@lionden/core 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.
Files changed (51) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +23 -0
  3. package/dist/arg-names.d.ts +11 -0
  4. package/dist/arg-names.d.ts.map +1 -0
  5. package/dist/arg-names.js +39 -0
  6. package/dist/arg-names.js.map +1 -0
  7. package/dist/config-resolution.d.ts +20 -0
  8. package/dist/config-resolution.d.ts.map +1 -0
  9. package/dist/config-resolution.js +570 -0
  10. package/dist/config-resolution.js.map +1 -0
  11. package/dist/hook-system.d.ts +51 -0
  12. package/dist/hook-system.d.ts.map +1 -0
  13. package/dist/hook-system.js +144 -0
  14. package/dist/hook-system.js.map +1 -0
  15. package/dist/index.d.ts +17 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +21 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/key-artifacts.d.ts +75 -0
  20. package/dist/key-artifacts.d.ts.map +1 -0
  21. package/dist/key-artifacts.js +258 -0
  22. package/dist/key-artifacts.js.map +1 -0
  23. package/dist/leo-preflight.d.ts +11 -0
  24. package/dist/leo-preflight.d.ts.map +1 -0
  25. package/dist/leo-preflight.js +93 -0
  26. package/dist/leo-preflight.js.map +1 -0
  27. package/dist/log-style.d.ts +22 -0
  28. package/dist/log-style.d.ts.map +1 -0
  29. package/dist/log-style.js +67 -0
  30. package/dist/log-style.js.map +1 -0
  31. package/dist/lre.d.ts +14 -0
  32. package/dist/lre.d.ts.map +1 -0
  33. package/dist/lre.js +113 -0
  34. package/dist/lre.js.map +1 -0
  35. package/dist/plugin-loader.d.ts +20 -0
  36. package/dist/plugin-loader.d.ts.map +1 -0
  37. package/dist/plugin-loader.js +91 -0
  38. package/dist/plugin-loader.js.map +1 -0
  39. package/dist/task-builder.d.ts +49 -0
  40. package/dist/task-builder.d.ts.map +1 -0
  41. package/dist/task-builder.js +123 -0
  42. package/dist/task-builder.js.map +1 -0
  43. package/dist/task-runner.d.ts +78 -0
  44. package/dist/task-runner.d.ts.map +1 -0
  45. package/dist/task-runner.js +247 -0
  46. package/dist/task-runner.js.map +1 -0
  47. package/dist/types.d.ts +186 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +20 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +33 -0
