Blame view

天文台pc/tianwentai-ui/node_modules/@emotion/babel-plugin/src/utils/get-target-class-name.js 1.49 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  import findRoot from 'find-root'
  import memoize from '@emotion/memoize'
  import nodePath from 'path'
  import hashString from '@emotion/hash'
  import escapeRegexp from 'escape-string-regexp'
  
  let hashArray = (arr /*: Array<string> */) => hashString(arr.join(''))
  
  const unsafeRequire = require
  
  const getPackageRootPath = memoize(filename => findRoot(filename))
  
  const separator = new RegExp(escapeRegexp(nodePath.sep), 'g')
  
  const normalizePath = path => nodePath.normalize(path).replace(separator, '/')
  
  export function getTargetClassName(state, t) {
    if (state.emotionTargetClassNameCount === undefined) {
      state.emotionTargetClassNameCount = 0
    }
  
    const hasFilepath =
      state.file.opts.filename && state.file.opts.filename !== 'unknown'
    const filename = hasFilepath ? state.file.opts.filename : ''
    // normalize the file path to ignore folder structure
    // outside the current node project and arch-specific delimiters
    let moduleName = ''
    let rootPath = filename
  
    try {
      rootPath = getPackageRootPath(filename)
      moduleName = unsafeRequire(rootPath + '/package.json').name
    } catch (err) {}
  
    const finalPath =
      filename === rootPath ? 'root' : filename.slice(rootPath.length)
  
    const positionInFile = state.emotionTargetClassNameCount++
  
    const stuffToHash = [moduleName]
  
    if (finalPath) {
      stuffToHash.push(normalizePath(finalPath))
    } else {
      stuffToHash.push(state.file.code)
    }
  
    const stableClassName = `e${hashArray(stuffToHash)}${positionInFile}`
  
    return stableClassName
  }