presetter 3.1.0 → 3.3.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/README.md +7 -7
- package/lib/content.d.ts +1 -1
- package/lib/content.js +58 -129
- package/lib/directive.js +67 -196
- package/lib/error.js +12 -36
- package/lib/executable/entry.js +55 -73
- package/lib/executable/error.js +24 -55
- package/lib/executable/index.js +5 -23
- package/lib/index.js +20 -69
- package/lib/io.d.ts +1 -1
- package/lib/io.js +88 -170
- package/lib/package.js +58 -149
- package/lib/preset.js +160 -294
- package/lib/run.js +59 -127
- package/lib/scripts.js +52 -128
- package/lib/template.js +70 -139
- package/lib/types.d.ts +1 -0
- package/lib/types.js +2 -1
- package/package.json +9 -1
- package/lib/content.js.map +0 -1
- package/lib/directive.js.map +0 -1
- package/lib/error.js.map +0 -1
- package/lib/executable/entry.js.map +0 -1
- package/lib/executable/error.js.map +0 -1
- package/lib/executable/index.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/io.js.map +0 -1
- package/lib/package.js.map +0 -1
- package/lib/preset.js.map +0 -1
- package/lib/run.js.map +0 -1
- package/lib/scripts.js.map +0 -1
- package/lib/template.js.map +0 -1
- package/lib/types.js.map +0 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "presetter",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.3.0",
|
4
4
|
"engines": {
|
5
5
|
"node": ">=12.10.0"
|
6
6
|
},
|
@@ -25,7 +25,15 @@
|
|
25
25
|
"run": "./bin/run"
|
26
26
|
},
|
27
27
|
"main": "lib/index.js",
|
28
|
+
"module": "lib/index.mjs",
|
28
29
|
"types": "lib/index.d.ts",
|
30
|
+
"exports": {
|
31
|
+
".": {
|
32
|
+
"require": "./lib/index.js",
|
33
|
+
"import": "./lib/index.mjs"
|
34
|
+
},
|
35
|
+
"./package.json": "./package.json"
|
36
|
+
},
|
29
37
|
"repository": {
|
30
38
|
"type": "git",
|
31
39
|
"url": "git+https://github.com/alvis/presetter.git"
|
package/lib/content.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/content.ts"],"names":["customise","template","custom","Array","isArray","split","join","generateContent","assets","context","resolvedContext","resolveContext","resolvedTemplate","resolveDynamicMap","Object","fromEntries","Promise","all","entries","map","relativePath","templateConfig","customConfig","config","getConfigKey","variable","filename","replace","getVariable","variables","asset","filter","variableFromPresets","reduce","merged","variableWithCustomConfig","variableContext","customList","noSymlinks","assetList","flat","Set","field","templates","content","Function","value"],"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 Collection of config related helpers\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2021 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport { basename, extname, isAbsolute } from 'path';\n\nimport { loadDynamic, loadFile } from './io';\nimport { merge, template } from './template';\n\nimport type {\n DynamicAsset,\n DynamicAssetField,\n PresetAsset,\n PresetContext,\n RequiredResolution,\n ResolvedPresetContext,\n Template,\n} from './types';\n\n/**\n * customise the template with customisation from .presetterrc\n * @param template template configuration\n * @param custom content to be merged with the template configuration\n * @returns customised configuration\n */\nexport function customise(\n template: Template,\n custom?: string[] | Record<string, unknown>,\n): Template {\n if (typeof template === 'string' && Array.isArray(custom)) {\n return merge(template.split('\\n'), custom).join('\\n');\n } else if (typeof template === 'object' && !Array.isArray(custom)) {\n return merge(template, custom);\n } else {\n return template;\n }\n}\n/**\n * generate configuration content from preset with user customisation\n * @param assets list of preset assets\n * @param context context about the target project and any customisation in .presetterrc\n * @returns a map of configuration content\n */\nexport async function generateContent(\n assets: PresetAsset[],\n context: PresetContext,\n): Promise<Record<string, Template>> {\n const resolvedContext = await resolveContext(assets, context);\n\n const resolvedTemplate = await resolveDynamicMap(\n assets,\n resolvedContext,\n 'template',\n );\n\n // merge templates with custom configuration\n const custom = Object.fromEntries(\n await Promise.all(\n Object.entries(resolvedTemplate).map(\n async ([relativePath, templateConfig]): Promise<[string, Template]> => {\n const customConfig =\n resolvedContext.custom.config[getConfigKey(relativePath)];\n\n return [relativePath, customise(templateConfig, customConfig)];\n },\n ),\n ),\n );\n\n return template(custom, resolvedContext.custom.variable);\n}\n\n/**\n * compute the corresponding field within the config field of .presetterrc\n * @param filename symlink name\n * @returns field name in config\n */\nexport function getConfigKey(filename: string): string {\n return basename(filename, extname(filename))\n .replace(/^\\./, '')\n .replace(/rc$/, '')\n .replace(/\\.config$/, '');\n}\n\n/**\n * combine the default variables from presets with custom variables\n * @param assets list of preset assets\n * @param context context about the target project and any customisation in .presetterrc\n * @returns combined variables\n */\nexport function getVariable(\n assets: PresetAsset[],\n context: PresetContext,\n): Record<string, string> {\n const variables = assets\n .map((asset) => asset.variable)\n .filter((variable): variable is Record<string, string> => !!variable);\n\n const variableFromPresets = variables.reduce(\n (merged, variable) => merge(merged, variable),\n {},\n );\n\n const variableWithCustomConfig = merge(\n variableFromPresets,\n context.custom.variable,\n );\n\n return { ...variableWithCustomConfig };\n}\n\n/**\n * resolve context values which may be dynamic\n * @param assets list of preset assets\n * @param context context about the target project and any customisation in .presetterrc\n * @returns a context with no further dynamic content\n */\nexport async function resolveContext(\n assets: PresetAsset[],\n context: PresetContext,\n): Promise<ResolvedPresetContext> {\n const variableContext: ResolvedPresetContext<'variable'> = {\n ...context,\n custom: {\n ...context.custom,\n variable: getVariable(assets, context),\n },\n };\n\n const config = merge(\n await resolveDynamicMap(assets, variableContext, 'supplementaryConfig'),\n context.custom.config,\n );\n\n const customList = context.custom.noSymlinks ?? [];\n const assetList = assets.map(async ({ noSymlinks }) =>\n loadDynamic(noSymlinks ?? [], variableContext),\n );\n const noSymlinks = [...(await Promise.all(assetList)), ...customList].flat();\n\n return {\n ...variableContext,\n custom: {\n ...variableContext.custom,\n config,\n noSymlinks: [...new Set(noSymlinks)],\n },\n };\n}\n\n/**\n * resolve a dynamic asset content\n * @param assets list of preset assets\n * @param context arguments to be passed to the generator function\n * @param field field name of PresetAsset to be resolved\n * @returns content of the resolved field\n */\nexport async function resolveDynamicMap<F extends DynamicAssetField>(\n assets: PresetAsset[],\n context: ResolvedPresetContext<RequiredResolution<F>>,\n field: F,\n): Promise<Record<string, DynamicAsset<F>>> {\n // load templated configuration from presets\n const templates = await Promise.all(\n assets.map(async (asset) => {\n const content = asset[field];\n\n return Object.fromEntries(\n await Promise.all(\n Object.entries(\n content instanceof Function\n ? await content(context as ResolvedPresetContext)\n : { ...content },\n ).map(\n async ([relativePath, value]): Promise<[string, any]> => [\n relativePath,\n // load a file if it's a valid path only\n typeof value === 'string' && isAbsolute(value)\n ? await loadFile(value)\n : await loadDynamic(value, context as ResolvedPresetContext),\n ],\n ),\n ),\n );\n }),\n );\n\n // merge all maps\n return templates.reduce((merged, map) => merge(merged, map), {});\n}\n"],"file":"content.js"}
|
package/lib/directive.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/directive.ts"],"names":["applyRegex","importRegex","isApplyDirective","value","exec","isImportDirective","isDirective","resolveDirective","config","context","packages","Set","stringifiedConfig","stringifyConfigObject","importMap","Object","fromEntries","values","map","packageName","key","resolveApplyDirective","directiveMeta","directive","args","match","_","_prefix","_importBracket","importName","resolvedArgs","arg","stringifyValue","argsExpression","join","resolvedName","registerUsage","resolveImportDirective","stringifyObjectValue","Array","isArray","stringifyConfigArray","entries","JSON","stringify","add","packageKey","findIndex","name","named"],"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 Collection of helpers for parsing configuration\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2021 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport type { PresetContext } from './types';\n\n/** syntax for an apply direc ti ve */\nexport type ApplyDirective = `@apply ${string}` | `@apply ${string}[${string}]`;\n\n/** syntax for an import directive */\nexport type ImportDirective =\n | `@import ${string}`\n | `@import ${string}[${string}]`;\n\n/** context that pass down to all parsers */\ninterface ConfigResolutionContext extends PresetContext {\n /** a set of packages to be used in the output */\n packages: Set<string>;\n}\n\n/** syntax for an apply directive */\nconst applyRegex =\n /^@apply ((\\.+\\/|@)?[a-zA-Z]+[a-zA-Z0-9_/.-]*[a-zA-Z0-9_]+)(\\[([a-zA-Z]+[a-zA-Z0-9_.]*)\\])?$/;\n\n/** syntax for an import directive */\nconst importRegex =\n /^@import ((\\.+\\/|@)?[a-zA-Z]+[a-zA-Z0-9_/.-]*[a-zA-Z0-9_]+)(\\[([a-zA-Z]+[a-zA-Z0-9_.]*)\\])?$/;\n\n/**\n * indicate whether the given value is an apply directive\n * @param value value to be tested\n * @returns true if the value is an apply directive\n */\nexport function isApplyDirective(value: unknown): value is ApplyDirective {\n return typeof value === 'string' && !!applyRegex.exec(value);\n}\n\n/**\n * indicate whether the given value is an import directive\n * @param value value to be tested\n * @returns true if the value is an import directive\n */\nexport function isImportDirective(value: unknown): value is ImportDirective {\n return typeof value === 'string' && !!importRegex.exec(value);\n}\n\n/**\n * indicate whether the given value is a directive\n * @param value value to be tested\n * @returns true if the value is a directive\n */\nexport function isDirective(\n value: unknown,\n): value is ApplyDirective | ImportDirective {\n return isApplyDirective(value) || isImportDirective(value);\n}\n\n/**\n * resolve directives from configuration options\n * @param config configuration options\n * @param context background context about the configuration\n * @returns resolved configuration options with directive replaced\n */\nexport function resolveDirective(\n config: Record<string, unknown>,\n context: PresetContext,\n): {\n importMap: Record<string, string>;\n stringifiedConfig: string;\n} {\n const packages = new Set<string>();\n const stringifiedConfig = stringifyConfigObject(config, {\n ...context,\n packages,\n });\n\n const importMap = Object.fromEntries(\n [...packages.values()].map((packageName, key) => [\n packageName,\n `import${key}`,\n ]),\n );\n\n return { importMap, stringifiedConfig };\n}\n\n/**\n * resolve an apply directive\n * @param directiveMeta a potential directive in the form of [directive, options]\n * @param context shared context passed from the upstream\n * @returns resolved string or null if no directive is found\n */\nfunction resolveApplyDirective(\n directiveMeta: unknown[],\n context: ConfigResolutionContext,\n): string | null {\n const [directive, ...args] = directiveMeta;\n const { packages } = context;\n\n if (typeof directive === 'string') {\n const match = applyRegex.exec(directive);\n\n if (match) {\n const [_, packageName, _prefix, _importBracket, importName] = match;\n const resolvedArgs = args.map((arg) => stringifyValue(arg, context));\n const argsExpression = `[${resolvedArgs.join(', ')}]`;\n\n const resolvedName = registerUsage(packages, packageName, importName);\n\n return `${resolvedName}(...(${argsExpression} as const))`;\n }\n }\n\n // return null for a non-match\n return null;\n}\n\n/**\n * resolve an import directive\n * @param directive a potential directive string\n * @param context shared context passed from the upstream\n * @returns resolved string or null if no directive is found\n */\nfunction resolveImportDirective(\n directive: string,\n context: ConfigResolutionContext,\n): string | null {\n const { packages } = context;\n const match = importRegex.exec(directive);\n\n if (match) {\n const [_, packageName, _prefix, _importBracket, importName] = match;\n\n return registerUsage(packages, packageName, importName);\n }\n\n // return null for a non-match\n return null;\n}\n\n/**\n * stringify a value which has a type object\n * @param value the value to be stringified\n * @param context shared context passed from the upstream\n * @returns stringified value\n */\nfunction stringifyObjectValue(\n value: Record<string, any> | any[] | null,\n context: ConfigResolutionContext,\n): string {\n if (Array.isArray(value)) {\n return (\n resolveApplyDirective(value, context) ??\n stringifyConfigArray(value, context)\n );\n } else if (value !== null) {\n return stringifyConfigObject(value, context);\n } else {\n return 'null';\n }\n}\n\n/**\n * stringify an array\n * @param config an object to be parsed\n * @param context shared context passed from the upstream\n * @returns stringified object\n */\nfunction stringifyConfigArray(\n config: unknown[],\n context: ConfigResolutionContext,\n): string {\n const values: string[] = config.map((value) =>\n stringifyValue(value, context),\n );\n\n return `[${values.join(', ')}]`;\n}\n\n/**\n * stringify an object\n * @param config an object to be parsed\n * @param context shared context passed from the upstream\n * @returns stringified object\n */\nfunction stringifyConfigObject(\n config: Record<string, any>,\n context: ConfigResolutionContext,\n): string {\n const values: string[] = Object.entries(config).map(([key, value]) => {\n return `${JSON.stringify(key)}: ${stringifyValue(value, context)}`;\n });\n\n return `{${values.join(', ')}}`;\n}\n\n/**\n * stringify a value\n * @param value the value to be stringified\n * @param context shared context passed from the upstream\n * @returns stringified value\n */\nfunction stringifyValue(\n value: unknown,\n context: ConfigResolutionContext,\n): string {\n switch (typeof value) {\n case 'string':\n return resolveImportDirective(value, context) ?? JSON.stringify(value);\n case 'object':\n return stringifyObjectValue(value, context);\n case 'boolean':\n case 'number':\n default:\n return JSON.stringify(value);\n }\n}\n\n/**\n * add the needed package name to the registry and return its resolved name\n * @param packages package registry\n * @param packageName name of the package to be imported\n * @param importName named import to be used\n * @returns resolved symbol\n */\nfunction registerUsage(\n packages: Set<string>,\n packageName: string,\n importName?: string,\n): string {\n // add package and import to the register\n packages.add(packageName);\n\n // replace the directive with the value path\n const packageKey = [...packages.values()].findIndex(\n (name) => name === packageName,\n );\n\n const named = importName ? `.${importName}` : '';\n\n return `import${packageKey}${named}`;\n}\n"],"file":"directive.js"}
|
package/lib/error.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/error.ts"],"names":["wrap","promise","message","error","Error"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeA,IAAf,CACLC,OADK,EAELC,OAFK,EAGO;AACZ,MAAI;AACF,WAAO,MAAMD,OAAb;AACD,GAFD,CAEE,OAAOE,KAAP,EAAc;AACd,QAAIA,KAAK,YAAYC,KAArB,EAA4B;AAC1BD,MAAAA,KAAK,CAACD,OAAN,GAAiB,GAAEA,OAAQ,KAAIC,KAAK,CAACD,OAAQ,EAA7C;AACD;;AAED,UAAMC,KAAN;AACD;AACF","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 errors\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2020 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\n/**\n * prepend a rejected error message with a better explanation\n * @param promise a promise to be resolved\n * @param message a custom message to be prepended to any rejected message\n * @returns wrapped error\n */\nexport async function wrap<T>(\n promise: Promise<T>,\n message: string,\n): Promise<T> {\n try {\n return await promise;\n } catch (error) {\n if (error instanceof Error) {\n error.message = `${message}: ${error.message}`;\n }\n\n throw error;\n }\n}\n"],"file":"error.js"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../../source/executable/entry.ts"],"names":["useCommand","command","describe","builder","yargs","positional","required","type","description","help","handler","argv","preset","bootstrapCommand","option","only","runCommand","usage","demandCommand","task","args","_","map","arg","toString","unsetCommand","entry","process","showHelpOnFail","parse"],"mappings":";;;;;;;AAeA;;AACA;;AAEA;;AACA;;;;AAnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA,MAAMA,UAAsE,GAAG;AAC7EC,EAAAA,OAAO,EAAE,gBADoE;AAE7EC,EAAAA,QAAQ,EAAE,2CAFmE;AAG7EC,EAAAA,OAAO,EAAGC,KAAD,IACPA,KAAK,CACFC,UADH,CACc,QADd,EACwB;AACpBC,IAAAA,QAAQ,EAAE,IADU;AAEpBC,IAAAA,IAAI,EAAE,QAFc;AAGpBC,IAAAA,WAAW,EAAE;AAHO,GADxB,EAMGC,IANH,EAJ2E;AAW7EC,EAAAA,OAAO,EAAE,MAAOC,IAAP,IAAgB,yBAAY,GAAGA,IAAI,CAACC,MAApB;AAXoD,CAA/E;AAcA,MAAMC,gBAGL,GAAG;AACFZ,EAAAA,OAAO,EAAE,WADP;AAEFC,EAAAA,QAAQ,EAAE,qDAFR;AAGFC,EAAAA,OAAO,EAAGC,KAAD,IACPA,KAAK,CACFU,MADH,CACU,MADV,EACkB;AACdP,IAAAA,IAAI,EAAE,QADQ;AAEdC,IAAAA,WAAW,EAAE;AAFC,GADlB,EAKGC,IALH,EAJA;AAUFC,EAAAA,OAAO,EAAE,MAAOC,IAAP,IAAgB;AACvB,UAAM;AAAEI,MAAAA;AAAF,QAAWJ,IAAjB,CADuB,CAGvB;;AACA,QAAI,CAACI,IAAD,KAAU,MAAM,yBAAWA,IAAX,CAAhB,CAAJ,EAAuC;AACrC,YAAM,8BAAN;AACD;AACF;AAjBC,CAHJ;AAuBA,MAAMC,UAAyB,GAAG;AAChCf,EAAAA,OAAO,EAAE,KADuB;AAEhCC,EAAAA,QAAQ,EAAE,uBAFsB;AAGhCC,EAAAA,OAAO,EAAGC,KAAD,IAAWA,KAAK,CAACa,KAAN,CAAY,YAAZ,EAA0BC,aAA1B,EAHY;AAIhCR,EAAAA,OAAO,EAAE,MAAOC,IAAP,IAAgB;AACvB;AACA,UAAM,GAAGQ,IAAH,EAAS,GAAGC,IAAZ,IAAoBT,IAAI,CAACU,CAAL,CAAOC,GAAP,CAAYC,GAAD,IAASA,GAAG,CAACC,QAAJ,EAApB,CAA1B;;AAEA,UAAM,cAAIL,IAAJ,EAAUC,IAAV,CAAN;AACD;AAT+B,CAAlC;AAYA,MAAMK,YAA2B,GAAG;AAClCxB,EAAAA,OAAO,EAAE,OADyB;AAElCC,EAAAA,QAAQ,EAAE,4CAFwB;AAGlCQ,EAAAA,OAAO,EAAE,YAAY;AAHa,CAApC;AAMA;AACA;AACA;AACA;;AACO,eAAegB,KAAf,GAAsC;AAC3C,QAAM,IAAK,GAAGN,IAAR,IAAgBO,OAAO,CAAChB,IAA9B;AAEA,QAAMP,eACHa,KADG,CACG,uCADH,EAEHW,cAFG,CAEY,IAFZ,EAGH3B,OAHG,CAGKD,UAHL,EAIHC,OAJG,CAIKY,gBAJL,EAKHZ,OALG,CAKKe,UALL,EAMHf,OANG,CAMKwB,YANL,EAOHP,aAPG,GAQHW,KARG,CAQGT,IARH,CAAN;AASD","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 Entry point for the command line interface (CLI)\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2019 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport { pathExists } from 'fs-extra';\nimport yargs from 'yargs';\n\nimport { bootstrapPreset, setupPreset, unsetPreset } from '#preset';\nimport { run } from '#run';\n\nimport type { CommandModule } from 'yargs';\n\nconst useCommand: CommandModule<Record<string, unknown>, { preset: string }> = {\n command: 'use <preset..>',\n describe: 'adopt the specified preset to the project',\n builder: (yargs) =>\n yargs\n .positional('preset', {\n required: true as const,\n type: 'string',\n description: 'proceed only if the specified file exists',\n })\n .help(),\n handler: async (argv) => setupPreset(...argv.preset),\n};\n\nconst bootstrapCommand: CommandModule<\n Record<string, unknown>,\n { only?: string }\n> = {\n command: 'bootstrap',\n describe: 'setup the project according to the specified preset',\n builder: (yargs) =>\n yargs\n .option('only', {\n type: 'string',\n description: 'proceed only if the specified file exists',\n })\n .help(),\n handler: async (argv) => {\n const { only } = argv;\n\n // only proceed if the specified file exists\n if (!only || (await pathExists(only))) {\n await bootstrapPreset();\n }\n },\n};\n\nconst runCommand: CommandModule = {\n command: 'run',\n describe: 'run a template script',\n builder: (yargs) => yargs.usage('run <task>').demandCommand(),\n handler: async (argv) => {\n // get the options\n const [, task, ...args] = argv._.map((arg) => arg.toString());\n\n await run(task, args);\n },\n};\n\nconst unsetCommand: CommandModule = {\n command: 'unset',\n describe: 'remove all artifacts created by the preset',\n handler: async () => unsetPreset(),\n};\n\n/**\n * provide a command line interface\n * @returns the command entered together with its options\n */\nexport async function entry(): Promise<void> {\n const [, , ...args] = process.argv;\n\n await yargs\n .usage('⚙ presetter: your preset configurator')\n .showHelpOnFail(true)\n .command(useCommand)\n .command(bootstrapCommand)\n .command(runCommand)\n .command(unsetCommand)\n .demandCommand()\n .parse(args);\n}\n"],"file":"entry.js"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../../source/executable/error.ts"],"names":["handleError","error","process","stdout","isTTY","type","chalk","red","bold","name","message","white","trim","record","forError","render"],"mappings":";;;;;;;AAiBA;;AACA;;AACA;;;;AAnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAMA;AACA;AACA;AACA;AACO,eAAeA,WAAf,CAA2BC,KAA3B,EAAwD;AAC7D,MAAI,CAACC,OAAO,CAACC,MAAR,CAAeC,KAApB,EAA2B;AACzB;AACA,uBAAKH,KAAL;AACD,GAHD,MAGO;AACL;AACA,UAAMI,IAAI,GAAGC,eAAMC,GAAN,CAAUC,IAAV,CAAgB,IAAGP,KAAK,CAACQ,IAAK,GAA9B,CAAb;;AACA,UAAMC,OAAO,GAAGJ,eAAMK,KAAN,CAAYH,IAAZ,CAAiBP,KAAK,CAACS,OAAN,CAAcE,IAAd,EAAjB,CAAhB;;AACA,uBAAM,GAAEP,IAAK,IAAGK,OAAQ,EAAxB,EAJK,CAML;;AACA,UAAMG,MAAM,GAAG,6BAAqB;AAClCC,MAAAA,QAAQ,EAAEb;AADwB,KAArB,CAAf;;AAIA,QAAIY,MAAJ,EAAY;AACV;AACA,yBAAK,MAAMA,MAAM,CAACE,MAAP,CAAc,EAAd,CAAX;AACD;AACF;AACF","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 error\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2019 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\n/* istanbul ignore file */\n\nimport createCallsiteRecord from 'callsite-record';\nimport chalk from 'chalk';\nimport { warn } from 'console';\n\n/**\n * print error nicely on console\n * @param error the error to be reported\n */\nexport async function handleError(error: Error): Promise<void> {\n if (!process.stdout.isTTY) {\n // don't print formatted error message if the process is not run on TTY\n warn(error);\n } else {\n // print the error message\n const type = chalk.red.bold(`[${error.name}]`);\n const message = chalk.white.bold(error.message.trim());\n warn(`${type} ${message}`);\n\n // print the callsite record\n const record = createCallsiteRecord({\n forError: error,\n });\n\n if (record) {\n warn();\n warn(await record.render({}));\n }\n }\n}\n"],"file":"error.js"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../../source/executable/index.ts"],"names":["catch","handleError"],"mappings":";;AAiBA;;AACA;;AAlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAKA,oBAAQA,KAAR,CAAcC,kBAAd","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 A command line interface for presetter\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2019 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\n/* istanbul ignore file */\n\nimport { entry } from './entry';\nimport { handleError } from './error';\n\nentry().catch(handleError);\n"],"file":"index.js"}
|
package/lib/index.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/index.ts"],"names":[],"mappings":";;;;;;AAiBA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","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 Collection of public types\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2020 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\n/* istanbul ignore file */\n\nexport * from '#content';\nexport * from '#directive';\nexport * from '#io';\nexport * from '#template';\n\nexport * from '#types';\n"],"file":"index.js"}
|
package/lib/io.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/io.ts"],"names":["INDENT","loadDynamic","value","context","loadFile","path","defaultFormat","content","toString","JSON","parse","serialiseContent","destination","stringify","writeFiles","root","config","pathMap","key","Object","entries","linkFiles","configurationLink","file","link","to","linkExists","recursive","unlinkFiles","name"],"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 Collection of io helpers\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 {\n ensureFile,\n lstat,\n mkdir,\n pathExists,\n readFile,\n readlink,\n symlink,\n unlink,\n writeFile,\n} from 'fs-extra';\nimport { dump, load } from 'js-yaml';\nimport { basename, dirname, extname, relative, resolve } from 'path';\n\nimport type {\n Generator,\n PresetterConfig,\n ResolvedPresetContext,\n Template,\n} from './types';\n\n// JSON format\nconst INDENT = 2;\n\n/**\n * load a potentially dynamic content\n * @param value content to be loaded\n * @param context context to be supplied to the generator\n * @returns resolved content\n */\nexport async function loadDynamic<\n R extends Template | string[],\n K extends keyof PresetterConfig,\n>(\n value:\n | string // path to a template file\n | R // template content\n | Generator<R, K>,\n context: ResolvedPresetContext<K>,\n): Promise<R> {\n if (typeof value === 'function') {\n return value(context);\n } else if (typeof value === 'string' && (await pathExists(value))) {\n return (await loadFile(value)) as R;\n } else {\n return value as R;\n }\n}\n\n/**\n * load the content of a file\n * @param path file path to be loaded\n * @param defaultFormat default format of the file\n * @returns content of the file\n */\nexport async function loadFile(\n path: string,\n defaultFormat?: 'json' | 'yaml',\n): Promise<Record<string, unknown>>;\nexport async function loadFile(\n path: string,\n defaultFormat?: 'text',\n): Promise<string>;\nexport async function loadFile(\n path: string,\n defaultFormat: 'json' | 'yaml' | 'text' = 'text',\n): Promise<string | Record<string, unknown>> {\n const content = (await readFile(path)).toString();\n\n // parse the content depending on the extension\n switch (extname(path) || `.${defaultFormat}`) {\n case '.json':\n return JSON.parse(content) as Record<string, unknown>;\n case '.yaml':\n case '.yml':\n return load(content) as Record<string, unknown>;\n default:\n return content;\n }\n}\n\n/**\n * serialise a configuration content to the right format according to its destination\n * @param destination the path to which the content will be written\n * @param content configuration content\n * @returns serialised content\n */\nexport function serialiseContent(\n destination: string,\n content: Template,\n): string {\n if (typeof content === 'string') {\n return content;\n }\n\n switch (extname(destination)) {\n case '.yaml':\n case '.yml':\n return dump(content);\n case '.json':\n default:\n return JSON.stringify(content, null, INDENT);\n }\n}\n\n/**\n * write all generated configuration to their destination\n * @param root path to the target project root\n * @param config a map of configuration content and its path to be written\n * @param pathMap a map of keys in the config map and their destination path\n */\nexport async function writeFiles(\n root: string,\n config: Record<string, Template>,\n pathMap: Record<string, string>,\n): Promise<void> {\n for (const [key, content] of Object.entries(config)) {\n const destination = pathMap[key];\n\n // write content to the destination path\n if (\n // file don't exist\n !(await pathExists(destination)) ||\n // content to be written under the configurations folder\n destination !== resolve(root, key)\n ) {\n info(`Generating ${key}`);\n\n // ensure that all parent folders exist to avoid errors from writeFile\n await ensureFile(destination);\n\n // write content to the destination path\n await writeFile(destination, serialiseContent(destination, content));\n } else {\n info(`Skipping ${key}`);\n }\n }\n}\n\n/**\n * link generated files to the project root\n * @param root path to the target project root\n * @param configurationLink map of symlinks to its real path\n */\nexport async function linkFiles(\n root: string,\n configurationLink: Record<string, string>,\n): Promise<void> {\n for (const [file, destination] of Object.entries(configurationLink)) {\n const link = resolve(root, file);\n const to = relative(dirname(link), destination);\n\n // create links only if the path really doesn't exist\n if (\n !(await linkExists(link)) &&\n !(await pathExists(link)) &&\n // for files that mean to be created directly on the target project root, not via symlink\n to !== basename(to)\n ) {\n info(`Linking ${relative(root, link)} => ${to}`);\n await mkdir(dirname(link), { recursive: true });\n await symlink(to, link);\n } else if (to !== basename(to)) {\n info(`Skipping ${relative(root, link)} => ${to}`);\n }\n }\n}\n\n/**\n * unlink generated files from the project root\n * @param root path to the target project root\n * @param configurationLink map of symlinks to its real path\n */\nexport async function unlinkFiles(\n root: string,\n configurationLink: Record<string, string>,\n): Promise<void> {\n for (const [name, destination] of Object.entries(configurationLink)) {\n try {\n const link = await readlink(resolve(root, name));\n const to = relative(root, destination);\n\n if (link === to) {\n info(`Removing ${name}`);\n await unlink(resolve(root, name));\n continue;\n }\n } catch {\n // do nothing\n }\n\n info(`Skipping ${name}`);\n }\n}\n\n/**\n * check if path is a symlink\n * @param path file path to be checked\n * @returns true if it is a symlink\n */\nasync function linkExists(path: string): Promise<boolean> {\n try {\n // NOTE use lstat instead of pathExists as it checks the link not the linked path\n await lstat(path);\n\n return true;\n } catch {\n return false;\n }\n}\n"],"file":"io.js"}
|
package/lib/package.js.map
DELETED
@@ -1 +0,0 @@
|
|
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.map
DELETED
@@ -1 +0,0 @@
|
|
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/run.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/run.ts"],"names":["TemporaryPackageJSONManager","constructor","packageDetail","package","path","shouldRestore","replace","task","json","scripts","template","target","PADDING","content","JSON","stringify","restore","then","run","argv","manager","isInterrupted","process","removeListener","SIGINT","exit","on","bind","exitCode","cwd","stdio","reject","shell"],"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 Run a task\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2019 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport execa from 'execa';\nimport { move, pathExistsSync, unlink, writeFile } from 'fs-extra';\nimport { once } from 'lodash';\nimport { basename, dirname, resolve } from 'path';\n\nimport { wrap } from './error';\nimport { getPackage } from './package';\nimport { getContext, getScripts } from './preset';\nimport { composeScripts } from './scripts';\n\nimport type { Package } from './package';\n\n/** manage ~package.json */\nclass TemporaryPackageJSONManager {\n private package: Package;\n private path: string;\n\n private shouldRestore: boolean;\n\n /**\n * create a temporary package.json manager\n * @param packageDetail the content of the target project's package.json\n */\n constructor(packageDetail: Package) {\n this.path = resolve(\n dirname(packageDetail.path),\n '~' + basename(packageDetail.path),\n );\n\n this.package = packageDetail;\n this.shouldRestore = !pathExistsSync(this.path);\n }\n\n /**\n * setup an environment for running a task with presetter\n * @param task name of the task to be replaced by the template\n */\n public async replace(task: string): Promise<void> {\n // delete the current task to avoid duplicated task running\n delete this.package.json.scripts[task];\n\n // get the merged script definitions\n const template = await getScripts(await getContext());\n this.package.json.scripts = composeScripts({\n template,\n target: {\n ...this.package.json.scripts,\n },\n });\n\n // move the existing package.json to a safe place\n if (this.shouldRestore) {\n await wrap(\n move(this.package.path, this.path),\n `failed to backup package.json`,\n );\n }\n\n // generate a temporary package.json in order to let npm to see all the definitions\n const PADDING = 2;\n const content = JSON.stringify(this.package.json, null, PADDING);\n await wrap(\n writeFile(this.package.path, content),\n 'failed to write to package.json',\n );\n }\n\n /**\n * clean up the temporary artifacts\n */\n public async restore(): Promise<void> {\n if (this.shouldRestore) {\n await wrap(\n unlink(this.package.path).then(async () =>\n move(this.path, this.package.path),\n ),\n `failed to restore package.json`,\n );\n }\n }\n}\n\n/**\n * run a task defined in the combined script definitions\n * @param task the name of the task to be run\n * @param argv parameters supplied for the task\n */\nexport async function run(task: string, argv: string[] = []): Promise<void> {\n // try to find the target project's package.json\n const packageDetail = await getPackage();\n const manager = new TemporaryPackageJSONManager(packageDetail);\n\n // setup\n await manager.replace(task);\n const restore = once(async (isInterrupted: boolean): Promise<void> => {\n // stop listening to SIGINT in order to avoid double handling during the restoration process\n process.removeListener('SIGINT', restore);\n\n // restore package.json\n await manager.restore();\n\n if (isInterrupted) {\n const SIGINT = 130;\n process.exit(SIGINT);\n }\n });\n process.on('SIGINT', restore.bind(run, true));\n\n // run the task\n const { exitCode } = await execa('npm', ['run', task, '--', ...argv], {\n cwd: dirname(packageDetail.path),\n stdio: 'inherit',\n reject: false,\n shell: true,\n });\n\n // restore package.json\n await restore(false);\n\n // set the exit code as the same as the returned\n if (exitCode > 0) {\n process.exit(exitCode);\n }\n}\n"],"file":"run.js"}
|
package/lib/scripts.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/scripts.ts"],"names":["parser","syntax","NewParser","printer","NewPrinter","composeScripts","args","template","target","command","ast","Parse","Walk","node","replaceRunnerNode","statement","Stmts","isNodeType","Cmd","Print","trim","error","Error","type","NodeType","resolveRunner","context","parts","split","destinations","slice","filter","task","startsWith","destinationArgs","part","map","destination","expandedCommand","undefined","join","Args","Parts","Value","resolvedCommand"],"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 Handle script merging\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2019 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport { mapValues } from 'lodash';\nimport { syntax } from 'mvdan-sh';\nimport { basename } from 'path';\n\nimport type { CallExpr, Node, Stmt, Subshell } from 'mvdan-sh';\n\n/** pseudo type for representing the name of a script */\ntype ScriptName = string;\n\n/** pseudo type for representing the command */\ntype Command = string;\n\n/** collection of scripts */\nexport type Script = Record<ScriptName, Command>;\n\n// shell command parser\nconst parser = syntax.NewParser();\n\n// shell command generator\nconst printer = syntax.NewPrinter();\n\n/** resource context to be passed for processing */\ninterface ScriptContext {\n /** scripts defined from the template */\n template: Script;\n /** scripts defined from target's package.json */\n target: Script;\n}\n\n/**\n * merge the script definitions from the template and the target package.json\n * @param args template and customised scripts to be merged\n * @param args.template scripts defined from the template\n * @param args.target scripts defined from target's package.json\n * @returns a dictionary of merged definitions\n */\nexport function composeScripts(args: {\n /** scripts defined from the template */\n template: Script;\n /** scripts defined from target's package.json */\n target: Script;\n}): Script {\n const { template, target } = args;\n\n return mapValues({ ...template, ...target }, (command): string => {\n try {\n // parse the shell command into its ast\n const ast = parser.Parse(command);\n\n // walk through the tree and replace any call to the runner e.g. preset task1 task2 -- --help\n syntax.Walk(ast, (node) => replaceRunnerNode(node, { template, target }));\n\n // remove any unnecessary subshell\n const [statement] = ast.Stmts;\n if (isNodeType(statement.Cmd, 'Subshell')) {\n statement.Cmd = statement.Cmd.Stmts[0].Cmd;\n }\n\n // generate the code from ast\n return printer.Print(ast).trim();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw error;\n } else {\n // parser.Parse may throw an empty object as an error, catch here\n throw new Error(`failed to parse command: ${command}`);\n }\n }\n });\n}\n\n/**\n * typeguard helper for different node type\n * @param node a node to be tested\n * @param type node type\n * @returns true if the node is the specified type\n */\nfunction isNodeType(node: Node, type: 'CallExpr'): node is CallExpr;\nfunction isNodeType(node: Node, type: 'Stmt'): node is Stmt;\nfunction isNodeType(node: Node, type: 'Subshell'): node is Subshell;\nfunction isNodeType(node: Node, type: string): boolean {\n return syntax.NodeType(node) === type;\n}\n\n/**\n * resolve a runner command\n * @param command the command to be replaced\n * @param context resource context\n * @returns the resolved command\n */\nfunction resolveRunner(command: string, context: ScriptContext): string {\n const parts = command.split(' ');\n\n // extract tasks and their arguments\n const destinations = parts.slice(1).filter((task) => !task.startsWith('-'));\n const destinationArgs = parts.filter(\n (part) => part !== '--' && part.startsWith('-'),\n );\n\n // resolve tasks into its full form e.g. task1 task2\n return destinations\n .map((destination) => {\n const expandedCommand =\n context.template[destination] ||\n (context.target[destination] === command\n ? undefined\n : context.target[destination]);\n\n if (expandedCommand === undefined) {\n throw new Error(`\"${destination}\" cannot be resolved in \"${command}\"`);\n }\n\n return [expandedCommand, ...destinationArgs].join(' ');\n })\n .join(' && ');\n}\n\n/**\n * replace a runner node with the actual command\n * @param node an expression node\n * @param context resource context\n * @returns boolean true for no error\n */\nfunction replaceRunnerNode(node: Node, context: ScriptContext): boolean {\n // replace only it's a runner call, not anything else\n if (isNodeType(node, 'Stmt') && isNodeType(node.Cmd, 'CallExpr')) {\n // parse assigned arguments e.g. task1 args --help\n const parts: string[] = node.Cmd.Args.map((part) => part.Parts[0].Value);\n\n // only resolve if the `run` cli shipped in this package is invoke\n if (basename(parts[0]) === 'run') {\n // resolve tasks into its full form e.g. task1 task2\n const resolvedCommand = resolveRunner(parts.join(' '), context);\n\n // replace the task definition with its expanded statement\n node.Cmd = parser.Parse(`(${resolvedCommand})`).Stmts[0].Cmd;\n }\n }\n\n return true;\n}\n"],"file":"scripts.js"}
|
package/lib/template.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../source/template.ts"],"names":["filter","subject","ignores","fieldsToIgnore","ignore","Array","isArray","_","key","includes","distilled","Object","fromEntries","entries","moreRules","reduce","furtherDistilled","ignoreTree","map","value","filterByPath","path","isJSON","every","merge","source","replacement","replace","keys","assign","replaceArray","undefined","index","Set","values","template","content","parameter"],"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 Collection of template related helpers\n *\n * @author Alvis HT Tang <alvis@hilbert.space>\n * @license MIT\n * @copyright Copyright (c) 2020 - All Rights Reserved.\n * -------------------------------------------------------------------------\n */\n\nimport pupa from 'pupa';\n\nimport type { IgnorePath, IgnoreRule } from './types';\n\n/**\n * filter fields in an object according to the given rules\n * @param subject an object to be filtered\n * @param ignores a list of ignore rules\n * @returns filtered content\n */\nexport function filter<C extends Record<string, unknown>>(\n subject: C,\n ...ignores: IgnoreRule[]\n): C;\nexport function filter(subject: unknown[], ...ignores: IgnoreRule[]): unknown[];\nexport function filter(\n subject: Record<string, unknown> | unknown[],\n ...ignores: IgnoreRule[]\n): Record<string, unknown> | unknown[] {\n // compute the list of fields in config to be ignored\n const fieldsToIgnore = ignores.filter(\n (ignore): ignore is string | number => typeof ignore !== 'object',\n );\n\n // filter the unwanted item in an array\n if (Array.isArray(subject)) {\n return subject.filter((_, key) => !fieldsToIgnore.includes(key));\n }\n\n // filter the unwanted fields below\n const distilled = Object.fromEntries(\n Object.entries(subject).filter(([key, _]) => !fieldsToIgnore.includes(key)),\n );\n\n // compute the left over and process them further below\n const moreRules = ignores.filter(\n (ignore): ignore is Record<string, IgnorePath> =>\n typeof ignore !== 'string',\n );\n\n // continue filtering the left over\n return moreRules.reduce(\n (furtherDistilled, ignoreTree) =>\n Object.fromEntries(\n Object.entries(furtherDistilled).map(\n ([key, value]): [string, unknown] => [\n key,\n filterByPath(value, ignoreTree[key]),\n ],\n ),\n ),\n distilled,\n );\n}\n\n/**\n * filter a value according to the supplied ignore rules\n * @param value value to be filtered\n * @param path ignore rule to be applied\n * @returns filtered value\n */\nfunction filterByPath(value: unknown, path?: IgnorePath): unknown {\n return path && typeof value === 'object'\n ? filter(\n value as Record<string, unknown>,\n // NOTE\n // if rule is an array, it means that it contains a list of fields to be ignored\n // otherwise, it contains rules in a tree form\n ...(Array.isArray(path) ? path : [path]),\n )\n : value;\n}\n\n/**\n * indicate whether the supplied value is a JSON object\n * @param subject the subject to be tested\n * @returns true if the subject is a JSON object\n */\nexport function isJSON(subject: unknown): subject is Record<string, any> {\n return [\n typeof subject === 'object',\n !Array.isArray(subject),\n subject !== null,\n ].every((value) => value);\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return */\n\n/**\n * deep merge an object\n * @param source default object if no additional property is supplied\n * @param replacement properties to be merged with the default\n * @returns merged object\n */\nexport function merge<Source extends Record<string, any> | unknown[]>(\n source: Source,\n replacement?: Record<string, any> | unknown[],\n): Source {\n if (Array.isArray(source)) {\n return replace(source, replacement);\n }\n\n const keys = [...Object.keys(source), ...Object.keys(replacement ?? {})];\n\n const entries: Array<[string, any]> = keys.map((key) => [\n key,\n replace(source[key], replacement?.[key]),\n ]);\n\n return Object.assign(\n {},\n ...entries.map(([key, value]) => ({\n [key]: value,\n })),\n );\n}\n\n/**\n * replace source according to the replacement instruction\n * @param source source value if there's no replacement\n * @param replacement value to be merged with the default\n * @returns merged value\n */\nfunction replace(source: unknown, replacement: unknown): any {\n // LOGIC\n // S\\R | Array | Object | Primitive\n // Array | EXTEND | AMEND | replace\n // Object | replace | MERGE | replace\n // Primitive | replace | replace | replace\n\n if (Array.isArray(source)) {\n return replaceArray(source, replacement);\n } else if (isJSON(source) && isJSON(replacement)) {\n // deep merge any objects\n return merge(source, replacement);\n }\n\n // primitive values\n return replacement === undefined ? source : replacement;\n}\n\n/**\n * replace an array source according to the replacement instruction\n * @param source source value if there's no replacement\n * @param replacement value to be merged with the default\n * @returns merged value\n */\nfunction replaceArray(source: unknown[], replacement: unknown): any {\n if (isJSON(replacement)) {\n // overwrite a list\n return source.map((value, index) => replace(value, replacement[index]));\n } else if (Array.isArray(replacement)) {\n // extend a list uniquely\n return [...new Set([...source, ...replacement]).values()];\n } else {\n // primitive values\n return replacement ?? source;\n }\n}\n\n/**\n * replace parameters in the template\n * @param content template content\n * @param parameter variables to be substituted in the template\n */\nexport function template(\n content: string,\n parameter: Record<string, string>,\n): string;\nexport function template<Content extends Record<string, unknown> | unknown[]>(\n content: Content,\n parameter: Record<string, string>,\n): Content;\nexport function template(\n content: unknown,\n parameter: Record<string, string>,\n): unknown;\nexport function template(\n content: string | Record<string, unknown> | unknown | unknown[],\n parameter: Record<string, string>,\n): string | Record<string, unknown> | unknown | unknown[] {\n if (typeof content === 'string') {\n return pupa(content, parameter);\n } else if (Array.isArray(content)) {\n return content.map((value) => template(value, parameter));\n } else if (isJSON(content)) {\n return Object.fromEntries(\n Object.entries(content).map(([key, value]) => {\n return [template(key, parameter), template(value, parameter)];\n }),\n );\n } else {\n return content;\n }\n}\n\n/* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return */\n"],"file":"template.js"}
|
package/lib/types.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"types.js"}
|