presetter 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/directive.js +1 -1
- package/lib/io.js +2 -2
- package/lib/package.js +31 -13
- package/lib/package.js.map +1 -1
- package/lib/preset.js +25 -13
- package/lib/preset.js.map +1 -1
- package/lib/types.d.ts +25 -27
- package/package.json +3 -2
package/lib/directive.js
CHANGED
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.isApplyDirective = isApplyDirective;
|
7
|
-
exports.isImportDirective = isImportDirective;
|
8
7
|
exports.isDirective = isDirective;
|
8
|
+
exports.isImportDirective = isImportDirective;
|
9
9
|
exports.resolveDirective = resolveDirective;
|
10
10
|
|
11
11
|
/*
|
package/lib/io.js
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
+
exports.linkFiles = linkFiles;
|
6
7
|
exports.loadDynamic = loadDynamic;
|
7
8
|
exports.loadFile = loadFile;
|
8
9
|
exports.serialiseContent = serialiseContent;
|
9
|
-
exports.writeFiles = writeFiles;
|
10
|
-
exports.linkFiles = linkFiles;
|
11
10
|
exports.unlinkFiles = unlinkFiles;
|
11
|
+
exports.writeFiles = writeFiles;
|
12
12
|
|
13
13
|
var _console = require("console");
|
14
14
|
|
package/lib/package.js
CHANGED
@@ -13,6 +13,10 @@ var _config = _interopRequireDefault(require("@npmcli/config"));
|
|
13
13
|
|
14
14
|
var _lodash = require("lodash");
|
15
15
|
|
16
|
+
var _os = require("os");
|
17
|
+
|
18
|
+
var _path = require("path");
|
19
|
+
|
16
20
|
var _readPkgUp = _interopRequireDefault(require("read-pkg-up"));
|
17
21
|
|
18
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
@@ -102,9 +106,13 @@ async function reifyDependencies(args) {
|
|
102
106
|
} = { ...args
|
103
107
|
}; // use arborist to install peer dependencies
|
104
108
|
|
109
|
+
const config = await getNPMConfig();
|
110
|
+
const workspacesEnabled = arePeerPackagesAutoInstalled(); // no workspace before npm 7
|
111
|
+
|
105
112
|
const arborist = new _arborist.Arborist({
|
106
113
|
path: root,
|
107
|
-
|
114
|
+
workspacesEnabled,
|
115
|
+
...config
|
108
116
|
}); // don't write to the lockfile
|
109
117
|
|
110
118
|
const actualTree = await arborist.reify({
|
@@ -125,17 +133,27 @@ async function reifyDependencies(args) {
|
|
125
133
|
*/
|
126
134
|
|
127
135
|
|
128
|
-
async function
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
136
|
+
async function getNPMConfig() {
|
137
|
+
// get npm config
|
138
|
+
const config = new _config.default({
|
139
|
+
definitions: {
|
140
|
+
userconfig: {
|
141
|
+
default: (0, _path.resolve)((0, _os.homedir)(), '.npmrc'),
|
142
|
+
type: String
|
143
|
+
},
|
144
|
+
registry: {
|
145
|
+
default: 'https://registry.npmjs.org',
|
146
|
+
type: String
|
147
|
+
}
|
148
|
+
},
|
149
|
+
npmPath: '.',
|
150
|
+
flatten: (config, flattenedConfig) => {
|
151
|
+
// NOTE: this function is called multiple time for flattening the configs at multiple levels, user, project, cli etc.
|
152
|
+
// ensure that higher level configs are always in priority
|
153
|
+
Object.assign(flattenedConfig, config);
|
154
|
+
}
|
155
|
+
});
|
156
|
+
await config.load();
|
157
|
+
return config.flat;
|
140
158
|
}
|
141
159
|
//# sourceMappingURL=package.js.map
|
package/lib/package.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../source/package.ts"],"names":["NPM_VERSION_FOR_PEER_INSTALLATION","arePeerPackagesAutoInstalled","clientID","process","env","split","name","version","major","undefined","parseInt","getPackage","root","detail","cwd","normalize","Error","path","json","packageJson","scripts","reifyDependencies","args","add","remove","saveAs","lockFile","
|
1
|
+
{"version":3,"sources":["../source/package.ts"],"names":["NPM_VERSION_FOR_PEER_INSTALLATION","arePeerPackagesAutoInstalled","clientID","process","env","split","name","version","major","undefined","parseInt","getPackage","root","detail","cwd","normalize","Error","path","json","packageJson","scripts","reifyDependencies","args","add","remove","saveAs","lockFile","config","getNPMConfig","workspacesEnabled","arborist","Arborist","actualTree","reify","rm","saveType","save","update","edgesOut","values","map","edge","spec","Config","definitions","userconfig","default","type","String","registry","npmPath","flatten","flattenedConfig","Object","assign","load","flat"],"mappings":"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","sourcesContent":["/*\n * *** MIT LICENSE ***\n * -------------------------------------------------------------------------\n * This code may be modified and distributed under the MIT license.\n * See the LICENSE file for details.\n * -------------------------------------------------------------------------\n *\n * @summary Helpers for handling a package\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2019 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport { Arborist } from '@npmcli/arborist';\nimport Config from '@npmcli/config';\nimport { defaultsDeep } from 'lodash';\nimport { homedir } from 'os';\nimport { resolve } from 'path';\nimport readPackageDetail from 'read-pkg-up';\n\nimport type { NormalizedPackageJson } from 'read-pkg-up';\n\nconst NPM_VERSION_FOR_PEER_INSTALLATION = 7;\n\n/** package detail */\nexport type Package = {\n /** path to the package.json */\n path: string;\n /** content of package.json */\n json: NormalizedPackageJson & { scripts: Record<string, string> };\n};\n\n/**\n * indicate whether peer packages would be installed automatically\n * @returns true for npm v7+\n */\nexport function arePeerPackagesAutoInstalled(): boolean {\n // NOTE npm_config_user_agent should be in the form of 'npm/7.3.0 node/v15.5.0 darwin x64'\n\n /* istanbul ignore next */\n const [clientID] =\n process.env['npm_config_user_agent']?.split(' ') ?? ([] as undefined[]);\n\n /* istanbul ignore next */\n const [name, version] = clientID?.split('/') ?? ([] as undefined[]);\n\n /* istanbul ignore next */\n const [major] = version?.split('.') ?? ([] as undefined[]);\n\n return (\n name === 'npm' &&\n major !== undefined &&\n parseInt(major) >= NPM_VERSION_FOR_PEER_INSTALLATION\n );\n}\n\n/**\n * get scripts from the targeted project's package.json\n * @param root path to the project's root folder\n * @returns package detail\n */\nexport async function getPackage(root?: string): Promise<Package> {\n // try to find the target project's package.json\n const detail = await readPackageDetail({ cwd: root, normalize: true });\n\n // throw an error if there's no package.json found\n if (!detail) {\n throw new Error(\"failed to find target's package.json\");\n }\n\n const path = detail.path;\n const json = defaultsDeep(detail.packageJson, {\n scripts: {},\n }) as Package['json'];\n\n return { path, json };\n}\n\n/**\n * reify packages for the target project\n * @param args list of packages and other options\n * @param args.root directory of the project package.json\n * @param args.add list of packages to be added\n * @param args.remove list of packages to be removed\n * @param args.saveAs type of dependency\n * @param args.lockFile indicate whether package-lock.json should be produced\n * @returns list of installed packages\n */\nexport async function reifyDependencies(args: {\n root: string;\n add?: string[];\n remove?: string[];\n saveAs?: 'dev' | 'peer' | 'optional' | 'prod';\n lockFile?: boolean;\n}): Promise<Array<{ name: string; spec: string }>> {\n const {\n root,\n add = [],\n remove = [],\n saveAs = 'prod',\n lockFile = false,\n } = { ...args };\n\n // use arborist to install peer dependencies\n const config = await getNPMConfig();\n const workspacesEnabled = arePeerPackagesAutoInstalled(); // no workspace before npm 7\n const arborist = new Arborist({ path: root, workspacesEnabled, ...config });\n\n // don't write to the lockfile\n const actualTree = await arborist.reify({\n add,\n rm: remove,\n saveType: saveAs,\n save: lockFile,\n update: true,\n });\n\n return [...actualTree.edgesOut.values()].map((edge) => ({\n name: edge.name,\n spec: edge.spec,\n }));\n}\n\n/**\n * get the url of the package registry of the target project\n * @returns url of the registry\n */\nasync function getNPMConfig(): Promise<Record<string, string>> {\n // get npm config\n const config = new Config({\n definitions: {\n userconfig: { default: resolve(homedir(), '.npmrc'), type: String },\n registry: { default: 'https://registry.npmjs.org', type: String },\n },\n npmPath: '.',\n flatten: (\n config: Record<string, string>,\n flattenedConfig: Record<string, string>,\n ): void => {\n // NOTE: this function is called multiple time for flattening the configs at multiple levels, user, project, cli etc.\n\n // ensure that higher level configs are always in priority\n Object.assign(flattenedConfig, config);\n },\n });\n\n await config.load();\n\n return config.flat;\n}\n"],"file":"package.js"}
|
package/lib/preset.js
CHANGED
@@ -3,17 +3,17 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.getPresetterRC = getPresetterRC;
|
7
|
-
exports.updatePresetterRC = updatePresetterRC;
|
8
6
|
exports.assertPresetterRC = assertPresetterRC;
|
7
|
+
exports.bootstrapContent = bootstrapContent;
|
8
|
+
exports.bootstrapPreset = bootstrapPreset;
|
9
|
+
exports.getContext = getContext;
|
10
|
+
exports.getDestinationMap = getDestinationMap;
|
9
11
|
exports.getPresetAssets = getPresetAssets;
|
12
|
+
exports.getPresetterRC = getPresetterRC;
|
10
13
|
exports.getScripts = getScripts;
|
11
14
|
exports.setupPreset = setupPreset;
|
12
|
-
exports.bootstrapPreset = bootstrapPreset;
|
13
|
-
exports.bootstrapContent = bootstrapContent;
|
14
15
|
exports.unsetPreset = unsetPreset;
|
15
|
-
exports.
|
16
|
-
exports.getDestinationMap = getDestinationMap;
|
16
|
+
exports.updatePresetterRC = updatePresetterRC;
|
17
17
|
|
18
18
|
var _console = require("console");
|
19
19
|
|
@@ -166,10 +166,10 @@ async function getScripts(context) {
|
|
166
166
|
async function setupPreset(...uris) {
|
167
167
|
// NOTE: comparing packages before and after installation is the only reliable way
|
168
168
|
// to extract the name of the preset in case it's given as a git url or file path etc.
|
169
|
-
const context = await getContext();
|
170
169
|
const {
|
171
|
-
|
172
|
-
} =
|
170
|
+
path
|
171
|
+
} = await (0, _package.getPackage)();
|
172
|
+
const root = (0, _path.dirname)(path);
|
173
173
|
const packageBefore = (await (0, _readPkg.default)({
|
174
174
|
cwd: root
|
175
175
|
})).devDependencies; // install presetter & the preset
|
@@ -195,7 +195,8 @@ async function setupPreset(...uris) {
|
|
195
195
|
preset
|
196
196
|
}); // bootstrap configuration files with the new .presetterrc.json
|
197
197
|
|
198
|
-
|
198
|
+
const context = await getContext();
|
199
|
+
await bootstrapContent(context); // insert post install script if not preset
|
199
200
|
|
200
201
|
await (0, _writePkg.default)(root, (0, _lodash.defaultsDeep)(context.target.package, {
|
201
202
|
scripts: {
|
@@ -239,7 +240,11 @@ async function bootstrapContent(context) {
|
|
239
240
|
const assets = await getPresetAssets(context);
|
240
241
|
const content = await (0, _content.generateContent)(assets, context);
|
241
242
|
const resolvedContext = await (0, _content.resolveContext)(assets, context);
|
242
|
-
const
|
243
|
+
const userIgnores = (_context$custom$ignor = context.custom.ignores) !== null && _context$custom$ignor !== void 0 ? _context$custom$ignor : [];
|
244
|
+
const presetIgnores = (await Promise.all(assets.map(({
|
245
|
+
supplementaryIgnores
|
246
|
+
}) => supplementaryIgnores instanceof Function ? supplementaryIgnores(resolvedContext) : supplementaryIgnores))).filter(rules => !!rules).flat();
|
247
|
+
const filteredContent = (0, _template.filter)(content, ...presetIgnores, ...userIgnores);
|
243
248
|
const destinationMap = await getDestinationMap(filteredContent, resolvedContext);
|
244
249
|
await (0, _io.writeFiles)(context.target.root, filteredContent, destinationMap);
|
245
250
|
await (0, _io.linkFiles)(context.target.root, destinationMap);
|
@@ -292,9 +297,16 @@ async function getDestinationMap(template, context) {
|
|
292
297
|
const {
|
293
298
|
custom: {
|
294
299
|
noSymlinks
|
300
|
+
},
|
301
|
+
target: {
|
302
|
+
root
|
295
303
|
}
|
296
|
-
} = context;
|
297
|
-
|
304
|
+
} = context; // make sure we use the path of presetter under the target project, not the one via npx
|
305
|
+
|
306
|
+
const presetterDir = (0, _resolvePkg.default)('presetter', {
|
307
|
+
cwd: root
|
308
|
+
});
|
309
|
+
const outDir = (0, _path.resolve)(presetterDir, 'generated', context.target.name);
|
298
310
|
const relativePaths = [...Object.keys(template)];
|
299
311
|
return Object.fromEntries([...relativePaths.map(relativePath => [relativePath, (0, _path.resolve)( // output on the project root if it's specified as not a symlink
|
300
312
|
noSymlinks.includes(relativePath) ? context.target.root : outDir, relativePath)])]);
|
package/lib/preset.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../source/preset.ts"],"names":["PRESETTERRC","JSON_INDENT","getPresetterRC","root","potentialConfigFiles","map","ext","path","custom","assertPresetterRC","Error","updatePresetterRC","config","existingPresetterRC","catch","spaces","value","Array","isArray","getPresetAssets","context","preset","presets","assets","module","cwd","target","default","presetPresetAsset","asset","extensions","extends","extension","push","Promise","all","flat","getScripts","variable","scripts","filter","scriptsFromPreset","reduce","merged","scriptsWithCustomConfig","setupPreset","uris","getContext","packageBefore","devDependencies","join","add","saveAs","lockFile","packageAfter","newPackages","getNewPackages","name","bootstrapContent","package","prepare","bootstrapPreset","options","force","content","resolvedContext","filteredContent","ignores","destinationMap","getDestinationMap","unsetPreset","configurationLink","json","template","noSymlinks","outDir","__dirname","relativePaths","Object","keys","fromEntries","relativePath","includes","before","after"],"mappings":"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","sourcesContent":["/*\n * *** MIT LICENSE ***\n * -------------------------------------------------------------------------\n * This code may be modified and distributed under the MIT license.\n * See the LICENSE file for details.\n * -------------------------------------------------------------------------\n *\n * @summary Procedures for setting up a preset\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2020 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport { info } from 'console';\nimport { pathExists, writeJSON } from 'fs-extra';\nimport { defaultsDeep } from 'lodash';\nimport { dirname, resolve } from 'path';\nimport readPackage from 'read-pkg';\nimport resolvePackage from 'resolve-pkg';\nimport writePackage from 'write-pkg';\n\nimport { generateContent, getVariable, resolveContext } from './content';\nimport { linkFiles, loadFile, unlinkFiles, writeFiles } from './io';\nimport {\n arePeerPackagesAutoInstalled,\n getPackage,\n reifyDependencies,\n} from './package';\nimport { filter, isJSON, merge, template } from './template';\n\nimport type {\n PresetAsset,\n PresetContext,\n PresetterConfig,\n ResolvedPresetContext,\n Template,\n} from './types';\n\n/** presetter configuration filename */\nconst PRESETTERRC = '.presetterrc';\n\nconst JSON_INDENT = 2;\n\n/**\n * get the .presetterrc configuration file content\n * @param root the base directory in which the configuration file should be located\n * @returns content of the configuration file\n */\nexport async function getPresetterRC(root: string): Promise<PresetterConfig> {\n const potentialConfigFiles = ['', '.json'].map((ext) =>\n resolve(root, `${PRESETTERRC}${ext}`),\n );\n\n for (const path of potentialConfigFiles) {\n if (await pathExists(path)) {\n // return the first customisation file found\n const custom = await loadFile(path, 'json');\n assertPresetterRC(custom);\n\n return custom;\n }\n }\n\n throw new Error('Missing preset defined in .presetterrc');\n}\n\n/**\n * update .presetterrc configuration file content\n * @param root the base directory in which the configuration file should be located\n * @param config content to be merged with the existing configuration file\n */\nexport async function updatePresetterRC(\n root: string,\n config: PresetterConfig,\n): Promise<void> {\n const existingPresetterRC = await getPresetterRC(root).catch(() => ({}));\n\n await writeJSON(\n resolve(root, `${PRESETTERRC}.json`),\n merge(existingPresetterRC, config),\n { spaces: JSON_INDENT },\n );\n}\n\n/**\n * check that the configuration is valid\n * @param value content from a configuration file\n */\nexport function assertPresetterRC(\n value: unknown,\n): asserts value is PresetterConfig {\n if (\n !isJSON(value) ||\n (typeof value['preset'] !== 'string' && !Array.isArray(value['preset']))\n ) {\n throw new Error(`invalid presetter configuration file`);\n }\n}\n\n/**\n * get the preset package name from package.json\n * @param context context about the target project and any customisation in .presetterrc\n * @returns name of the preset package\n */\nexport async function getPresetAssets(\n context: PresetContext,\n): Promise<PresetAsset[]> {\n // get the preset name\n const { preset } = context.custom;\n\n const presets = Array.isArray(preset) ? preset : [preset];\n\n const assets: PresetAsset[] = [];\n\n for (const preset of presets) {\n try {\n // get the preset\n const module = resolvePackage(preset, {\n cwd: context.target.root,\n });\n\n const { default: presetPresetAsset } = (await import(module!)) as {\n default: (args: PresetContext) => Promise<PresetAsset>;\n };\n\n const asset = await presetPresetAsset(context);\n\n // add extended assets first\n const extensions =\n asset.extends?.map(async (extension) =>\n getPresetAssets({\n ...context,\n custom: { ...context.custom, preset: extension },\n }),\n ) ?? [];\n assets.push(...(await Promise.all(extensions)).flat());\n\n // then asset from this preset so that this preset can override the extended ones\n assets.push(asset);\n } catch {\n throw new Error(`cannot resolve preset ${preset}`);\n }\n }\n\n return assets;\n}\n\n/**\n * merge all scripts templates\n * @param context context about the target project and any customisation in .presetterrc\n * @returns scripts template\n */\nexport async function getScripts(\n context: PresetContext,\n): Promise<Record<string, string>> {\n const { custom } = context;\n\n // get assets from all configured presets\n const assets = await getPresetAssets(context);\n\n // compute the final variable to be used in the scripts template\n const variable = getVariable(assets, context);\n\n // load templated scripts from presets\n const scripts = await Promise.all(\n assets\n .map((asset) => asset.scripts)\n .filter((path): path is string => typeof path === 'string')\n .map(\n async (path) =>\n (await loadFile(path, 'yaml')) as Record<string, string>,\n ),\n );\n\n // merge all template scripts from presets\n const scriptsFromPreset = scripts.reduce(\n (merged, scripts) => merge(merged, scripts),\n {},\n );\n\n // merge customised scripts with the preset scripts\n const scriptsWithCustomConfig = merge(scriptsFromPreset, custom.scripts);\n\n // replace the template variables\n return template(scriptsWithCustomConfig, variable);\n}\n\n/**\n * adopt a preset to the project\n * @param uris list of name or git url of the preset\n */\nexport async function setupPreset(...uris: string[]): Promise<void> {\n // NOTE: comparing packages before and after installation is the only reliable way\n // to extract the name of the preset in case it's given as a git url or file path etc.\n\n const context = await getContext();\n const { root } = context.target;\n const packageBefore = (await readPackage({ cwd: root })).devDependencies;\n\n // install presetter & the preset\n info(`Installing ${uris.join(' ')}... it may take a few moment...`);\n await reifyDependencies({\n root,\n add: ['presetter', ...uris],\n saveAs: 'dev',\n lockFile: true,\n });\n\n // extract the name of the installed preset\n const packageAfter = (await readPackage({ cwd: root })).devDependencies;\n const newPackages = getNewPackages({ ...packageBefore }, { ...packageAfter });\n const preset = newPackages.filter((name) => name !== 'presetter');\n\n info('Updating .presetterrc.json & package.json');\n // update .presetterrc.json\n await updatePresetterRC(root, { preset });\n\n // bootstrap configuration files with the new .presetterrc.json\n await bootstrapContent(await getContext());\n\n // insert post install script if not preset\n await writePackage(\n root,\n defaultsDeep(context.target.package, {\n scripts: { prepare: 'presetter bootstrap' },\n }),\n );\n\n info('Done. Enjoy coding!');\n}\n\n/**\n * bootstrap the preset to the current project root\n * @param options options on how to bootstrap the preset\n * @param options.force do all steps despite potential step saving\n */\nexport async function bootstrapPreset(options?: {\n force?: boolean;\n}): Promise<void> {\n const { force = false } = { ...options };\n\n const context = await getContext();\n\n // install all related packages first\n if (force || !arePeerPackagesAutoInstalled()) {\n await reifyDependencies({ root: context.target.root });\n }\n\n // generate configurations\n await bootstrapContent(context);\n}\n\n/**\n * generate files from templates and link them to the target project root\n * @param context context about the target project and any customisation in .presetterrc\n */\nexport async function bootstrapContent(context: PresetContext): Promise<void> {\n const assets = await getPresetAssets(context);\n const content = await generateContent(assets, context);\n const resolvedContext = await resolveContext(assets, context);\n const filteredContent = filter(content, ...(context.custom.ignores ?? []));\n\n const destinationMap = await getDestinationMap(\n filteredContent,\n resolvedContext,\n );\n\n await writeFiles(context.target.root, filteredContent, destinationMap);\n await linkFiles(context.target.root, destinationMap);\n}\n\n/**\n * uninstall the preset from the current project root\n */\nexport async function unsetPreset(): Promise<void> {\n const context = await getContext();\n const assets = await getPresetAssets(context);\n const content = await generateContent(assets, context);\n const resolvedContext = await resolveContext(assets, context);\n const configurationLink = await getDestinationMap(content, resolvedContext);\n\n await unlinkFiles(context.target.root, configurationLink);\n}\n\n/**\n * get context about the target project and any customisation in .presetterrc\n * @returns context about the target project and any customisation in .presetterrc\n */\nexport async function getContext(): Promise<PresetContext> {\n const { json, path } = await getPackage();\n const root = dirname(path);\n const target = { name: json.name, root, package: json };\n const custom = await getPresetterRC(root);\n\n return {\n target,\n custom,\n };\n}\n\n/**\n * compute the output paths of all configuration files to be generated\n * @param template resolved template map\n * @param context resolved context about the target project and customisation\n * @returns mapping of configuration symlinks to its real path\n */\nexport async function getDestinationMap(\n template: Record<string, Template>,\n context: ResolvedPresetContext<'noSymlinks'>,\n): Promise<Record<string, string>> {\n const {\n custom: { noSymlinks },\n } = context;\n const outDir = resolve(__dirname, '..', 'generated', context.target.name);\n\n const relativePaths = [...Object.keys(template)];\n\n return Object.fromEntries([\n ...relativePaths.map((relativePath): [string, string] => [\n relativePath,\n resolve(\n // output on the project root if it's specified as not a symlink\n noSymlinks.includes(relativePath) ? context.target.root : outDir,\n relativePath,\n ),\n ]),\n ]);\n}\n\n/**\n * get a list of new packages installed by comparing the before and after state of devDependencies in package.json\n * @param before before state of devDependencies in package.json\n * @param after after state of devDependencies in package.json\n * @returns list of new package names\n */\nfunction getNewPackages(\n before: Record<string, string>,\n after: Record<string, string>,\n): string[] {\n return Object.keys(after).filter((name): name is string => !before[name]);\n}\n"],"file":"preset.js"}
|
1
|
+
{"version":3,"sources":["../source/preset.ts"],"names":["PRESETTERRC","JSON_INDENT","getPresetterRC","root","potentialConfigFiles","map","ext","path","custom","assertPresetterRC","Error","updatePresetterRC","config","existingPresetterRC","catch","spaces","value","Array","isArray","getPresetAssets","context","preset","presets","assets","module","cwd","target","default","presetPresetAsset","asset","extensions","extends","extension","push","Promise","all","flat","getScripts","variable","scripts","filter","scriptsFromPreset","reduce","merged","scriptsWithCustomConfig","setupPreset","uris","packageBefore","devDependencies","join","add","saveAs","lockFile","packageAfter","newPackages","getNewPackages","name","getContext","bootstrapContent","package","prepare","bootstrapPreset","options","force","content","resolvedContext","userIgnores","ignores","presetIgnores","supplementaryIgnores","Function","rules","filteredContent","destinationMap","getDestinationMap","unsetPreset","configurationLink","json","template","noSymlinks","presetterDir","outDir","relativePaths","Object","keys","fromEntries","relativePath","includes","before","after"],"mappings":"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","sourcesContent":["/*\n * *** MIT LICENSE ***\n * -------------------------------------------------------------------------\n * This code may be modified and distributed under the MIT license.\n * See the LICENSE file for details.\n * -------------------------------------------------------------------------\n *\n * @summary Procedures for setting up a preset\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2020 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport { info } from 'console';\nimport { pathExists, writeJSON } from 'fs-extra';\nimport { defaultsDeep } from 'lodash';\nimport { dirname, resolve } from 'path';\nimport readPackage from 'read-pkg';\nimport resolvePackage from 'resolve-pkg';\nimport writePackage from 'write-pkg';\n\nimport { generateContent, getVariable, resolveContext } from './content';\nimport { linkFiles, loadFile, unlinkFiles, writeFiles } from './io';\nimport {\n arePeerPackagesAutoInstalled,\n getPackage,\n reifyDependencies,\n} from './package';\nimport { filter, isJSON, merge, template } from './template';\n\nimport type {\n IgnoreRule,\n PresetAsset,\n PresetContext,\n PresetterConfig,\n ResolvedPresetContext,\n Template,\n} from './types';\nimport type { PackageJson } from 'read-pkg';\n\n/** presetter configuration filename */\nconst PRESETTERRC = '.presetterrc';\n\nconst JSON_INDENT = 2;\n\n/**\n * get the .presetterrc configuration file content\n * @param root the base directory in which the configuration file should be located\n * @returns content of the configuration file\n */\nexport async function getPresetterRC(root: string): Promise<PresetterConfig> {\n const potentialConfigFiles = ['', '.json'].map((ext) =>\n resolve(root, `${PRESETTERRC}${ext}`),\n );\n\n for (const path of potentialConfigFiles) {\n if (await pathExists(path)) {\n // return the first customisation file found\n const custom = await loadFile(path, 'json');\n assertPresetterRC(custom);\n\n return custom;\n }\n }\n\n throw new Error('Missing preset defined in .presetterrc');\n}\n\n/**\n * update .presetterrc configuration file content\n * @param root the base directory in which the configuration file should be located\n * @param config content to be merged with the existing configuration file\n */\nexport async function updatePresetterRC(\n root: string,\n config: PresetterConfig,\n): Promise<void> {\n const existingPresetterRC = await getPresetterRC(root).catch(() => ({}));\n\n await writeJSON(\n resolve(root, `${PRESETTERRC}.json`),\n merge(existingPresetterRC, config),\n { spaces: JSON_INDENT },\n );\n}\n\n/**\n * check that the configuration is valid\n * @param value content from a configuration file\n */\nexport function assertPresetterRC(\n value: unknown,\n): asserts value is PresetterConfig {\n if (\n !isJSON(value) ||\n (typeof value['preset'] !== 'string' && !Array.isArray(value['preset']))\n ) {\n throw new Error(`invalid presetter configuration file`);\n }\n}\n\n/**\n * get the preset package name from package.json\n * @param context context about the target project and any customisation in .presetterrc\n * @returns name of the preset package\n */\nexport async function getPresetAssets(\n context: PresetContext,\n): Promise<PresetAsset[]> {\n // get the preset name\n const { preset } = context.custom;\n\n const presets = Array.isArray(preset) ? preset : [preset];\n\n const assets: PresetAsset[] = [];\n\n for (const preset of presets) {\n try {\n // get the preset\n const module = resolvePackage(preset, {\n cwd: context.target.root,\n });\n\n const { default: presetPresetAsset } = (await import(module!)) as {\n default: (args: PresetContext) => Promise<PresetAsset>;\n };\n\n const asset = await presetPresetAsset(context);\n\n // add extended assets first\n const extensions =\n asset.extends?.map(async (extension) =>\n getPresetAssets({\n ...context,\n custom: { ...context.custom, preset: extension },\n }),\n ) ?? [];\n assets.push(...(await Promise.all(extensions)).flat());\n\n // then asset from this preset so that this preset can override the extended ones\n assets.push(asset);\n } catch {\n throw new Error(`cannot resolve preset ${preset}`);\n }\n }\n\n return assets;\n}\n\n/**\n * merge all scripts templates\n * @param context context about the target project and any customisation in .presetterrc\n * @returns scripts template\n */\nexport async function getScripts(\n context: PresetContext,\n): Promise<Record<string, string>> {\n const { custom } = context;\n\n // get assets from all configured presets\n const assets = await getPresetAssets(context);\n\n // compute the final variable to be used in the scripts template\n const variable = getVariable(assets, context);\n\n // load templated scripts from presets\n const scripts = await Promise.all(\n assets\n .map((asset) => asset.scripts)\n .filter((path): path is string => typeof path === 'string')\n .map(\n async (path) =>\n (await loadFile(path, 'yaml')) as Record<string, string>,\n ),\n );\n\n // merge all template scripts from presets\n const scriptsFromPreset = scripts.reduce(\n (merged, scripts) => merge(merged, scripts),\n {},\n );\n\n // merge customised scripts with the preset scripts\n const scriptsWithCustomConfig = merge(scriptsFromPreset, custom.scripts);\n\n // replace the template variables\n return template(scriptsWithCustomConfig, variable);\n}\n\n/**\n * adopt a preset to the project\n * @param uris list of name or git url of the preset\n */\nexport async function setupPreset(...uris: string[]): Promise<void> {\n // NOTE: comparing packages before and after installation is the only reliable way\n // to extract the name of the preset in case it's given as a git url or file path etc.\n const { path } = await getPackage();\n const root = dirname(path);\n const packageBefore = (await readPackage({ cwd: root })).devDependencies;\n\n // install presetter & the preset\n info(`Installing ${uris.join(' ')}... it may take a few moment...`);\n await reifyDependencies({\n root,\n add: ['presetter', ...uris],\n saveAs: 'dev',\n lockFile: true,\n });\n\n // extract the name of the installed preset\n const packageAfter = (await readPackage({ cwd: root })).devDependencies;\n const newPackages = getNewPackages({ ...packageBefore }, { ...packageAfter });\n const preset = newPackages.filter((name) => name !== 'presetter');\n\n info('Updating .presetterrc.json & package.json');\n // update .presetterrc.json\n await updatePresetterRC(root, { preset });\n\n // bootstrap configuration files with the new .presetterrc.json\n const context = await getContext();\n await bootstrapContent(context);\n\n // insert post install script if not preset\n await writePackage(\n root,\n defaultsDeep(context.target.package, {\n scripts: { prepare: 'presetter bootstrap' },\n }) as PackageJson & Record<string, string>,\n );\n\n info('Done. Enjoy coding!');\n}\n\n/**\n * bootstrap the preset to the current project root\n * @param options options on how to bootstrap the preset\n * @param options.force do all steps despite potential step saving\n */\nexport async function bootstrapPreset(options?: {\n force?: boolean;\n}): Promise<void> {\n const { force = false } = { ...options };\n\n const context = await getContext();\n\n // install all related packages first\n if (force || !arePeerPackagesAutoInstalled()) {\n await reifyDependencies({ root: context.target.root });\n }\n\n // generate configurations\n await bootstrapContent(context);\n}\n\n/**\n * generate files from templates and link them to the target project root\n * @param context context about the target project and any customisation in .presetterrc\n */\nexport async function bootstrapContent(context: PresetContext): Promise<void> {\n const assets = await getPresetAssets(context);\n const content = await generateContent(assets, context);\n const resolvedContext = await resolveContext(assets, context);\n\n const userIgnores = context.custom.ignores ?? [];\n const presetIgnores = (\n await Promise.all(\n assets.map(({ supplementaryIgnores }) =>\n supplementaryIgnores instanceof Function\n ? supplementaryIgnores(resolvedContext)\n : supplementaryIgnores,\n ),\n )\n )\n .filter((rules): rules is IgnoreRule[] => !!rules)\n .flat();\n\n const filteredContent = filter(content, ...presetIgnores, ...userIgnores);\n\n const destinationMap = await getDestinationMap(\n filteredContent,\n resolvedContext,\n );\n\n await writeFiles(context.target.root, filteredContent, destinationMap);\n await linkFiles(context.target.root, destinationMap);\n}\n\n/**\n * uninstall the preset from the current project root\n */\nexport async function unsetPreset(): Promise<void> {\n const context = await getContext();\n const assets = await getPresetAssets(context);\n const content = await generateContent(assets, context);\n const resolvedContext = await resolveContext(assets, context);\n const configurationLink = await getDestinationMap(content, resolvedContext);\n\n await unlinkFiles(context.target.root, configurationLink);\n}\n\n/**\n * get context about the target project and any customisation in .presetterrc\n * @returns context about the target project and any customisation in .presetterrc\n */\nexport async function getContext(): Promise<PresetContext> {\n const { json, path } = await getPackage();\n const root = dirname(path);\n const target = { name: json.name, root, package: json };\n const custom = await getPresetterRC(root);\n\n return {\n target,\n custom,\n };\n}\n\n/**\n * compute the output paths of all configuration files to be generated\n * @param template resolved template map\n * @param context resolved context about the target project and customisation\n * @returns mapping of configuration symlinks to its real path\n */\nexport async function getDestinationMap(\n template: Record<string, Template>,\n context: ResolvedPresetContext<'noSymlinks'>,\n): Promise<Record<string, string>> {\n const {\n custom: { noSymlinks },\n target: { root },\n } = context;\n // make sure we use the path of presetter under the target project, not the one via npx\n const presetterDir = resolvePackage('presetter', { cwd: root });\n const outDir = resolve(presetterDir!, 'generated', context.target.name);\n\n const relativePaths = [...Object.keys(template)];\n\n return Object.fromEntries([\n ...relativePaths.map((relativePath): [string, string] => [\n relativePath,\n resolve(\n // output on the project root if it's specified as not a symlink\n noSymlinks.includes(relativePath) ? context.target.root : outDir,\n relativePath,\n ),\n ]),\n ]);\n}\n\n/**\n * get a list of new packages installed by comparing the before and after state of devDependencies in package.json\n * @param before before state of devDependencies in package.json\n * @param after after state of devDependencies in package.json\n * @returns list of new package names\n */\nfunction getNewPackages(\n before: Record<string, string>,\n after: Record<string, string>,\n): string[] {\n return Object.keys(after).filter((name): name is string => !before[name]);\n}\n"],"file":"preset.js"}
|
package/lib/types.d.ts
CHANGED
@@ -1,4 +1,21 @@
|
|
1
1
|
import type { PackageJson } from 'read-pkg-up';
|
2
|
+
export interface PresetterConfig {
|
3
|
+
preset: string | string[];
|
4
|
+
config?: Record<string, Record<string, unknown> | string[]>;
|
5
|
+
scripts?: Record<string, string>;
|
6
|
+
variable?: Record<string, string>;
|
7
|
+
ignores?: IgnoreRule[];
|
8
|
+
noSymlinks?: string[];
|
9
|
+
}
|
10
|
+
export interface PresetAsset {
|
11
|
+
extends?: string[];
|
12
|
+
template?: TemplateMap | TemplateMapGenerator;
|
13
|
+
noSymlinks?: string[] | Generator<string[], 'variable'>;
|
14
|
+
scripts?: string;
|
15
|
+
variable?: Record<string, string>;
|
16
|
+
supplementaryConfig?: ConfigMap | ConfigMapGenerator;
|
17
|
+
supplementaryIgnores?: IgnoreRule[] | IgnoreRulesGenerator;
|
18
|
+
}
|
2
19
|
export interface PresetContext {
|
3
20
|
target: {
|
4
21
|
name: string;
|
@@ -14,8 +31,6 @@ export interface ResolvedPresetContext<F extends keyof PresetterConfig = 'config
|
|
14
31
|
[K in keyof Pick<PresetterConfig, Exclude<keyof PresetterConfig, F>>]: PresetterConfig[K];
|
15
32
|
};
|
16
33
|
}
|
17
|
-
export declare type PotentiallyPromise<T> = T | PromiseLike<T>;
|
18
|
-
export declare type Generator<R, K extends keyof PresetterConfig = 'config' | 'noSymlinks' | 'variable'> = (args: ResolvedPresetContext<K>) => PotentiallyPromise<R>;
|
19
34
|
declare type Path = string;
|
20
35
|
export declare type Template = string | Record<string, unknown>;
|
21
36
|
export declare type TemplateGenerator = Generator<Template>;
|
@@ -25,33 +40,16 @@ export declare type Config = string[] | Record<string, unknown>;
|
|
25
40
|
export declare type ConfigGenerator = Generator<Config>;
|
26
41
|
export declare type ConfigMap = Record<string, Path | Config | ConfigGenerator>;
|
27
42
|
export declare type ConfigMapGenerator = Generator<ConfigMap, 'variable'>;
|
28
|
-
export interface PresetAsset {
|
29
|
-
extends?: string[];
|
30
|
-
template?: TemplateMap | TemplateMapGenerator;
|
31
|
-
noSymlinks?: string[] | Generator<string[], 'variable'>;
|
32
|
-
scripts?: string;
|
33
|
-
variable?: Record<string, string>;
|
34
|
-
supplementaryConfig?: ConfigMap | ConfigMapGenerator;
|
35
|
-
}
|
36
|
-
export declare type RequiredResolution<F extends DynamicAssetField = DynamicAssetField> = PresetAsset[F] extends infer R ? R extends Generator<any, infer K> ? K : never : never;
|
37
|
-
export declare type DynamicAssetField = {
|
38
|
-
[F in keyof PresetAsset]-?: Generator<any, never> extends PresetAsset[F] ? Record<string, any> extends PresetAsset[F] ? F : never : never;
|
39
|
-
}[keyof PresetAsset];
|
40
|
-
export declare type DynamicAsset<F extends DynamicAssetField> = Exclude<PresetAsset[F], undefined | Generator<any>>[string] extends infer R ? R extends Generator<infer V> ? V : never : never;
|
41
|
-
export interface PresetTarget {
|
42
|
-
name: string;
|
43
|
-
root: string;
|
44
|
-
}
|
45
|
-
export interface PresetterConfig {
|
46
|
-
preset: string | string[];
|
47
|
-
config?: Record<string, Record<string, unknown> | string[]>;
|
48
|
-
scripts?: Record<string, string>;
|
49
|
-
variable?: Record<string, string>;
|
50
|
-
ignores?: IgnoreRule[];
|
51
|
-
noSymlinks?: string[];
|
52
|
-
}
|
53
43
|
export declare type IgnoreRule = string | number | Record<string, IgnorePath>;
|
54
44
|
export declare type IgnorePath = Array<string | number> | {
|
55
45
|
[key: string]: IgnorePath;
|
56
46
|
};
|
47
|
+
export declare type IgnoreRulesGenerator = Generator<IgnoreRule[], 'variable'>;
|
48
|
+
export declare type Generator<R, K extends keyof PresetterConfig = 'config' | 'noSymlinks' | 'variable'> = (args: ResolvedPresetContext<K>) => PotentiallyPromise<R>;
|
49
|
+
export declare type DynamicAssetField = {
|
50
|
+
[F in keyof PresetAsset]-?: Generator<any, never> extends PresetAsset[F] ? Record<string, any> extends PresetAsset[F] ? F : never : never;
|
51
|
+
}[keyof PresetAsset];
|
52
|
+
export declare type DynamicAsset<F extends DynamicAssetField> = Exclude<PresetAsset[F], undefined | Generator<any>>[string] extends infer R ? R extends Generator<infer V> ? V : never : never;
|
53
|
+
export declare type PotentiallyPromise<T> = T | PromiseLike<T>;
|
54
|
+
export declare type RequiredResolution<F extends DynamicAssetField = DynamicAssetField> = PresetAsset[F] extends infer R ? R extends Generator<any, infer K> ? K : never : never;
|
57
55
|
export {};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "presetter",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.1.0",
|
4
4
|
"engines": {
|
5
5
|
"node": ">=12.10.0"
|
6
6
|
},
|
@@ -55,7 +55,7 @@
|
|
55
55
|
"typescript": "^4.0.0"
|
56
56
|
},
|
57
57
|
"dependencies": {
|
58
|
-
"@npmcli/arborist": "^
|
58
|
+
"@npmcli/arborist": "^4.0.0",
|
59
59
|
"@npmcli/config": "^2.2.0",
|
60
60
|
"callsite-record": "^4.0.0",
|
61
61
|
"chalk": "^4.0.0",
|
@@ -65,6 +65,7 @@
|
|
65
65
|
"lodash": "^4.0.0",
|
66
66
|
"mvdan-sh": "^0.5.0",
|
67
67
|
"pupa": "^2.0.0",
|
68
|
+
"read-pkg": "^5.0.0",
|
68
69
|
"read-pkg-up": "^7.0.0",
|
69
70
|
"resolve-pkg": "^2.0.0",
|
70
71
|
"source-map-support": "^0.5.0",
|