@beignet/cli 0.0.1 → 0.0.4
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/CHANGELOG.md +231 -0
- package/README.md +497 -90
- package/dist/ansi.d.ts +10 -0
- package/dist/ansi.d.ts.map +1 -0
- package/dist/ansi.js +20 -0
- package/dist/ansi.js.map +1 -0
- package/dist/choices.d.ts +72 -0
- package/dist/choices.d.ts.map +1 -0
- package/dist/choices.js +88 -0
- package/dist/choices.js.map +1 -0
- package/dist/completion.d.ts +47 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +123 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +39 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -1
- package/dist/create-prompts.d.ts +42 -0
- package/dist/create-prompts.d.ts.map +1 -0
- package/dist/create-prompts.js +136 -0
- package/dist/create-prompts.js.map +1 -0
- package/dist/create.d.ts +12 -0
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +19 -24
- package/dist/create.js.map +1 -1
- package/dist/db.d.ts +37 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +146 -0
- package/dist/db.js.map +1 -0
- package/dist/github-annotations.d.ts +18 -0
- package/dist/github-annotations.d.ts.map +1 -0
- package/dist/github-annotations.js +22 -0
- package/dist/github-annotations.js.map +1 -0
- package/dist/index.d.ts +1 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +710 -400
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +45 -2
- package/dist/inspect.d.ts.map +1 -1
- package/dist/inspect.js +2191 -100
- package/dist/inspect.js.map +1 -1
- package/dist/lib.d.ts +20 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +17 -0
- package/dist/lib.js.map +1 -0
- package/dist/lint.d.ts +22 -1
- package/dist/lint.d.ts.map +1 -1
- package/dist/lint.js +370 -38
- package/dist/lint.js.map +1 -1
- package/dist/make.d.ts +109 -1
- package/dist/make.d.ts.map +1 -1
- package/dist/make.js +2225 -333
- package/dist/make.js.map +1 -1
- package/dist/outbox.d.ts +24 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +138 -0
- package/dist/outbox.js.map +1 -0
- package/dist/schedule.d.ts +36 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +155 -0
- package/dist/schedule.js.map +1 -0
- package/dist/task.d.ts +26 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +106 -0
- package/dist/task.js.map +1 -0
- package/dist/templates.d.ts +12 -8
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +2144 -385
- package/dist/templates.js.map +1 -1
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/package.json +9 -8
- package/src/ansi.ts +30 -0
- package/src/choices.ts +137 -0
- package/src/completion.ts +169 -0
- package/src/config.ts +47 -0
- package/src/create-prompts.ts +182 -0
- package/src/create.ts +32 -28
- package/src/db.ts +222 -0
- package/src/github-annotations.ts +37 -0
- package/src/index.ts +1119 -535
- package/src/inspect.ts +3372 -134
- package/src/lib.ts +45 -0
- package/src/lint.ts +533 -45
- package/src/make.ts +3010 -397
- package/src/outbox.ts +249 -0
- package/src/schedule.ts +272 -0
- package/src/task.ts +169 -0
- package/src/templates.ts +2282 -462
- package/src/version.ts +20 -0
- package/dist/create-bin.d.ts +0 -3
- package/dist/create-bin.d.ts.map +0 -1
- package/dist/create-bin.js +0 -9
- package/dist/create-bin.js.map +0 -1
- package/src/create-bin.ts +0 -11
package/dist/outbox.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createJiti } from "jiti";
|
|
4
|
+
import { loadBeignetConfig, normalizePath } from "./config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Run one app-owned outbox drain pass from the app's outbox registry.
|
|
7
|
+
*/
|
|
8
|
+
export async function runOutboxDrain(options = {}) {
|
|
9
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
10
|
+
const config = await loadBeignetConfig(cwd);
|
|
11
|
+
const modulePath = normalizePath(options.modulePath ?? config.paths.outbox);
|
|
12
|
+
const batchSize = options.batchSize;
|
|
13
|
+
if (batchSize !== undefined)
|
|
14
|
+
assertPositiveInteger("batchSize", batchSize);
|
|
15
|
+
const startedAt = performance.now();
|
|
16
|
+
const outboxModule = await loadOutboxModule(cwd, modulePath);
|
|
17
|
+
const registry = assertOutboxRegistry(outboxModule.outboxRegistry, modulePath);
|
|
18
|
+
const contextArgs = { registry, batchSize };
|
|
19
|
+
const rawContext = outboxModule.createOutboxDrainContext
|
|
20
|
+
? await outboxModule.createOutboxDrainContext(contextArgs)
|
|
21
|
+
: undefined;
|
|
22
|
+
const ctx = assertOutboxDrainContext(rawContext, modulePath);
|
|
23
|
+
try {
|
|
24
|
+
// Loaded lazily so CLI commands that never touch the app runtime, such as
|
|
25
|
+
// `beignet lint`, work without a built @beignet/core.
|
|
26
|
+
const { drainOutbox } = await import("@beignet/core/outbox");
|
|
27
|
+
const result = await drainOutbox({
|
|
28
|
+
outbox: ctx.ports.outbox,
|
|
29
|
+
registry,
|
|
30
|
+
eventBus: ctx.ports.eventBus,
|
|
31
|
+
jobs: ctx.ports.jobs,
|
|
32
|
+
batchSize,
|
|
33
|
+
instrumentation: ctx.ports.instrumentation ?? ctx.ports.devtools,
|
|
34
|
+
instrumentationContext: {
|
|
35
|
+
requestId: ctx.requestId,
|
|
36
|
+
traceId: ctx.traceId,
|
|
37
|
+
},
|
|
38
|
+
onError(error, message) {
|
|
39
|
+
ctx.ports.logger?.error("Outbox delivery failed", {
|
|
40
|
+
error,
|
|
41
|
+
outboxMessageId: message.id,
|
|
42
|
+
kind: message.kind,
|
|
43
|
+
name: message.name,
|
|
44
|
+
attempts: message.attempts,
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
await recordOutboxDrain(ctx, result);
|
|
49
|
+
return {
|
|
50
|
+
schemaVersion: 1,
|
|
51
|
+
cwd,
|
|
52
|
+
modulePath,
|
|
53
|
+
result,
|
|
54
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await outboxModule.stopOutboxDrainContext?.(ctx, contextArgs);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function loadOutboxModule(cwd, modulePath) {
|
|
62
|
+
const absolutePath = path.join(cwd, modulePath);
|
|
63
|
+
try {
|
|
64
|
+
await stat(absolutePath);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new Error(`Could not find app outbox registry at ${modulePath}. Create server/outbox.ts or configure paths.outbox in beignet.config.ts.`);
|
|
68
|
+
}
|
|
69
|
+
const tsconfigPath = path.join(cwd, "tsconfig.json");
|
|
70
|
+
const jiti = createJiti(absolutePath, {
|
|
71
|
+
tsconfigPaths: (await fileExists(tsconfigPath)) ? tsconfigPath : false,
|
|
72
|
+
});
|
|
73
|
+
return (await jiti.import(absolutePath));
|
|
74
|
+
}
|
|
75
|
+
function assertOutboxRegistry(registry, modulePath) {
|
|
76
|
+
if (!isRecord(registry)) {
|
|
77
|
+
throw new Error(`${modulePath} must export an outboxRegistry.`);
|
|
78
|
+
}
|
|
79
|
+
const events = registry.events;
|
|
80
|
+
const jobs = registry.jobs;
|
|
81
|
+
if (!(events instanceof Map) || !(jobs instanceof Map)) {
|
|
82
|
+
throw new Error(`${modulePath} outboxRegistry must be created with defineOutboxRegistry(...).`);
|
|
83
|
+
}
|
|
84
|
+
return { events, jobs };
|
|
85
|
+
}
|
|
86
|
+
function assertOutboxDrainContext(ctx, modulePath) {
|
|
87
|
+
if (!isRecord(ctx) || !isRecord(ctx.ports)) {
|
|
88
|
+
throw new Error(`${modulePath} must export createOutboxDrainContext that returns an app context with ports.outbox.`);
|
|
89
|
+
}
|
|
90
|
+
if (!isOutboxPort(ctx.ports.outbox)) {
|
|
91
|
+
throw new Error(`${modulePath} createOutboxDrainContext must return ports.outbox.`);
|
|
92
|
+
}
|
|
93
|
+
return ctx;
|
|
94
|
+
}
|
|
95
|
+
function isOutboxPort(value) {
|
|
96
|
+
return (isRecord(value) &&
|
|
97
|
+
typeof value.enqueue === "function" &&
|
|
98
|
+
typeof value.claimBatch === "function" &&
|
|
99
|
+
typeof value.markDelivered === "function" &&
|
|
100
|
+
typeof value.markFailed === "function");
|
|
101
|
+
}
|
|
102
|
+
async function recordOutboxDrain(ctx, result) {
|
|
103
|
+
try {
|
|
104
|
+
await (ctx.ports.instrumentation ?? ctx.ports.devtools)?.record({
|
|
105
|
+
type: "custom",
|
|
106
|
+
watcher: "outbox",
|
|
107
|
+
name: "outbox.drain",
|
|
108
|
+
label: "Outbox drain",
|
|
109
|
+
summary: `${result.delivered} delivered, ${result.retried} retried, ${result.deadLettered} dead-lettered`,
|
|
110
|
+
requestId: ctx.requestId,
|
|
111
|
+
traceId: ctx.traceId,
|
|
112
|
+
details: result,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
ctx.ports.logger?.error("Outbox drain instrumentation recording failed", {
|
|
117
|
+
error,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function assertPositiveInteger(name, value) {
|
|
122
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
123
|
+
throw new Error(`${name} must be a positive integer.`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function isRecord(value) {
|
|
127
|
+
return typeof value === "object" && value !== null;
|
|
128
|
+
}
|
|
129
|
+
async function fileExists(filePath) {
|
|
130
|
+
try {
|
|
131
|
+
await readFile(filePath, "utf8");
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for running one app-owned schedule.
|
|
3
|
+
*/
|
|
4
|
+
export type RunAppScheduleOptions = {
|
|
5
|
+
name: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
modulePath?: string;
|
|
8
|
+
payload?: string | Record<string, unknown>;
|
|
9
|
+
id?: string;
|
|
10
|
+
attempt?: number;
|
|
11
|
+
scheduledAt?: string;
|
|
12
|
+
triggeredAt?: string;
|
|
13
|
+
source?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Result returned by `beignet schedule run`.
|
|
17
|
+
*/
|
|
18
|
+
export type RunAppScheduleResult = {
|
|
19
|
+
schemaVersion: 1;
|
|
20
|
+
name: string;
|
|
21
|
+
cwd: string;
|
|
22
|
+
modulePath: string;
|
|
23
|
+
run: {
|
|
24
|
+
id?: string;
|
|
25
|
+
attempt?: number;
|
|
26
|
+
scheduledAt?: string;
|
|
27
|
+
triggeredAt?: string;
|
|
28
|
+
source: string;
|
|
29
|
+
};
|
|
30
|
+
durationMs: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Run an app-owned schedule from the app's schedule registry.
|
|
34
|
+
*/
|
|
35
|
+
export declare function runAppSchedule(options: RunAppScheduleOptions): Promise<RunAppScheduleResult>;
|
|
36
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE;QACH,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA8BF;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA0E/B"}
|
package/dist/schedule.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createJiti } from "jiti";
|
|
4
|
+
import { loadBeignetConfig, normalizePath } from "./config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Run an app-owned schedule from the app's schedule registry.
|
|
7
|
+
*/
|
|
8
|
+
export async function runAppSchedule(options) {
|
|
9
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
10
|
+
const config = await loadBeignetConfig(cwd);
|
|
11
|
+
const modulePath = normalizePath(options.modulePath ?? config.paths.schedules);
|
|
12
|
+
const runOptions = buildScheduleRunOptions(options);
|
|
13
|
+
const startedAt = performance.now();
|
|
14
|
+
const scheduleModule = await loadScheduleModule(cwd, modulePath);
|
|
15
|
+
const schedule = findSchedule(scheduleModule.schedules, options.name, modulePath);
|
|
16
|
+
const contextArgs = {
|
|
17
|
+
schedule,
|
|
18
|
+
scheduleName: schedule.name,
|
|
19
|
+
run: runOptions,
|
|
20
|
+
};
|
|
21
|
+
const ctx = scheduleModule.createScheduleContext
|
|
22
|
+
? await scheduleModule.createScheduleContext(contextArgs)
|
|
23
|
+
: {};
|
|
24
|
+
const scheduleContext = toScheduleContext(ctx);
|
|
25
|
+
try {
|
|
26
|
+
// Loaded lazily so CLI commands that never touch the app runtime, such as
|
|
27
|
+
// `beignet lint`, work without a built @beignet/core.
|
|
28
|
+
const { createInlineScheduleRunner } = await import("@beignet/core/schedules");
|
|
29
|
+
const runner = createInlineScheduleRunner({
|
|
30
|
+
ctx,
|
|
31
|
+
instrumentation: scheduleContext.ports?.devtools,
|
|
32
|
+
instrumentationContext: {
|
|
33
|
+
requestId: scheduleContext.requestId,
|
|
34
|
+
traceId: scheduleContext.traceId,
|
|
35
|
+
},
|
|
36
|
+
onError({ error }) {
|
|
37
|
+
scheduleContext.ports?.logger?.error("Schedule failed", {
|
|
38
|
+
error,
|
|
39
|
+
scheduleName: schedule.name,
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
onHookError({ error, hook }) {
|
|
43
|
+
scheduleContext.ports?.logger?.warn?.("Schedule lifecycle hook failed", {
|
|
44
|
+
error,
|
|
45
|
+
hook,
|
|
46
|
+
scheduleName: schedule.name,
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
await runner.run(schedule, runOptions);
|
|
51
|
+
return {
|
|
52
|
+
schemaVersion: 1,
|
|
53
|
+
name: schedule.name,
|
|
54
|
+
cwd,
|
|
55
|
+
modulePath,
|
|
56
|
+
run: {
|
|
57
|
+
id: runOptions.id,
|
|
58
|
+
attempt: runOptions.attempt,
|
|
59
|
+
scheduledAt: stringifyDateInput(runOptions.scheduledAt),
|
|
60
|
+
triggeredAt: stringifyDateInput(runOptions.triggeredAt),
|
|
61
|
+
source: runOptions.source ?? "beignet-cli",
|
|
62
|
+
},
|
|
63
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await scheduleModule.stopScheduleContext?.(ctx, contextArgs);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function loadScheduleModule(cwd, modulePath) {
|
|
71
|
+
const absolutePath = path.join(cwd, modulePath);
|
|
72
|
+
try {
|
|
73
|
+
await stat(absolutePath);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new Error(`Could not find app schedule registry at ${modulePath}. Create server/schedules.ts or configure paths.schedules in beignet.config.ts.`);
|
|
77
|
+
}
|
|
78
|
+
const tsconfigPath = path.join(cwd, "tsconfig.json");
|
|
79
|
+
const jiti = createJiti(absolutePath, {
|
|
80
|
+
tsconfigPaths: (await fileExists(tsconfigPath)) ? tsconfigPath : false,
|
|
81
|
+
});
|
|
82
|
+
return (await jiti.import(absolutePath));
|
|
83
|
+
}
|
|
84
|
+
function buildScheduleRunOptions(options) {
|
|
85
|
+
const runOptions = {
|
|
86
|
+
source: options.source ?? "beignet-cli",
|
|
87
|
+
triggeredAt: options.triggeredAt ?? new Date().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
if (options.payload !== undefined) {
|
|
90
|
+
runOptions.payload = parseSchedulePayloadFlag(options.payload);
|
|
91
|
+
}
|
|
92
|
+
if (options.id !== undefined)
|
|
93
|
+
runOptions.id = options.id;
|
|
94
|
+
if (options.attempt !== undefined)
|
|
95
|
+
runOptions.attempt = options.attempt;
|
|
96
|
+
if (options.scheduledAt !== undefined)
|
|
97
|
+
runOptions.scheduledAt = options.scheduledAt;
|
|
98
|
+
return runOptions;
|
|
99
|
+
}
|
|
100
|
+
function parseSchedulePayloadFlag(input) {
|
|
101
|
+
if (typeof input !== "string")
|
|
102
|
+
return input;
|
|
103
|
+
try {
|
|
104
|
+
return JSON.parse(input);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new Error(`Invalid --payload JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function findSchedule(schedules, name, modulePath) {
|
|
111
|
+
if (!schedules) {
|
|
112
|
+
throw new Error(`Schedule registry ${modulePath} must export a schedules array.`);
|
|
113
|
+
}
|
|
114
|
+
const schedule = schedules.find((candidate) => typeof candidate === "object" &&
|
|
115
|
+
candidate !== null &&
|
|
116
|
+
candidate.kind === "schedule" &&
|
|
117
|
+
candidate.name === name &&
|
|
118
|
+
typeof candidate.handle === "function");
|
|
119
|
+
if (!schedule) {
|
|
120
|
+
const available = schedules
|
|
121
|
+
.filter((candidate) => typeof candidate === "object" &&
|
|
122
|
+
candidate !== null &&
|
|
123
|
+
candidate.kind === "schedule" &&
|
|
124
|
+
typeof candidate.name === "string")
|
|
125
|
+
.map((candidate) => candidate.name)
|
|
126
|
+
.sort();
|
|
127
|
+
throw new Error(available.length > 0
|
|
128
|
+
? `Unknown schedule "${name}". Available schedules: ${available.join(", ")}.`
|
|
129
|
+
: `Unknown schedule "${name}". No schedules were registered in ${modulePath}.`);
|
|
130
|
+
}
|
|
131
|
+
return schedule;
|
|
132
|
+
}
|
|
133
|
+
function toScheduleContext(ctx) {
|
|
134
|
+
return isRecord(ctx) ? ctx : {};
|
|
135
|
+
}
|
|
136
|
+
function stringifyDateInput(value) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
return undefined;
|
|
139
|
+
if (value instanceof Date)
|
|
140
|
+
return value.toISOString();
|
|
141
|
+
return String(value);
|
|
142
|
+
}
|
|
143
|
+
function isRecord(value) {
|
|
144
|
+
return typeof value === "object" && value !== null;
|
|
145
|
+
}
|
|
146
|
+
async function fileExists(filePath) {
|
|
147
|
+
try {
|
|
148
|
+
await readFile(filePath, "utf8");
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"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"}
|
package/dist/task.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for running an app-owned operational task.
|
|
3
|
+
*/
|
|
4
|
+
export type RunAppTaskOptions = {
|
|
5
|
+
name: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
input?: string | Record<string, unknown>;
|
|
8
|
+
modulePath?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Result returned by `beignet task run`.
|
|
12
|
+
*/
|
|
13
|
+
export type RunAppTaskResult = {
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
name: string;
|
|
16
|
+
cwd: string;
|
|
17
|
+
modulePath: string;
|
|
18
|
+
input: unknown;
|
|
19
|
+
output: unknown;
|
|
20
|
+
durationMs: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Run an app-owned operational task from the app's task registry.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runAppTask(options: RunAppTaskOptions): Promise<RunAppTaskResult>;
|
|
26
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAcF;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAwC3B"}
|
package/dist/task.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createJiti } from "jiti";
|
|
4
|
+
import { loadBeignetConfig, normalizePath } from "./config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Run an app-owned operational task from the app's task registry.
|
|
7
|
+
*/
|
|
8
|
+
export async function runAppTask(options) {
|
|
9
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
10
|
+
const config = await loadBeignetConfig(cwd);
|
|
11
|
+
const modulePath = normalizePath(options.modulePath ?? config.paths.tasks);
|
|
12
|
+
const rawInput = parseTaskInputFlag(options.input);
|
|
13
|
+
const startedAt = performance.now();
|
|
14
|
+
const taskModule = await loadTaskModule(cwd, modulePath);
|
|
15
|
+
const task = findTask(taskModule.tasks, options.name, modulePath);
|
|
16
|
+
// Loaded lazily so CLI commands that never touch the app runtime, such as
|
|
17
|
+
// `beignet lint`, work without a built @beignet/core.
|
|
18
|
+
const { parseTaskInput } = await import("@beignet/core/tasks");
|
|
19
|
+
const parsedInput = await parseTaskInput(task, rawInput);
|
|
20
|
+
const contextArgs = {
|
|
21
|
+
task,
|
|
22
|
+
taskName: task.name,
|
|
23
|
+
input: parsedInput,
|
|
24
|
+
};
|
|
25
|
+
const ctx = taskModule.createTaskContext
|
|
26
|
+
? await taskModule.createTaskContext(contextArgs)
|
|
27
|
+
: {};
|
|
28
|
+
try {
|
|
29
|
+
const output = await task.handle({
|
|
30
|
+
task,
|
|
31
|
+
input: parsedInput,
|
|
32
|
+
ctx,
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
schemaVersion: 1,
|
|
36
|
+
name: task.name,
|
|
37
|
+
cwd,
|
|
38
|
+
modulePath,
|
|
39
|
+
input: parsedInput,
|
|
40
|
+
output,
|
|
41
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await taskModule.stopTaskContext?.(ctx, contextArgs);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function parseTaskInputFlag(input) {
|
|
49
|
+
if (input === undefined)
|
|
50
|
+
return {};
|
|
51
|
+
if (typeof input !== "string")
|
|
52
|
+
return input;
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(input);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`Invalid --input JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function loadTaskModule(cwd, modulePath) {
|
|
61
|
+
const absolutePath = path.join(cwd, modulePath);
|
|
62
|
+
try {
|
|
63
|
+
await stat(absolutePath);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new Error(`Could not find app task registry at ${modulePath}. Create it with beignet make task <feature>/<name> or configure paths.tasks in beignet.config.ts.`);
|
|
67
|
+
}
|
|
68
|
+
const tsconfigPath = path.join(cwd, "tsconfig.json");
|
|
69
|
+
const jiti = createJiti(absolutePath, {
|
|
70
|
+
tsconfigPaths: (await fileExists(tsconfigPath)) ? tsconfigPath : false,
|
|
71
|
+
});
|
|
72
|
+
return (await jiti.import(absolutePath));
|
|
73
|
+
}
|
|
74
|
+
function findTask(tasks, name, modulePath) {
|
|
75
|
+
if (!tasks) {
|
|
76
|
+
throw new Error(`Task registry ${modulePath} must export a tasks array.`);
|
|
77
|
+
}
|
|
78
|
+
const task = tasks.find((candidate) => typeof candidate === "object" &&
|
|
79
|
+
candidate !== null &&
|
|
80
|
+
candidate.kind === "task" &&
|
|
81
|
+
candidate.name === name &&
|
|
82
|
+
typeof candidate.handle === "function");
|
|
83
|
+
if (!task) {
|
|
84
|
+
const available = tasks
|
|
85
|
+
.filter((candidate) => typeof candidate === "object" &&
|
|
86
|
+
candidate !== null &&
|
|
87
|
+
candidate.kind === "task" &&
|
|
88
|
+
typeof candidate.name === "string")
|
|
89
|
+
.map((candidate) => candidate.name)
|
|
90
|
+
.sort();
|
|
91
|
+
throw new Error(available.length > 0
|
|
92
|
+
? `Unknown task "${name}". Available tasks: ${available.join(", ")}.`
|
|
93
|
+
: `Unknown task "${name}". No tasks were registered in ${modulePath}.`);
|
|
94
|
+
}
|
|
95
|
+
return task;
|
|
96
|
+
}
|
|
97
|
+
async function fileExists(filePath) {
|
|
98
|
+
try {
|
|
99
|
+
await readFile(filePath, "utf8");
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=task.js.map
|
package/dist/task.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
|
package/dist/templates.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
export type PresetName
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type { FeatureName, IntegrationName, PackageManager, PresetName } from "./choices.js";
|
|
2
|
+
export type { FeatureName, IntegrationName, PackageManager, PresetName, TemplateName, } from "./choices.js";
|
|
3
|
+
export { featureChoices, integrationChoices, presetChoices, } from "./choices.js";
|
|
4
|
+
/**
|
|
5
|
+
* One generated file emitted by the template generator.
|
|
6
|
+
*/
|
|
6
7
|
export type TemplateFile = {
|
|
7
8
|
path: string;
|
|
8
9
|
content: string;
|
|
9
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* Inputs used to render app template files.
|
|
13
|
+
*/
|
|
10
14
|
export type TemplateContext = {
|
|
11
15
|
name: string;
|
|
12
16
|
packageManager: PackageManager;
|
|
@@ -15,8 +19,8 @@ export type TemplateContext = {
|
|
|
15
19
|
features: FeatureName[];
|
|
16
20
|
integrations: IntegrationName[];
|
|
17
21
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Render all template files for a new Beignet app.
|
|
24
|
+
*/
|
|
21
25
|
export declare function getTemplateFiles(ctx: TemplateContext): TemplateFile[];
|
|
22
26
|
//# sourceMappingURL=templates.d.ts.map
|
package/dist/templates.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAgjIF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,YAAY,EAAE,CA8FrE"}
|