presetter 4.5.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/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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"}
|