@t4h.framework/cli 0.0.0-experimental-29d0277 → 0.0.0-experimental-20261009202408

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 (41) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/bin/bin.js +1 -20
  3. package/dist/bin/bin.js.map +1 -1
  4. package/dist/commands/ai/ai-bootstrap.js +48 -183
  5. package/dist/commands/ai/ai-bootstrap.js.map +1 -1
  6. package/dist/commands/build/build.js +2 -6
  7. package/dist/commands/build/build.js.map +1 -1
  8. package/dist/commands/dev/dev.js +1 -8
  9. package/dist/commands/dev/dev.js.map +1 -1
  10. package/package.json +2 -11
  11. package/LICENSE +0 -21
  12. package/dist/commands/ai/ai-hook.js +0 -84
  13. package/dist/commands/ai/ai-hook.js.map +0 -1
  14. package/dist/commands/ai/tools/agent-instructions.js +0 -75
  15. package/dist/commands/ai/tools/agent-instructions.js.map +0 -1
  16. package/dist/commands/ai/tools/agent-settings.js +0 -56
  17. package/dist/commands/ai/tools/agent-settings.js.map +0 -1
  18. package/dist/commands/ai/tools/assets-lock.js +0 -34
  19. package/dist/commands/ai/tools/assets-lock.js.map +0 -1
  20. package/dist/commands/check/check.js +0 -185
  21. package/dist/commands/check/check.js.map +0 -1
  22. package/dist/commands/mcp/mcp-server.js +0 -235
  23. package/dist/commands/mcp/mcp-server.js.map +0 -1
  24. package/dist/commands/mcp/mcp-tools.js +0 -283
  25. package/dist/commands/mcp/mcp-tools.js.map +0 -1
  26. package/dist/commands/mcp/mcp.js +0 -71
  27. package/dist/commands/mcp/mcp.js.map +0 -1
  28. package/dist/commands/runtime/runtime.js +0 -143
  29. package/dist/commands/runtime/runtime.js.map +0 -1
  30. package/dist/commands/workflows/workflows.js +0 -166
  31. package/dist/commands/workflows/workflows.js.map +0 -1
  32. package/dist/tools/debug-log-option.js +0 -13
  33. package/dist/tools/debug-log-option.js.map +0 -1
  34. package/dist/tools/dev-server-client.js +0 -261
  35. package/dist/tools/dev-server-client.js.map +0 -1
  36. package/dist/tools/load-dev.js +0 -23
  37. package/dist/tools/load-dev.js.map +0 -1
  38. package/dist/tools/project-package.js +0 -67
  39. package/dist/tools/project-package.js.map +0 -1
  40. package/dist/tools/project-scripts.js +0 -53
  41. package/dist/tools/project-scripts.js.map +0 -1
