presetter 8.2.0 → 9.0.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 +155 -96
- package/lib/context.d.ts +1 -1
- package/lib/context.d.ts.map +1 -1
- package/lib/debugger.d.ts.map +1 -1
- package/lib/executable/entry.d.ts +20 -1
- package/lib/executable/entry.d.ts.map +1 -1
- package/lib/executable/entry.js +78 -18
- package/lib/index.d.ts +5 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -6
- package/lib/io.d.ts +2 -2
- package/lib/io.d.ts.map +1 -1
- package/lib/io.js +2 -2
- package/lib/parsing.d.ts +92 -0
- package/lib/parsing.d.ts.map +1 -0
- package/lib/parsing.js +209 -0
- package/lib/preset/bootstrap.d.ts.map +1 -1
- package/lib/preset/bootstrap.js +7 -3
- package/lib/preset/config/resolve.d.ts +1 -1
- package/lib/preset/config/resolve.d.ts.map +1 -1
- package/lib/preset/config/resolve.js +1 -1
- package/lib/preset/project.d.ts +2 -2
- package/lib/preset/project.d.ts.map +1 -1
- package/lib/preset/project.js +3 -3
- package/lib/preset/resolution/asset.d.ts +3 -3
- package/lib/preset/resolution/asset.d.ts.map +1 -1
- package/lib/preset/resolution/asset.js +3 -3
- package/lib/preset/resolution/content.d.ts +3 -3
- package/lib/preset/resolution/content.d.ts.map +1 -1
- package/lib/preset/resolution/content.js +3 -3
- package/lib/preset/resolution/debugger.d.ts.map +1 -1
- package/lib/preset/resolution/index.d.ts +1 -0
- package/lib/preset/resolution/index.d.ts.map +1 -1
- package/lib/preset/resolution/index.js +2 -1
- package/lib/preset/resolution/object.d.ts +2 -2
- package/lib/preset/resolution/object.d.ts.map +1 -1
- package/lib/preset/resolution/object.js +1 -1
- package/lib/preset/resolution/preset.d.ts +1 -1
- package/lib/preset/resolution/preset.d.ts.map +1 -1
- package/lib/preset/resolution/roots.d.ts +15 -0
- package/lib/preset/resolution/roots.d.ts.map +1 -0
- package/lib/preset/resolution/roots.js +24 -0
- package/lib/preset/resolution/script.d.ts +5 -2
- package/lib/preset/resolution/script.d.ts.map +1 -1
- package/lib/preset/resolution/script.js +7 -2
- package/lib/preset/resolution/variable.d.ts +1 -1
- package/lib/preset/resolution/variable.d.ts.map +1 -1
- package/lib/preset/scripts.d.ts +6 -2
- package/lib/preset/scripts.d.ts.map +1 -1
- package/lib/preset/scripts.js +5 -6
- package/lib/run.d.ts.map +1 -1
- package/lib/run.js +44 -27
- package/lib/scripts.d.ts +3 -5
- package/lib/scripts.d.ts.map +1 -1
- package/lib/scripts.js +87 -60
- package/lib/serialization.d.ts +1 -1
- package/lib/serialization.d.ts.map +1 -1
- package/lib/task.d.ts +3 -3
- package/lib/task.js +7 -7
- package/lib/template/merge.d.ts +12 -2
- package/lib/template/merge.d.ts.map +1 -1
- package/lib/template/merge.js +161 -1
- package/lib/template/substitute.d.ts +1 -1
- package/lib/template/substitute.d.ts.map +1 -1
- package/lib/utilities/display.js +1 -1
- package/lib/utilities/mapping.d.ts +7 -0
- package/lib/utilities/mapping.d.ts.map +1 -1
- package/lib/utilities/mapping.js +11 -1
- package/package.json +19 -39
- package/types/npmcli__run-script/index.d.ts +1 -0
- package/types/mvdan-sh/index.d.ts +0 -44
package/lib/executable/entry.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, posix, resolve } from 'node:path';
|
|
3
3
|
import { globby } from 'globby';
|
|
4
4
|
import yargs from 'yargs';
|
|
5
5
|
import { bootstrap } from '../preset/index.js';
|
|
6
6
|
import { run } from '../run.js';
|
|
7
7
|
import { parseGlobalArgs, parseTaskSpec } from '../task.js';
|
|
8
|
+
const DEFAULT_LIST_DELIMITER = ',';
|
|
9
|
+
const WORKSPACE_GLOB_OPTIONS = {
|
|
10
|
+
gitignore: true,
|
|
11
|
+
ignore: ['**/node_modules/**'],
|
|
12
|
+
};
|
|
8
13
|
const bootstrapCommand = {
|
|
9
14
|
command: 'bootstrap',
|
|
10
15
|
describe: 'setup the project according to the specified preset',
|
|
@@ -18,23 +23,26 @@ const bootstrapCommand = {
|
|
|
18
23
|
alias: 'p',
|
|
19
24
|
array: true,
|
|
20
25
|
default: ['.'],
|
|
21
|
-
|
|
26
|
+
coerce: (values) => expandDelimitedValues(values),
|
|
27
|
+
description: 'a glob pattern matching any target project folders containing package.json (comma-separated values supported)',
|
|
28
|
+
})
|
|
29
|
+
.option('packages', {
|
|
30
|
+
type: 'string',
|
|
31
|
+
alias: 'P',
|
|
32
|
+
array: true,
|
|
33
|
+
default: [],
|
|
34
|
+
coerce: (values) => expandDelimitedValues(values),
|
|
35
|
+
description: 'a glob pattern matching any target package names (e.g. @presetter/preset-*; comma-separated values supported)',
|
|
22
36
|
})
|
|
23
37
|
.help(),
|
|
24
38
|
handler: async (argv) => {
|
|
25
|
-
const { only, projects } = argv;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
33
|
-
const projectRoots = packageJsons.map(dirname);
|
|
34
|
-
// bootstrap all projects
|
|
35
|
-
for (const root of projectRoots) {
|
|
36
|
-
await bootstrap(resolve(root));
|
|
37
|
-
}
|
|
39
|
+
const { only, projects, packages } = argv;
|
|
40
|
+
if (only && !existsSync(only)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const projectRoots = await resolveProjectRoots({ projects, packages });
|
|
44
|
+
for (const root of projectRoots) {
|
|
45
|
+
await bootstrap(root);
|
|
38
46
|
}
|
|
39
47
|
},
|
|
40
48
|
};
|
|
@@ -50,7 +58,6 @@ const runCommand = {
|
|
|
50
58
|
.usage('run <task>')
|
|
51
59
|
.demandCommand(),
|
|
52
60
|
handler: async (argv) => {
|
|
53
|
-
// get the options
|
|
54
61
|
const [, selector] = argv._.map((arg) => arg.toString());
|
|
55
62
|
const args = parseGlobalArgs(argv);
|
|
56
63
|
await run([{ selector, args }], { templateOnly: argv.template });
|
|
@@ -81,7 +88,6 @@ const runPCommand = {
|
|
|
81
88
|
/**
|
|
82
89
|
* provide a command line interface
|
|
83
90
|
* @param args command line arguments
|
|
84
|
-
* @returns the command entered together with its options
|
|
85
91
|
*/
|
|
86
92
|
export async function entry(args) {
|
|
87
93
|
await yargs()
|
|
@@ -98,4 +104,58 @@ export async function entry(args) {
|
|
|
98
104
|
.demandCommand()
|
|
99
105
|
.parse(args);
|
|
100
106
|
}
|
|
101
|
-
|
|
107
|
+
/**
|
|
108
|
+
* resolve target project roots from path globs and package-name globs
|
|
109
|
+
* @param options resolution inputs
|
|
110
|
+
* @param options.projects path globs (e.g. `presets/next`, `packages/*`)
|
|
111
|
+
* @param options.packages package-name globs (e.g. `@presetter/preset-*`)
|
|
112
|
+
* @returns deduped absolute project root paths
|
|
113
|
+
*/
|
|
114
|
+
export async function resolveProjectRoots(options) {
|
|
115
|
+
const { projects, packages } = options;
|
|
116
|
+
const roots = new Set();
|
|
117
|
+
if (projects.length > 0) {
|
|
118
|
+
const files = await globby(projects.map((project) => posix.join(project, 'package.json')), WORKSPACE_GLOB_OPTIONS);
|
|
119
|
+
for (const file of files) {
|
|
120
|
+
roots.add(resolve(dirname(file)));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (packages.length > 0) {
|
|
124
|
+
const candidates = await globby('**/package.json', WORKSPACE_GLOB_OPTIONS);
|
|
125
|
+
const isMatchingName = compileNameMatcher(packages);
|
|
126
|
+
await Promise.all(candidates.map(async (path) => {
|
|
127
|
+
const { name } = JSON.parse(readFileSync(path, { encoding: 'utf8' }));
|
|
128
|
+
if (name && isMatchingName(name)) {
|
|
129
|
+
roots.add(resolve(dirname(path)));
|
|
130
|
+
}
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
return [...roots];
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* expand each entry by splitting on a delimiter and trimming the parts
|
|
137
|
+
* @param values raw flag values, each possibly containing the delimiter
|
|
138
|
+
* @param delimiter delimiter character (defaults to `,`)
|
|
139
|
+
* @returns flattened, trimmed, non-empty values
|
|
140
|
+
*/
|
|
141
|
+
export function expandDelimitedValues(values, delimiter = DEFAULT_LIST_DELIMITER) {
|
|
142
|
+
return values.flatMap((value) => value
|
|
143
|
+
.split(delimiter)
|
|
144
|
+
.map((part) => part.trim())
|
|
145
|
+
.filter(Boolean));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* compile a list of package-name globs into a single predicate
|
|
149
|
+
* @param patterns package-name globs (`*` matches anything except `/`)
|
|
150
|
+
* @returns predicate returning true when a name matches any pattern
|
|
151
|
+
*/
|
|
152
|
+
function compileNameMatcher(patterns) {
|
|
153
|
+
const expressions = patterns.map((pattern) => {
|
|
154
|
+
const escaped = pattern
|
|
155
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
|
|
156
|
+
.replace(/\*/g, '[^/]*');
|
|
157
|
+
return new RegExp(`^${escaped}$`);
|
|
158
|
+
});
|
|
159
|
+
return (name) => expressions.some((expression) => expression.test(name));
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0YWJsZS9lbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBZ0J6RCxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHO0lBQzdCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsTUFBTSxFQUFFLENBQUMsb0JBQW9CLENBQUM7Q0FDL0IsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBR2xCO0lBQ0YsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFLHFEQUFxRDtJQUMvRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNqQixLQUFLO1NBQ0YsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNkLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLDJDQUEyQztLQUN6RCxDQUFDO1NBQ0QsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNsQixJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxHQUFHO1FBQ1YsS0FBSyxFQUFFLElBQUk7UUFDWCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDZCxNQUFNLEVBQUUsQ0FBQyxNQUFnQixFQUFZLEVBQUUsQ0FBQyxx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
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from 'presetter
|
|
2
|
-
export * from '
|
|
3
|
-
export * from '
|
|
4
|
-
export * from '
|
|
5
|
-
export * from '
|
|
1
|
+
export * from '@presetter/types';
|
|
2
|
+
export * from '#preset';
|
|
3
|
+
export * from '#resolve';
|
|
4
|
+
export * from '#run';
|
|
5
|
+
export * from '#template';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,kBAAkB,CAAC;AAEjC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* v8 ignore start */
|
|
2
|
-
export * from 'presetter
|
|
3
|
-
export * from '
|
|
4
|
-
export * from '
|
|
5
|
-
export * from '
|
|
6
|
-
export * from '
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
export * from '@presetter/types';
|
|
3
|
+
export * from '#preset';
|
|
4
|
+
export * from '#resolve';
|
|
5
|
+
export * from '#run';
|
|
6
|
+
export * from '#template';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCO0FBRXJCLGNBQWMsa0JBQWtCLENBQUM7QUFFakMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxNQUFNLENBQUM7QUFDckIsY0FBYyxXQUFXLENBQUMifQ==
|
package/lib/io.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Variables } from 'presetter
|
|
1
|
+
import type { Variables } from '@presetter/types';
|
|
2
2
|
import type { JsonObject } from 'type-fest';
|
|
3
3
|
/**
|
|
4
4
|
* load the content of a file
|
|
@@ -10,7 +10,7 @@ export declare function loadFile(path: string, variables?: Variables): JsonObjec
|
|
|
10
10
|
/**
|
|
11
11
|
* ensure that there is a file at the given path with the given content
|
|
12
12
|
* @param path path where the file should be created
|
|
13
|
-
* @param content
|
|
13
|
+
* @param content data that should be written to disk
|
|
14
14
|
*/
|
|
15
15
|
export declare function ensureFile(path: string, content: string | Buffer): void;
|
|
16
16
|
//# sourceMappingURL=io.d.ts.map
|
package/lib/io.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,SAAc,GACxB,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAwBhC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvE"}
|
package/lib/io.js
CHANGED
|
@@ -32,7 +32,7 @@ export function loadFile(path, variables = {}) {
|
|
|
32
32
|
/**
|
|
33
33
|
* ensure that there is a file at the given path with the given content
|
|
34
34
|
* @param path path where the file should be created
|
|
35
|
-
* @param content
|
|
35
|
+
* @param content data that should be written to disk
|
|
36
36
|
*/
|
|
37
37
|
export function ensureFile(path, content) {
|
|
38
38
|
// ensure that all parent folders exist to avoid errors from writeFile
|
|
@@ -40,4 +40,4 @@ export function ensureFile(path, content) {
|
|
|
40
40
|
// write content to the destination path
|
|
41
41
|
writeFileSync(path, content);
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU3QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFLeEM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixJQUFZLEVBQ1osU0FBUyxHQUFjLEVBQUU7SUFFekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuQywrQ0FBK0M7SUFDL0MsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN0QixLQUFLLE9BQU87WUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FDNUIsQ0FBQztRQUNsQixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTTtZQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQWUsQ0FBQztRQUN2RTtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQztxQkFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDWCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZLEVBQUUsT0FBd0I7SUFDL0Qsc0VBQXNFO0lBQ3RFLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU5Qyx3Q0FBd0M7SUFDeEMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvQixDQUFDIn0=
|
package/lib/parsing.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/** represents a parsed call expression from command text */
|
|
2
|
+
export interface ParsedCallExpr {
|
|
3
|
+
/** the command name (e.g., "run") */
|
|
4
|
+
command: string;
|
|
5
|
+
/** positional arguments before "--" */
|
|
6
|
+
args: string[];
|
|
7
|
+
/** extra arguments after "--" */
|
|
8
|
+
extraArgs: string[];
|
|
9
|
+
}
|
|
10
|
+
/** represents a run command match with its position */
|
|
11
|
+
export interface RunMatch {
|
|
12
|
+
/** the matched text */
|
|
13
|
+
match: string;
|
|
14
|
+
/** start offset in source */
|
|
15
|
+
start: number;
|
|
16
|
+
/** end offset in source */
|
|
17
|
+
end: number;
|
|
18
|
+
}
|
|
19
|
+
/** parsed command structure */
|
|
20
|
+
export type ParsedCommand = ParsedSimpleCommand | ParsedBinaryCmd | ParsedSubshell | ParsedBlock;
|
|
21
|
+
/** simple command (e.g., `run build`, `echo test`) */
|
|
22
|
+
export interface ParsedSimpleCommand {
|
|
23
|
+
type: 'CallExpr';
|
|
24
|
+
/** command name (first word) */
|
|
25
|
+
command: string;
|
|
26
|
+
/** arguments after command name */
|
|
27
|
+
args: string[];
|
|
28
|
+
/** extra arguments after "--" */
|
|
29
|
+
extraArgs: string[];
|
|
30
|
+
/** start offset in original source */
|
|
31
|
+
start: number;
|
|
32
|
+
/** end offset in original source */
|
|
33
|
+
end: number;
|
|
34
|
+
}
|
|
35
|
+
/** binary operator type */
|
|
36
|
+
type BinaryOperator = '&&' | '||' | '|';
|
|
37
|
+
/** binary command (e.g., `cmd1 && cmd2`) */
|
|
38
|
+
export interface ParsedBinaryCmd {
|
|
39
|
+
type: 'BinaryCmd';
|
|
40
|
+
/** operator: && || | */
|
|
41
|
+
op: BinaryOperator;
|
|
42
|
+
/** left side command */
|
|
43
|
+
left: ParsedCommand;
|
|
44
|
+
/** right side command */
|
|
45
|
+
right: ParsedCommand;
|
|
46
|
+
/** start offset in original source */
|
|
47
|
+
start: number;
|
|
48
|
+
/** end offset in original source */
|
|
49
|
+
end: number;
|
|
50
|
+
}
|
|
51
|
+
/** subshell (e.g., `(cmd1 && cmd2)`) */
|
|
52
|
+
export interface ParsedSubshell {
|
|
53
|
+
type: 'Subshell';
|
|
54
|
+
/** inner command */
|
|
55
|
+
body: ParsedCommand;
|
|
56
|
+
/** start offset in original source */
|
|
57
|
+
start: number;
|
|
58
|
+
/** end offset in original source */
|
|
59
|
+
end: number;
|
|
60
|
+
}
|
|
61
|
+
/** block (e.g., `{ cmd1; cmd2; }`) */
|
|
62
|
+
export interface ParsedBlock {
|
|
63
|
+
type: 'Block';
|
|
64
|
+
/** inner command */
|
|
65
|
+
body: ParsedCommand;
|
|
66
|
+
/** start offset in original source */
|
|
67
|
+
start: number;
|
|
68
|
+
/** end offset in original source */
|
|
69
|
+
end: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* parses command text into ParsedCallExpr structure (pure)
|
|
73
|
+
* @param cmdText the command text to parse
|
|
74
|
+
* @returns the parsed call expression
|
|
75
|
+
*/
|
|
76
|
+
export declare const parseCommandText: (cmdText: string) => Readonly<ParsedCallExpr>;
|
|
77
|
+
/**
|
|
78
|
+
* parses command text into structured form
|
|
79
|
+
* @param text command text to parse
|
|
80
|
+
* @param baseOffset offset in original source
|
|
81
|
+
* @returns parsed command structure
|
|
82
|
+
*/
|
|
83
|
+
export declare const parseCommandStructure: (text: string, baseOffset: number) => ParsedCommand;
|
|
84
|
+
/**
|
|
85
|
+
* finds all run commands in parsed structure
|
|
86
|
+
* @param cmd parsed command to search
|
|
87
|
+
* @param source original source string
|
|
88
|
+
* @returns array of run command matches
|
|
89
|
+
*/
|
|
90
|
+
export declare const findRunInParsed: (cmd: ParsedCommand, source: string) => RunMatch[];
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=parsing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../src/parsing.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,iCAAiC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,uDAAuD;AACvD,MAAM,WAAW,QAAQ;IACvB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,+BAA+B;AAC/B,MAAM,MAAM,aAAa,GACrB,mBAAmB,GACnB,eAAe,GACf,cAAc,GACd,WAAW,CAAC;AAEhB,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,iCAAiC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,2BAA2B;AAC3B,KAAK,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAExC,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,wBAAwB;IACxB,EAAE,EAAE,cAAc,CAAC;IACnB,wBAAwB;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,yBAAyB;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,oBAAoB;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,oBAAoB;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb;AA8ID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAAa,MAAM,KAAG,QAAQ,CAAC,cAAc,CAWzE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,SAC1B,MAAM,cACA,MAAM,KACjB,aA4DF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QACrB,aAAa,UACV,MAAM,KACb,QAAQ,EAkCV,CAAC"}
|
package/lib/parsing.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import parseArgs from 'yargs-parser';
|
|
2
|
+
/**
|
|
3
|
+
* updates depth counters based on character
|
|
4
|
+
* @param char the character
|
|
5
|
+
* @param parenDepth current parenthesis depth
|
|
6
|
+
* @param braceDepth current brace depth
|
|
7
|
+
* @returns updated depths
|
|
8
|
+
*/
|
|
9
|
+
const updateDepths = (char, parenDepth, braceDepth) => {
|
|
10
|
+
let newParenDepth = parenDepth;
|
|
11
|
+
let newBraceDepth = braceDepth;
|
|
12
|
+
if (char === '(') {
|
|
13
|
+
newParenDepth++;
|
|
14
|
+
}
|
|
15
|
+
else if (char === ')') {
|
|
16
|
+
newParenDepth--;
|
|
17
|
+
}
|
|
18
|
+
else if (char === '{') {
|
|
19
|
+
newBraceDepth++;
|
|
20
|
+
}
|
|
21
|
+
else if (char === '}') {
|
|
22
|
+
newBraceDepth--;
|
|
23
|
+
}
|
|
24
|
+
return [newParenDepth, newBraceDepth];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* checks if a character ends a quote
|
|
28
|
+
* @param char the character
|
|
29
|
+
* @param inSingleQuote whether in single quote
|
|
30
|
+
* @param inDoubleQuote whether in double quote
|
|
31
|
+
* @returns updated quote states
|
|
32
|
+
*/
|
|
33
|
+
const updateQuotes = (char, inSingleQuote, inDoubleQuote) => {
|
|
34
|
+
let newSingleQuote = inSingleQuote;
|
|
35
|
+
let newDoubleQuote = inDoubleQuote;
|
|
36
|
+
if (char === "'" && !inDoubleQuote) {
|
|
37
|
+
newSingleQuote = !inSingleQuote;
|
|
38
|
+
}
|
|
39
|
+
else if (char === '"' && !inSingleQuote) {
|
|
40
|
+
newDoubleQuote = !inDoubleQuote;
|
|
41
|
+
}
|
|
42
|
+
return [newSingleQuote, newDoubleQuote];
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* checks for binary operators at current position
|
|
46
|
+
* @param params collection of parameters
|
|
47
|
+
* @param params.char current character
|
|
48
|
+
* @param params.nextChar next character
|
|
49
|
+
* @param params.parenDepth parenthesis depth
|
|
50
|
+
* @param params.braceDepth number of nested braces currently open
|
|
51
|
+
* @returns operator match or null
|
|
52
|
+
*/
|
|
53
|
+
const checkBinaryOp = (params) => {
|
|
54
|
+
const { char, nextChar, parenDepth, braceDepth } = params;
|
|
55
|
+
if (parenDepth !== 0 || braceDepth !== 0) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
if (char === '&' && nextChar === '&') {
|
|
59
|
+
return { op: '&&' };
|
|
60
|
+
}
|
|
61
|
+
if (char === '|' && nextChar === '|') {
|
|
62
|
+
return { op: '||' };
|
|
63
|
+
}
|
|
64
|
+
if (char === '|' && nextChar !== '|') {
|
|
65
|
+
return { op: '|' };
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* finds the first top-level binary operator in command text
|
|
71
|
+
* @param text command text to search
|
|
72
|
+
* @returns operator match or null if none found
|
|
73
|
+
*/
|
|
74
|
+
const findTopLevelOperator = (text) => {
|
|
75
|
+
let parenDepth = 0;
|
|
76
|
+
let braceDepth = 0;
|
|
77
|
+
let inSingleQuote = false;
|
|
78
|
+
let inDoubleQuote = false;
|
|
79
|
+
let escaped = false;
|
|
80
|
+
for (let i = 0; i < text.length; i++) {
|
|
81
|
+
const char = text[i];
|
|
82
|
+
const nextChar = text[i + 1];
|
|
83
|
+
if (escaped) {
|
|
84
|
+
escaped = false;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (char === '\\' && !inSingleQuote) {
|
|
88
|
+
escaped = true;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
[inSingleQuote, inDoubleQuote] = updateQuotes(char, inSingleQuote, inDoubleQuote);
|
|
92
|
+
if (inSingleQuote || inDoubleQuote) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
[parenDepth, braceDepth] = updateDepths(char, parenDepth, braceDepth);
|
|
96
|
+
const opMatch = checkBinaryOp({ char, nextChar, parenDepth, braceDepth });
|
|
97
|
+
if (opMatch) {
|
|
98
|
+
return { ...opMatch, index: i };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* parses command text into ParsedCallExpr structure (pure)
|
|
105
|
+
* @param cmdText the command text to parse
|
|
106
|
+
* @returns the parsed call expression
|
|
107
|
+
*/
|
|
108
|
+
export const parseCommandText = (cmdText) => {
|
|
109
|
+
const arg = parseArgs(cmdText, {
|
|
110
|
+
configuration: { 'populate--': true, 'unknown-options-as-args': true },
|
|
111
|
+
});
|
|
112
|
+
const parts = arg._;
|
|
113
|
+
const command = parts[0] ?? '';
|
|
114
|
+
const args = parts.slice(1);
|
|
115
|
+
const extraArgs = (arg['--'] ?? []);
|
|
116
|
+
return { command, args, extraArgs };
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* parses command text into structured form
|
|
120
|
+
* @param text command text to parse
|
|
121
|
+
* @param baseOffset offset in original source
|
|
122
|
+
* @returns parsed command structure
|
|
123
|
+
*/
|
|
124
|
+
export const parseCommandStructure = (text, baseOffset) => {
|
|
125
|
+
const trimmed = text.trim();
|
|
126
|
+
const trimOffset = text.indexOf(trimmed);
|
|
127
|
+
const start = baseOffset + trimOffset;
|
|
128
|
+
const end = start + trimmed.length;
|
|
129
|
+
// check for Subshell: (...)
|
|
130
|
+
if (trimmed.startsWith('(') && trimmed.endsWith(')')) {
|
|
131
|
+
const inner = trimmed.slice(1, -1);
|
|
132
|
+
return {
|
|
133
|
+
type: 'Subshell',
|
|
134
|
+
body: parseCommandStructure(inner, start + 1),
|
|
135
|
+
start,
|
|
136
|
+
end,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// check for Block: { ... }
|
|
140
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
141
|
+
const inner = trimmed.slice(1, -1);
|
|
142
|
+
return {
|
|
143
|
+
type: 'Block',
|
|
144
|
+
body: parseCommandStructure(inner, start + 1),
|
|
145
|
+
start,
|
|
146
|
+
end,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// check for BinaryCmd: cmd1 && cmd2
|
|
150
|
+
const opMatch = findTopLevelOperator(trimmed);
|
|
151
|
+
if (opMatch) {
|
|
152
|
+
const leftText = trimmed.slice(0, opMatch.index);
|
|
153
|
+
const rightText = trimmed.slice(opMatch.index + opMatch.op.length);
|
|
154
|
+
return {
|
|
155
|
+
type: 'BinaryCmd',
|
|
156
|
+
op: opMatch.op,
|
|
157
|
+
left: parseCommandStructure(leftText, start),
|
|
158
|
+
right: parseCommandStructure(rightText, start + opMatch.index + opMatch.op.length),
|
|
159
|
+
start,
|
|
160
|
+
end,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// otherwise it's a CallExpr
|
|
164
|
+
const parsed = parseCommandText(trimmed);
|
|
165
|
+
return {
|
|
166
|
+
type: 'CallExpr',
|
|
167
|
+
command: parsed.command,
|
|
168
|
+
args: parsed.args,
|
|
169
|
+
extraArgs: parsed.extraArgs,
|
|
170
|
+
start,
|
|
171
|
+
end,
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* finds all run commands in parsed structure
|
|
176
|
+
* @param cmd parsed command to search
|
|
177
|
+
* @param source original source string
|
|
178
|
+
* @returns array of run command matches
|
|
179
|
+
*/
|
|
180
|
+
export const findRunInParsed = (cmd, source) => {
|
|
181
|
+
const matches = [];
|
|
182
|
+
const visit = (node) => {
|
|
183
|
+
switch (node.type) {
|
|
184
|
+
case 'CallExpr':
|
|
185
|
+
// check if command is 'run' with at least one task
|
|
186
|
+
if (node.command === 'run' && node.args.length > 0) {
|
|
187
|
+
matches.push({
|
|
188
|
+
match: source.slice(node.start, node.end),
|
|
189
|
+
start: node.start,
|
|
190
|
+
end: node.end,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
case 'BinaryCmd':
|
|
195
|
+
visit(node.left);
|
|
196
|
+
visit(node.right);
|
|
197
|
+
break;
|
|
198
|
+
case 'Subshell':
|
|
199
|
+
case 'Block':
|
|
200
|
+
visit(node.body);
|
|
201
|
+
break;
|
|
202
|
+
default:
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
visit(cmd);
|
|
207
|
+
return matches;
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLGNBQWMsQ0FBQztBQTRGckM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ0EsRUFBRTtJQUNwQixJQUFJLGFBQWEsR0FBRyxVQUFVLENBQUM7SUFDL0IsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDO0lBRS9CLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGFBQWEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7U0FBTSxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN4QixhQUFhLEVBQUUsQ0FBQztJQUNsQixDQUFDO1NBQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDeEIsYUFBYSxFQUFFLENBQUM7SUFDbEIsQ0FBQztTQUFNLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLGFBQWEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sWUFBWSxHQUFHLENBQ25CLElBQVksRUFDWixhQUFzQixFQUN0QixhQUFzQixFQUNGLEVBQUU7SUFDdEIsSUFBSSxjQUFjLEdBQUcsYUFBYSxDQUFDO0lBQ25DLElBQUksY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUVuQyxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQyxjQUFjLEdBQUcsQ0FBQyxhQUFhLENBQUM7SUFDbEMsQ0FBQztTQUFNLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFDLGNBQWMsR0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/preset/bootstrap.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/preset/bootstrap.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B3D"}
|
package/lib/preset/bootstrap.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { info } from 'node:console';
|
|
2
|
-
import {
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
3
|
import { resolveProjectContext } from '../context.js';
|
|
4
4
|
import { ensureFile } from '../io.js';
|
|
5
5
|
import { serialize } from '../serialization.js';
|
|
@@ -11,7 +11,11 @@ import { resolveAssets } from './resolution/index.js';
|
|
|
11
11
|
*/
|
|
12
12
|
export async function bootstrap(cwd) {
|
|
13
13
|
const context = await resolveProjectContext(cwd);
|
|
14
|
-
|
|
14
|
+
const packageName = context.packageJson.name;
|
|
15
|
+
if (!packageName) {
|
|
16
|
+
throw new Error(`failed to bootstrap unnamed package at ${context.relativeProjectRoot}`);
|
|
17
|
+
}
|
|
18
|
+
info(`Bootstrapping ${packageName} (${context.relativeProjectRoot})`);
|
|
15
19
|
// generate configurations
|
|
16
20
|
const node = await resolveProjectPreset(context);
|
|
17
21
|
const assets = await resolveAssets(node, context);
|
|
@@ -26,4 +30,4 @@ export async function bootstrap(cwd) {
|
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
32
|
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ByZXNldC9ib290c3RyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFZO0lBQzFDLE1BQU0sT0FBTyxHQUFHLE1BQU0scUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFFN0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQyxpQkFBaUIsV0FBVyxLQUFLLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFFdEUsMEJBQTBCO0lBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWxELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXZELElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUM7WUFFM0IsVUFBVSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/preset/config/resolve.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/preset/config/resolve.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAW/C;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB1E"}
|
|
@@ -24,4 +24,4 @@ export async function resolvePresetterConfig(root) {
|
|
|
24
24
|
// NOTE: load the preset with import cache as a fix to a bug in jiti that importing the same file multiple times simtaneously would result in some of the imports resolved as undefined
|
|
25
25
|
return (configs[closestConfigPath] ??= jiti.import(closestConfigPath, { default: true }));
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmVzZXQvY29uZmlnL3Jlc29sdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJbEQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUN2QyxXQUFXLEVBQUUsS0FBSyxFQUFFLHFLQUFxSztJQUN6TCxxQkFBcUI7SUFDckIsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ2pELG1CQUFtQjtDQUNwQixDQUFDLENBQUM7QUFFSCxNQUFNLE9BQU8sR0FBb0MsRUFBRSxDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUFDLElBQVk7SUFDdkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV2RCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCwrR0FBK0c7SUFDL0csTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFFLENBQUM7SUFFMUMsS0FBSyxDQUFDLHdDQUF3QyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFFbkUsdUxBQXVMO0lBQ3ZMLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUNoRCxpQkFBaUIsRUFDakIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
|
package/lib/preset/project.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { PresetNode, ProjectContext } from 'presetter
|
|
1
|
+
import type { PresetNode, ProjectContext } from '@presetter/types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* build the full preset graph for a project
|
|
4
4
|
* @param context context about the target project and customization in .presetterrc
|
|
5
5
|
* @returns assets from the preset
|
|
6
6
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/preset/project.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/preset/project.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC,CAoBrB"}
|