-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaugment-options.js
113 lines (93 loc) · 2.56 KB
/
augment-options.js
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import glob from 'glob';
function analyzePackageJson(options) {
const { projectRoot } = options;
try {
const packageJsonFile = readFileSync(
join(projectRoot, 'package.json'),
'utf8'
);
const {
dependencies,
devDependencies,
'ember-addon': emberAddon,
name,
version,
} = JSON.parse(packageJsonFile);
if (!name) {
throw new SyntaxError('Package name is missing.');
}
if (!version) {
throw new SyntaxError('Package version is missing.');
}
const projectDependencies = new Map([
...Object.entries(dependencies ?? {}),
...Object.entries(devDependencies ?? {}),
]);
return {
dependencies: projectDependencies,
hasGlint: projectDependencies.has('@glint/core'),
hasTypeScript: projectDependencies.has('typescript'),
isV1Addon: Boolean(emberAddon),
name,
version,
};
} catch (e) {
throw new SyntaxError(
`ERROR: package.json is missing or is not valid. (${e.message})\n`
);
}
}
function analyzePackageManager(options) {
const { projectRoot } = options;
const lockFiles = glob.sync('{package-lock.json,pnpm-lock.yaml,yarn.lock}', {
cwd: projectRoot,
});
if (lockFiles.length !== 1) {
console.warn('WARNING: Package manager is unknown. Yarn will be assumed.');
return {
isNpm: false,
isPnpm: false,
isYarn: true,
};
}
const [lockFile] = lockFiles;
return {
isNpm: lockFile === 'package-lock.json',
isPnpm: lockFile === 'pnpm-lock.yaml',
isYarn: lockFile === 'yarn.lock',
};
}
function deriveAddonLocation(addonPackage) {
// Package is not scoped
if (!addonPackage.name.includes('/')) {
return addonPackage.name;
}
// eslint-disable-next-line no-unused-vars
const [scope, packageName] = addonPackage.name.split('/');
if (!packageName) {
throw new SyntaxError(
`ERROR: In package.json, the package name \`${addonPackage.name}\` is not valid.`
);
}
return packageName;
}
export function augmentOptions(options) {
const addonPackage = analyzePackageJson(options);
const packageManager = analyzePackageManager(options);
return {
locations: {
addon: options.addonLocation ?? deriveAddonLocation(addonPackage),
testApp: options.testAppLocation ?? 'test-app',
},
packageManager,
packages: {
addon: addonPackage,
testApp: {
name: options.testAppName ?? 'test-app',
},
},
projectRoot: options.projectRoot,
};
}