@kodycodes/cli 1.25.0 → 1.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/capability-proxy.d.ts +37 -0
- package/dist/capability-proxy.js +144 -0
- package/dist/capability-proxy.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/dev/dev-assets.d.ts +40 -0
- package/dist/dev/dev-assets.js +202 -0
- package/dist/dev/dev-assets.js.map +1 -0
- package/dist/dev/dev-bundler.d.ts +3 -1
- package/dist/dev/dev-bundler.js +21 -7
- package/dist/dev/dev-bundler.js.map +1 -1
- package/dist/dev/dev-events.d.ts +1 -1
- package/dist/dev/dev-events.js +1 -1
- package/dist/dev/dev-events.js.map +1 -1
- package/dist/dev/dev-port.d.ts +22 -0
- package/dist/dev/dev-port.js +80 -0
- package/dist/dev/dev-port.js.map +1 -0
- package/dist/dev/prebuild.d.ts +17 -0
- package/dist/dev/prebuild.js +102 -0
- package/dist/dev/prebuild.js.map +1 -0
- package/dist/dev/process-reaper.d.ts +3 -0
- package/dist/dev/process-reaper.js +8 -1
- package/dist/dev/process-reaper.js.map +1 -1
- package/dist/dev-command.d.ts +1 -0
- package/dist/dev-command.js +65 -29
- package/dist/dev-command.js.map +1 -1
- package/dist/help.js +7 -0
- package/dist/help.js.map +1 -1
- package/dist/local-execute.js +14 -50
- package/dist/local-execute.js.map +1 -1
- package/dist/local-gateway-fetch-forward.d.ts +16 -0
- package/dist/local-gateway-fetch-forward.js +135 -0
- package/dist/local-gateway-fetch-forward.js.map +1 -0
- package/dist/local-host-runtime-surface.d.ts +55 -0
- package/dist/local-host-runtime-surface.js +75 -0
- package/dist/local-host-runtime-surface.js.map +1 -0
- package/dist/local-package-graph.js +23 -1
- package/dist/local-package-graph.js.map +1 -1
- package/dist/local-package-run.js +14 -50
- package/dist/local-package-run.js.map +1 -1
- package/dist/local-runtime-bridge.d.ts +36 -0
- package/dist/local-runtime-bridge.js +128 -0
- package/dist/local-runtime-bridge.js.map +1 -0
- package/dist/local-runtime-source.d.ts +5 -0
- package/dist/local-runtime-source.js +158 -16
- package/dist/local-runtime-source.js.map +1 -1
- package/dist/mock/mock-supported.d.ts +1 -1
- package/dist/mock/mock-supported.js +1 -0
- package/dist/mock/mock-supported.js.map +1 -1
- package/dist/package-app-dev.d.ts +16 -0
- package/dist/package-app-dev.js +166 -70
- package/dist/package-app-dev.js.map +1 -1
- package/dist/package-local-runtime-source.js +44 -47
- package/dist/package-local-runtime-source.js.map +1 -1
- package/dist/package-manifest.d.ts +11 -0
- package/dist/package-manifest.js +66 -1
- package/dist/package-manifest.js.map +1 -1
- package/dist/structured-error.d.ts +1 -1
- package/dist/structured-error.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local copy of the platform's `<appBasePath>/_assets/` surface for `kody dev`:
|
|
3
|
+
* the browser bundle of `kody.app.client` (fingerprinted `client.<hash>.js`),
|
|
4
|
+
* `__version.json`, and files from the `kody.app.assets` directory. Answered
|
|
5
|
+
* by the Node proxy before the app's fetch handler, like the platform does.
|
|
6
|
+
* Everything is `no-store` so a rebuild is always picked up.
|
|
7
|
+
*/
|
|
8
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
9
|
+
export declare const devAssetsPathPrefix = "/_assets/";
|
|
10
|
+
export declare const devVersionAssetName = "__version.json";
|
|
11
|
+
export type DevClientBundle = {
|
|
12
|
+
/** `client.<16-char base64url sha256>.js`, same shape as published apps. */
|
|
13
|
+
name: string;
|
|
14
|
+
code: string;
|
|
15
|
+
inputs: Array<string>;
|
|
16
|
+
};
|
|
17
|
+
export type DevClientBundler = {
|
|
18
|
+
build: () => Promise<DevClientBundle>;
|
|
19
|
+
dispose: () => Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
export declare function createDevClientBundler(input: {
|
|
22
|
+
entryPath: string;
|
|
23
|
+
root: string;
|
|
24
|
+
externals?: ReadonlyArray<string>;
|
|
25
|
+
}): DevClientBundler;
|
|
26
|
+
/** `/_assets/<rest>` → `<rest>` (percent-decoded), or null when not an asset path. */
|
|
27
|
+
export declare function parseDevAssetPath(pathname: string): string | null;
|
|
28
|
+
/** Absolute file under `assetsDir`, or null for traversal / absolute paths. */
|
|
29
|
+
export declare function resolveDevAssetFile(assetsDir: string, relativePath: string): string | null;
|
|
30
|
+
export declare function serveDevAsset(input: {
|
|
31
|
+
req: IncomingMessage;
|
|
32
|
+
res: ServerResponse;
|
|
33
|
+
relativePath: string;
|
|
34
|
+
assetsDir: string | null;
|
|
35
|
+
client: DevClientBundle | null;
|
|
36
|
+
clientModuleUrl: string | null;
|
|
37
|
+
/** Origin-relative app mount ('' at the root). */
|
|
38
|
+
appBasePath: string;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
export declare function inferDevAssetContentType(path: string): string;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local copy of the platform's `<appBasePath>/_assets/` surface for `kody dev`:
|
|
3
|
+
* the browser bundle of `kody.app.client` (fingerprinted `client.<hash>.js`),
|
|
4
|
+
* `__version.json`, and files from the `kody.app.assets` directory. Answered
|
|
5
|
+
* by the Node proxy before the app's fetch handler, like the platform does.
|
|
6
|
+
* Everything is `no-store` so a rebuild is always picked up.
|
|
7
|
+
*/
|
|
8
|
+
import * as esbuild from 'esbuild';
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
11
|
+
import { join, resolve, sep } from 'node:path';
|
|
12
|
+
import { createBundleError } from '../local-bundle.js';
|
|
13
|
+
import { bundleInputs } from './dev-bundler.js';
|
|
14
|
+
export const devAssetsPathPrefix = '/_assets/';
|
|
15
|
+
export const devVersionAssetName = '__version.json';
|
|
16
|
+
const clientModuleHashLength = 16;
|
|
17
|
+
export function createDevClientBundler(input) {
|
|
18
|
+
const externals = input.externals ?? [];
|
|
19
|
+
const workingDir = process.cwd();
|
|
20
|
+
let disposed = false;
|
|
21
|
+
let context = null;
|
|
22
|
+
const createContext = () => esbuild.context({
|
|
23
|
+
absWorkingDir: workingDir,
|
|
24
|
+
entryPoints: [resolve(input.entryPath)],
|
|
25
|
+
bundle: true,
|
|
26
|
+
write: false,
|
|
27
|
+
metafile: true,
|
|
28
|
+
format: 'esm',
|
|
29
|
+
platform: 'browser',
|
|
30
|
+
target: 'es2022',
|
|
31
|
+
sourcemap: 'inline',
|
|
32
|
+
logLevel: 'silent',
|
|
33
|
+
outfile: join(input.root, '_assets', 'client.js'),
|
|
34
|
+
plugins: externals.length > 0 ? [clientExternalsPlugin(externals)] : [],
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
build: async () => {
|
|
38
|
+
try {
|
|
39
|
+
// A context created after dispose would never be released and keeps Node alive.
|
|
40
|
+
if (disposed)
|
|
41
|
+
throw new Error('kody dev bundler was already disposed.');
|
|
42
|
+
context ??= createContext();
|
|
43
|
+
const result = await (await context).rebuild();
|
|
44
|
+
const code = result.outputFiles.find((file) => file.path.endsWith('.js'))?.text ?? '';
|
|
45
|
+
const hash = createHash('sha256')
|
|
46
|
+
.update(code)
|
|
47
|
+
.digest('base64url')
|
|
48
|
+
.slice(0, clientModuleHashLength);
|
|
49
|
+
return {
|
|
50
|
+
name: `client.${hash}.js`,
|
|
51
|
+
code,
|
|
52
|
+
inputs: bundleInputs(result.metafile, workingDir),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw createBundleError(input.entryPath, error, {
|
|
57
|
+
workingDir,
|
|
58
|
+
displayRoot: input.root,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
dispose: async () => {
|
|
63
|
+
disposed = true;
|
|
64
|
+
const current = context;
|
|
65
|
+
context = null;
|
|
66
|
+
await (await current?.catch(() => null))?.dispose();
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Exact specifier or a subpath of it, so `preact` does not also externalize
|
|
72
|
+
* `preact-render-to-string` (esbuild's own `external` matches by prefix).
|
|
73
|
+
*/
|
|
74
|
+
function clientExternalsPlugin(externals) {
|
|
75
|
+
return {
|
|
76
|
+
name: 'kody-dev-client-externals',
|
|
77
|
+
setup(build) {
|
|
78
|
+
build.onResolve({ filter: /^[^./]/ }, (args) => externals.some((external) => args.path === external || args.path.startsWith(`${external}/`))
|
|
79
|
+
? { path: args.path, external: true }
|
|
80
|
+
: undefined);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** `/_assets/<rest>` → `<rest>` (percent-decoded), or null when not an asset path. */
|
|
85
|
+
export function parseDevAssetPath(pathname) {
|
|
86
|
+
if (!pathname.startsWith(devAssetsPathPrefix))
|
|
87
|
+
return null;
|
|
88
|
+
const encoded = pathname.slice(devAssetsPathPrefix.length);
|
|
89
|
+
if (!encoded)
|
|
90
|
+
return null;
|
|
91
|
+
try {
|
|
92
|
+
return decodeURIComponent(encoded);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Absolute file under `assetsDir`, or null for traversal / absolute paths. */
|
|
99
|
+
export function resolveDevAssetFile(assetsDir, relativePath) {
|
|
100
|
+
if (relativePath.includes('\0') || relativePath.startsWith('/'))
|
|
101
|
+
return null;
|
|
102
|
+
const root = resolve(assetsDir);
|
|
103
|
+
const file = resolve(root, relativePath);
|
|
104
|
+
return file.startsWith(`${root}${sep}`) ? file : null;
|
|
105
|
+
}
|
|
106
|
+
export async function serveDevAsset(input) {
|
|
107
|
+
const { req, res } = input;
|
|
108
|
+
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
109
|
+
res.writeHead(405, { allow: 'GET, HEAD', 'cache-control': 'no-store' });
|
|
110
|
+
res.end('Method not allowed\n');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (input.relativePath === devVersionAssetName) {
|
|
114
|
+
send(req, res, 'application/json; charset=utf-8', JSON.stringify({
|
|
115
|
+
clientModuleUrl: input.clientModuleUrl,
|
|
116
|
+
assetBasePath: `${input.appBasePath}/_assets`,
|
|
117
|
+
publishedCommit: null,
|
|
118
|
+
}));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (input.client && input.relativePath === input.client.name) {
|
|
122
|
+
send(req, res, 'text/javascript; charset=utf-8', input.client.code);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const file = input.assetsDir ? resolveDevAssetFile(input.assetsDir, input.relativePath) : null;
|
|
126
|
+
const body = file ? await readAssetFile(file) : null;
|
|
127
|
+
if (!file || !body) {
|
|
128
|
+
res.writeHead(404, {
|
|
129
|
+
'content-type': 'text/plain; charset=utf-8',
|
|
130
|
+
'cache-control': 'no-store',
|
|
131
|
+
});
|
|
132
|
+
res.end('Not found\n');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const contentType = inferDevAssetContentType(file);
|
|
136
|
+
send(req, res, contentType, body, contentType.startsWith('text/javascript')
|
|
137
|
+
? { 'service-worker-allowed': `${input.appBasePath}/` }
|
|
138
|
+
: {});
|
|
139
|
+
}
|
|
140
|
+
async function readAssetFile(file) {
|
|
141
|
+
try {
|
|
142
|
+
if (!(await stat(file)).isFile())
|
|
143
|
+
return null;
|
|
144
|
+
return await readFile(file);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function send(req, res, contentType, body, extraHeaders = {}) {
|
|
151
|
+
const bytes = typeof body === 'string' ? Buffer.from(body, 'utf8') : body;
|
|
152
|
+
res.writeHead(200, {
|
|
153
|
+
'content-type': contentType,
|
|
154
|
+
'content-length': String(bytes.length),
|
|
155
|
+
'cache-control': 'no-store',
|
|
156
|
+
'x-content-type-options': 'nosniff',
|
|
157
|
+
...extraHeaders,
|
|
158
|
+
});
|
|
159
|
+
res.end(req.method === 'HEAD' ? undefined : bytes);
|
|
160
|
+
}
|
|
161
|
+
const contentTypesByExtension = {
|
|
162
|
+
avif: 'image/avif',
|
|
163
|
+
css: 'text/css; charset=utf-8',
|
|
164
|
+
csv: 'text/csv; charset=utf-8',
|
|
165
|
+
gif: 'image/gif',
|
|
166
|
+
htm: 'text/html; charset=utf-8',
|
|
167
|
+
html: 'text/html; charset=utf-8',
|
|
168
|
+
ico: 'image/x-icon',
|
|
169
|
+
jpeg: 'image/jpeg',
|
|
170
|
+
jpg: 'image/jpeg',
|
|
171
|
+
js: 'text/javascript; charset=utf-8',
|
|
172
|
+
json: 'application/json; charset=utf-8',
|
|
173
|
+
map: 'application/json; charset=utf-8',
|
|
174
|
+
md: 'text/markdown; charset=utf-8',
|
|
175
|
+
mjs: 'text/javascript; charset=utf-8',
|
|
176
|
+
mp3: 'audio/mpeg',
|
|
177
|
+
mp4: 'video/mp4',
|
|
178
|
+
oga: 'audio/ogg',
|
|
179
|
+
ogg: 'audio/ogg',
|
|
180
|
+
ogv: 'video/ogg',
|
|
181
|
+
otf: 'font/otf',
|
|
182
|
+
pdf: 'application/pdf',
|
|
183
|
+
png: 'image/png',
|
|
184
|
+
svg: 'image/svg+xml; charset=utf-8',
|
|
185
|
+
ttf: 'font/ttf',
|
|
186
|
+
txt: 'text/plain; charset=utf-8',
|
|
187
|
+
wasm: 'application/wasm',
|
|
188
|
+
wav: 'audio/wav',
|
|
189
|
+
webm: 'video/webm',
|
|
190
|
+
webmanifest: 'application/manifest+json; charset=utf-8',
|
|
191
|
+
webp: 'image/webp',
|
|
192
|
+
woff: 'font/woff',
|
|
193
|
+
woff2: 'font/woff2',
|
|
194
|
+
xml: 'application/xml; charset=utf-8',
|
|
195
|
+
};
|
|
196
|
+
export function inferDevAssetContentType(path) {
|
|
197
|
+
const name = path.split(/[\\/]/).pop() ?? '';
|
|
198
|
+
const separator = name.lastIndexOf('.');
|
|
199
|
+
const extension = separator <= 0 ? '' : name.slice(separator + 1).toLowerCase();
|
|
200
|
+
return contentTypesByExtension[extension] ?? 'application/octet-stream';
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=dev-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-assets.js","sourceRoot":"","sources":["../../src/dev/dev-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `kody dev` bundles of `kody.app.entry`: same esbuild options as one-shot
|
|
3
3
|
* local bundles, plus an in-memory source map (for mapping workerd stacks back
|
|
4
|
-
* to `.ts`) and the list of input files (for the watcher's stat poll).
|
|
4
|
+
* to `.ts`) and the list of input files (for the watcher's stat poll). Uses an
|
|
5
|
+
* incremental esbuild context so rebuilds only reparse changed files.
|
|
5
6
|
*/
|
|
6
7
|
import * as esbuild from 'esbuild';
|
|
7
8
|
export type DevBundle = {
|
|
@@ -19,6 +20,7 @@ export declare function createDevBundler(input: {
|
|
|
19
20
|
entryPath: string;
|
|
20
21
|
root: string;
|
|
21
22
|
}): DevBundler;
|
|
23
|
+
export declare function bundleInputs(metafile: esbuild.Metafile | undefined, workingDir: string): Array<string>;
|
|
22
24
|
export declare function readBundle(result: esbuild.BuildResult<{
|
|
23
25
|
metafile: true;
|
|
24
26
|
write: false;
|
package/dist/dev/dev-bundler.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `kody dev` bundles of `kody.app.entry`: same esbuild options as one-shot
|
|
3
3
|
* local bundles, plus an in-memory source map (for mapping workerd stacks back
|
|
4
|
-
* to `.ts`) and the list of input files (for the watcher's stat poll).
|
|
4
|
+
* to `.ts`) and the list of input files (for the watcher's stat poll). Uses an
|
|
5
|
+
* incremental esbuild context so rebuilds only reparse changed files.
|
|
5
6
|
*/
|
|
6
7
|
import * as esbuild from 'esbuild';
|
|
7
8
|
import { join, resolve } from 'node:path';
|
|
@@ -18,20 +19,36 @@ export function createDevBundler(input) {
|
|
|
18
19
|
outfile: join(input.root, '__kody_dev_bundle.js'),
|
|
19
20
|
};
|
|
20
21
|
const paths = { workingDir: base.absWorkingDir, displayRoot: input.root };
|
|
22
|
+
let disposed = false;
|
|
23
|
+
let context = null;
|
|
21
24
|
return {
|
|
22
25
|
build: async () => {
|
|
23
26
|
let result;
|
|
24
27
|
try {
|
|
25
|
-
|
|
28
|
+
// A context created after dispose would never be released and keeps Node alive.
|
|
29
|
+
if (disposed)
|
|
30
|
+
throw new Error('kody dev bundler was already disposed.');
|
|
31
|
+
context ??= esbuild.context(options);
|
|
32
|
+
result = await (await context).rebuild();
|
|
26
33
|
}
|
|
27
34
|
catch (error) {
|
|
28
35
|
throw createBundleError(input.entryPath, error, paths);
|
|
29
36
|
}
|
|
30
37
|
return readBundle(result, base.absWorkingDir, input.entryPath);
|
|
31
38
|
},
|
|
32
|
-
dispose: async () => {
|
|
39
|
+
dispose: async () => {
|
|
40
|
+
disposed = true;
|
|
41
|
+
const current = context;
|
|
42
|
+
context = null;
|
|
43
|
+
await (await current?.catch(() => null))?.dispose();
|
|
44
|
+
},
|
|
33
45
|
};
|
|
34
46
|
}
|
|
47
|
+
export function bundleInputs(metafile, workingDir) {
|
|
48
|
+
return Object.keys(metafile?.inputs ?? {})
|
|
49
|
+
.filter((path) => !path.includes('node_modules') && !path.includes(':'))
|
|
50
|
+
.map((path) => resolve(workingDir, path));
|
|
51
|
+
}
|
|
35
52
|
export function readBundle(result, workingDir, entryPath) {
|
|
36
53
|
const outputs = result.outputFiles ?? [];
|
|
37
54
|
const js = outputs.find((file) => file.path.endsWith('.js'));
|
|
@@ -39,13 +56,10 @@ export function readBundle(result, workingDir, entryPath) {
|
|
|
39
56
|
if (!js) {
|
|
40
57
|
throw new BundleError(`Could not bundle ${entryPath}: esbuild produced no output.`, []);
|
|
41
58
|
}
|
|
42
|
-
const inputs = Object.keys(result.metafile?.inputs ?? {})
|
|
43
|
-
.filter((path) => !path.includes('node_modules') && !path.includes(':'))
|
|
44
|
-
.map((path) => resolve(workingDir, path));
|
|
45
59
|
return {
|
|
46
60
|
code: js.text.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, '\n'),
|
|
47
61
|
sourceMap: map?.text ?? null,
|
|
48
|
-
inputs,
|
|
62
|
+
inputs: bundleInputs(result.metafile, workingDir),
|
|
49
63
|
};
|
|
50
64
|
}
|
|
51
65
|
//# sourceMappingURL=dev-bundler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-bundler.js","sourceRoot":"","sources":["../../src/dev/dev-bundler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dev-bundler.js","sourceRoot":"","sources":["../../src/dev/dev-bundler.ts"],"names":[],"mappings":"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"}
|
package/dist/dev/dev-events.d.ts
CHANGED
package/dist/dev/dev-events.js
CHANGED
|
@@ -67,7 +67,7 @@ export function formatDevEvent(event) {
|
|
|
67
67
|
text: `${formatRequestTag(event.request)} Uncaught ${event.stack || event.message}`,
|
|
68
68
|
};
|
|
69
69
|
case 'log': {
|
|
70
|
-
const tag = event.source === '
|
|
70
|
+
const tag = event.source === 'app' ? formatRequestTag(event.request) : `[${event.source}]`;
|
|
71
71
|
const level = event.level === 'log' || event.level === 'info' ? '' : `${event.level}: `;
|
|
72
72
|
const stream = event.level === 'error' || event.level === 'warn' ? 'stderr' : 'stdout';
|
|
73
73
|
return { stream, text: `${tag} ${level}${event.message}` };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-events.js","sourceRoot":"","sources":["../../src/dev/dev-events.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dev-events.js","sourceRoot":"","sources":["../../src/dev/dev-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kody dev` ports: each package gets a stable default (so bookmarks, OAuth
|
|
3
|
+
* redirect URIs, and agent notes keep working across restarts) and walks up to
|
|
4
|
+
* the next free port when that one is taken. An explicit `--port` is honored
|
|
5
|
+
* exactly and fails with an actionable message instead.
|
|
6
|
+
*/
|
|
7
|
+
import type { Server } from 'node:http';
|
|
8
|
+
export declare const devPortRange: {
|
|
9
|
+
readonly min: 4100;
|
|
10
|
+
readonly max: 4999;
|
|
11
|
+
};
|
|
12
|
+
export declare function defaultDevPort(kodyId: string): number;
|
|
13
|
+
export declare function parseDevPort(raw: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Listen on `port` exactly when `explicit`, otherwise on `port` or the next
|
|
16
|
+
* free port above it. Returns the bound port.
|
|
17
|
+
*/
|
|
18
|
+
export declare function listenDevServer(server: Server, input: {
|
|
19
|
+
host: string;
|
|
20
|
+
port: number;
|
|
21
|
+
explicit: boolean;
|
|
22
|
+
}): Promise<number>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kody dev` ports: each package gets a stable default (so bookmarks, OAuth
|
|
3
|
+
* redirect URIs, and agent notes keep working across restarts) and walks up to
|
|
4
|
+
* the next free port when that one is taken. An explicit `--port` is honored
|
|
5
|
+
* exactly and fails with an actionable message instead.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { StructuredCliError } from '../structured-error.js';
|
|
9
|
+
export const devPortRange = { min: 4100, max: 4999 };
|
|
10
|
+
const fallbackAttempts = 20;
|
|
11
|
+
export function defaultDevPort(kodyId) {
|
|
12
|
+
const span = devPortRange.max - devPortRange.min + 1;
|
|
13
|
+
const hash = createHash('sha256').update(kodyId).digest();
|
|
14
|
+
return devPortRange.min + (hash.readUInt32BE(0) % span);
|
|
15
|
+
}
|
|
16
|
+
export function parseDevPort(raw) {
|
|
17
|
+
const port = /^\d+$/.test(raw.trim()) ? Number(raw) : Number.NaN;
|
|
18
|
+
if (!Number.isInteger(port) || port > 65_535) {
|
|
19
|
+
throw new StructuredCliError({
|
|
20
|
+
code: 'invalid_port',
|
|
21
|
+
message: `--port must be an integer from 0 to 65535 (got "${raw}").`,
|
|
22
|
+
fix: 'Pass --port 0 for any free port, or omit --port to use this package’s stable default.',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return port;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Listen on `port` exactly when `explicit`, otherwise on `port` or the next
|
|
29
|
+
* free port above it. Returns the bound port.
|
|
30
|
+
*/
|
|
31
|
+
export async function listenDevServer(server, input) {
|
|
32
|
+
const attempts = input.explicit || input.port === 0 ? 1 : fallbackAttempts;
|
|
33
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
34
|
+
const port = input.port === 0 ? 0 : wrapPort(input.port + attempt);
|
|
35
|
+
try {
|
|
36
|
+
await listenOnce(server, input.host, port);
|
|
37
|
+
return server.address().port;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!isAddressInUse(error))
|
|
41
|
+
throw error;
|
|
42
|
+
if (input.explicit)
|
|
43
|
+
throw portInUseError(input.host, port);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw new StructuredCliError({
|
|
47
|
+
code: 'dev_port_in_use',
|
|
48
|
+
message: `Ports ${input.port}–${wrapPort(input.port + attempts - 1)} on ${input.host} are all in use.`,
|
|
49
|
+
fix: 'Stop old `kody dev` processes, or pass --port 0 for any free port.',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function portInUseError(host, port) {
|
|
53
|
+
return new StructuredCliError({
|
|
54
|
+
code: 'dev_port_in_use',
|
|
55
|
+
message: `Port ${port} on ${host} is already in use.`,
|
|
56
|
+
fix: `Find the owner with \`lsof -nP -iTCP:${port} -sTCP:LISTEN\` and stop it, pass another --port, or omit --port to use this package’s default (it moves to the next free port automatically).`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function wrapPort(port) {
|
|
60
|
+
return port > 65_535 ? devPortRange.min + (port - 65_536) : port;
|
|
61
|
+
}
|
|
62
|
+
function listenOnce(server, host, port) {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
const onError = (error) => {
|
|
65
|
+
server.off('listening', onListening);
|
|
66
|
+
reject(error);
|
|
67
|
+
};
|
|
68
|
+
const onListening = () => {
|
|
69
|
+
server.off('error', onError);
|
|
70
|
+
resolve();
|
|
71
|
+
};
|
|
72
|
+
server.once('error', onError);
|
|
73
|
+
server.once('listening', onListening);
|
|
74
|
+
server.listen(port, host);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function isAddressInUse(error) {
|
|
78
|
+
return error?.code === 'EADDRINUSE';
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=dev-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-port.js","sourceRoot":"","sources":["../../src/dev/dev-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kody.dev.prebuild`: a shell command `kody dev` runs from the package root
|
|
3
|
+
* before every build, so generated assets (CSS, icons, data files) stay in
|
|
4
|
+
* sync with the source without a second watcher process.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PrebuildError extends Error {
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
export declare function runPrebuild(input: {
|
|
10
|
+
command: string;
|
|
11
|
+
cwd: string;
|
|
12
|
+
onSpawn?: (pid: number) => void;
|
|
13
|
+
onExit?: (pid: number) => void;
|
|
14
|
+
onLine?: (line: string, stream: 'stdout' | 'stderr') => void;
|
|
15
|
+
/** When aborted, the child is SIGKILLed so graceful `kody dev` shutdown is not blocked. */
|
|
16
|
+
signal?: AbortSignal;
|
|
17
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kody.dev.prebuild`: a shell command `kody dev` runs from the package root
|
|
3
|
+
* before every build, so generated assets (CSS, icons, data files) stay in
|
|
4
|
+
* sync with the source without a second watcher process.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { apiTokenEnvVar } from '../defaults.js';
|
|
8
|
+
const outputTailLines = 20;
|
|
9
|
+
export class PrebuildError extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'PrebuildError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function runPrebuild(input) {
|
|
16
|
+
if (input.signal?.aborted) {
|
|
17
|
+
throw new PrebuildError('kody.dev.prebuild aborted before start');
|
|
18
|
+
}
|
|
19
|
+
const env = { ...process.env, KODY_DEV: '1' };
|
|
20
|
+
delete env[apiTokenEnvVar];
|
|
21
|
+
// New process group so abort can SIGKILL the whole tree (sh + npm/node/…).
|
|
22
|
+
const child = spawn('sh', ['-c', input.command], {
|
|
23
|
+
cwd: input.cwd,
|
|
24
|
+
env,
|
|
25
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
26
|
+
detached: true,
|
|
27
|
+
});
|
|
28
|
+
if (child.pid)
|
|
29
|
+
input.onSpawn?.(child.pid);
|
|
30
|
+
const tail = [];
|
|
31
|
+
const collect = (stream) => (line) => {
|
|
32
|
+
tail.push(line);
|
|
33
|
+
if (tail.length > outputTailLines)
|
|
34
|
+
tail.shift();
|
|
35
|
+
input.onLine?.(line, stream);
|
|
36
|
+
};
|
|
37
|
+
forEachLine(child.stdout, collect('stdout'));
|
|
38
|
+
forEachLine(child.stderr, collect('stderr'));
|
|
39
|
+
const killChild = () => {
|
|
40
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
41
|
+
return;
|
|
42
|
+
const pid = child.pid;
|
|
43
|
+
if (pid === undefined)
|
|
44
|
+
return;
|
|
45
|
+
try {
|
|
46
|
+
process.kill(-pid, 'SIGKILL');
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
try {
|
|
50
|
+
child.kill('SIGKILL');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// already gone
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
if (input.signal) {
|
|
58
|
+
if (input.signal.aborted)
|
|
59
|
+
killChild();
|
|
60
|
+
else
|
|
61
|
+
input.signal.addEventListener('abort', killChild, { once: true });
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const result = await new Promise((resolve, reject) => {
|
|
65
|
+
child.once('error', reject);
|
|
66
|
+
child.once('close', (code, signal) => resolve({ code, signal }));
|
|
67
|
+
});
|
|
68
|
+
if (input.signal?.aborted) {
|
|
69
|
+
throw new PrebuildError('kody.dev.prebuild aborted');
|
|
70
|
+
}
|
|
71
|
+
if (result.code === 0)
|
|
72
|
+
return;
|
|
73
|
+
const how = result.signal ? `signal ${result.signal}` : `exit ${result.code}`;
|
|
74
|
+
throw new PrebuildError([`kody.dev.prebuild failed (${how}): ${input.command}`, ...tail.map((line) => ` ${line}`)].join('\n'));
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
input.signal?.removeEventListener('abort', killChild);
|
|
78
|
+
if (child.pid)
|
|
79
|
+
input.onExit?.(child.pid);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Split stream chunks into lines, including a final incomplete line on end. */
|
|
83
|
+
function forEachLine(stream, onLine) {
|
|
84
|
+
if (!stream)
|
|
85
|
+
return;
|
|
86
|
+
let buffered = '';
|
|
87
|
+
stream.on('data', (chunk) => {
|
|
88
|
+
buffered += typeof chunk === 'string' ? chunk : chunk.toString('utf8');
|
|
89
|
+
const lines = buffered.split('\n');
|
|
90
|
+
buffered = lines.pop() ?? '';
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
if (line.length > 0)
|
|
93
|
+
onLine(line);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
stream.on('end', () => {
|
|
97
|
+
if (buffered.length > 0)
|
|
98
|
+
onLine(buffered);
|
|
99
|
+
buffered = '';
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=prebuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../src/dev/prebuild.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,9 @@ export declare const devWorkDirPrefix = "kody-dev-";
|
|
|
11
11
|
export type ProcessReaper = {
|
|
12
12
|
track: (pid: number) => void;
|
|
13
13
|
untrack: (pid: number) => void;
|
|
14
|
+
/** Track a detached process-group leader; hard CLI death SIGKILLs the whole tree. */
|
|
15
|
+
trackGroup: (pid: number) => void;
|
|
16
|
+
untrackGroup: (pid: number) => void;
|
|
14
17
|
close: () => void;
|
|
15
18
|
};
|
|
16
19
|
export declare function startProcessReaper(input: {
|