UNPKG

1.99 kBJavaScriptView Raw
1const path = require('path')
2const sum = require('hash-sum')
3const paths = require('./paths')
4const isLocalPath = require('./utils/isLocalPath')
5
6/**
7 *
8 * @param {string} generator
9 * @return {Object}
10 */
11module.exports = generator => {
12 if (isLocalPath(generator)) {
13 let subGenerator
14 if (isLocalPath.removePrefix(generator).includes(':')) {
15 subGenerator = generator.slice(generator.lastIndexOf(':') + 1)
16 generator = generator.slice(0, generator.lastIndexOf(':'))
17 }
18 const absolutePath = path.resolve(generator)
19 return {
20 type: 'local',
21 path: absolutePath,
22 hash: sum(absolutePath),
23 subGenerator
24 }
25 }
26
27 if (!generator.startsWith('npm:') && !generator.includes('/')) {
28 generator = `npm:sao-${generator}`
29 }
30
31 const SPECIAL_PREFIX_RE = /^(npm|github|bitbucket|gitlab):/
32 /** @type {string|null} */
33 let type = null
34 if (SPECIAL_PREFIX_RE.test(generator)) {
35 type = SPECIAL_PREFIX_RE.exec(generator)[1]
36 generator = generator.replace(SPECIAL_PREFIX_RE, '')
37 }
38
39 if (type === 'npm') {
40 const hasSubGenerator = generator.indexOf(':') !== -1
41 const slug = generator.slice(
42 0,
43 hasSubGenerator ? generator.indexOf(':') : generator.length
44 )
45 const parsed = require('parse-package-name')(slug)
46 const hash = sum(`npm:${slug}`)
47 return {
48 type: 'npm',
49 name: parsed.name,
50 version: parsed.version,
51 slug,
52 subGenerator:
53 hasSubGenerator && generator.slice(generator.indexOf(':') + 1),
54 hash,
55 path: path.join(paths.packagePath, hash, 'node_modules', parsed.name)
56 }
57 }
58
59 const [
60 ,
61 user,
62 repo,
63 version,
64 subGenerator
65 ] = /([^/]+)\/([^#:]+)(?:#(.+))?(?::(.+))?$/.exec(generator)
66 const slug = `${type ? `${type}:` : ''}${user}/${repo}${
67 version ? `#${version}` : ''
68 }`
69 const hash = sum(`repo:${slug}`)
70 return {
71 type: 'repo',
72 slug,
73 subGenerator,
74 hash,
75 path: path.join(paths.repoPath, hash)
76 }
77}