UNPKG

2.96 kBJavaScriptView Raw
1const { path, hash: sum, isLocalPath, isGitUrl, SherryError, env: { SHERRY_MODULE_PREFIX } } = require('sherry-utils')
2const paths = require('./paths')
3const { getAlias } = require('./cache')
4
5function 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
21function 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
36function 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 * @param {string} generator
56 * @return {Object}
57 */
58module.exports = (generator, { gitOrigin, registry } = {}) => {
59 // 1. local path
60 if (isLocalPath(generator)) {
61 return LocalGenerator(generator)
62 }
63
64 // 2. direct git url
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 // Scope package
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}