1 | const { path, hash: sum, isLocalPath, isGitUrl, SherryError, env: { SHERRY_MODULE_PREFIX } } = require('sherry-utils')
|
2 | const paths = require('./paths')
|
3 | const { getAlias } = require('./cache')
|
4 |
|
5 | function NpmGenerator(generator, registry) {
|
6 | const hasSubGenerator = generator.indexOf(':') !== -1
|
7 | const slug = generator.slice(0, hasSubGenerator ? generator.indexOf(':') : generator.length)
|
8 | const parsed = require('parse-package-name')(slug)
|
9 | const hash = sum(`npm:${slug}:${registry}`)
|
10 | return {
|
11 | type: 'npm',
|
12 | name: parsed.name,
|
13 | version: parsed.version,
|
14 | slug,
|
15 | subGenerator: hasSubGenerator && generator.slice(generator.indexOf(':') + 1),
|
16 | hash,
|
17 | path: path.join(paths.packagePath, hash, 'node_modules', parsed.name)
|
18 | }
|
19 | }
|
20 |
|
21 | function LocalGenerator(generator) {
|
22 | let subGenerator = false
|
23 | if (isLocalPath.removePrefix(generator).includes(':')) {
|
24 | subGenerator = generator.slice(generator.lastIndexOf(':') + 1)
|
25 | generator = generator.slice(0, generator.lastIndexOf(':'))
|
26 | }
|
27 | const absolutePath = path.resolve(generator)
|
28 | return {
|
29 | type: 'local',
|
30 | path: absolutePath,
|
31 | hash: sum(absolutePath),
|
32 | subGenerator
|
33 | }
|
34 | }
|
35 |
|
36 | function RepoGenerator(generator, gitOrigin) {
|
37 | let subGenerator = false
|
38 | if (isGitUrl.removePrefix(generator).includes(':')) {
|
39 | subGenerator = generator.slice(generator.lastIndexOf(':') + 1)
|
40 | generator = generator.slice(0, generator.lastIndexOf(':'))
|
41 | }
|
42 | const slug = generator
|
43 | const hash = sum(`repo:${slug}:${gitOrigin}`)
|
44 | return {
|
45 | type: 'repo',
|
46 | slug,
|
47 | subGenerator,
|
48 | hash,
|
49 | path: path.join(paths.repoPath, hash)
|
50 | }
|
51 | }
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | module.exports = (generator, { gitOrigin, registry } = {}) => {
|
59 |
|
60 | if (isLocalPath(generator)) {
|
61 | return LocalGenerator(generator)
|
62 | }
|
63 |
|
64 |
|
65 | if (isGitUrl(generator)) {
|
66 | return RepoGenerator(generator, gitOrigin)
|
67 | }
|
68 |
|
69 | const SPECIAL_PREFIX_RE = /^(npm|alias):/
|
70 | if (!SPECIAL_PREFIX_RE.test(generator)) {
|
71 | if (!generator.includes('/')) {
|
72 | generator = `npm:${SHERRY_MODULE_PREFIX}-${generator}`
|
73 |
|
74 | } else if (generator.startsWith('@')) {
|
75 | generator = `npm:${generator}`
|
76 | }
|
77 | }
|
78 |
|
79 | let type = null
|
80 | if (SPECIAL_PREFIX_RE.test(generator)) {
|
81 | type = SPECIAL_PREFIX_RE.exec(generator)[1]
|
82 | generator = generator.replace(SPECIAL_PREFIX_RE, '')
|
83 | }
|
84 |
|
85 | if (type === 'npm') {
|
86 | return NpmGenerator(generator, registry)
|
87 | }
|
88 |
|
89 | if (type === 'alias') {
|
90 | const hasSubGenerator = generator.indexOf(':') !== -1
|
91 | const alias = generator.slice(0, hasSubGenerator ? generator.lastIndexOf(':') : generator.length)
|
92 |
|
93 | const url = getAlias(alias)
|
94 | if (!url) {
|
95 | throw new SherryError(`Cannot find alias '${alias}'`)
|
96 | }
|
97 |
|
98 | if (isLocalPath(url)) {
|
99 | return LocalGenerator(url)
|
100 | } else if (isGitUrl(url)) {
|
101 | return RepoGenerator(url)
|
102 | }
|
103 | }
|
104 |
|
105 | return RepoGenerator(generator)
|
106 | }
|