@@ -0,0 +1,93 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ const LEO_VERSION_RE = /\b(\d+)\.(\d+)\.(\d+)(?![-+.\w])/;
5
+ const CONFIG_VERSION_RE = /^(\d+)\.(\d+)\.(\d+)$/;
6
+ const memoizedPreflights = new Map();
7
+ export function parseLeoVersionOutput(output) {
8
+ const match = LEO_VERSION_RE.exec(output);
9
+ if (!match)
10
+ return null;
11
+ return {
12
+ major: Number(match[1]),
13
+ minor: Number(match[2]),
14
+ patch: Number(match[3]),
15
+ text: `${match[1]}.${match[2]}.${match[3]}`,
16
+ };
17
+ }
18
+ export async function preflightLeo(config) {
19
+ const expected = parseConfigLeoVersion(config.leoVersion);
20
+ const expectedLine = expected ? `${expected.major}.${expected.minor}` : config.leoVersion;
21
+ const skip = config.skipLeoVersionCheck;
22
+ const key = `${config.leoBinary}\0${expectedLine}\0${skip ? "skip" : "check"}`;
23
+ const memoized = memoizedPreflights.get(key);
24
+ if (memoized)
25
+ return memoized;
26
+ const promise = runLeoPreflight(config, expected);
27
+ memoizedPreflights.set(key, promise);
28
+ return promise;
29
+ }
30
+ export function clearLeoPreflightMemoForTests() {
31
+ memoizedPreflights.clear();
32
+ }
33
+ async function runLeoPreflight(config, expected) {
34
+ const binary = config.leoBinary;
35
+ let stdout = "";
36
+ let stderr = "";
37
+ try {
38
+ const result = await execFileAsync(binary, ["--disable-update-check", "--version"], {
39
+ timeout: 30_000,
40
+ });
41
+ stdout = String(result.stdout);
42
+ stderr = String(result.stderr);
43
+ }
44
+ catch (err) {
45
+ const e = err;
46
+ const output = formatVersionOutput(e.stdout, e.stderr);
47
+ const reason = [e.code ? `code ${String(e.code)}` : "", e.message ?? "unknown error"]
48
+ .filter(Boolean)
49
+ .join(": ");
50
+ throw new Error(`Leo preflight failed for "${binary}": unable to execute ` +
51
+ `"${binary} --disable-update-check --version" (${reason}).` +
52
+ (output ? `\nOutput:\n${output}` : ""));
53
+ }
54
+ if (config.skipLeoVersionCheck)
55
+ return;
56
+ if (!expected) {
57
+ throw new Error(`Leo preflight failed for "${binary}": configured leoVersion ` +
58
+ `"${config.leoVersion}" is not a stable major.minor.patch version.`);
59
+ }
60
+ const output = `${stdout}\n${stderr}`;
61
+ const actual = parseLeoVersionOutput(output);
62
+ if (!actual) {
63
+ const formattedOutput = formatVersionOutput(stdout, stderr);
64
+ throw new Error(`Leo preflight failed for "${binary}": could not parse a stable ` +
65
+ `major.minor.patch version from "${binary} --disable-update-check --version".` +
66
+ (formattedOutput ? `\nOutput:\n${formattedOutput}` : ""));
67
+ }
68
+ if (actual.major !== expected.major || actual.minor !== expected.minor) {
69
+ throw new Error(`Leo preflight failed for "${binary}": leoBinary reports ${actual.text}, ` +
70
+ `but leoVersion "${config.leoVersion}" requires ${expected.major}.${expected.minor}.x. ` +
71
+ `Set leoBinary to a compatible Leo CLI or set skipLeoVersionCheck: true.`);
72
+ }
73
+ }
74
+ function parseConfigLeoVersion(version) {
75
+ const match = CONFIG_VERSION_RE.exec(version);
76
+ if (!match)
77
+ return null;
78
+ return {
79
+ major: Number(match[1]),
80
+ minor: Number(match[2]),
81
+ patch: Number(match[3]),
82
+ text: version,
83
+ };
84
+ }
85
+ function formatVersionOutput(stdout, stderr) {
86
+ const output = [stdout, stderr]
87
+ .map((value) => (value === undefined ? "" : String(value).trim()))
88
+ .filter(Boolean)
89
+ .join("\n")
90
+ .trim();
91
+ return output.slice(0, 1_000);
92
+ }
93
+ //# sourceMappingURL=leo-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leo-preflight.js","sourceRoot":"","sources":["../src/leo-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ declare const LOG_COLOR_CODES: {
2
+ readonly cyan: "\u001B[36m";
3
+ readonly dim: "\u001B[2m";
4
+ readonly green: "\u001B[32m";
5
+ readonly red: "\u001B[31m";
6
+ readonly yellow: "\u001B[33m";
7
+ };
8
+ type LogColor = keyof typeof LOG_COLOR_CODES;
9
+ export type LogStyleRole = "action" | "success" | "warning" | "error" | "metadata" | "divider";
10
+ export declare function shouldColorLogs(): boolean;
11
+ export declare function shouldRenderDivider(): boolean;
12
+ export declare function colorLogText(text: string, color: LogColor): string;
13
+ export declare function styleLogRole(text: string, role: LogStyleRole): string;
14
+ export declare function logAction(text: string): string;
15
+ export declare function logSuccess(text: string): string;
16
+ export declare function logWarning(text: string): string;
17
+ export declare function logError(text: string): string;
18
+ export declare function logMetadata(text: string): string;
19
+ export declare function logDivider(text?: string): string;
20
+ export declare function pluralize(word: string, count: number): string;
21
+ export {};
22
+ //# sourceMappingURL=log-style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-style.d.ts","sourceRoot":"","sources":["../src/log-style.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,eAAe;;;;;;CAMX,CAAC;AAIX,KAAK,QAAQ,GAAG,MAAM,OAAO,eAAe,CAAC;AAC7C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAe/F,wBAAgB,eAAe,IAAI,OAAO,CAKzC;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAGlE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAcrE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,IAAI,SAA6C,GAAG,MAAM,CAEpF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,67 @@
1
+ const LOG_COLOR_CODES = {
2
+ cyan: "\x1b[36m",
3
+ dim: "\x1b[2m",
4
+ green: "\x1b[32m",
5
+ red: "\x1b[31m",
6
+ yellow: "\x1b[33m",
7
+ };
8
+ const LOG_COLOR_RESET = "\x1b[0m";
9
+ function logProcess() {
10
+ return globalThis.process;
11
+ }
12
+ function logEnv(name) {
13
+ return logProcess()?.env?.[name];
14
+ }
15
+ export function shouldColorLogs() {
16
+ if (logEnv("NO_COLOR") !== undefined)
17
+ return false;
18
+ const forceColor = logEnv("FORCE_COLOR");
19
+ if (forceColor !== undefined && forceColor !== "0")
20
+ return true;
21
+ return logProcess()?.stdout?.isTTY === true;
22
+ }
23
+ export function shouldRenderDivider() {
24
+ return !logEnv("VITEST") && !logEnv("LIONDEN_MANAGED_TEST");
25
+ }
26
+ export function colorLogText(text, color) {
27
+ if (!shouldColorLogs())
28
+ return text;
29
+ return LOG_COLOR_CODES[color] + text + LOG_COLOR_RESET;
30
+ }
31
+ export function styleLogRole(text, role) {
32
+ switch (role) {
33
+ case "action":
34
+ return colorLogText(text, "cyan");
35
+ case "success":
36
+ return colorLogText(text, "green");
37
+ case "warning":
38
+ return colorLogText(text, "yellow");
39
+ case "error":
40
+ return colorLogText(text, "red");
41
+ case "metadata":
42
+ case "divider":
43
+ return colorLogText(text, "dim");
44
+ }
45
+ }
46
+ export function logAction(text) {
47
+ return styleLogRole(text, "action");
48
+ }
49
+ export function logSuccess(text) {
50
+ return styleLogRole(text, "success");
51
+ }
52
+ export function logWarning(text) {
53
+ return styleLogRole(text, "warning");
54
+ }
55
+ export function logError(text) {
56
+ return styleLogRole(text, "error");
57
+ }
58
+ export function logMetadata(text) {
59
+ return styleLogRole(text, "metadata");
60
+ }
61
+ export function logDivider(text = "----------------------------------------") {
62
+ return styleLogRole(text, "divider");
63
+ }
64
+ export function pluralize(word, count) {
65
+ return count === 1 ? word : word + "s";
66
+ }
67
+ //# sourceMappingURL=log-style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-style.js","sourceRoot":"","sources":["../src/log-style.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;CACV,CAAC;AAEX,MAAM,eAAe,GAAG,SAAS,CAAC;AAUlC,SAAS,UAAU;IACjB,OAAQ,UAAwE,CAAC,OAAO,CAAC;AAC3F,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAe;IACxD,IAAI,CAAC,eAAe,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,eAAe,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAkB;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,0CAA0C;IAC1E,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;AACzC,CAAC"}
package/dist/lre.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { LionDenResolvedConfig } from "@lionden/config";
2
+ import type { LionDenPlugin, LionDenRuntimeEnvironment, TaskDefinition } from "./types.js";
3
+ export interface CreateLreOptions {
4
+ config: LionDenResolvedConfig;
5
+ plugins: readonly LionDenPlugin[];
6
+ globalOptions?: Record<string, unknown>;
7
+ /** Tasks registered at the config level (via defineConfig({ tasks })) */
8
+ configTasks?: readonly TaskDefinition[];
9
+ }
10
+ /**
11
+ * Construct the LionDen Runtime Environment.
12
+ */
13
+ export declare function createLre(options: CreateLreOptions): LionDenRuntimeEnvironment;
14
+ //# sourceMappingURL=lre.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lre.d.ts","sourceRoot":"","sources":["../src/lre.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,KAAK,EAEV,aAAa,EACb,yBAAyB,EACzB,cAAc,EACf,MAAM,YAAY,CAAC;AA8EpB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,yEAAyE;IACzE,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,yBAAyB,CAkD9E"}
package/dist/lre.js ADDED
@@ -0,0 +1,113 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { HookDispatcherImpl } from "./hook-system.js";
4
+ import { TaskRunnerImpl } from "./task-runner.js";
5
+ /**
6
+ * Artifact store backed by in-memory writes with lazy fallback to disk.
7
+ *
8
+ * Fresh LRE instances are created inside test workers and CLI subprocesses.
9
+ * They need to be able to observe artifacts produced by an earlier compile
10
+ * step in a different process.
11
+ */
12
+ class ArtifactStoreImpl {
13
+ artifactsDir;
14
+ abis = new Map();
15
+ sources = new Map();
16
+ constructor(artifactsDir) {
17
+ this.artifactsDir = artifactsDir;
18
+ }
19
+ setAbi(programId, abi) {
20
+ this.abis.set(programId, abi);
21
+ }
22
+ setAleoSource(programId, source) {
23
+ this.sources.set(programId, source);
24
+ }
25
+ getAbi(programId) {
26
+ const cached = this.abis.get(programId);
27
+ if (cached !== undefined) {
28
+ return cached;
29
+ }
30
+ const abiPath = path.join(this.artifactsDir, programId, "abi.json");
31
+ if (!fs.existsSync(abiPath)) {
32
+ return undefined;
33
+ }
34
+ const abi = JSON.parse(fs.readFileSync(abiPath, "utf8"));
35
+ this.abis.set(programId, abi);
36
+ return abi;
37
+ }
38
+ getAleoSource(programId) {
39
+ const cached = this.sources.get(programId);
40
+ if (cached !== undefined) {
41
+ return cached;
42
+ }
43
+ const sourcePath = path.join(this.artifactsDir, programId, "main.aleo");
44
+ if (!fs.existsSync(sourcePath)) {
45
+ return undefined;
46
+ }
47
+ const source = fs.readFileSync(sourcePath, "utf8");
48
+ this.sources.set(programId, source);
49
+ return source;
50
+ }
51
+ getProgramIds() {
52
+ const programIds = new Set(this.abis.keys());
53
+ if (fs.existsSync(this.artifactsDir)) {
54
+ for (const entry of fs.readdirSync(this.artifactsDir, { withFileTypes: true })) {
55
+ if (!entry.isDirectory() || entry.name.startsWith(".")) {
56
+ continue;
57
+ }
58
+ const abiPath = path.join(this.artifactsDir, entry.name, "abi.json");
59
+ if (fs.existsSync(abiPath)) {
60
+ programIds.add(entry.name);
61
+ }
62
+ }
63
+ }
64
+ return [...programIds];
65
+ }
66
+ }
67
+ /**
68
+ * Construct the LionDen Runtime Environment.
69
+ */
70
+ export function createLre(options) {
71
+ const { config, plugins, globalOptions = {}, configTasks = [] } = options;
72
+ // Build hook dispatcher
73
+ const hooks = new HookDispatcherImpl();
74
+ hooks.registerPlugins(plugins);
75
+ // Build task runner
76
+ const tasks = new TaskRunnerImpl();
77
+ // Register tasks from all plugins, then config-level tasks
78
+ const allTaskDefs = plugins.flatMap((p) => p.tasks ?? []);
79
+ tasks.registerTasks(allTaskDefs);
80
+ if (configTasks.length > 0) {
81
+ tasks.registerTasks(configTasks);
82
+ }
83
+ // Build artifact store
84
+ const artifacts = new ArtifactStoreImpl(config.paths.artifacts);
85
+ const lre = {
86
+ config,
87
+ network: null, // Set by @lionden/plugin-network via extendLre
88
+ deployments: null, // Set by @lionden/plugin-deploy via extendLre
89
+ tasks,
90
+ hooks,
91
+ artifacts,
92
+ plugins,
93
+ globalOptions,
94
+ namedAccounts: {}, // Overridden by @lionden/plugin-network via extendLre getter
95
+ };
96
+ // Allow plugins to inject services (e.g., network manager).
97
+ //
98
+ // NOTE: `globalOptions` may not be populated yet at this point. The CLI boot
99
+ // path (packages/cli/src/index.ts) constructs the LRE with an empty
100
+ // globalOptions object and fills it (by reference) only after a task-aware
101
+ // argv parse — so the parse can route named args after task definitions are
102
+ // known. Plugins must therefore read CLI global option values lazily during
103
+ // task execution, not synchronously here in extendLre.
104
+ for (const plugin of plugins) {
105
+ if (plugin.extendLre) {
106
+ plugin.extendLre(lre);
107
+ }
108
+ }
109
+ // Bind LRE to task runner
110
+ tasks.setLre(lre);
111
+ return lre;
112
+ }
113
+ //# sourceMappingURL=lre.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lre.js","sourceRoot":"","sources":["../src/lre.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { GlobalOptionDefinition, LionDenPlugin } from "./types.js";
2
+ export declare class PluginLoadError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * Resolves plugin load order using topological sort.
7
+ *
8
+ * @param plugins - The user-provided plugin list
9
+ * @returns Plugins in dependency-first order
10
+ */
11
+ export declare function resolvePluginOrder(plugins: readonly LionDenPlugin[]): LionDenPlugin[];
12
+ /**
13
+ * Collect all global options from the resolved plugin list.
14
+ * Validates there are no name collisions.
15
+ */
16
+ export declare function collectGlobalOptions(plugins: readonly LionDenPlugin[]): Map<string, {
17
+ pluginId: string;
18
+ definition: GlobalOptionDefinition;
19
+ }>;
20
+ //# sourceMappingURL=plugin-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,EAAE,CA2DrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,sBAAsB,CAAA;CAAE,CAAC,CA4BvE"}
@@ -0,0 +1,91 @@
1
+ import { argumentFlagName, getPublicArgumentNames, getReservedBuiltInGlobalArgumentNames, } from "./arg-names.js";
2
+ export class PluginLoadError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "PluginLoadError";
6
+ }
7
+ }
8
+ /**
9
+ * Resolves plugin load order using topological sort.
10
+ *
11
+ * @param plugins - The user-provided plugin list
12
+ * @returns Plugins in dependency-first order
13
+ */
14
+ export function resolvePluginOrder(plugins) {
15
+ const allPlugins = new Map();
16
+ // Reverse once so LIFO pop() seeds the plugin map in declared order. Only the
17
+ // relative order of independent roots depends on this — the DFS below already
18
+ // places every dependency before its dependents regardless of insertion order.
19
+ const toVisit = [...plugins].reverse();
20
+ // Collect all plugins including transitive dependencies
21
+ while (toVisit.length > 0) {
22
+ const plugin = toVisit.pop();
23
+ if (allPlugins.has(plugin.id)) {
24
+ const existing = allPlugins.get(plugin.id);
25
+ if (existing !== plugin) {
26
+ throw new PluginLoadError(`Duplicate plugin ID "${plugin.id}" with different instances`);
27
+ }
28
+ continue;
29
+ }
30
+ allPlugins.set(plugin.id, plugin);
31
+ // Hard dependencies must all be included
32
+ for (const dep of plugin.dependencies ?? []) {
33
+ toVisit.push(dep);
34
+ }
35
+ }
36
+ // Topological sort via DFS
37
+ const sorted = [];
38
+ const visited = new Set();
39
+ const visiting = new Set(); // cycle detection
40
+ function visit(plugin) {
41
+ if (visited.has(plugin.id))
42
+ return;
43
+ if (visiting.has(plugin.id)) {
44
+ throw new PluginLoadError(`Circular plugin dependency detected involving "${plugin.id}"`);
45
+ }
46
+ visiting.add(plugin.id);
47
+ // Visit hard dependencies
48
+ for (const dep of plugin.dependencies ?? []) {
49
+ const resolved = allPlugins.get(dep.id);
50
+ if (!resolved) {
51
+ throw new PluginLoadError(`Plugin "${plugin.id}" depends on "${dep.id}" which is not available`);
52
+ }
53
+ visit(resolved);
54
+ }
55
+ visiting.delete(plugin.id);
56
+ visited.add(plugin.id);
57
+ sorted.push(plugin);
58
+ }
59
+ for (const plugin of allPlugins.values()) {
60
+ visit(plugin);
61
+ }
62
+ return sorted;
63
+ }
64
+ /**
65
+ * Collect all global options from the resolved plugin list.
66
+ * Validates there are no name collisions.
67
+ */
68
+ export function collectGlobalOptions(plugins) {
69
+ const options = new Map();
70
+ const publicNames = new Map();
71
+ const reservedBuiltInNames = getReservedBuiltInGlobalArgumentNames();
72
+ for (const plugin of plugins) {
73
+ for (const opt of plugin.globalOptions ?? []) {
74
+ for (const publicName of getPublicArgumentNames(opt.name)) {
75
+ if (reservedBuiltInNames.has(publicName)) {
76
+ throw new PluginLoadError(`Global option "${argumentFlagName(opt.name)}" registered by "${plugin.id}" conflicts with built-in global option "${argumentFlagName(publicName)}"`);
77
+ }
78
+ const existingPluginId = publicNames.get(publicName);
79
+ if (existingPluginId) {
80
+ throw new PluginLoadError(`Global option "${argumentFlagName(opt.name)}" registered by both "${existingPluginId}" and "${plugin.id}"`);
81
+ }
82
+ }
83
+ options.set(opt.name, { pluginId: plugin.id, definition: opt });
84
+ for (const publicName of getPublicArgumentNames(opt.name)) {
85
+ publicNames.set(publicName, plugin.id);
86
+ }
87
+ }
88
+ }
89
+ return options;
90
+ }
91
+ //# sourceMappingURL=plugin-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { ArgumentType, type TaskAction, type TaskActionWithSuper, type TaskDefinition, type TaskFlag, type TaskOption, type TaskPositionalArgument } from "./types.js";
2
+ export { ArgumentType };
3
+ /**
4
+ * Fluent builder for creating task definitions.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const compileTask = task("compile", "Compile Leo programs")
9
+ * .addFlag({ name: "force", description: "Force recompile" })
10
+ * .addFlag({ name: "noTypechain", description: "Skip TypeScript binding generation" })
11
+ * .setAction(async (args, lre) => { ... })
12
+ * .build();
13
+ * ```
14
+ */
15
+ export declare class TaskBuilder {
16
+ private readonly _id;
17
+ private readonly _description;
18
+ private _action;
19
+ private readonly _options;
20
+ private readonly _flags;
21
+ private readonly _positionalArguments;
22
+ private readonly _argumentNames;
23
+ private readonly _reservedBuiltInGlobalNames;
24
+ constructor(id: string, description: string);
25
+ addOption(option: TaskOption): this;
26
+ addFlag(flag: TaskFlag): this;
27
+ addPositionalArgument(arg: TaskPositionalArgument): this;
28
+ /** Set an inline action function */
29
+ setAction(action: TaskAction): this;
30
+ build(): TaskDefinition;
31
+ private registerArgumentName;
32
+ private validateReservedBuiltInGlobalName;
33
+ }
34
+ /**
35
+ * Builder for overriding an existing task. Cannot add/remove parameters.
36
+ * The action receives `runSuper` as a third argument.
37
+ */
38
+ export declare class OverrideTaskBuilder {
39
+ private readonly _id;
40
+ private _action;
41
+ constructor(id: string);
42
+ setAction(action: TaskActionWithSuper): this;
43
+ build(): TaskDefinition;
44
+ }
45
+ /** Create a new task definition */
46
+ export declare function task(id: string, description: string): TaskBuilder;
47
+ /** Create a task override */
48
+ export declare function overrideTask(id: string): OverrideTaskBuilder;
49
+ //# sourceMappingURL=task-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-builder.d.ts","sourceRoot":"","sources":["../src/task-builder.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgC;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG3B;IACJ,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAA2C;gBAE3E,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK3C,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAYnC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAO7B,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAMxD,oCAAoC;IACpC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnC,KAAK,IAAI,cAAc;IAgBvB,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,iCAAiC;CAS1C;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAoC;gBAEvC,EAAE,EAAE,MAAM;IAItB,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAK5C,KAAK,IAAI,cAAc;CAaxB;AAED,mCAAmC;AACnC,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CAEjE;AAED,6BAA6B;AAC7B,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,CAE5D"}
@@ -0,0 +1,123 @@
1
+ import { argumentFlagName, getPublicArgumentNames, getReservedBuiltInGlobalArgumentNames, } from "./arg-names.js";
2
+ import { ArgumentType, } from "./types.js";
3
+ export { ArgumentType };
4
+ /**
5
+ * Fluent builder for creating task definitions.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const compileTask = task("compile", "Compile Leo programs")
10
+ * .addFlag({ name: "force", description: "Force recompile" })
11
+ * .addFlag({ name: "noTypechain", description: "Skip TypeScript binding generation" })
12
+ * .setAction(async (args, lre) => { ... })
13
+ * .build();
14
+ * ```
15
+ */
16
+ export class TaskBuilder {
17
+ _id;
18
+ _description;
19
+ _action = null;
20
+ _options = [];
21
+ _flags = [];
22
+ _positionalArguments = [];
23
+ _argumentNames = new Map();
24
+ _reservedBuiltInGlobalNames = getReservedBuiltInGlobalArgumentNames();
25
+ constructor(id, description) {
26
+ this._id = id;
27
+ this._description = description;
28
+ }
29
+ addOption(option) {
30
+ if (option.type === "boolean") {
31
+ throw new Error(`Task "${this._id}" option "${option.name}" uses boolean type. Boolean task arguments must be registered with addFlag().`);
32
+ }
33
+ this.validateReservedBuiltInGlobalName("option", option.name);
34
+ this.registerArgumentName("option", option.name);
35
+ this._options.push(option);
36
+ return this;
37
+ }
38
+ addFlag(flag) {
39
+ this.validateReservedBuiltInGlobalName("flag", flag.name);
40
+ this.registerArgumentName("flag", flag.name);
41
+ this._flags.push(flag);
42
+ return this;
43
+ }
44
+ addPositionalArgument(arg) {
45
+ this.registerArgumentName("positional argument", arg.name);
46
+ this._positionalArguments.push(arg);
47
+ return this;
48
+ }
49
+ /** Set an inline action function */
50
+ setAction(action) {
51
+ this._action = action;
52
+ return this;
53
+ }
54
+ build() {
55
+ if (!this._action) {
56
+ throw new Error(`Task "${this._id}" has no action set`);
57
+ }
58
+ return {
59
+ id: this._id,
60
+ description: this._description,
61
+ action: this._action,
62
+ options: this._options.length > 0 ? [...this._options] : undefined,
63
+ flags: this._flags.length > 0 ? [...this._flags] : undefined,
64
+ positionalArguments: this._positionalArguments.length > 0 ? [...this._positionalArguments] : undefined,
65
+ };
66
+ }
67
+ registerArgumentName(kind, name) {
68
+ // Validate all aliases before committing any, so a conflict on a later
69
+ // alias never leaves an earlier alias half-registered.
70
+ for (const publicName of getPublicArgumentNames(name)) {
71
+ const existing = this._argumentNames.get(publicName);
72
+ if (existing) {
73
+ throw new Error(`Task "${this._id}" ${kind} "${name}" conflicts with existing ${existing.kind} "${existing.name}"`);
74
+ }
75
+ }
76
+ for (const publicName of getPublicArgumentNames(name)) {
77
+ this._argumentNames.set(publicName, { kind, name });
78
+ }
79
+ }
80
+ validateReservedBuiltInGlobalName(kind, name) {
81
+ for (const publicName of getPublicArgumentNames(name)) {
82
+ if (this._reservedBuiltInGlobalNames.has(publicName)) {
83
+ throw new Error(`Task "${this._id}" ${kind} "${name}" conflicts with built-in global option "${argumentFlagName(publicName)}"`);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ /**
89
+ * Builder for overriding an existing task. Cannot add/remove parameters.
90
+ * The action receives `runSuper` as a third argument.
91
+ */
92
+ export class OverrideTaskBuilder {
93
+ _id;
94
+ _action = null;
95
+ constructor(id) {
96
+ this._id = id;
97
+ }
98
+ setAction(action) {
99
+ this._action = action;
100
+ return this;
101
+ }
102
+ build() {
103
+ if (!this._action) {
104
+ throw new Error(`Override for task "${this._id}" has no action set`);
105
+ }
106
+ const capturedAction = this._action;
107
+ return {
108
+ id: this._id,
109
+ description: "", // overrides inherit the original description
110
+ overrides: this._id,
111
+ action: capturedAction, // runSuper is injected at dispatch time
112
+ };
113
+ }
114
+ }
115
+ /** Create a new task definition */
116
+ export function task(id, description) {
117
+ return new TaskBuilder(id, description);
118
+ }
119
+ /** Create a task override */
120
+ export function overrideTask(id) {
121
+ return new OverrideTaskBuilder(id);
122
+ }
123
+ //# sourceMappingURL=task-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-builder.js","sourceRoot":"","sources":["../src/task-builder.ts"],"names":[],"mappings":"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"}