@@ -1,166 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { parseEnv } from 'node:util';
4
- import { Argument, Command, Option } from 'commander';
5
- import { debugLogOption, debugOption, toDebugLog, } from '../../tools/debug-log-option.js';
6
- import { findDevServer, runOnDevServer } from '../../tools/dev-server-client.js';
7
- import { loadDev, toProjectDir } from '../../tools/load-dev.js';
8
- /** `DEFAULT_HEADLESS_RUN_TIMEOUT_IN_MS` of the dev package. */
9
- export const DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS = 60_000;
10
- /** Exit codes of `framework workflows`, for scripts and agents. */
11
- export const WORKFLOWS_EXIT_CODE = {
12
- ok: 0,
13
- rejected: 1,
14
- error: 1,
15
- timedOut: 2,
16
- };
17
- export function toWorkflowRunExitCode(result) {
18
- if (result.timedOut)
19
- return WORKFLOWS_EXIT_CODE.timedOut;
20
- return result.run.status === 'fulfilled'
21
- ? WORKFLOWS_EXIT_CODE.ok
22
- : WORKFLOWS_EXIT_CODE.rejected;
23
- }
24
- export function readWorkflowInput({ input, inputFile, }) {
25
- if (input !== undefined && inputFile !== undefined)
26
- throw new Error('Pass either --input or --input-file, not both');
27
- const text = inputFile !== undefined ? fs.readFileSync(inputFile, 'utf8') : input;
28
- if (text === undefined)
29
- return undefined;
30
- try {
31
- return JSON.parse(text);
32
- }
33
- catch (error) {
34
- throw new Error(`The workflow input is not valid JSON: ${error.message}`, { cause: error });
35
- }
36
- }
37
- /** Fails with an HTTP-like status and details, printed as `{ error }`. */
38
- export class WorkflowsError extends Error {
39
- status;
40
- details;
41
- name = 'WorkflowsError';
42
- constructor(message, status, details) {
43
- super(message);
44
- this.status = status;
45
- this.details = details;
46
- }
47
- }
48
- /**
49
- * By name: `HeadlessAppError` belongs to the project's dev package, and
50
- * `DevServerError` / `WorkflowsError` carry the same fields.
51
- */
52
- const STATUS_ERROR_NAMES = new Set([
53
- 'HeadlessAppError',
54
- 'DevServerError',
55
- 'WorkflowsError',
56
- ]);
57
- const isStatusError = (error) => error instanceof Error && STATUS_ERROR_NAMES.has(error.name);
58
- export function toErrorOutput(error) {
59
- if (isStatusError(error))
60
- return {
61
- error: {
62
- message: error.message,
63
- status: error.status ?? null,
64
- details: error.details ?? null,
65
- },
66
- };
67
- return {
68
- error: { message: error instanceof Error ? error.message : String(error) },
69
- };
70
- }
71
- const print = (value) => process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
72
- async function execute(app, workflowId, action, options) {
73
- if (workflowId === undefined) {
74
- print({ workflows: app.workflows });
75
- return WORKFLOWS_EXIT_CODE.ok;
76
- }
77
- const workflow = app.workflows.find(({ id }) => id === workflowId);
78
- if (!workflow)
79
- throw new WorkflowsError(`Workflow not found: ${workflowId}`, 404, {
80
- workflows: app.workflows.map(({ id }) => id),
81
- });
82
- if (action !== 'run') {
83
- print({ workflow });
84
- return WORKFLOWS_EXIT_CODE.ok;
85
- }
86
- const result = await app.run(workflowId, readWorkflowInput(options), {
87
- timeoutInMs: options.timeout,
88
- trace: options.trace,
89
- });
90
- print(result);
91
- return toWorkflowRunExitCode(result);
92
- }
93
- /** The `framework dev` of the project, as a `WorkflowsApp` (`--attach`). */
94
- async function attachDevServer(projectDir) {
95
- const server = await findDevServer(projectDir);
96
- if (!server)
97
- throw new WorkflowsError(`No dev server is running for ${projectDir}; start it with \`framework dev\`, or drop --attach to run headless`, undefined, null);
98
- const { workflows } = await server.client.manifest();
99
- return {
100
- workflows,
101
- run: (workflowId, input, options) => runOnDevServer(server.client, workflowId, input, options),
102
- };
103
- }
104
- export const workflowsCommand = new Command('workflows')
105
- .description('List, describe or run the workflows of the app, headless or on the running dev server (--attach); prints JSON')
106
- .addArgument(new Argument('[workflow]', 'Workflow id; omit it to list the workflows'))
107
- .addArgument(new Argument('[action]', 'What to do with the workflow')
108
- .choices(['describe', 'run'])
109
- .default('describe'))
110
- .option('--entrypoint <entrypoint path>', 'The entrypoint package json path', './package.json')
111
- .addOption(new Option('-e, --env <envs..>', 'The env secrets (NAME=value)')
112
- .argParser((value, previous) => {
113
- const index = value.indexOf('=');
114
- if (index < 1)
115
- throw new Error('Invalid secret format');
116
- return { ...previous, [value.slice(0, index)]: value.slice(index + 1) };
117
- })
118
- .default({}))
119
- .addOption(new Option('--env-file-if-exists <file-path>', 'Load variables from a .env file if it exists').argParser(value => path.resolve(process.cwd(), value)))
120
- .option('--attach', 'Use the dev server of the project (`framework dev`) instead of a headless runtime; runs keep going after the command exits', false)
121
- .option('-i, --input <json>', 'Workflow input as JSON (run)')
122
- .addOption(new Option('--input-file <file-path>', 'Read the workflow input JSON from a file (run)').argParser(value => path.resolve(process.cwd(), value)))
123
- .addOption(new Option('-t, --timeout <ms>', 'Stop waiting for the run after this many milliseconds (run)')
124
- .default(DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS)
125
- .argParser(value => {
126
- const timeout = Number.parseInt(value, 10);
127
- if (!Number.isInteger(timeout) || timeout < 0)
128
- throw new Error('Invalid timeout');
129
- return timeout;
130
- }))
131
- .addOption(debugOption())
132
- .addOption(debugLogOption())
133
- .option('--trace', 'Include the activities, logs and child runs in the output (run)', false)
134
- .action(async (workflowId, action, options) => {
135
- if (options.envFileIfExists && fs.existsSync(options.envFileIfExists))
136
- Object.assign(options.env, parseEnv(fs.readFileSync(options.envFileIfExists, 'utf8')));
137
- let app = null;
138
- let exitCode = WORKFLOWS_EXIT_CODE.error;
139
- const shutdown = async (code) => {
140
- await app?.down().catch(() => { });
141
- process.exit(code);
142
- };
143
- process.once('SIGINT', () => void shutdown(130));
144
- process.once('SIGTERM', () => void shutdown(143));
145
- try {
146
- if (action === 'run')
147
- readWorkflowInput(options);
148
- const projectDir = toProjectDir(options.entrypoint);
149
- if (options.attach)
150
- exitCode = await execute(await attachDevServer(projectDir), workflowId, action, options);
151
- else {
152
- const dev = await loadDev(projectDir, ['HeadlessApp']);
153
- app = await dev.HeadlessApp.up({
154
- entrypoint: options.entrypoint,
155
- env: options.env,
156
- debugLog: toDebugLog(options),
157
- });
158
- exitCode = await execute(app, workflowId, action, options);
159
- }
160
- }
161
- catch (error) {
162
- print(toErrorOutput(error));
163
- }
164
- await shutdown(exitCode);
165
- });
166
- //# sourceMappingURL=workflows.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/commands/workflows/workflows.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import path from 'node:path';
2
- import { Option } from 'commander';
3
- /** `DEBUG_LOG_STDERR` of the dev package: the events go to stderr. */
4
- export const DEBUG_LOG_STDERR = '-';
5
- export const debugOption = () => new Option('--debug', 'Log what the runtime runs (jobs, runs, activities, queue) to stderr');
6
- export const debugLogOption = () => new Option('--debug-log <file-path>', 'Append the runtime events to this file as NDJSON instead of stderr').argParser(value => path.resolve(process.cwd(), value));
7
- /** The `debugLog` the dev package takes, or undefined when debugging is off. */
8
- export function toDebugLog({ debug, debugLog, }) {
9
- if (debugLog)
10
- return debugLog;
11
- return debug ? DEBUG_LOG_STDERR : undefined;
12
- }
13
- //# sourceMappingURL=debug-log-option.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug-log-option.js","sourceRoot":"","sources":["../../src/tools/debug-log-option.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAOnC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAC9B,IAAI,MAAM,CACR,SAAS,EACT,qEAAqE,CACtE,CAAA;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CACjC,IAAI,MAAM,CACR,yBAAyB,EACzB,oEAAoE,CACrE,CAAC,SAAS,CAAS,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;AAElE,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,GACQ;IAChB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC"}
@@ -1,261 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { setTimeout as sleep } from 'node:timers/promises';
5
- import { promisify } from 'node:util';
6
- import { loadDev } from './load-dev.js';
7
- /** `DEV_ROUTES_PREFIX` of the dev package. */
8
- const DEV_ROUTES_PREFIX = '/_dev';
9
- /** `SERVER_URL_ARG` the dev server passes to the app process it forks. */
10
- const SERVER_URL_ARG = '--server-url=';
11
- /** `MAX_LIMIT` of the `/_dev` page queries. */
12
- export const DEV_SERVER_PAGE_LIMIT = 50;
13
- const DEFAULT_REQUEST_TIMEOUT_IN_MS = 30_000;
14
- const PROBE_TIMEOUT_IN_MS = 2_000;
15
- const DEFAULT_POLL_INTERVAL_IN_MS = 250;
16
- const DEFAULT_RUN_TIMEOUT_IN_MS = 60_000;
17
- /** A `/_dev` request failed; `status` is the HTTP status, if any. */
18
- export class DevServerError extends Error {
19
- status;
20
- details;
21
- name = 'DevServerError';
22
- constructor(message, status, details, options) {
23
- super(message, options);
24
- this.status = status;
25
- this.details = details;
26
- }
27
- }
28
- /** Typed client of the `/_dev` routes of a running `framework dev`. */
29
- export class DevServerClient {
30
- url;
31
- fetch;
32
- timeoutInMs;
33
- constructor(url, { fetch = globalThis.fetch, timeoutInMs = DEFAULT_REQUEST_TIMEOUT_IN_MS, } = {}) {
34
- this.url = url;
35
- this.fetch = fetch;
36
- this.timeoutInMs = timeoutInMs;
37
- }
38
- /** Waits for the app to be ready (`/_dev/manifest` blocks until then). */
39
- manifest() {
40
- return this.request('GET', '/manifest');
41
- }
42
- state(timeoutInMs) {
43
- return this.request('GET', '/state', { timeoutInMs });
44
- }
45
- findRuns(query = {}) {
46
- return this.request('GET', '/runs', { query });
47
- }
48
- findRun(runId) {
49
- return this.request('GET', `/runs/${encodeURIComponent(runId)}`);
50
- }
51
- findActivities(runId, page = {}) {
52
- return this.request('GET', `/runs/${encodeURIComponent(runId)}/activities`, { query: page });
53
- }
54
- findActivity(runId, activityId) {
55
- return this.request('GET', `/runs/${encodeURIComponent(runId)}/activities/${encodeURIComponent(activityId)}`);
56
- }
57
- findLogs(runId, page = {}) {
58
- return this.request('GET', `/runs/${encodeURIComponent(runId)}/logs`, {
59
- query: page,
60
- });
61
- }
62
- findWaitingActivities(page = {}) {
63
- return this.request('GET', '/activities/waiting', { query: page });
64
- }
65
- startRun(workflowId, input) {
66
- return this.request('POST', `/workflows/${encodeURIComponent(workflowId)}/runs`, { body: input });
67
- }
68
- /** Resolves a waiting async activity now, with `payload` as its outcome. */
69
- advanceActivity(activityId, payload) {
70
- return this.request('POST', `/activities/${encodeURIComponent(activityId)}/advance`, { body: payload === undefined ? {} : { payload } });
71
- }
72
- /** Every activity of the run, in the order they ran. */
73
- async findAllActivities(runId) {
74
- const activities = await this.findAll(page => this.findActivities(runId, page).then(result => ({
75
- items: result.activities,
76
- count: result.count,
77
- })));
78
- return activities.reverse();
79
- }
80
- /** Every log of the run, oldest first. */
81
- async findAllLogs(runId) {
82
- const logs = await this.findAll(page => this.findLogs(runId, page).then(result => ({
83
- items: result.logs,
84
- count: result.count,
85
- })));
86
- return logs.reverse();
87
- }
88
- findAllRuns(query) {
89
- return this.findAll(page => this.findRuns({ ...query, ...page }).then(result => ({
90
- items: result.runs,
91
- count: result.count,
92
- })));
93
- }
94
- async findAll(find) {
95
- const items = [];
96
- for (let offset = 0;; offset += DEV_SERVER_PAGE_LIMIT) {
97
- const page = await find({ limit: DEV_SERVER_PAGE_LIMIT, offset });
98
- items.push(...page.items);
99
- if (!page.items.length || offset + DEV_SERVER_PAGE_LIMIT >= page.count)
100
- return items;
101
- }
102
- }
103
- async request(method, route, { query, body, timeoutInMs = this.timeoutInMs, } = {}) {
104
- const url = new URL(`${DEV_ROUTES_PREFIX}${route}`, this.url);
105
- for (const [name, value] of Object.entries(query ?? {}))
106
- if (value !== undefined)
107
- url.searchParams.set(name, String(value));
108
- let response;
109
- try {
110
- response = await this.fetch(url, {
111
- method,
112
- headers: method === 'POST' ? { 'content-type': 'application/json' } : {},
113
- // An absent input is sent as no body: the route reads it as `undefined`.
114
- body: method === 'POST' && body !== undefined
115
- ? JSON.stringify(body)
116
- : undefined,
117
- signal: AbortSignal.timeout(timeoutInMs),
118
- });
119
- }
120
- catch (error) {
121
- throw new DevServerError(`The dev server at ${this.url} did not answer ${method} ${url.pathname}: ${error.message}`, undefined, null, { cause: error });
122
- }
123
- const text = await response.text();
124
- let json;
125
- try {
126
- json = text ? JSON.parse(text) : undefined;
127
- }
128
- catch {
129
- json = text;
130
- }
131
- if (!response.ok)
132
- throw toDevServerError(response.status, json);
133
- return json;
134
- }
135
- }
136
- /** Reads `{ statusCode, message, error }`, the error body of the dev server. */
137
- function toDevServerError(status, body) {
138
- const { message, error } = (typeof body === 'object' && body !== null ? body : { message: body });
139
- if (typeof message === 'string' && message)
140
- return new DevServerError(error && typeof error === 'string' && error !== message
141
- ? `${message} (${error})`
142
- : message, status, null);
143
- return new DevServerError(`The dev server answered ${status}${typeof error === 'string' ? ` ${error}` : ''}`, status, message ?? null);
144
- }
145
- const execFileAsync = promisify(execFile);
146
- /**
147
- * The URL a dev server handed to its app process. Newer dev versions publish
148
- * it in the registry; for older ones (the project picks the version) it is
149
- * read from the process arguments (`--server-url=`), except on Windows.
150
- */
151
- export async function readRuntimeServerUrl(runtime) {
152
- if (runtime.serverUrl)
153
- return runtime.serverUrl;
154
- let args;
155
- try {
156
- // cspell:ignore cmdline
157
- args = (await fs.promises.readFile(`/proc/${runtime.pid}/cmdline`, 'utf8'))
158
- .split('\0')
159
- .filter(Boolean);
160
- }
161
- catch {
162
- if (process.platform === 'win32')
163
- return null;
164
- try {
165
- const { stdout } = await execFileAsync('ps', [
166
- '-ww',
167
- '-o',
168
- 'args=',
169
- '-p',
170
- String(runtime.pid),
171
- ]);
172
- args = stdout.trim().split(/\s+/);
173
- }
174
- catch {
175
- return null;
176
- }
177
- }
178
- const arg = args.find(value => value.startsWith(SERVER_URL_ARG));
179
- return arg ? arg.slice(SERVER_URL_ARG.length) : null;
180
- }
181
- const toRealPath = (dir) => {
182
- try {
183
- return fs.realpathSync(path.resolve(dir));
184
- }
185
- catch {
186
- return path.resolve(dir);
187
- }
188
- };
189
- /**
190
- * The `framework dev` serving `projectDir` on this machine, newest first, or
191
- * `null` when none answers.
192
- */
193
- export async function findDevServer(projectDir, { dev, fetch } = {}) {
194
- const { listRuntimes } = dev ?? (await loadDev(projectDir, ['listRuntimes']));
195
- const target = toRealPath(projectDir);
196
- const runtimes = (await listRuntimes())
197
- .filter(runtime => runtime.kind === 'dev' &&
198
- runtime.projectDir !== null &&
199
- toRealPath(runtime.projectDir) === target)
200
- .reverse();
201
- for (const runtime of runtimes) {
202
- const url = await readRuntimeServerUrl(runtime);
203
- if (!url)
204
- continue;
205
- const client = new DevServerClient(url, { fetch });
206
- try {
207
- await client.state(PROBE_TIMEOUT_IN_MS);
208
- }
209
- catch {
210
- continue;
211
- }
212
- return { url, runtime, client };
213
- }
214
- return null;
215
- }
216
- /** An async activity still waiting for a callback, advance or timeout. */
217
- export const isWaitingActivity = (activity) => activity.kind === 'async' && activity.pendingStatus === 'pending';
218
- /** Activities (with input and output), logs and child runs, as `--trace`. */
219
- export async function traceDevRun(client, runId, activities) {
220
- const ran = activities ?? (await client.findAllActivities(runId));
221
- const [detailed, logs, children] = await Promise.all([
222
- Promise.all(ran.map(activity => client.findActivity(runId, activity.id))),
223
- client.findAllLogs(runId),
224
- client.findAllRuns({ parentRun: runId }),
225
- ]);
226
- return { activities: detailed, logs, children };
227
- }
228
- /** The outcome of a run so far, in the shape of `HeadlessApp.run`. */
229
- export async function readDevRun(client, runId, { timedOut = false, trace = false } = {}) {
230
- const run = await client.findRun(runId);
231
- const activities = await client.findAllActivities(runId);
232
- return {
233
- run,
234
- timedOut,
235
- waiting: activities.filter(isWaitingActivity),
236
- ...(trace ? { trace: await traceDevRun(client, runId, activities) } : {}),
237
- };
238
- }
239
- /** Polls the run until it is no longer `running` or `timeoutInMs` elapses. */
240
- export async function waitForDevRun(client, runId, { timeoutInMs = DEFAULT_RUN_TIMEOUT_IN_MS, pollIntervalInMs = DEFAULT_POLL_INTERVAL_IN_MS, } = {}) {
241
- const deadline = Date.now() + timeoutInMs;
242
- while (true) {
243
- const { status } = await client.findRun(runId);
244
- if (status !== 'running')
245
- return true;
246
- const left = deadline - Date.now();
247
- if (left <= 0)
248
- return false;
249
- await sleep(Math.min(pollIntervalInMs, left));
250
- }
251
- }
252
- /**
253
- * Starts a run on the dev server and waits like `HeadlessApp.run`, but the run
254
- * keeps going on the server after a timeout (sleeping children included).
255
- */
256
- export async function runOnDevServer(client, workflowId, input, { trace = false, ...options } = {}) {
257
- const { id } = await client.startRun(workflowId, input);
258
- const settled = await waitForDevRun(client, id, options);
259
- return readDevRun(client, id, { timedOut: !settled, trace });
260
- }
261
- //# sourceMappingURL=dev-server-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-server-client.js","sourceRoot":"","sources":["../../src/tools/dev-server-client.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import path from 'node:path';
2
- import { DEV_PACKAGE_NAME, importProjectPackage, ProjectPackageError, } from './project-package.js';
3
- /** The directory of a `--entrypoint` package json path. */
4
- export const toProjectDir = (entrypoint) => path.dirname(path.resolve(process.cwd(), entrypoint));
5
- /**
6
- * Fails with the installed version when the project's dev package is older
7
- * than the command needs, instead of a `x is not a function` later on.
8
- */
9
- function requireExports(module, names) {
10
- const missing = names.filter(name => module[name] === undefined);
11
- if (missing.length)
12
- throw new ProjectPackageError(`${DEV_PACKAGE_NAME}@${module.package.version} (${module.package.dir}) does not provide ${missing.join(', ')}; upgrade it in the project`);
13
- return module;
14
- }
15
- /** The `@t4h.framework/dev` installed in the project, not the CLI's. */
16
- export async function loadDev(projectDir, required = []) {
17
- return requireExports(await importProjectPackage(DEV_PACKAGE_NAME, projectDir), required);
18
- }
19
- /** `@t4h.framework/dev/build` of the project, see `loadDev`. */
20
- export async function loadDevBuild(projectDir, required = []) {
21
- return requireExports(await importProjectPackage(DEV_PACKAGE_NAME, projectDir, './build'), required);
22
- }
23
- //# sourceMappingURL=load-dev.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-dev.js","sourceRoot":"","sources":["../../src/tools/load-dev.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,sBAAsB,CAAA;AAM7B,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,EAAE,CACjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAA;AAEvD;;;GAGG;AACH,SAAS,cAAc,CACrB,MAAe,EACf,KAA0C;IAE1C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAA;IAEhE,IAAI,OAAO,CAAC,MAAM;QAChB,MAAM,IAAI,mBAAmB,CAC3B,GAAG,gBAAgB,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAC1I,CAAA;IAEH,OAAO,MAAM,CAAA;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,UAAkB,EAClB,WAAmD,EAAE;IAErD,OAAO,cAAc,CACnB,MAAM,oBAAoB,CAAa,gBAAgB,EAAE,UAAU,CAAC,EACpE,QAAQ,CACT,CAAA;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,WAAwD,EAAE;IAE1D,OAAO,cAAc,CACnB,MAAM,oBAAoB,CACxB,gBAAgB,EAChB,UAAU,EACV,SAAS,CACV,EACD,QAAQ,CACT,CAAA;AACH,CAAC"}
@@ -1,67 +0,0 @@
1
- import fs from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
- import { pathToFileURL } from 'node:url';
5
- export const DEV_PACKAGE_NAME = '@t4h.framework/dev';
6
- /** The project lacks a package the command needs; the CLI prints the message only. */
7
- export class ProjectPackageError extends Error {
8
- name = 'ProjectPackageError';
9
- }
10
- export class ProjectPackageNotFoundError extends ProjectPackageError {
11
- packageName;
12
- projectDir;
13
- name = 'ProjectPackageNotFoundError';
14
- constructor(packageName, projectDir) {
15
- super(`${packageName} is not installed in ${projectDir}; add it to the project (e.g. \`yarn add -D ${packageName}\`)`);
16
- this.packageName = packageName;
17
- this.projectDir = projectDir;
18
- }
19
- }
20
- /** The file `exports[subpath]` points to for `import`, as Node would pick it. */
21
- function toImportTarget(exports) {
22
- if (exports === undefined)
23
- return null;
24
- if (typeof exports === 'string')
25
- return exports;
26
- for (const condition of ['import', 'node', 'default'])
27
- if (condition in exports)
28
- return toImportTarget(exports[condition]);
29
- return null;
30
- }
31
- /** Resolves `subpath` against `main` / `exports` of a package json. */
32
- function toExportTarget({ main, exports }, subpath) {
33
- if (exports === undefined)
34
- return subpath === '.' ? (main ?? 'index.js') : subpath;
35
- const isSubpathMap = typeof exports === 'object' &&
36
- Object.keys(exports).some(key => key.startsWith('.'));
37
- if (!isSubpathMap)
38
- return subpath === '.' ? toImportTarget(exports) : null;
39
- return toImportTarget(exports[subpath]);
40
- }
41
- /**
42
- * Finds `packageName` the way the project itself would: in the `node_modules`
43
- * of `projectDir` and its parents, never next to the CLI. That is what lets the
44
- * project pin the version the CLI runs.
45
- */
46
- export function findProjectPackage(packageName, projectDir) {
47
- const lookupPaths = createRequire(path.join(projectDir, 'package.json')).resolve.paths(packageName) ?? [];
48
- for (const lookupPath of lookupPaths) {
49
- const dir = path.join(lookupPath, packageName);
50
- const packageJsonPath = path.join(dir, 'package.json');
51
- if (!fs.existsSync(packageJsonPath))
52
- continue;
53
- const { version } = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
54
- return { name: packageName, version, dir: fs.realpathSync(dir) };
55
- }
56
- throw new ProjectPackageNotFoundError(packageName, projectDir);
57
- }
58
- /** Imports `packageName[/subpath]` from the project, see `findProjectPackage`. */
59
- export async function importProjectPackage(packageName, projectDir, subpath = '.') {
60
- const projectPackage = findProjectPackage(packageName, projectDir);
61
- const target = toExportTarget(JSON.parse(fs.readFileSync(path.join(projectPackage.dir, 'package.json'), 'utf8')), subpath);
62
- if (!target)
63
- throw new ProjectPackageError(`${packageName}@${projectPackage.version} does not export "${subpath}"; upgrade it in ${projectDir}`);
64
- const module = await import(pathToFileURL(path.join(projectPackage.dir, target)).href);
65
- return { ...module, package: projectPackage };
66
- }
67
- //# sourceMappingURL=project-package.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-package.js","sourceRoot":"","sources":["../../src/tools/project-package.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- const LOCKFILES = [
5
- ['yarn.lock', 'yarn'],
6
- ['pnpm-lock.yaml', 'pnpm'],
7
- ['package-lock.json', 'npm'],
8
- ];
9
- /** The package manager of the project: its lockfile, here or in a workspace root. */
10
- export function detectPackageManager(projectDir) {
11
- let dir = path.resolve(projectDir);
12
- while (true) {
13
- for (const [lockfile, packageManager] of LOCKFILES)
14
- if (fs.existsSync(path.join(dir, lockfile)))
15
- return packageManager;
16
- const parent = path.dirname(dir);
17
- if (parent === dir)
18
- return 'npm';
19
- dir = parent;
20
- }
21
- }
22
- export function readProjectScripts(projectDir) {
23
- const packageJsonPath = path.join(projectDir, 'package.json');
24
- if (!fs.existsSync(packageJsonPath))
25
- return {};
26
- const { scripts } = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
27
- return scripts && typeof scripts === 'object' ? scripts : {};
28
- }
29
- export function runCommand(command, args, cwd) {
30
- return new Promise(resolve => {
31
- // CI=true keeps watch-mode runners (vitest, jest) from waiting for input.
32
- const child = spawn(command, args, {
33
- cwd,
34
- env: { ...process.env, CI: 'true', FORCE_COLOR: '0' },
35
- shell: process.platform === 'win32',
36
- stdio: ['ignore', 'pipe', 'pipe'],
37
- });
38
- const chunks = [];
39
- child.stdout.on('data', (chunk) => chunks.push(chunk));
40
- child.stderr.on('data', (chunk) => chunks.push(chunk));
41
- const done = (exitCode, extra = '') => resolve({
42
- command: [command, ...args].join(' '),
43
- exitCode,
44
- output: Buffer.concat(chunks).toString('utf8') + extra,
45
- });
46
- child.on('error', error => done(127, error.message));
47
- child.on('close', code => done(code ?? 1));
48
- });
49
- }
50
- export function runProjectScript(projectDir, script) {
51
- return runCommand(detectPackageManager(projectDir), ['run', script], projectDir);
52
- }
53
- //# sourceMappingURL=project-scripts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-scripts.js","sourceRoot":"","sources":["../../src/tools/project-scripts.ts"],"names":[],"mappings":"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"}