qualety 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/biome.d.ts +18 -0
- package/dist/biome.d.ts.map +1 -0
- package/dist/biome.js +312 -0
- package/dist/biome.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +149 -0
- package/dist/cli.js.map +1 -0
- package/dist/companion-closure.d.ts +2 -0
- package/dist/companion-closure.d.ts.map +1 -0
- package/dist/companion-closure.js +29 -0
- package/dist/companion-closure.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +222 -0
- package/dist/config.js.map +1 -0
- package/dist/default-providers.d.ts +5 -0
- package/dist/default-providers.d.ts.map +1 -0
- package/dist/default-providers.js +5 -0
- package/dist/default-providers.js.map +1 -0
- package/dist/define-rule.d.ts +9 -0
- package/dist/define-rule.d.ts.map +1 -0
- package/dist/define-rule.js +5 -0
- package/dist/define-rule.js.map +1 -0
- package/dist/define-rule.types.d.ts +2 -0
- package/dist/define-rule.types.d.ts.map +1 -0
- package/dist/define-rule.types.js +33 -0
- package/dist/define-rule.types.js.map +1 -0
- package/dist/engine.d.ts +10 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +447 -0
- package/dist/engine.js.map +1 -0
- package/dist/git-seed.d.ts +2 -0
- package/dist/git-seed.d.ts.map +1 -0
- package/dist/git-seed.js +52 -0
- package/dist/git-seed.js.map +1 -0
- package/dist/index.d.ts +138 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/record.d.ts +2 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +4 -0
- package/dist/record.js.map +1 -0
- package/dist/ruff.d.ts +17 -0
- package/dist/ruff.d.ts.map +1 -0
- package/dist/ruff.js +303 -0
- package/dist/ruff.js.map +1 -0
- package/dist/rule-options.d.ts +3 -0
- package/dist/rule-options.d.ts.map +1 -0
- package/dist/rule-options.js +78 -0
- package/dist/rule-options.js.map +1 -0
- package/dist/run-command.d.ts +13 -0
- package/dist/run-command.d.ts.map +1 -0
- package/dist/run-command.js +60 -0
- package/dist/run-command.js.map +1 -0
- package/dist/schemas.d.ts +125 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +79 -0
- package/dist/schemas.js.map +1 -0
- package/dist/standalone-wasm.d.ts +7 -0
- package/dist/standalone-wasm.d.ts.map +1 -0
- package/dist/standalone-wasm.js +31 -0
- package/dist/standalone-wasm.js.map +1 -0
- package/dist/typescript-frontend.d.ts +4 -0
- package/dist/typescript-frontend.d.ts.map +1 -0
- package/dist/typescript-frontend.js +105 -0
- package/dist/typescript-frontend.js.map +1 -0
- package/package.json +46 -0
package/dist/engine.js
ADDED
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { glob } from "node:fs/promises";
|
|
10
|
+
import { basename, dirname, relative, resolve, sep } from "node:path";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
import { biomeEnabled, runBiomePhase } from "./biome.js";
|
|
13
|
+
import { expandCompanions } from "./companion-closure.js";
|
|
14
|
+
import { CONFIG_FILENAMES, ConfigError, isStandalone, loadConfig } from "./config.js";
|
|
15
|
+
import { DEFAULT_PROVIDERS } from "./default-providers.js";
|
|
16
|
+
import { listGitSeed } from "./git-seed.js";
|
|
17
|
+
import { NO_SUGGESTION, } from "./index.js";
|
|
18
|
+
import { isRecord } from "./record.js";
|
|
19
|
+
import { ruffEnabled, runRuffPhase } from "./ruff.js";
|
|
20
|
+
import { compileRuleOptions } from "./rule-options.js";
|
|
21
|
+
import { pluginSchema } from "./schemas.js";
|
|
22
|
+
import { expandTypeScriptClosure } from "./typescript-frontend.js";
|
|
23
|
+
const NOTHING_TO_CHECK = "No rules configured — nothing to check.";
|
|
24
|
+
const NO_RULES_MATCHED = "No rules matched filters.";
|
|
25
|
+
const DEFAULT_INCLUDE = ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts", "**/*.py"];
|
|
26
|
+
const DEFAULT_EXCLUDE = ["**/node_modules/**", "**/dist/**"];
|
|
27
|
+
const officialLoaders = {
|
|
28
|
+
"@qualety/typescript": () =>
|
|
29
|
+
// @ts-expect-error official plugin; not a qualety dependency
|
|
30
|
+
import("@qualety/typescript"),
|
|
31
|
+
"@qualety/react": () =>
|
|
32
|
+
// @ts-expect-error official plugin; not a qualety dependency
|
|
33
|
+
import("@qualety/react"),
|
|
34
|
+
"@qualety/dry": () =>
|
|
35
|
+
// @ts-expect-error official plugin; not a qualety dependency
|
|
36
|
+
import("@qualety/dry"),
|
|
37
|
+
"@qualety/python": () =>
|
|
38
|
+
// @ts-expect-error official plugin; not a qualety dependency
|
|
39
|
+
import("@qualety/python"),
|
|
40
|
+
};
|
|
41
|
+
const EMPTY_FILTERS = {
|
|
42
|
+
plugins: [],
|
|
43
|
+
excludePlugins: [],
|
|
44
|
+
rules: [],
|
|
45
|
+
diff: "off",
|
|
46
|
+
};
|
|
47
|
+
export async function check(cwd, out, err, filters = EMPTY_FILTERS) {
|
|
48
|
+
try {
|
|
49
|
+
const loaded = await loadConfig(cwd);
|
|
50
|
+
if (loaded === undefined) {
|
|
51
|
+
if (hasNameFilters(filters)) {
|
|
52
|
+
assertKnownFilters([], [], filters);
|
|
53
|
+
}
|
|
54
|
+
out(NOTHING_TO_CHECK);
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
const { path: configPath, config } = loaded;
|
|
58
|
+
const plugins = await loadPluginsFromConfig(config, configPath);
|
|
59
|
+
const enabled = resolveEnabledRules(plugins, config.rules);
|
|
60
|
+
assertKnownFilters(plugins, enabled, filters);
|
|
61
|
+
const selected = selectRules(enabled, filters);
|
|
62
|
+
const composed = hasNameFilters(filters)
|
|
63
|
+
? { biome: false, ruff: false }
|
|
64
|
+
: { biome: biomeEnabled(config), ruff: ruffEnabled(config) };
|
|
65
|
+
if (selected.length === 0 && !composed.biome && !composed.ruff) {
|
|
66
|
+
out(hasNameFilters(filters) ? NO_RULES_MATCHED : NOTHING_TO_CHECK);
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
const files = await listCheckFiles(cwd, config, filters.diff);
|
|
70
|
+
if (files.length === 0) {
|
|
71
|
+
out("No files to check.");
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
const displayPaths = files.map((abs) => displayPath(cwd, abs));
|
|
75
|
+
const composedViolations = await runComposedPhases(cwd, displayPaths, plugins, config, composed);
|
|
76
|
+
const productViolations = selected.length === 0
|
|
77
|
+
? []
|
|
78
|
+
: collectViolations(selected, cwd, displayPaths, await buildRequiredArtifacts(plugins, selected, {
|
|
79
|
+
cwd,
|
|
80
|
+
files: displayPaths,
|
|
81
|
+
exclude: mergedExclude(config),
|
|
82
|
+
}));
|
|
83
|
+
const violations = [...composedViolations, ...productViolations];
|
|
84
|
+
violations.sort((a, b) => a.file.localeCompare(b.file) ||
|
|
85
|
+
a.range.start.line - b.range.start.line ||
|
|
86
|
+
a.range.start.column - b.range.start.column ||
|
|
87
|
+
a.ruleId.localeCompare(b.ruleId));
|
|
88
|
+
printViolations(violations, out);
|
|
89
|
+
return violations.length > 0 ? 1 : 0;
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
err(e instanceof Error ? e.message : String(e));
|
|
93
|
+
return 2;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function runComposedPhases(cwd, displayPaths, plugins, config, composed) {
|
|
97
|
+
const biomeViolations = composed.biome
|
|
98
|
+
? (await runBiomePhase({
|
|
99
|
+
cwd,
|
|
100
|
+
files: displayPaths,
|
|
101
|
+
plugins,
|
|
102
|
+
biome: config.biome,
|
|
103
|
+
})).map((violation) => ({ ...violation, file: displayPath(cwd, violation.file) }))
|
|
104
|
+
: [];
|
|
105
|
+
const ruffViolations = composed.ruff
|
|
106
|
+
? (await runRuffPhase({
|
|
107
|
+
cwd,
|
|
108
|
+
files: displayPaths,
|
|
109
|
+
plugins,
|
|
110
|
+
ruff: config.ruff,
|
|
111
|
+
})).map((violation) => ({ ...violation, file: displayPath(cwd, violation.file) }))
|
|
112
|
+
: [];
|
|
113
|
+
return [...biomeViolations, ...ruffViolations];
|
|
114
|
+
}
|
|
115
|
+
function collectViolations(selected, cwd, displayPaths, artifacts) {
|
|
116
|
+
const violations = [];
|
|
117
|
+
for (const item of selected) {
|
|
118
|
+
const allowed = new Set(requiresOf(item));
|
|
119
|
+
function getArtifact(id) {
|
|
120
|
+
if (!allowed.has(id)) {
|
|
121
|
+
throw new ConfigError(`getArtifact(${JSON.stringify(id)}) requires meta.requires to include ${JSON.stringify(id)}`);
|
|
122
|
+
}
|
|
123
|
+
if (!artifacts.has(id)) {
|
|
124
|
+
throw new ConfigError(`Artifact ${JSON.stringify(id)} is not available.`);
|
|
125
|
+
}
|
|
126
|
+
return artifacts.get(id);
|
|
127
|
+
}
|
|
128
|
+
item.rule.create({
|
|
129
|
+
id: item.id,
|
|
130
|
+
options: item.options,
|
|
131
|
+
getCwd: () => cwd,
|
|
132
|
+
getFiles: () => displayPaths,
|
|
133
|
+
getArtifact,
|
|
134
|
+
report: (violation) => {
|
|
135
|
+
violations.push({
|
|
136
|
+
...violation,
|
|
137
|
+
ruleId: item.id,
|
|
138
|
+
severity: item.severity,
|
|
139
|
+
file: displayPath(cwd, violation.file),
|
|
140
|
+
suggestion: violation.suggestion ?? NO_SUGGESTION,
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return violations;
|
|
146
|
+
}
|
|
147
|
+
function printViolations(violations, out) {
|
|
148
|
+
for (const violation of violations) {
|
|
149
|
+
const loc = `${violation.file}:${violation.range.start.line}:${violation.range.start.column}`;
|
|
150
|
+
if (violation.suggestion === NO_SUGGESTION) {
|
|
151
|
+
out(`${loc} ${violation.severity} ${violation.ruleId} ${violation.message}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
out(`${loc} ${violation.severity} ${violation.ruleId} ${violation.message}\n suggestion: ${violation.suggestion}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export async function loadPluginsFromConfig(config, configPath) {
|
|
159
|
+
const plugins = [];
|
|
160
|
+
for (const spec of config.plugins) {
|
|
161
|
+
plugins.push(await loadPlugin(spec, dirname(configPath)));
|
|
162
|
+
}
|
|
163
|
+
return plugins;
|
|
164
|
+
}
|
|
165
|
+
async function loadPlugin(spec, fromDir) {
|
|
166
|
+
let loaded;
|
|
167
|
+
try {
|
|
168
|
+
loaded = await loadPluginModule(spec, fromDir);
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
if (e instanceof ConfigError) {
|
|
172
|
+
throw e;
|
|
173
|
+
}
|
|
174
|
+
throw new ConfigError(`Failed to load plugin "${spec}": ${e instanceof Error ? e.message : String(e)}`);
|
|
175
|
+
}
|
|
176
|
+
const candidate = isRecord(loaded) ? (loaded.default ?? loaded.plugin) : undefined;
|
|
177
|
+
const parsed = pluginSchema.safeParse(candidate);
|
|
178
|
+
requirePlugin(spec, candidate, parsed);
|
|
179
|
+
return candidate;
|
|
180
|
+
}
|
|
181
|
+
async function loadPluginModule(spec, fromDir) {
|
|
182
|
+
const loadOfficial = officialLoaders[spec];
|
|
183
|
+
if (loadOfficial !== undefined) {
|
|
184
|
+
return loadOfficial();
|
|
185
|
+
}
|
|
186
|
+
if (isStandalone()) {
|
|
187
|
+
throw new ConfigError(`Standalone binary cannot load plugin "${spec}". Custom plugins need npm: npm i qualety`);
|
|
188
|
+
}
|
|
189
|
+
const target = spec.startsWith(".") || spec.startsWith("/")
|
|
190
|
+
? pathToFileURL(resolve(fromDir, spec)).href
|
|
191
|
+
: spec;
|
|
192
|
+
return import(__rewriteRelativeImportExtension(target));
|
|
193
|
+
}
|
|
194
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: assertion plus Zod path dispatch
|
|
195
|
+
function requirePlugin(spec, candidate, parsed) {
|
|
196
|
+
if (parsed.success) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const name = isRecord(candidate) && typeof candidate.name === "string" && candidate.name.length > 0
|
|
200
|
+
? candidate.name
|
|
201
|
+
: spec;
|
|
202
|
+
for (const issue of parsed.error.issues) {
|
|
203
|
+
if (issue.path.length === 0 || (issue.path.length === 1 && issue.path[0] === "name")) {
|
|
204
|
+
throw new ConfigError(`Module "${spec}" does not export a Plugin (default or "plugin")`);
|
|
205
|
+
}
|
|
206
|
+
if (issue.path[0] === "provides" && issue.path[1] === "") {
|
|
207
|
+
throw new ConfigError(`Plugin "${name}" provides an empty artifact id.`);
|
|
208
|
+
}
|
|
209
|
+
if (issue.path[0] === "rules" &&
|
|
210
|
+
typeof issue.path[1] === "string" &&
|
|
211
|
+
issue.path[2] === "meta" &&
|
|
212
|
+
issue.path[3] === "requires") {
|
|
213
|
+
throw new ConfigError(`Rule "${name}/${issue.path[1]}" has invalid requires; must be an array of non-empty artifact ids.`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const first = parsed.error.issues[0];
|
|
217
|
+
const zodPath = first === undefined ? "" : first.path.map(String).join(".");
|
|
218
|
+
const detail = first === undefined ? "invalid" : first.message;
|
|
219
|
+
throw new ConfigError(`Plugin "${name}" is invalid (${zodPath}: ${detail}).`);
|
|
220
|
+
}
|
|
221
|
+
function hasNameFilters(filters) {
|
|
222
|
+
return (filters.plugins.length > 0 || filters.excludePlugins.length > 0 || filters.rules.length > 0);
|
|
223
|
+
}
|
|
224
|
+
function pluginNameOf(id) {
|
|
225
|
+
const slash = id.indexOf("/");
|
|
226
|
+
return slash === -1 ? id : id.slice(0, slash);
|
|
227
|
+
}
|
|
228
|
+
function assertKnownFilters(plugins, enabled, filters) {
|
|
229
|
+
const pluginNames = new Set(plugins.map((plugin) => plugin.name));
|
|
230
|
+
const catalog = new Set();
|
|
231
|
+
for (const plugin of plugins) {
|
|
232
|
+
for (const name of Object.keys(plugin.rules ?? {})) {
|
|
233
|
+
catalog.add(`${plugin.name}/${name}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const asked = [...filters.plugins, ...filters.excludePlugins];
|
|
237
|
+
const unknownPlugins = [...new Set(asked.filter((name) => !pluginNames.has(name)))];
|
|
238
|
+
if (unknownPlugins.length > 0) {
|
|
239
|
+
throw new ConfigError(unknownPlugins.length === 1
|
|
240
|
+
? `Unknown plugin name: ${unknownPlugins[0]}.`
|
|
241
|
+
: `Unknown plugin names: ${unknownPlugins.join(", ")}.`);
|
|
242
|
+
}
|
|
243
|
+
const unknownRules = filters.rules.filter((id) => !catalog.has(id));
|
|
244
|
+
if (unknownRules.length > 0) {
|
|
245
|
+
throw new ConfigError(unknownRules.length === 1
|
|
246
|
+
? `Unknown rule id: ${unknownRules[0]}.`
|
|
247
|
+
: `Unknown rule ids: ${unknownRules.join(", ")}.`);
|
|
248
|
+
}
|
|
249
|
+
const enabledIds = new Set(enabled.map((item) => item.id));
|
|
250
|
+
const disabled = filters.rules.filter((id) => !enabledIds.has(id));
|
|
251
|
+
if (disabled.length > 0) {
|
|
252
|
+
throw new ConfigError(disabled.length === 1
|
|
253
|
+
? `Rule "${disabled[0]}" is not enabled.`
|
|
254
|
+
: `Rules not enabled: ${disabled.join(", ")}.`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function selectRules(enabled, filters) {
|
|
258
|
+
let selected = enabled;
|
|
259
|
+
if (filters.plugins.length > 0) {
|
|
260
|
+
const allow = new Set(filters.plugins);
|
|
261
|
+
selected = selected.filter((item) => allow.has(pluginNameOf(item.id)));
|
|
262
|
+
}
|
|
263
|
+
if (filters.excludePlugins.length > 0) {
|
|
264
|
+
const deny = new Set(filters.excludePlugins);
|
|
265
|
+
selected = selected.filter((item) => !deny.has(pluginNameOf(item.id)));
|
|
266
|
+
}
|
|
267
|
+
if (filters.rules.length > 0) {
|
|
268
|
+
const allow = new Set(filters.rules);
|
|
269
|
+
selected = selected.filter((item) => allow.has(item.id));
|
|
270
|
+
}
|
|
271
|
+
return selected;
|
|
272
|
+
}
|
|
273
|
+
async function listCheckFiles(cwd, config, diff) {
|
|
274
|
+
const workspace = await listWorkspaceFiles(cwd, config);
|
|
275
|
+
if (diff === "off") {
|
|
276
|
+
return workspace;
|
|
277
|
+
}
|
|
278
|
+
const seed = await listGitSeed(cwd, diff);
|
|
279
|
+
const workspaceSet = new Set(workspace);
|
|
280
|
+
const matched = seed.filter((file) => workspaceSet.has(file));
|
|
281
|
+
if (matched.length === 0) {
|
|
282
|
+
return [];
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
const closed = expandTypeScriptClosure(cwd, workspace, matched);
|
|
286
|
+
return expandCompanions(cwd, workspace, closed);
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
290
|
+
throw new Error(`Failed to resolve dependency closure: ${detail}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function resolveEnabledRules(plugins, userRules) {
|
|
294
|
+
const catalog = new Map();
|
|
295
|
+
const rules = {};
|
|
296
|
+
for (const plugin of plugins) {
|
|
297
|
+
for (const [name, rule] of Object.entries(plugin.rules ?? {})) {
|
|
298
|
+
catalog.set(`${plugin.name}/${name}`, rule);
|
|
299
|
+
}
|
|
300
|
+
Object.assign(rules, plugin.configs?.recommended?.rules);
|
|
301
|
+
}
|
|
302
|
+
Object.assign(rules, userRules);
|
|
303
|
+
const unknown = Object.keys(rules).filter((id) => !catalog.has(id));
|
|
304
|
+
if (unknown.length > 0) {
|
|
305
|
+
throw new ConfigError(`Unknown rule id${unknown.length > 1 ? "s" : ""}: ${unknown.join(", ")}. No loaded plugin defines ${unknown.length > 1 ? "these rules" : "this rule"}.`);
|
|
306
|
+
}
|
|
307
|
+
const enabled = [];
|
|
308
|
+
for (const [id, setting] of Object.entries(rules)) {
|
|
309
|
+
const entry = enableRule(id, setting, catalog.get(id));
|
|
310
|
+
if (entry !== undefined) {
|
|
311
|
+
enabled.push(entry);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return enabled;
|
|
315
|
+
}
|
|
316
|
+
function enableRule(id, setting, rule) {
|
|
317
|
+
if (setting === "off") {
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
if (rule === undefined) {
|
|
321
|
+
throw new ConfigError(`Unknown rule id: ${id}. No loaded plugin defines this rule.`);
|
|
322
|
+
}
|
|
323
|
+
const severity = typeof setting === "string" ? setting : setting[0];
|
|
324
|
+
const rawOptions = typeof setting === "string" ? undefined : setting[1];
|
|
325
|
+
if (rawOptions === undefined) {
|
|
326
|
+
return { id, severity, rule, options: undefined };
|
|
327
|
+
}
|
|
328
|
+
if (rule.meta.schema === undefined) {
|
|
329
|
+
throw new ConfigError(`Rule "${id}" does not accept options.`);
|
|
330
|
+
}
|
|
331
|
+
const parsed = compileRuleOptions(rule.meta.schema, id).safeParse(rawOptions);
|
|
332
|
+
if (parsed.success) {
|
|
333
|
+
return { id, severity, rule, options: parsed.data };
|
|
334
|
+
}
|
|
335
|
+
const issue = parsed.error.issues[0];
|
|
336
|
+
const path = issue === undefined || issue.path.length === 0 ? "options" : issue.path.join(".");
|
|
337
|
+
const detail = issue === undefined ? "invalid" : issue.message;
|
|
338
|
+
throw new ConfigError(`Invalid options for "${id}": ${path}: ${detail}`);
|
|
339
|
+
}
|
|
340
|
+
function requiresOf(item) {
|
|
341
|
+
return item.rule.meta.requires ?? [];
|
|
342
|
+
}
|
|
343
|
+
async function buildRequiredArtifacts(plugins, enabled, base) {
|
|
344
|
+
const requiredBy = new Map();
|
|
345
|
+
for (const item of enabled) {
|
|
346
|
+
for (const id of requiresOf(item)) {
|
|
347
|
+
const list = requiredBy.get(id) ?? [];
|
|
348
|
+
list.push(item.id);
|
|
349
|
+
requiredBy.set(id, list);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const providers = collectProviders(plugins);
|
|
353
|
+
const artifacts = new Map();
|
|
354
|
+
const ids = [...requiredBy.keys()].sort((left, right) => artifactRank(left) - artifactRank(right) || left.localeCompare(right));
|
|
355
|
+
for (const id of ids) {
|
|
356
|
+
const rules = requiredBy.get(id);
|
|
357
|
+
if (rules === undefined) {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
artifacts.set(id, await buildOneArtifact(id, rules, providers, base, (artifactId) => artifacts.get(artifactId)));
|
|
361
|
+
}
|
|
362
|
+
return artifacts;
|
|
363
|
+
}
|
|
364
|
+
function artifactRank(id) {
|
|
365
|
+
if (id === "python") {
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
if (id === "typescript") {
|
|
369
|
+
return 1;
|
|
370
|
+
}
|
|
371
|
+
if (id === "code-embeddings") {
|
|
372
|
+
return 3;
|
|
373
|
+
}
|
|
374
|
+
return 2;
|
|
375
|
+
}
|
|
376
|
+
async function buildOneArtifact(id, rules, providers, base, getArtifact) {
|
|
377
|
+
const entry = providers.get(id);
|
|
378
|
+
if (entry === undefined) {
|
|
379
|
+
throw new ConfigError(`No provider for artifact "${id}" (required by ${rules.join(", ")}).`);
|
|
380
|
+
}
|
|
381
|
+
try {
|
|
382
|
+
return await entry.provider.build({
|
|
383
|
+
cwd: base.cwd,
|
|
384
|
+
files: base.files,
|
|
385
|
+
exclude: base.exclude,
|
|
386
|
+
requiredBy: rules,
|
|
387
|
+
getArtifact,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
catch (e) {
|
|
391
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
392
|
+
if (rules.some((ruleId) => detail.includes(ruleId))) {
|
|
393
|
+
throw e instanceof ConfigError ? e : new ConfigError(detail);
|
|
394
|
+
}
|
|
395
|
+
throw new ConfigError(`Failed to build artifact "${id}" (required by ${rules.join(", ")}): ${detail}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function collectProviders(plugins) {
|
|
399
|
+
const providers = new Map();
|
|
400
|
+
for (const plugin of plugins) {
|
|
401
|
+
registerPluginProvides(plugin, providers);
|
|
402
|
+
}
|
|
403
|
+
for (const [id, createProvider] of Object.entries(DEFAULT_PROVIDERS)) {
|
|
404
|
+
if (providers.has(id)) {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
providers.set(id, { provider: createProvider(), owner: "default" });
|
|
408
|
+
}
|
|
409
|
+
return providers;
|
|
410
|
+
}
|
|
411
|
+
function registerPluginProvides(plugin, providers) {
|
|
412
|
+
const provides = plugin.provides;
|
|
413
|
+
if (provides === undefined) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
for (const [id, provider] of Object.entries(provides)) {
|
|
417
|
+
const existing = providers.get(id);
|
|
418
|
+
if (existing !== undefined) {
|
|
419
|
+
throw new ConfigError(`Artifact "${id}" is provided by more than one owner (${existing.owner}, ${plugin.name}).`);
|
|
420
|
+
}
|
|
421
|
+
providers.set(id, { provider, owner: plugin.name });
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
function mergedExclude(config) {
|
|
425
|
+
return [...new Set([...(config.exclude ?? DEFAULT_EXCLUDE), ...DEFAULT_EXCLUDE])];
|
|
426
|
+
}
|
|
427
|
+
async function listWorkspaceFiles(cwd, config) {
|
|
428
|
+
const include = config.include ?? DEFAULT_INCLUDE;
|
|
429
|
+
const exclude = mergedExclude(config);
|
|
430
|
+
const found = new Set();
|
|
431
|
+
for (const pattern of include) {
|
|
432
|
+
for await (const entry of glob(pattern, { cwd, exclude })) {
|
|
433
|
+
const abs = resolve(cwd, entry);
|
|
434
|
+
if (CONFIG_FILENAMES.some((filename) => filename === basename(abs))) {
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
found.add(abs);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return [...found].sort();
|
|
441
|
+
}
|
|
442
|
+
function displayPath(cwd, file) {
|
|
443
|
+
const abs = resolve(cwd, file);
|
|
444
|
+
const rel = relative(cwd, abs);
|
|
445
|
+
return (rel === "" ? file : rel).split(sep).join("/");
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-seed.d.ts","sourceRoot":"","sources":["../src/git-seed.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyB/F"}
|
package/dist/git-seed.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
export async function listGitSeed(cwd, mode) {
|
|
6
|
+
const toplevel = (await runGit(cwd, ["rev-parse", "--show-toplevel"])).trim();
|
|
7
|
+
let names;
|
|
8
|
+
if (mode === "worktree") {
|
|
9
|
+
const dirty = splitGitNames(await runGit(cwd, ["diff", "--name-only", "--diff-filter=ACMR", "HEAD"]));
|
|
10
|
+
const extra = splitGitNames(await runGit(cwd, ["ls-files", "--others", "--exclude-standard"]));
|
|
11
|
+
names = [...new Set([...dirty, ...extra])];
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
const upstream = (await gitOk(cwd, ["rev-parse", "--abbrev-ref", "@{upstream}"])) ??
|
|
15
|
+
(await gitOk(cwd, ["rev-parse", "--verify", "origin/main"])) ??
|
|
16
|
+
(await gitOk(cwd, ["rev-parse", "--verify", "origin/master"]));
|
|
17
|
+
if (upstream === undefined) {
|
|
18
|
+
throw new Error("No upstream base was found (tried @{upstream}, origin/main, origin/master).");
|
|
19
|
+
}
|
|
20
|
+
const base = (await runGit(cwd, ["merge-base", "HEAD", upstream])).trim();
|
|
21
|
+
names = splitGitNames(await runGit(cwd, ["diff", "--name-only", "--diff-filter=ACMR", `${base}...HEAD`]));
|
|
22
|
+
}
|
|
23
|
+
return names.map((name) => resolve(toplevel, name));
|
|
24
|
+
}
|
|
25
|
+
async function gitOk(cwd, args) {
|
|
26
|
+
try {
|
|
27
|
+
return (await runGit(cwd, args)).trim();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function runGit(cwd, args) {
|
|
34
|
+
try {
|
|
35
|
+
const result = await execFileAsync("git", args, { cwd, encoding: "utf8" });
|
|
36
|
+
return result.stdout;
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
if (typeof e === "object" && e !== null && "code" in e && e.code === "ENOENT") {
|
|
40
|
+
throw new Error("git is not available.");
|
|
41
|
+
}
|
|
42
|
+
const stderr = typeof e === "object" && e !== null && "stderr" in e && typeof e.stderr === "string"
|
|
43
|
+
? e.stderr.trim()
|
|
44
|
+
: "";
|
|
45
|
+
const detail = stderr !== "" ? stderr : e instanceof Error ? e.message : String(e);
|
|
46
|
+
throw new Error(`git ${args.join(" ")} failed: ${detail}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function splitGitNames(stdout) {
|
|
50
|
+
return stdout.split("\n").filter((line) => line !== "");
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=git-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-seed.js","sourceRoot":"","sources":["../src/git-seed.ts"],"names":[],"mappings":"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"}
|