presetter 4.5.0 → 4.6.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/content.d.ts +77 -0
- package/lib/content.d.ts.map +1 -1
- package/lib/content.js +126 -1
- package/lib/directive.d.ts +23 -0
- package/lib/directive.d.ts.map +1 -1
- package/lib/directive.js +85 -1
- package/lib/error.d.ts +6 -0
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +21 -1
- package/lib/executable/entry.d.ts +5 -0
- package/lib/executable/entry.d.ts.map +1 -1
- package/lib/executable/entry.js +24 -1
- package/lib/executable/error.d.ts +4 -0
- package/lib/executable/error.d.ts.map +1 -1
- package/lib/executable/error.js +23 -1
- package/lib/executable/index.js +16 -1
- package/lib/index.js +16 -1
- package/lib/io.d.ts +39 -0
- package/lib/io.d.ts.map +1 -1
- package/lib/io.js +96 -11
- package/lib/package.d.ts +22 -0
- package/lib/package.d.ts.map +1 -1
- package/lib/package.js +53 -3
- package/lib/preset/content.d.ts +7 -0
- package/lib/preset/content.d.ts.map +1 -1
- package/lib/preset/content.js +20 -1
- package/lib/preset/context.d.ts +4 -0
- package/lib/preset/context.d.ts.map +1 -1
- package/lib/preset/context.js +19 -1
- package/lib/preset/graph.d.ts +17 -0
- package/lib/preset/graph.d.ts.map +1 -1
- package/lib/preset/graph.js +34 -1
- package/lib/preset/index.js +25 -1
- package/lib/preset/mapping.d.ts +6 -0
- package/lib/preset/mapping.d.ts.map +1 -1
- package/lib/preset/mapping.js +25 -2
- package/lib/preset/presetterRC.d.ts +19 -0
- package/lib/preset/presetterRC.d.ts.map +1 -1
- package/lib/preset/presetterRC.js +37 -1
- package/lib/preset/scripts.d.ts +4 -0
- package/lib/preset/scripts.d.ts.map +1 -1
- package/lib/preset/scripts.js +19 -1
- package/lib/preset/setup.d.ts +10 -0
- package/lib/preset/setup.d.ts.map +1 -1
- package/lib/preset/setup.js +38 -1
- package/lib/preset/unset.d.ts +3 -0
- package/lib/preset/unset.d.ts.map +1 -1
- package/lib/preset/unset.js +18 -1
- package/lib/resolution.d.ts +17 -0
- package/lib/resolution.d.ts.map +1 -1
- package/lib/resolution.js +33 -1
- package/lib/run.d.ts +7 -0
- package/lib/run.d.ts.map +1 -1
- package/lib/run.js +77 -1
- package/lib/scripts.d.ts +12 -0
- package/lib/scripts.d.ts.map +1 -1
- package/lib/scripts.js +50 -1
- package/lib/task.d.ts +18 -0
- package/lib/task.d.ts.map +1 -1
- package/lib/task.js +40 -2
- package/lib/template.d.ts +47 -0
- package/lib/template.d.ts.map +1 -1
- package/lib/template.js +96 -2
- package/lib/utilities/index.js +16 -1
- package/lib/utilities/mapValues.d.ts +6 -0
- package/lib/utilities/mapValues.d.ts.map +1 -1
- package/lib/utilities/mapValues.js +21 -1
- package/package.json +3 -3
package/lib/resolution.js
CHANGED
@@ -1,13 +1,39 @@
|
|
1
|
+
/*
|
2
|
+
* *** MIT LICENSE ***
|
3
|
+
* -------------------------------------------------------------------------
|
4
|
+
* This code may be modified and distributed under the MIT license.
|
5
|
+
* See the LICENSE file for details.
|
6
|
+
* -------------------------------------------------------------------------
|
7
|
+
*
|
8
|
+
* @summary Collection of helpers for resolving content
|
9
|
+
*
|
10
|
+
* @author Alvis HT Tang <alvis@hilbert.space>
|
11
|
+
* @license MIT
|
12
|
+
* @copyright Copyright (c) 2022 - All Rights Reserved.
|
13
|
+
* -------------------------------------------------------------------------
|
14
|
+
*/
|
1
15
|
import { existsSync } from 'node:fs';
|
2
16
|
import { basename, extname } from 'node:path';
|
3
17
|
import { loadFile } from './io.js';
|
18
|
+
/**
|
19
|
+
* compute the corresponding field within the config field of .presetterrc
|
20
|
+
* @param filename link name
|
21
|
+
* @returns field name in config
|
22
|
+
*/
|
4
23
|
export function getConfigKey(filename) {
|
5
24
|
return basename(filename, extname(filename))
|
6
25
|
.replace(/^\./, '')
|
7
26
|
.replace(/rc$/, '')
|
8
27
|
.replace(/\.config$/, '');
|
9
28
|
}
|
29
|
+
/**
|
30
|
+
* resolve a dynamic asset content
|
31
|
+
* @param map a dynamic map to be resolved
|
32
|
+
* @param context arguments to be passed to the generator function
|
33
|
+
* @returns content of the resolved field
|
34
|
+
*/
|
10
35
|
export async function loadDynamicMap(map, context) {
|
36
|
+
// load templated configuration from presets
|
11
37
|
return Object.fromEntries(await Promise.all(Object.entries(map instanceof Function
|
12
38
|
? await map(context)
|
13
39
|
: { ...map }).map(async ([relativePath, value]) => [
|
@@ -15,6 +41,12 @@ export async function loadDynamicMap(map, context) {
|
|
15
41
|
await loadDynamic(value, context),
|
16
42
|
])));
|
17
43
|
}
|
44
|
+
/**
|
45
|
+
* load a potentially dynamic content
|
46
|
+
* @param value content to be loaded
|
47
|
+
* @param context context to be supplied to the generator
|
48
|
+
* @returns resolved content
|
49
|
+
*/
|
18
50
|
export async function loadDynamic(value, context) {
|
19
51
|
if (typeof value === 'function') {
|
20
52
|
return value(context);
|
@@ -26,4 +58,4 @@ export async function loadDynamic(value, context) {
|
|
26
58
|
return value;
|
27
59
|
}
|
28
60
|
}
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFhaEM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsUUFBZ0I7SUFDM0MsT0FBTyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN6QyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztTQUNsQixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztTQUNsQixPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUNsQyxHQUFtQixFQUNuQixPQUFxRDtJQUVyRCw0Q0FBNEM7SUFDNUMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FDWixHQUFHLFlBQVksUUFBUTtRQUNyQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBZ0MsQ0FBQztRQUM3QyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUNmLENBQUMsR0FBRyxDQUNILEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBMEIsRUFBRSxDQUFDO1FBQ3ZELFlBQVk7UUFDWixNQUFNLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBZ0MsQ0FBQztLQUMzRCxDQUNGLENBQ0YsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBSS9CLEtBR21CLEVBQ25CLE9BQWlDO0lBRWpDLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO1FBQy9CLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3ZCO1NBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3pELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBTSxDQUFDO0tBQzdCO1NBQU07UUFDTCxPQUFPLEtBQVUsQ0FBQztLQUNuQjtBQUNILENBQUMifQ==
|
package/lib/run.d.ts
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
import type { Task } from './task.js';
|
2
|
+
/**
|
3
|
+
* run a task defined in the combined script definitions.
|
4
|
+
* @param tasks array of objects containing the selector and args for the task
|
5
|
+
* @param options collection of options
|
6
|
+
* @param options.parallel whether to run tasks concurrently
|
7
|
+
* @param options.templateOnly whether to resolve the task from the template only
|
8
|
+
*/
|
2
9
|
export declare function run(tasks: Task[], options?: {
|
3
10
|
parallel?: boolean;
|
4
11
|
templateOnly?: boolean;
|
package/lib/run.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../source/run.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../source/run.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAgJnC;;;;;;GAMG;AACH,wBAAsB,GAAG,CACvB,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
package/lib/run.js
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
/*
|
2
|
+
* *** MIT LICENSE ***
|
3
|
+
* -------------------------------------------------------------------------
|
4
|
+
* This code may be modified and distributed under the MIT license.
|
5
|
+
* See the LICENSE file for details.
|
6
|
+
* -------------------------------------------------------------------------
|
7
|
+
*
|
8
|
+
* @summary Run a task
|
9
|
+
*
|
10
|
+
* @author Alvis HT Tang <alvis@hilbert.space>
|
11
|
+
* @license MIT
|
12
|
+
* @copyright Copyright (c) 2019 - All Rights Reserved.
|
13
|
+
* -------------------------------------------------------------------------
|
14
|
+
*/
|
1
15
|
import { dirname } from 'node:path';
|
2
16
|
import npmRunScript from '@npmcli/run-script';
|
3
17
|
import { Listr } from 'listr2';
|
@@ -6,31 +20,57 @@ import { getPackage } from './package.js';
|
|
6
20
|
import { getScripts } from './preset/index.js';
|
7
21
|
import { composeScripts } from './scripts.js';
|
8
22
|
import { parseGlobalArgs, parseTaskSpec, selectTasks } from './task.js';
|
23
|
+
/**
|
24
|
+
* create an array of Listr tasks based on the provided inputs
|
25
|
+
* @param _ collection of arguments
|
26
|
+
* @param _.composed composed script object containing script definitions
|
27
|
+
* @param _.template template object containing script definitions
|
28
|
+
* @param _.pkg detail of package.json
|
29
|
+
* @param _.task task name
|
30
|
+
* @param _.args array of arguments
|
31
|
+
* @returns array of Listr tasks
|
32
|
+
*/
|
9
33
|
function createListrTask(_) {
|
10
34
|
const { composed, template, task, args, pkg } = _;
|
11
35
|
return {
|
12
36
|
title: `Running ${task}...`,
|
13
37
|
task: async (_, taskControl) => {
|
14
38
|
const command = composed[task];
|
39
|
+
// parse the command and extract the executable and task specifications
|
15
40
|
const argv = parse(command, {
|
41
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
16
42
|
configuration: { 'populate--': true, 'unknown-options-as-args': true },
|
17
43
|
});
|
18
44
|
const [executable, ...taskSpecs] = argv._.map((arg) => arg.toString());
|
45
|
+
// check if the executable is 'run-s' or 'run-p'
|
19
46
|
if (['run-s', 'run-p'].includes(executable)) {
|
20
47
|
const globalArgs = [...parseGlobalArgs(argv), ...args];
|
48
|
+
// get subtasks based on the task specifications and global arguments
|
21
49
|
const subTasks = taskSpecs.flatMap((taskSpec) => getListrTasksBySpec({ template, pkg, taskSpec, globalArgs }));
|
22
50
|
const concurrent = executable === 'run-p';
|
23
51
|
return taskControl.newListr(subTasks, { concurrent });
|
24
52
|
}
|
25
53
|
else {
|
54
|
+
// run the npm script with the provided arguments and package information
|
26
55
|
return runWithNPM({ task, args, pkg, composedScript: composed });
|
27
56
|
}
|
28
57
|
},
|
29
58
|
};
|
30
59
|
}
|
60
|
+
/**
|
61
|
+
* get Listr tasks based on the task specification and global arguments
|
62
|
+
* @param _ collection of arguments
|
63
|
+
* @param _.template template object containing script definitions
|
64
|
+
* @param _.pkg detail of package.json
|
65
|
+
* @param _.taskSpec task specification string
|
66
|
+
* @param _.globalArgs array of global arguments
|
67
|
+
* @returns array of Listr tasks
|
68
|
+
*/
|
31
69
|
function getListrTasksBySpec(_) {
|
32
70
|
const { template, pkg, taskSpec, globalArgs } = _;
|
71
|
+
// parse the task specification and remove any quotes
|
33
72
|
const task = parseTaskSpec(taskSpec.toString().replace(/^(['"])([^]*?)\1$/, '$2'), globalArgs);
|
73
|
+
// get Listr tasks based on the provided inputs
|
34
74
|
return getListrTasks({
|
35
75
|
template,
|
36
76
|
pkg,
|
@@ -38,15 +78,38 @@ function getListrTasksBySpec(_) {
|
|
38
78
|
args: task.args,
|
39
79
|
});
|
40
80
|
}
|
81
|
+
/**
|
82
|
+
* create an array of Listr tasks based on the provided inputs
|
83
|
+
* @param _ collection of arguments
|
84
|
+
* @param _.template template object containing script definitions
|
85
|
+
* @param _.pkg detail of package.json
|
86
|
+
* @param _.selector task selector string
|
87
|
+
* @param _.args array of arguments
|
88
|
+
* @returns array of Listr tasks
|
89
|
+
*/
|
41
90
|
function getListrTasks(_) {
|
42
91
|
const { template, pkg, selector, args } = _;
|
92
|
+
// clone the content for immutability
|
43
93
|
const target = { ...pkg.json.scripts };
|
94
|
+
// compose the script using the provided template and target
|
44
95
|
const composed = composeScripts({ template, target });
|
96
|
+
// select tasks based on the composed script and selector
|
45
97
|
const tasks = selectTasks(Object.keys(composed), selector);
|
98
|
+
// create Listr tasks based on the selected tasks
|
46
99
|
return tasks.map((task) => createListrTask({ composed, template, pkg, task, args }));
|
47
100
|
}
|
101
|
+
/**
|
102
|
+
* run a task defined in the combined script definitions using npm-run-script
|
103
|
+
* @param _ collection of arguments
|
104
|
+
* @param _.task task name
|
105
|
+
* @param _.args array of arguments
|
106
|
+
* @param _.pkg detail of package.json
|
107
|
+
* @param _.composedScript combined script definitions
|
108
|
+
* @returns a promise that will be resolved when the task is completed
|
109
|
+
*/
|
48
110
|
async function runWithNPM(_) {
|
49
111
|
const { task, args, pkg, composedScript } = _;
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
50
113
|
return npmRunScript({
|
51
114
|
event: task,
|
52
115
|
args,
|
@@ -55,19 +118,32 @@ async function runWithNPM(_) {
|
|
55
118
|
stdio: 'inherit',
|
56
119
|
});
|
57
120
|
}
|
121
|
+
/**
|
122
|
+
* run a task defined in the combined script definitions.
|
123
|
+
* @param tasks array of objects containing the selector and args for the task
|
124
|
+
* @param options collection of options
|
125
|
+
* @param options.parallel whether to run tasks concurrently
|
126
|
+
* @param options.templateOnly whether to resolve the task from the template only
|
127
|
+
*/
|
58
128
|
export async function run(tasks, options) {
|
59
129
|
const { parallel = false, templateOnly = false } = { ...options };
|
130
|
+
// find the target project's package.json information
|
60
131
|
const pkg = await getPackage();
|
61
132
|
if (templateOnly) {
|
133
|
+
// remove all scripts from the package.json
|
62
134
|
pkg.json.scripts = {};
|
63
135
|
}
|
136
|
+
// get the merged script definitions
|
64
137
|
const template = await getScripts();
|
138
|
+
// get Listr tasks based on the provided tasks and package information
|
65
139
|
const listTasks = tasks.flatMap((task) => getListrTasks({ template, pkg, ...task }));
|
140
|
+
// create a Listr instance with the list of tasks and configuration options
|
66
141
|
const listr = new Listr(listTasks, {
|
67
142
|
concurrent: parallel,
|
68
143
|
exitOnError: true,
|
69
144
|
renderer: 'simple',
|
70
145
|
});
|
146
|
+
// run the Listr tasks
|
71
147
|
try {
|
72
148
|
await listr.run();
|
73
149
|
}
|
@@ -75,4 +151,4 @@ export async function run(tasks, options) {
|
|
75
151
|
process.exit(1);
|
76
152
|
}
|
77
153
|
}
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQyxPQUFPLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRS9CLE9BQU8sS0FBSyxNQUFNLGNBQWMsQ0FBQztBQUVqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFPckU7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FNeEI7SUFDQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVsRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLFdBQVcsSUFBSSxLQUFLO1FBQzNCLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUvQix1RUFBdUU7WUFDdkUsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDMUIsZ0VBQWdFO2dCQUNoRSxhQUFhLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLElBQUksRUFBRTthQUN2RSxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFD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
|
package/lib/scripts.d.ts
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
+
/** pseudo type for representing the name of a script */
|
1
2
|
type ScriptName = string;
|
3
|
+
/** pseudo type for representing the command */
|
2
4
|
type Command = string;
|
5
|
+
/** collection of scripts */
|
3
6
|
export type Script = Record<ScriptName, Command>;
|
7
|
+
/**
|
8
|
+
* merge the script definitions from the template and the target package.json
|
9
|
+
* @param args template and customized scripts to be merged
|
10
|
+
* @param args.template scripts defined from the template
|
11
|
+
* @param args.target scripts defined from target's package.json
|
12
|
+
* @returns a dictionary of merged definitions
|
13
|
+
*/
|
4
14
|
export declare function composeScripts(args: {
|
15
|
+
/** scripts defined from the template */
|
5
16
|
template: Script;
|
17
|
+
/** scripts defined from target's package.json */
|
6
18
|
target: Script;
|
7
19
|
}): Script;
|
8
20
|
export {};
|
package/lib/scripts.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../source/scripts.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../source/scripts.ts"],"names":[],"mappings":"AAwBA,wDAAwD;AACxD,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,+CAA+C;AAC/C,KAAK,OAAO,GAAG,MAAM,CAAC;AAEtB,4BAA4B;AAC5B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAkBjD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CA4BT"}
|
package/lib/scripts.js
CHANGED
@@ -1,20 +1,47 @@
|
|
1
|
+
/*
|
2
|
+
* *** MIT LICENSE ***
|
3
|
+
* -------------------------------------------------------------------------
|
4
|
+
* This code may be modified and distributed under the MIT license.
|
5
|
+
* See the LICENSE file for details.
|
6
|
+
* -------------------------------------------------------------------------
|
7
|
+
*
|
8
|
+
* @summary Handle script merging
|
9
|
+
*
|
10
|
+
* @author Alvis HT Tang <alvis@hilbert.space>
|
11
|
+
* @license MIT
|
12
|
+
* @copyright Copyright (c) 2019 - All Rights Reserved.
|
13
|
+
* -------------------------------------------------------------------------
|
14
|
+
*/
|
1
15
|
import { basename } from 'node:path';
|
2
16
|
import mvdan from 'mvdan-sh';
|
3
17
|
import parse from 'yargs-parser';
|
4
18
|
import { mapValues } from './utilities/index.js';
|
5
19
|
const { syntax } = mvdan;
|
20
|
+
// shell command parser
|
6
21
|
const parser = syntax.NewParser();
|
22
|
+
// shell command generator
|
7
23
|
const printer = syntax.NewPrinter();
|
24
|
+
/**
|
25
|
+
* merge the script definitions from the template and the target package.json
|
26
|
+
* @param args template and customized scripts to be merged
|
27
|
+
* @param args.template scripts defined from the template
|
28
|
+
* @param args.target scripts defined from target's package.json
|
29
|
+
* @returns a dictionary of merged definitions
|
30
|
+
*/
|
8
31
|
export function composeScripts(args) {
|
9
32
|
const { template, target } = args;
|
10
33
|
return mapValues({ ...template, ...target }, (command) => {
|
11
34
|
try {
|
35
|
+
// parse the shell command into its ast
|
12
36
|
const ast = parser.Parse(command);
|
37
|
+
// walk through the tree and replace any call to the runner e.g. preset task1 task2 -- --help
|
13
38
|
syntax.Walk(ast, (node) => replaceRunnerNode(node, { template, target }));
|
39
|
+
// remove any unnecessary subshell
|
14
40
|
const [statement] = ast.Stmts;
|
15
41
|
if (isNodeType(statement.Cmd, 'Subshell')) {
|
16
42
|
statement.Cmd = statement.Cmd.Stmts[0].Cmd;
|
17
43
|
}
|
44
|
+
// generate the code from ast
|
18
45
|
return printer.Print(ast).trim();
|
19
46
|
}
|
20
47
|
catch (error) {
|
@@ -22,6 +49,7 @@ export function composeScripts(args) {
|
|
22
49
|
throw error;
|
23
50
|
}
|
24
51
|
else {
|
52
|
+
// parser.Parse may throw an empty object as an error, catch here
|
25
53
|
throw new Error(`failed to parse command: ${command}`);
|
26
54
|
}
|
27
55
|
}
|
@@ -30,12 +58,21 @@ export function composeScripts(args) {
|
|
30
58
|
function isNodeType(node, type) {
|
31
59
|
return syntax.NodeType(node) === type;
|
32
60
|
}
|
61
|
+
/**
|
62
|
+
* resolve a runner command
|
63
|
+
* @param command the command to be replaced
|
64
|
+
* @param context resource context
|
65
|
+
* @returns the resolved command
|
66
|
+
*/
|
33
67
|
function resolveRunner(command, context) {
|
34
68
|
const arg = parse(command, {
|
69
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
35
70
|
configuration: { 'populate--': true, 'unknown-options-as-args': true },
|
36
71
|
});
|
72
|
+
// extract tasks and their arguments
|
37
73
|
const destinations = arg['_'].slice(1);
|
38
74
|
const destinationArgs = arg['--'] ?? [];
|
75
|
+
// resolve tasks into its full form e.g. task1 task2
|
39
76
|
return destinations
|
40
77
|
.map((destination) => {
|
41
78
|
const expandedCommand = context.template[destination] ||
|
@@ -49,15 +86,27 @@ function resolveRunner(command, context) {
|
|
49
86
|
})
|
50
87
|
.join(' && ');
|
51
88
|
}
|
89
|
+
/**
|
90
|
+
* replace a runner node with the actual command
|
91
|
+
* @param node an expression node
|
92
|
+
* @param context resource context
|
93
|
+
* @returns boolean true for no error
|
94
|
+
*/
|
52
95
|
function replaceRunnerNode(node, context) {
|
96
|
+
// replace only it's a runner call, not anything else
|
53
97
|
if (isNodeType(node, 'Stmt') && isNodeType(node.Cmd, 'CallExpr')) {
|
98
|
+
// parse assigned arguments e.g. task1 args --help
|
54
99
|
const parts = node.Cmd.Args.map((part) => part.Lit());
|
100
|
+
// only resolve if the `run` cli shipped in this package is invoke
|
55
101
|
if (parts.length && basename(parts[0]) === 'run') {
|
102
|
+
// resolve tasks into its full form e.g. task1 task2
|
56
103
|
const resolvedCommand = resolveRunner(parts.join(' '), context);
|
104
|
+
// replace the task definition with its expanded statement
|
57
105
|
node.Cmd = parser.Parse(`(${resolvedCommand})`).Stmts[0].Cmd;
|
106
|
+
// recursively replace any runner call in the expanded statement
|
58
107
|
replaceRunnerNode(node.Cmd, context);
|
59
108
|
}
|
60
109
|
}
|
61
110
|
return true;
|
62
111
|
}
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9zY3JpcHRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sS0FBSyxNQUFNLFVBQVUsQ0FBQztBQUM3QixPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFFakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWF4QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBRXpCLHVCQUF1QjtBQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFbEMsMEJBQTBCO0FBQzFCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQVVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLElBSzlCO0lBQ0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFbEMsT0FBTyxTQUFTLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFVLEVBQUU7UUFDL0QsSUFBSTtZQUNGLHVDQUF1QztZQUN2QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWxDLDZGQUE2RjtZQUM3RixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUxRSxrQ0FBa0M7WUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDOUIsSUFBSSxV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
|
package/lib/task.d.ts
CHANGED
@@ -1,9 +1,27 @@
|
|
1
1
|
import type { Arguments } from 'yargs-parser';
|
2
|
+
/** parsed task object with selector and args */
|
2
3
|
export interface Task {
|
3
4
|
selector: string;
|
4
5
|
args: string[];
|
5
6
|
}
|
7
|
+
/**
|
8
|
+
* parse global arguments from an argv object
|
9
|
+
* @param argv - an arguments object containing the command line arguments
|
10
|
+
* @returns an array of cleaned up global arguments as strings
|
11
|
+
*/
|
6
12
|
export declare function parseGlobalArgs(argv: Arguments): string[];
|
13
|
+
/**
|
14
|
+
* parse task string and return a parsed task object with selector and args
|
15
|
+
* @param spec - the task string to parse
|
16
|
+
* @param globalArgs - the global arguments to be added to each task
|
17
|
+
* @returns parsed task object with selector and args
|
18
|
+
*/
|
7
19
|
export declare function parseTaskSpec(spec: string, globalArgs: string[]): Task;
|
20
|
+
/**
|
21
|
+
* select tasks based on a pattern
|
22
|
+
* @param tasks array of available tasks in the format 'task:subtask:subsubtask'
|
23
|
+
* @param pattern pattern to match tasks ('*' wildcard for single level and '**' wildcard for multiple levels)
|
24
|
+
* @returns array of tasks that match the pattern
|
25
|
+
*/
|
8
26
|
export declare function selectTasks(tasks: string[], pattern: string): string[];
|
9
27
|
//# sourceMappingURL=task.d.ts.map
|
package/lib/task.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../source/task.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../source/task.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,gDAAgD;AAChD,MAAM,WAAW,IAAI;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAWzD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAiBtE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBtE"}
|
package/lib/task.js
CHANGED
@@ -1,15 +1,47 @@
|
|
1
|
+
/*
|
2
|
+
* *** MIT LICENSE ***
|
3
|
+
* -------------------------------------------------------------------------
|
4
|
+
* This code may be modified and distributed under the MIT license.
|
5
|
+
* See the LICENSE file for details.
|
6
|
+
* -------------------------------------------------------------------------
|
7
|
+
*
|
8
|
+
* @summary Helper functions for parsing task strings
|
9
|
+
*
|
10
|
+
* @author Alvis HT Tang <alvis@hilbert.space>
|
11
|
+
* @license MIT
|
12
|
+
* @copyright Copyright (c) 2019 - All Rights Reserved.
|
13
|
+
* -------------------------------------------------------------------------
|
14
|
+
*/
|
1
15
|
import parse from 'yargs-parser';
|
16
|
+
/**
|
17
|
+
* parse global arguments from an argv object
|
18
|
+
* @param argv - an arguments object containing the command line arguments
|
19
|
+
* @returns an array of cleaned up global arguments as strings
|
20
|
+
*/
|
2
21
|
export function parseGlobalArgs(argv) {
|
22
|
+
// get the global arguments as an array of strings or numbers, or undefined if not present
|
3
23
|
const globalArgs = argv['--'];
|
4
|
-
|
24
|
+
// if global arguments are present, map them to strings and clean up the quotes
|
25
|
+
return (globalArgs?.map((arg) =>
|
26
|
+
// replace the single or double quotes that wrap the argument
|
27
|
+
arg.toString().replace(/^(['"])([^]*?)\1$/, '$2')) ?? [] // if no global arguments are present, return an empty array
|
28
|
+
);
|
5
29
|
}
|
30
|
+
/**
|
31
|
+
* parse task string and return a parsed task object with selector and args
|
32
|
+
* @param spec - the task string to parse
|
33
|
+
* @param globalArgs - the global arguments to be added to each task
|
34
|
+
* @returns parsed task object with selector and args
|
35
|
+
*/
|
6
36
|
export function parseTaskSpec(spec, globalArgs) {
|
7
37
|
const argv = parse(spec, {
|
38
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
8
39
|
configuration: { 'populate--': true },
|
9
40
|
});
|
10
41
|
const selector = argv._[0];
|
11
42
|
const args = parseGlobalArgs(argv).reduce((processedArgs, arg) => {
|
12
43
|
if (arg === '{@}') {
|
44
|
+
// replace {@} with globalArgs
|
13
45
|
return [...processedArgs, ...globalArgs];
|
14
46
|
}
|
15
47
|
else {
|
@@ -18,6 +50,12 @@ export function parseTaskSpec(spec, globalArgs) {
|
|
18
50
|
}, []);
|
19
51
|
return { selector, args };
|
20
52
|
}
|
53
|
+
/**
|
54
|
+
* select tasks based on a pattern
|
55
|
+
* @param tasks array of available tasks in the format 'task:subtask:subsubtask'
|
56
|
+
* @param pattern pattern to match tasks ('*' wildcard for single level and '**' wildcard for multiple levels)
|
57
|
+
* @returns array of tasks that match the pattern
|
58
|
+
*/
|
21
59
|
export function selectTasks(tasks, pattern) {
|
22
60
|
const regexPattern = pattern
|
23
61
|
.split(':')
|
@@ -34,4 +72,4 @@ export function selectTasks(tasks, pattern) {
|
|
34
72
|
const regex = new RegExp(`^${regexPattern}$`);
|
35
73
|
return tasks.filter((task) => regex.test(task));
|
36
74
|
}
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS90YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFVakM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBZTtJQUM3QywwRkFBMEY7SUFDMUYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlCLCtFQUErRTtJQUMvRSxPQUFPLENBQ0wsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO0lBQ3RCLDZEQUE2RDtJQUM3RCxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUNsRCxJQUFJLEVBQUUsQ0FBQyw0REFBNEQ7S0FDckUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBWSxFQUFFLFVBQW9CO0lBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDdkIsZ0VBQWdFO1FBQ2hFLGFBQWEsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUU7S0FDdEMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVcsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQy9ELElBQUksR0FBRyxLQUFLLEtBQUssRUFBRTtZQUNqQiw4QkFBOEI7WUFDOUIsT0FBTyxDQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7U0FDMUM7YUFBTTtZQUNMLE9BQU8sQ0FBQyxHQUFHLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUMsRUFBRSxFQUFjLENBQUMsQ0FBQztJQUVuQixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBZSxFQUFFLE9BQWU7SUFDMUQsTUFBTSxZQUFZLEdBQUcsT0FBTztTQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWIsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMifQ==
|
package/lib/template.d.ts
CHANGED
@@ -2,14 +2,61 @@ import type { IgnoreRule, PrimitiveEntity } from 'presetter-types';
|
|
2
2
|
import type { JsonObject, JsonValue } from 'type-fest';
|
3
3
|
type MergedType<A, B> = A extends JsonObject ? B extends JsonObject ? A & B : MergedArray<A, B> : MergedArray<A, B>;
|
4
4
|
type MergedArray<A, B> = A extends JsonValue[] ? B extends JsonValue[] ? Array<A[number] | B[number]> : keyof B extends `${number}` ? JsonValue[] : B : B;
|
5
|
+
/**
|
6
|
+
* remove part of the template content according to the given rules
|
7
|
+
* @param subject an object to be filtered
|
8
|
+
* @param ignores a list of ignore rules
|
9
|
+
* @returns filtered content
|
10
|
+
*/
|
5
11
|
export declare function filter<C extends Record<string, unknown>>(subject: C, ...ignores: IgnoreRule[]): C;
|
6
12
|
export declare function filter(subject: unknown[], ...ignores: IgnoreRule[]): unknown[];
|
13
|
+
/**
|
14
|
+
* indicate whether the supplied value is a JSON object
|
15
|
+
* @param subject the subject to be tested
|
16
|
+
* @returns true if the subject is a JSON object
|
17
|
+
*/
|
7
18
|
export declare function isJSON(subject: unknown): subject is JsonObject;
|
19
|
+
/**
|
20
|
+
* deep merge an object
|
21
|
+
* @param source default object if no additional property is supplied
|
22
|
+
* @param target properties to be merged with the default
|
23
|
+
* @returns merged object
|
24
|
+
*/
|
8
25
|
export declare function merge<S extends JsonValue, T extends PrimitiveEntity>(source: S, target?: T): MergedType<S, T>;
|
26
|
+
/**
|
27
|
+
* merge an array with any value
|
28
|
+
* @param source the source array to be merged
|
29
|
+
* @param target new replacement
|
30
|
+
* @returns merged value
|
31
|
+
*/
|
9
32
|
export declare function mergeArray<S extends JsonValue, T extends PrimitiveEntity>(source: S[], target?: T): MergedArray<S[], T>;
|
33
|
+
/**
|
34
|
+
* merge two arrays
|
35
|
+
* @param source the source array to be merged
|
36
|
+
* @param target new replacement
|
37
|
+
* @returns merged array
|
38
|
+
*/
|
10
39
|
export declare function mergeArrays<S extends JsonValue, T extends JsonValue>(source: S[], target: T[]): MergedArray<S[], T[]>;
|
40
|
+
/**
|
41
|
+
* merge an object with any value
|
42
|
+
* @param source the source object to be merged
|
43
|
+
* @param target new replacement
|
44
|
+
* @returns merged value
|
45
|
+
*/
|
11
46
|
export declare function mergeObject<S extends JsonObject, T extends PrimitiveEntity>(source: S, target?: T): MergedType<S, T>;
|
47
|
+
/**
|
48
|
+
* merge templates
|
49
|
+
* @param source current template
|
50
|
+
* @param target new template content
|
51
|
+
* @returns customized configuration
|
52
|
+
*/
|
12
53
|
export declare function mergeTemplate(source: Record<string, JsonObject | string>, target: Record<string, JsonObject | string>): Record<string, JsonObject | string>;
|
54
|
+
/**
|
55
|
+
* replace parameters in the template
|
56
|
+
* @param content template content
|
57
|
+
* @param parameter variables to be substituted in the template
|
58
|
+
* @returns customized configuration
|
59
|
+
*/
|
13
60
|
export declare function template(content: string, parameter: Record<string, string>): string;
|
14
61
|
export declare function template<Content extends Record<string, unknown> | unknown[]>(content: Content, parameter: Record<string, string>): Content;
|
15
62
|
export declare function template(content: unknown, parameter: Record<string, string>): unknown;
|
package/lib/template.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../source/template.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAc,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,KAAK,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,UAAU,GACxC,CAAC,SAAS,UAAU,GAClB,CAAC,GAAG,CAAC,GACL,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEtB,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,SAAS,EAAE,GAC1C,CAAC,SAAS,SAAS,EAAE,GACnB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAC5B,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,GAC3B,SAAS,EAAE,GACX,CAAC,GACH,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../source/template.ts"],"names":[],"mappings":"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"}
|