@kodycodes/cli 1.23.1 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/dev/dev-bundler.d.ts +25 -0
- package/dist/dev/dev-bundler.js +51 -0
- package/dist/dev/dev-bundler.js.map +1 -0
- package/dist/dev/dev-events.d.ts +50 -0
- package/dist/dev/dev-events.js +81 -0
- package/dist/dev/dev-events.js.map +1 -0
- package/dist/dev/dev-protocol.d.ts +13 -0
- package/dist/dev/dev-protocol.js +14 -0
- package/dist/dev/dev-protocol.js.map +1 -0
- package/dist/dev/dev-watcher.d.ts +20 -0
- package/dist/dev/dev-watcher.js +108 -0
- package/dist/dev/dev-watcher.js.map +1 -0
- package/dist/dev/error-page.d.ts +21 -0
- package/dist/dev/error-page.js +64 -0
- package/dist/dev/error-page.js.map +1 -0
- package/dist/dev/process-reaper.d.ts +40 -0
- package/dist/dev/process-reaper.js +144 -0
- package/dist/dev/process-reaper.js.map +1 -0
- package/dist/dev/stack-trace.d.ts +11 -0
- package/dist/dev/stack-trace.js +56 -0
- package/dist/dev/stack-trace.js.map +1 -0
- package/dist/dev/workerd-process.d.ts +28 -0
- package/dist/dev/workerd-process.js +118 -0
- package/dist/dev/workerd-process.js.map +1 -0
- package/dist/dev-command.js +17 -4
- package/dist/dev-command.js.map +1 -1
- package/dist/help.js +5 -0
- package/dist/help.js.map +1 -1
- package/dist/local-bundle.d.ts +43 -3
- package/dist/local-bundle.js +94 -33
- package/dist/local-bundle.js.map +1 -1
- package/dist/package-app-dev.d.ts +16 -3
- package/dist/package-app-dev.js +389 -192
- package/dist/package-app-dev.js.map +1 -1
- package/dist/package-local-runtime-source.d.ts +8 -0
- package/dist/package-local-runtime-source.js +69 -5
- package/dist/package-local-runtime-source.js.map +1 -1
- package/package.json +3 -1
package/dist/local-bundle.js
CHANGED
|
@@ -1,64 +1,125 @@
|
|
|
1
1
|
import * as esbuild from 'esbuild';
|
|
2
|
-
import { resolve } from 'node:path';
|
|
2
|
+
import { relative, resolve } from 'node:path';
|
|
3
|
+
/** Thrown when esbuild fails; `diagnostics` keeps the structured locations. */
|
|
4
|
+
export class BundleError extends Error {
|
|
5
|
+
diagnostics;
|
|
6
|
+
constructor(message, diagnostics) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'BundleError';
|
|
9
|
+
this.diagnostics = diagnostics;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* esbuild options shared by one-shot bundles and `kody dev` rebuilds: follow
|
|
14
|
+
* relative imports and npm packages, keep `kody:*` external for package-graph
|
|
15
|
+
* + runtime binding, and leave `node:*` external for workerd `nodejs_compat`.
|
|
16
|
+
*/
|
|
17
|
+
export function localBundleOptions(entry) {
|
|
18
|
+
return {
|
|
19
|
+
absWorkingDir: process.cwd(),
|
|
20
|
+
entryPoints: [entry],
|
|
21
|
+
bundle: true,
|
|
22
|
+
write: false,
|
|
23
|
+
format: 'esm',
|
|
24
|
+
platform: 'neutral',
|
|
25
|
+
target: 'esnext',
|
|
26
|
+
logLevel: 'silent',
|
|
27
|
+
packages: 'bundle',
|
|
28
|
+
external: ['kody:*', 'node:*'],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
3
31
|
/**
|
|
4
32
|
* Bundle a `--file` entry for local workerd the same way hosted execute /
|
|
5
|
-
* publish resolves code
|
|
6
|
-
* `kody:*` external for package-graph + runtime binding, and leave `node:*`
|
|
7
|
-
* external for workerd `nodejs_compat` (same as unbundled `--code`).
|
|
33
|
+
* publish resolves code.
|
|
8
34
|
*/
|
|
9
35
|
export async function bundleLocalUserModule(modulePath) {
|
|
10
36
|
const entry = resolve(modulePath);
|
|
11
37
|
let result;
|
|
12
38
|
try {
|
|
13
|
-
result = await esbuild.build(
|
|
14
|
-
absWorkingDir: process.cwd(),
|
|
15
|
-
entryPoints: [entry],
|
|
16
|
-
bundle: true,
|
|
17
|
-
write: false,
|
|
18
|
-
format: 'esm',
|
|
19
|
-
platform: 'neutral',
|
|
20
|
-
target: 'esnext',
|
|
21
|
-
logLevel: 'silent',
|
|
22
|
-
packages: 'bundle',
|
|
23
|
-
external: ['kody:*', 'node:*'],
|
|
24
|
-
});
|
|
39
|
+
result = await esbuild.build(localBundleOptions(entry));
|
|
25
40
|
}
|
|
26
41
|
catch (error) {
|
|
27
|
-
throw
|
|
42
|
+
throw createBundleError(modulePath, error);
|
|
28
43
|
}
|
|
29
44
|
const output = result.outputFiles?.[0];
|
|
30
45
|
if (output === undefined) {
|
|
31
|
-
throw new
|
|
46
|
+
throw new BundleError(`Could not bundle ${modulePath}: esbuild produced no output.`, []);
|
|
32
47
|
}
|
|
33
48
|
if (result.errors.length > 0) {
|
|
34
|
-
throw
|
|
49
|
+
throw createBundleError(modulePath, { errors: result.errors });
|
|
35
50
|
}
|
|
36
51
|
return output.text;
|
|
37
52
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
53
|
+
/**
|
|
54
|
+
* `workingDir` is esbuild's `absWorkingDir` (locations are relative to it);
|
|
55
|
+
* `displayRoot` is what reported paths are relative to.
|
|
56
|
+
*/
|
|
57
|
+
export function createBundleError(modulePath, error, paths = {
|
|
58
|
+
workingDir: process.cwd(),
|
|
59
|
+
displayRoot: process.cwd(),
|
|
60
|
+
}) {
|
|
61
|
+
const diagnostics = bundleDiagnostics(error, paths);
|
|
62
|
+
const details = diagnostics.map(formatBundleDiagnostic).join('\n');
|
|
63
|
+
const header = `Could not bundle ${modulePath}.`;
|
|
41
64
|
const body = details.length > 0 ? `${header}\n${details}` : header;
|
|
65
|
+
const messages = diagnostics.map((item) => item.message).join('\n');
|
|
42
66
|
// Only when the unresolved specifier itself is kody:@ (not a path that happens
|
|
43
67
|
// to contain that substring).
|
|
44
|
-
if (/Could not resolve ["']kody:@/i.test(
|
|
45
|
-
return `${body}\nfix: Map the dependency in .kody/deps.json (or package.json#kody.localDeps), keep it in this package's exports, or log in so published package-graph can supply it
|
|
68
|
+
if (/Could not resolve ["']kody:@/i.test(messages)) {
|
|
69
|
+
return new BundleError(`${body}\nfix: Map the dependency in .kody/deps.json (or package.json#kody.localDeps), keep it in this package's exports, or log in so published package-graph can supply it.`, diagnostics);
|
|
46
70
|
}
|
|
47
71
|
if (/Could not resolve|Cannot find module|ENOENT/i.test(body)) {
|
|
48
|
-
return `${body}\nfix: Run \`npm install\` in the package directory (and any local deps), then retry
|
|
72
|
+
return new BundleError(`${body}\nfix: Run \`npm install\` in the package directory (and any local deps), then retry.`, diagnostics);
|
|
49
73
|
}
|
|
50
|
-
return body;
|
|
74
|
+
return new BundleError(body, diagnostics);
|
|
75
|
+
}
|
|
76
|
+
/** `file:line:col: message` followed by an indented code frame. */
|
|
77
|
+
export function formatBundleDiagnostic(item) {
|
|
78
|
+
const where = item.file !== null
|
|
79
|
+
? `${item.file}${item.line !== null ? `:${item.line}` : ''}${item.col !== null ? `:${item.col}` : ''}: `
|
|
80
|
+
: '';
|
|
81
|
+
return `${where}${item.message}${item.frame ? `\n${item.frame}` : ''}`;
|
|
51
82
|
}
|
|
52
|
-
function
|
|
83
|
+
function bundleDiagnostics(error, paths) {
|
|
53
84
|
if (isEsbuildFailure(error)) {
|
|
54
85
|
return error.errors
|
|
55
|
-
.
|
|
56
|
-
.
|
|
57
|
-
.join('\n');
|
|
86
|
+
.filter((item) => item.text.trim().length > 0)
|
|
87
|
+
.map((item) => toDiagnostic(item, paths));
|
|
58
88
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
file: null,
|
|
92
|
+
line: null,
|
|
93
|
+
col: null,
|
|
94
|
+
message: error instanceof Error ? error.message : String(error),
|
|
95
|
+
frame: null,
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
function toDiagnostic(item, paths) {
|
|
100
|
+
const location = item.location;
|
|
101
|
+
if (!location) {
|
|
102
|
+
return { file: null, line: null, col: null, message: item.text.trim(), frame: null };
|
|
103
|
+
}
|
|
104
|
+
const absolute = resolve(paths.workingDir, location.file);
|
|
105
|
+
const fromRoot = relative(paths.displayRoot, absolute);
|
|
106
|
+
const file = fromRoot && !fromRoot.startsWith('..') ? fromRoot : absolute;
|
|
107
|
+
return {
|
|
108
|
+
file,
|
|
109
|
+
line: location.line,
|
|
110
|
+
col: location.column + 1,
|
|
111
|
+
message: item.text.trim(),
|
|
112
|
+
frame: codeFrame(location),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function codeFrame(location) {
|
|
116
|
+
if (!location.lineText)
|
|
117
|
+
return null;
|
|
118
|
+
const gutter = String(location.line);
|
|
119
|
+
const pad = ' '.repeat(gutter.length);
|
|
120
|
+
const caretWidth = Math.max(1, Math.min(location.length || 1, location.lineText.length));
|
|
121
|
+
return (` ${gutter} | ${location.lineText}\n` +
|
|
122
|
+
` ${pad} | ${' '.repeat(location.column)}${'^'.repeat(caretWidth)}`);
|
|
62
123
|
}
|
|
63
124
|
function isEsbuildFailure(error) {
|
|
64
125
|
return (typeof error === 'object' &&
|
package/dist/local-bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-bundle.js","sourceRoot":"","sources":["../src/local-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"local-bundle.js","sourceRoot":"","sources":["../src/local-bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Long-running `kody dev` app server: bundles `kody.app.entry` the same way
|
|
3
|
-
* local-bundle/publish does for esbuild, serves via workerd
|
|
4
|
-
*
|
|
3
|
+
* local-bundle/publish does for esbuild, serves via workerd behind a Node
|
|
4
|
+
* proxy that strips the mount, and rebuilds on file changes.
|
|
5
|
+
*
|
|
6
|
+
* Each successful rebuild starts a new workerd "generation" and only swaps the
|
|
7
|
+
* proxy over once it is listening; the previous generation drains in-flight
|
|
8
|
+
* requests and is then stopped. Requests that arrive mid-rebuild wait for it,
|
|
9
|
+
* so a save is never answered by a 503 or a stale bundle.
|
|
5
10
|
*/
|
|
11
|
+
import { type DevEvent } from './dev/dev-events.js';
|
|
6
12
|
import { type PackageLocalContext } from './package-local-runtime-source.js';
|
|
7
13
|
import type { KodyPackageManifest } from './package-manifest.js';
|
|
8
14
|
import type { KodyTarget } from './target.js';
|
|
@@ -35,10 +41,17 @@ export type PackageAppDevOptions = {
|
|
|
35
41
|
passthroughHosts?: ReadonlyArray<string>;
|
|
36
42
|
workerdPath?: string;
|
|
37
43
|
fetchFn?: typeof fetch;
|
|
38
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Rebuild on file changes (default true). One-shot `dev fetch` turns this
|
|
46
|
+
* off, which also makes an initial build failure throw.
|
|
47
|
+
*/
|
|
39
48
|
watch?: boolean;
|
|
49
|
+
/** Quiet period after the last file event before rebuilding. */
|
|
50
|
+
debounceMs?: number;
|
|
40
51
|
onStatus?: (message: string) => void;
|
|
41
52
|
onError?: (message: string) => void;
|
|
53
|
+
/** Rebuilds, build/runtime errors, and app logs. */
|
|
54
|
+
onEvent?: (event: DevEvent) => void;
|
|
42
55
|
};
|
|
43
56
|
export type PackageAppDevServer = {
|
|
44
57
|
url: string;
|