@multiplayer-app/agent 0.1.20 → 0.1.21
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 +14 -7
- package/dist/agent/definition.test.js +8 -3
- package/dist/agent/definition.test.js.map +1 -1
- package/dist/agent/profiles/coding.d.ts +1 -1
- package/dist/agent/profiles/coding.d.ts.map +1 -1
- package/dist/agent/profiles/coding.js +21 -4
- package/dist/agent/profiles/coding.js.map +1 -1
- package/dist/agent/profiles/index.js +1 -1
- package/dist/agent/profiles/index.js.map +1 -1
- package/dist/agent/profiles/research.d.ts.map +1 -1
- package/dist/agent/profiles/research.js +2 -2
- package/dist/agent/profiles/research.js.map +1 -1
- package/dist/agent/turn-history.d.ts.map +1 -1
- package/dist/agent/turn-history.js +7 -1
- package/dist/agent/turn-history.js.map +1 -1
- package/dist/agent/turn-runner.d.ts +8 -0
- package/dist/agent/turn-runner.d.ts.map +1 -1
- package/dist/agent/turn-runner.js +35 -10
- package/dist/agent/turn-runner.js.map +1 -1
- package/dist/app/app-host.d.ts +57 -0
- package/dist/app/app-host.d.ts.map +1 -0
- package/dist/app/app-host.js +252 -0
- package/dist/app/app-host.js.map +1 -0
- package/dist/app/app-host.test.d.ts +2 -0
- package/dist/app/app-host.test.d.ts.map +1 -0
- package/dist/app/app-host.test.js +639 -0
- package/dist/app/app-host.test.js.map +1 -0
- package/dist/app/config.d.ts +196 -0
- package/dist/app/config.d.ts.map +1 -0
- package/dist/app/config.js +362 -0
- package/dist/app/config.js.map +1 -0
- package/dist/app/config.test.d.ts +2 -0
- package/dist/app/config.test.d.ts.map +1 -0
- package/dist/app/config.test.js +224 -0
- package/dist/app/config.test.js.map +1 -0
- package/dist/app/detect.d.ts +68 -0
- package/dist/app/detect.d.ts.map +1 -0
- package/dist/app/detect.js +449 -0
- package/dist/app/detect.js.map +1 -0
- package/dist/app/detect.test.d.ts +2 -0
- package/dist/app/detect.test.d.ts.map +1 -0
- package/dist/app/detect.test.js +267 -0
- package/dist/app/detect.test.js.map +1 -0
- package/dist/app/env.d.ts +5 -0
- package/dist/app/env.d.ts.map +1 -0
- package/dist/app/env.js +22 -0
- package/dist/app/env.js.map +1 -0
- package/dist/app/functions-cli.d.ts +3 -0
- package/dist/app/functions-cli.d.ts.map +1 -0
- package/dist/app/functions-cli.js +27 -0
- package/dist/app/functions-cli.js.map +1 -0
- package/dist/app/functions-host.d.ts +15 -0
- package/dist/app/functions-host.d.ts.map +1 -0
- package/dist/app/functions-host.js +276 -0
- package/dist/app/functions-host.js.map +1 -0
- package/dist/app/functions-host.test.d.ts +2 -0
- package/dist/app/functions-host.test.d.ts.map +1 -0
- package/dist/app/functions-host.test.js +117 -0
- package/dist/app/functions-host.test.js.map +1 -0
- package/dist/app/functions-routes.d.ts +23 -0
- package/dist/app/functions-routes.d.ts.map +1 -0
- package/dist/app/functions-routes.js +85 -0
- package/dist/app/functions-routes.js.map +1 -0
- package/dist/app/functions-routes.test.d.ts +2 -0
- package/dist/app/functions-routes.test.d.ts.map +1 -0
- package/dist/app/functions-routes.test.js +40 -0
- package/dist/app/functions-routes.test.js.map +1 -0
- package/dist/app/manifest.d.ts +17 -0
- package/dist/app/manifest.d.ts.map +1 -0
- package/dist/app/manifest.js +64 -0
- package/dist/app/manifest.js.map +1 -0
- package/dist/app/manifest.test.d.ts +2 -0
- package/dist/app/manifest.test.d.ts.map +1 -0
- package/dist/app/manifest.test.js +173 -0
- package/dist/app/manifest.test.js.map +1 -0
- package/dist/app/release-artifacts.d.ts +39 -0
- package/dist/app/release-artifacts.d.ts.map +1 -0
- package/dist/app/release-artifacts.js +229 -0
- package/dist/app/release-artifacts.js.map +1 -0
- package/dist/app/release-artifacts.test.d.ts +2 -0
- package/dist/app/release-artifacts.test.d.ts.map +1 -0
- package/dist/app/release-artifacts.test.js +295 -0
- package/dist/app/release-artifacts.test.js.map +1 -0
- package/dist/app/route-pattern.d.ts +23 -0
- package/dist/app/route-pattern.d.ts.map +1 -0
- package/dist/app/route-pattern.js +339 -0
- package/dist/app/route-pattern.js.map +1 -0
- package/dist/app/route-pattern.test.d.ts +2 -0
- package/dist/app/route-pattern.test.d.ts.map +1 -0
- package/dist/app/route-pattern.test.js +187 -0
- package/dist/app/route-pattern.test.js.map +1 -0
- package/dist/app/rules.d.ts +61 -0
- package/dist/app/rules.d.ts.map +1 -0
- package/dist/app/rules.js +90 -0
- package/dist/app/rules.js.map +1 -0
- package/dist/app/rules.test.d.ts +2 -0
- package/dist/app/rules.test.d.ts.map +1 -0
- package/dist/app/rules.test.js +69 -0
- package/dist/app/rules.test.js.map +1 -0
- package/dist/app/runner.d.ts +109 -0
- package/dist/app/runner.d.ts.map +1 -0
- package/dist/app/runner.js +429 -0
- package/dist/app/runner.js.map +1 -0
- package/dist/app/site.d.ts +73 -0
- package/dist/app/site.d.ts.map +1 -0
- package/dist/app/site.js +161 -0
- package/dist/app/site.js.map +1 -0
- package/dist/app/site.test.d.ts +2 -0
- package/dist/app/site.test.d.ts.map +1 -0
- package/dist/app/site.test.js +291 -0
- package/dist/app/site.test.js.map +1 -0
- package/dist/app/static-server.d.ts +20 -0
- package/dist/app/static-server.d.ts.map +1 -0
- package/dist/app/static-server.js +145 -0
- package/dist/app/static-server.js.map +1 -0
- package/dist/persistence/conversation-store.d.ts +21 -0
- package/dist/persistence/conversation-store.d.ts.map +1 -0
- package/dist/persistence/conversation-store.js +59 -0
- package/dist/persistence/conversation-store.js.map +1 -0
- package/dist/persistence/conversation-store.test.d.ts +2 -0
- package/dist/persistence/conversation-store.test.d.ts.map +1 -0
- package/dist/persistence/conversation-store.test.js +98 -0
- package/dist/persistence/conversation-store.test.js.map +1 -0
- package/dist/persistence/git-sync.d.ts +14 -1
- package/dist/persistence/git-sync.d.ts.map +1 -1
- package/dist/persistence/git-sync.js +73 -17
- package/dist/persistence/git-sync.js.map +1 -1
- package/dist/persistence/git-sync.test.js +155 -6
- package/dist/persistence/git-sync.test.js.map +1 -1
- package/dist/persistence/snapshot-sync.d.ts +19 -2
- package/dist/persistence/snapshot-sync.d.ts.map +1 -1
- package/dist/persistence/snapshot-sync.js +194 -83
- package/dist/persistence/snapshot-sync.js.map +1 -1
- package/dist/persistence/snapshot-sync.test.js +145 -27
- package/dist/persistence/snapshot-sync.test.js.map +1 -1
- package/dist/persistence/workspace.d.ts +3 -0
- package/dist/persistence/workspace.d.ts.map +1 -1
- package/dist/persistence/workspace.js +1 -0
- package/dist/persistence/workspace.js.map +1 -1
- package/dist/research/extract-texts.d.ts.map +1 -1
- package/dist/research/extract-texts.js +6 -13
- package/dist/research/extract-texts.js.map +1 -1
- package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
- package/dist/research/filingramp/attachment-tools.js +7 -4
- package/dist/research/filingramp/attachment-tools.js.map +1 -1
- package/dist/research/filingramp/shared.d.ts.map +1 -1
- package/dist/research/filingramp/shared.js +5 -5
- package/dist/research/filingramp/shared.js.map +1 -1
- package/dist/runtime/app-mode.d.ts +10 -0
- package/dist/runtime/app-mode.d.ts.map +1 -0
- package/dist/runtime/app-mode.js +172 -0
- package/dist/runtime/app-mode.js.map +1 -0
- package/dist/runtime/app-mode.test.d.ts +2 -0
- package/dist/runtime/app-mode.test.d.ts.map +1 -0
- package/dist/runtime/app-mode.test.js +130 -0
- package/dist/runtime/app-mode.test.js.map +1 -0
- package/dist/runtime/app-rehearsal.d.ts +2 -0
- package/dist/runtime/app-rehearsal.d.ts.map +1 -0
- package/dist/runtime/app-rehearsal.js +56 -0
- package/dist/runtime/app-rehearsal.js.map +1 -0
- package/dist/runtime/build-mode.d.ts +12 -0
- package/dist/runtime/build-mode.d.ts.map +1 -0
- package/dist/runtime/build-mode.js +116 -0
- package/dist/runtime/build-mode.js.map +1 -0
- package/dist/runtime/build-mode.test.d.ts +2 -0
- package/dist/runtime/build-mode.test.d.ts.map +1 -0
- package/dist/runtime/build-mode.test.js +121 -0
- package/dist/runtime/build-mode.test.js.map +1 -0
- package/dist/runtime/cli.js +7 -2
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/config.d.ts +4 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +13 -2
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/guest-server.d.ts +3 -0
- package/dist/runtime/guest-server.d.ts.map +1 -0
- package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
- package/dist/runtime/guest-server.js.map +1 -0
- package/dist/runtime/image-hooks.d.ts +5 -0
- package/dist/runtime/image-hooks.d.ts.map +1 -0
- package/dist/runtime/image-hooks.js +68 -0
- package/dist/runtime/image-hooks.js.map +1 -0
- package/dist/runtime/image-hooks.test.d.ts +2 -0
- package/dist/runtime/image-hooks.test.d.ts.map +1 -0
- package/dist/runtime/image-hooks.test.js +74 -0
- package/dist/runtime/image-hooks.test.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +53 -35
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/listening-ports.d.ts +13 -0
- package/dist/runtime/listening-ports.d.ts.map +1 -0
- package/dist/runtime/listening-ports.js +78 -0
- package/dist/runtime/listening-ports.js.map +1 -0
- package/dist/runtime/listening-ports.test.d.ts +2 -0
- package/dist/runtime/listening-ports.test.d.ts.map +1 -0
- package/dist/runtime/listening-ports.test.js +39 -0
- package/dist/runtime/listening-ports.test.js.map +1 -0
- package/dist/runtime/preview-proxy.d.ts +56 -0
- package/dist/runtime/preview-proxy.d.ts.map +1 -0
- package/dist/runtime/preview-proxy.js +302 -0
- package/dist/runtime/preview-proxy.js.map +1 -0
- package/dist/runtime/preview-proxy.test.d.ts +2 -0
- package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
- package/dist/runtime/preview-proxy.test.js +122 -0
- package/dist/runtime/preview-proxy.test.js.map +1 -0
- package/dist/runtime/session-mode.d.ts +3 -0
- package/dist/runtime/session-mode.d.ts.map +1 -0
- package/dist/runtime/session-mode.js +60 -0
- package/dist/runtime/session-mode.js.map +1 -0
- package/dist/runtime/workload.d.ts +44 -0
- package/dist/runtime/workload.d.ts.map +1 -0
- package/dist/runtime/workload.js +222 -0
- package/dist/runtime/workload.js.map +1 -0
- package/dist/runtime/workload.test.d.ts +2 -0
- package/dist/runtime/workload.test.d.ts.map +1 -0
- package/dist/runtime/workload.test.js +235 -0
- package/dist/runtime/workload.test.js.map +1 -0
- package/dist/session/conversation.d.ts +3 -2
- package/dist/session/conversation.d.ts.map +1 -1
- package/dist/session/conversation.js +11 -7
- package/dist/session/conversation.js.map +1 -1
- package/dist/session/conversation.test.js +2 -3
- package/dist/session/conversation.test.js.map +1 -1
- package/dist/session/runtime.d.ts +16 -3
- package/dist/session/runtime.d.ts.map +1 -1
- package/dist/session/runtime.js +80 -13
- package/dist/session/runtime.js.map +1 -1
- package/dist/session/runtime.test.js +18 -7
- package/dist/session/runtime.test.js.map +1 -1
- package/dist/session/tools.d.ts.map +1 -1
- package/dist/session/tools.js +3 -3
- package/dist/session/tools.js.map +1 -1
- package/dist/task/loop.d.ts.map +1 -1
- package/dist/task/loop.js +6 -4
- package/dist/task/loop.js.map +1 -1
- package/dist/tools/exec-tools.d.ts +12 -0
- package/dist/tools/exec-tools.d.ts.map +1 -1
- package/dist/tools/exec-tools.js +46 -3
- package/dist/tools/exec-tools.js.map +1 -1
- package/dist/tools/exec-tools.test.d.ts +2 -0
- package/dist/tools/exec-tools.test.d.ts.map +1 -0
- package/dist/tools/exec-tools.test.js +48 -0
- package/dist/tools/exec-tools.test.js.map +1 -0
- package/dist/tools/fs-tools.d.ts.map +1 -1
- package/dist/tools/fs-tools.js +5 -5
- package/dist/tools/fs-tools.js.map +1 -1
- package/dist/transport/link.d.ts.map +1 -1
- package/dist/transport/link.js +16 -5
- package/dist/transport/link.js.map +1 -1
- package/dist/transport/link.test.js +24 -0
- package/dist/transport/link.test.js.map +1 -1
- package/dist/transport/protocol.d.ts +190 -3
- package/dist/transport/protocol.d.ts.map +1 -1
- package/dist/transport/protocol.js +147 -7
- package/dist/transport/protocol.js.map +1 -1
- package/dist/transport/protocol.test.js +41 -0
- package/dist/transport/protocol.test.js.map +1 -1
- package/dist/workspace-sync/eligibility.d.ts +14 -0
- package/dist/workspace-sync/eligibility.d.ts.map +1 -0
- package/dist/workspace-sync/eligibility.js +53 -0
- package/dist/workspace-sync/eligibility.js.map +1 -0
- package/dist/workspace-sync/merge.d.ts +15 -0
- package/dist/workspace-sync/merge.d.ts.map +1 -0
- package/dist/workspace-sync/merge.js +66 -0
- package/dist/workspace-sync/merge.js.map +1 -0
- package/dist/workspace-sync/merge.test.d.ts +2 -0
- package/dist/workspace-sync/merge.test.d.ts.map +1 -0
- package/dist/workspace-sync/merge.test.js +28 -0
- package/dist/workspace-sync/merge.test.js.map +1 -0
- package/dist/workspace-sync/workspace-sync.d.ts +48 -0
- package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
- package/dist/workspace-sync/workspace-sync.js +308 -0
- package/dist/workspace-sync/workspace-sync.js.map +1 -0
- package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
- package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
- package/dist/workspace-sync/workspace-sync.test.js +111 -0
- package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
- package/dist/workspace-sync/write-drafts.d.ts +24 -0
- package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
- package/dist/workspace-sync/write-drafts.js +87 -0
- package/dist/workspace-sync/write-drafts.js.map +1 -0
- package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
- package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
- package/dist/workspace-sync/write-drafts.test.js +36 -0
- package/dist/workspace-sync/write-drafts.test.js.map +1 -0
- package/package.json +12 -2
- package/dist/runtime/lambda-microvm.d.ts +0 -3
- package/dist/runtime/lambda-microvm.d.ts.map +0 -1
- package/dist/runtime/lambda-microvm.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type DetectedManifest } from './detect';
|
|
2
|
+
/** builder.json for a detected project: its `$schema`, its mark, services and rewrites, in a fixed key order, two-space indented. */
|
|
3
|
+
export declare function renderManifest(manifest: DetectedManifest, schemaUrl?: string): string;
|
|
4
|
+
export interface ManifestState {
|
|
5
|
+
/** builder.json's text, if there is one. */
|
|
6
|
+
text?: string;
|
|
7
|
+
/** Whether it is the platform's (what it detected), rather than a person's. */
|
|
8
|
+
platform: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Brings `dir`'s builder.json in line with what is detected there, while it is the platform's:
|
|
12
|
+
* written when an app is detected, rewritten when that changes, removed when there is none
|
|
13
|
+
* anymore. One a person changed is left alone. `schemaUrl` is only written down, for editors: the
|
|
14
|
+
* guest never fetches it.
|
|
15
|
+
*/
|
|
16
|
+
export declare function syncManifest(dir: string, schemaUrl?: string): Promise<ManifestState>;
|
|
17
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/app/manifest.ts"],"names":[],"mappings":"AASA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAS/D,qIAAqI;AACrI,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrF;AAqBD,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAc1F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderManifest = renderManifest;
|
|
7
|
+
exports.syncManifest = syncManifest;
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const protocol_1 = require("../transport/protocol");
|
|
10
|
+
const detect_1 = require("./detect");
|
|
11
|
+
const config_1 = require("./config");
|
|
12
|
+
const workload_1 = require("../runtime/workload");
|
|
13
|
+
/** A hash of the rest of the file, so an edit shows, and it travels with the file wherever it goes. */
|
|
14
|
+
function markOf(rest) {
|
|
15
|
+
return (0, protocol_1.workspaceFileHash)(JSON.stringify(rest));
|
|
16
|
+
}
|
|
17
|
+
/** builder.json for a detected project: its `$schema`, its mark, services and rewrites, in a fixed key order, two-space indented. */
|
|
18
|
+
function renderManifest(manifest, schemaUrl) {
|
|
19
|
+
const schema = schemaUrl ? { $schema: schemaUrl } : {};
|
|
20
|
+
return `${JSON.stringify({ ...schema, $generated: markOf({ ...schema, ...manifest }), ...manifest }, null, 2)}\n`;
|
|
21
|
+
}
|
|
22
|
+
async function readText(dir, file) {
|
|
23
|
+
try {
|
|
24
|
+
return (await (0, workload_1.readInside)(dir, file)).toString('utf8');
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error.code === 'ENOENT')
|
|
28
|
+
return undefined;
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Whether this is still what the platform wrote: it carries the mark, and the mark still matches. */
|
|
33
|
+
function isPlatforms(text) {
|
|
34
|
+
try {
|
|
35
|
+
const { $generated: mark, ...rest } = JSON.parse(text);
|
|
36
|
+
return mark === markOf(rest);
|
|
37
|
+
}
|
|
38
|
+
catch (_a) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Brings `dir`'s builder.json in line with what is detected there, while it is the platform's:
|
|
44
|
+
* written when an app is detected, rewritten when that changes, removed when there is none
|
|
45
|
+
* anymore. One a person changed is left alone. `schemaUrl` is only written down, for editors: the
|
|
46
|
+
* guest never fetches it.
|
|
47
|
+
*/
|
|
48
|
+
async function syncManifest(dir, schemaUrl) {
|
|
49
|
+
const file = node_path_1.default.join(dir, protocol_1.APP_CONFIG_FILE);
|
|
50
|
+
const current = await readText(dir, file);
|
|
51
|
+
if (current !== undefined && !isPlatforms(current))
|
|
52
|
+
return { text: current, platform: false };
|
|
53
|
+
const detected = await (0, detect_1.detectProject)((0, config_1.directoryReader)(dir));
|
|
54
|
+
const next = detected && renderManifest(detected, schemaUrl);
|
|
55
|
+
if (next === current)
|
|
56
|
+
return { text: current, platform: true };
|
|
57
|
+
if (next === undefined) {
|
|
58
|
+
await (0, workload_1.removeWorkloadFile)(file);
|
|
59
|
+
return { platform: true };
|
|
60
|
+
}
|
|
61
|
+
await (0, workload_1.writeWorkloadFile)(file, next);
|
|
62
|
+
return { text: next, platform: true };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/app/manifest.ts"],"names":[],"mappings":";;;;;AAmBA,wCAGC;AAkCD,oCAcC;AA/DD,0DAA4B;AAC5B,oDAA0E;AAC1E,qCAA+D;AAC/D,qCAA0C;AAC1C,kDAAuF;AAEvF,uGAAuG;AACvG,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAA,4BAAiB,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,qIAAqI;AACrI,SAAgB,cAAc,CAAC,QAA0B,EAAE,SAAkB;IAC3E,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AACnH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY;IAC/C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAA,qBAAU,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QACxE,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAA;QACjF,OAAO,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AASD;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,SAAkB;IAChE,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,0BAAe,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IAE7F,MAAM,QAAQ,GAAG,MAAM,IAAA,sBAAa,EAAC,IAAA,wBAAe,EAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAG,QAAQ,IAAI,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC5D,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC9D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAA,6BAAkB,EAAC,IAAI,CAAC,CAAA;QAC9B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC3B,CAAC;IACD,MAAM,IAAA,4BAAiB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACnC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.test.d.ts","sourceRoot":"","sources":["../../src/app/manifest.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const node_test_1 = require("node:test");
|
|
11
|
+
const config_1 = require("./config");
|
|
12
|
+
const manifest_1 = require("./manifest");
|
|
13
|
+
(0, node_test_1.describe)('the builder.json a session VM writes', () => {
|
|
14
|
+
let dir;
|
|
15
|
+
const write = async (file, content) => {
|
|
16
|
+
await node_fs_1.promises.mkdir(node_path_1.default.dirname(node_path_1.default.join(dir, file)), { recursive: true });
|
|
17
|
+
await node_fs_1.promises.writeFile(node_path_1.default.join(dir, file), content);
|
|
18
|
+
};
|
|
19
|
+
const manifest = () => node_fs_1.promises.readFile(node_path_1.default.join(dir, '.builder/builder.json'), 'utf8').catch(() => undefined);
|
|
20
|
+
(0, node_test_1.beforeEach)(async () => {
|
|
21
|
+
dir = await node_fs_1.promises.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), 'builder-manifest-'));
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.afterEach)(() => node_fs_1.promises.rm(dir, { recursive: true, force: true }));
|
|
24
|
+
(0, node_test_1.it)('writes what it detected, pretty-printed', async () => {
|
|
25
|
+
await write('public/index.html', '<h1>dashboard</h1>');
|
|
26
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
27
|
+
const text = (await manifest());
|
|
28
|
+
strict_1.default.equal(text, `{
|
|
29
|
+
"$generated": "${JSON.parse(text).$generated}",
|
|
30
|
+
"services": {
|
|
31
|
+
"web": {
|
|
32
|
+
"root": ".",
|
|
33
|
+
"framework": null,
|
|
34
|
+
"outputDirectory": "public"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"rewrites": [
|
|
38
|
+
{
|
|
39
|
+
"source": "/(.*)",
|
|
40
|
+
"destination": {
|
|
41
|
+
"service": "web"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
`);
|
|
47
|
+
});
|
|
48
|
+
(0, node_test_1.it)('names its schema first when it was told one, and the file still runs', async () => {
|
|
49
|
+
await write('index.html', '');
|
|
50
|
+
const url = 'https://api.example.com/v0/sapi/schemas/builder.json';
|
|
51
|
+
await (0, manifest_1.syncManifest)(dir, url);
|
|
52
|
+
const text = (await manifest());
|
|
53
|
+
strict_1.default.ok(text.startsWith(`{\n "$schema": "${url}",\n "$generated": "`), text);
|
|
54
|
+
const resolved = await (0, config_1.resolveApp)((0, config_1.directoryReader)(dir), 'production');
|
|
55
|
+
strict_1.default.ok(resolved === null || resolved === void 0 ? void 0 : resolved.ok, resolved && !resolved.ok ? resolved.error : '');
|
|
56
|
+
// The same app, the same file: nothing to rewrite or restart.
|
|
57
|
+
strict_1.default.deepEqual(await (0, manifest_1.syncManifest)(dir, url), { text, platform: true });
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.it)('adds the schema to a file it wrote without one, and leaves one a person wrote alone', async () => {
|
|
60
|
+
await write('index.html', '');
|
|
61
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
62
|
+
strict_1.default.equal(JSON.parse((await manifest())).$schema, undefined);
|
|
63
|
+
await (0, manifest_1.syncManifest)(dir, 'https://a.example.com/s.json');
|
|
64
|
+
strict_1.default.equal(JSON.parse((await manifest())).$schema, 'https://a.example.com/s.json');
|
|
65
|
+
const own = '{ "services": { "web": { "outputDirectory": "." } } }';
|
|
66
|
+
await write('.builder/builder.json', own);
|
|
67
|
+
await (0, manifest_1.syncManifest)(dir, 'https://b.example.com/s.json');
|
|
68
|
+
strict_1.default.equal(await manifest(), own);
|
|
69
|
+
});
|
|
70
|
+
(0, node_test_1.it)('follows the app while the file is the platform\'s, and removes it once there is no app', async () => {
|
|
71
|
+
await write('public/index.html', '');
|
|
72
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
73
|
+
await write('package.json', JSON.stringify({ devDependencies: { vite: '7' } }));
|
|
74
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
75
|
+
strict_1.default.deepEqual(JSON.parse((await manifest())).services.web, {
|
|
76
|
+
root: '.',
|
|
77
|
+
framework: 'vite',
|
|
78
|
+
installCommand: 'npm install',
|
|
79
|
+
devCommand: 'vite --host 0.0.0.0 --port $PORT --strictPort',
|
|
80
|
+
buildCommand: 'vite build',
|
|
81
|
+
outputDirectory: 'dist',
|
|
82
|
+
rewrites: [{ source: '/(.*)', destination: '/index.html' }],
|
|
83
|
+
});
|
|
84
|
+
await node_fs_1.promises.rm(node_path_1.default.join(dir, 'package.json'));
|
|
85
|
+
await node_fs_1.promises.rm(node_path_1.default.join(dir, 'public'), { recursive: true });
|
|
86
|
+
strict_1.default.deepEqual(await (0, manifest_1.syncManifest)(dir), { platform: true });
|
|
87
|
+
strict_1.default.equal(await manifest(), undefined);
|
|
88
|
+
});
|
|
89
|
+
(0, node_test_1.it)('writes down an api/ folder as functions, and runs what it wrote', async () => {
|
|
90
|
+
await write('public/index.html', '');
|
|
91
|
+
await write('api/hello.js', '');
|
|
92
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
93
|
+
strict_1.default.deepEqual(JSON.parse((await manifest())).services, {
|
|
94
|
+
web: { root: '.', framework: null, outputDirectory: 'public' },
|
|
95
|
+
api: { root: '.', framework: null, functions: { directory: 'api', path: '/api' } },
|
|
96
|
+
});
|
|
97
|
+
const resolved = await (0, config_1.resolveApp)((0, config_1.directoryReader)(dir), 'production');
|
|
98
|
+
strict_1.default.ok(resolved === null || resolved === void 0 ? void 0 : resolved.ok);
|
|
99
|
+
strict_1.default.deepEqual(Object.keys(resolved.config.services), ['web', 'api']);
|
|
100
|
+
});
|
|
101
|
+
(0, node_test_1.it)('writes down every service it finds on disk, with the routes between them, and runs what it wrote', async () => {
|
|
102
|
+
await write('web/package.json', JSON.stringify({ devDependencies: { vite: '7' } }));
|
|
103
|
+
await write('server/package.json', JSON.stringify({ dependencies: { express: '5' }, scripts: { start: 'node index.js' } }));
|
|
104
|
+
await write('server/node_modules/x/package.json', JSON.stringify({ dependencies: { express: '5' }, scripts: { start: 'x' } }));
|
|
105
|
+
await write('node_modules/y/package.json', JSON.stringify({ dependencies: { express: '5' }, scripts: { start: 'y' } }));
|
|
106
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
107
|
+
const written = JSON.parse((await manifest()));
|
|
108
|
+
strict_1.default.deepEqual(Object.keys(written.services), ['server', 'web']);
|
|
109
|
+
strict_1.default.deepEqual(written.rewrites.map((rule) => rule.source), ['/api', '/api/(.*)', '/(.*)']);
|
|
110
|
+
const resolved = await (0, config_1.resolveApp)((0, config_1.directoryReader)(dir), 'production');
|
|
111
|
+
strict_1.default.ok(resolved === null || resolved === void 0 ? void 0 : resolved.ok, resolved && !resolved.ok ? resolved.error : '');
|
|
112
|
+
strict_1.default.equal(resolved.source, 'builder.json');
|
|
113
|
+
});
|
|
114
|
+
(0, node_test_1.it)('writes down services in packages/, and runs what it wrote', async () => {
|
|
115
|
+
await write('packages/web/index.html', '');
|
|
116
|
+
await write('packages/admin/index.html', '');
|
|
117
|
+
await write('packages/shop/package.json', JSON.stringify({ devDependencies: { vite: '7' } }));
|
|
118
|
+
await write('packages/shop/index.html', '');
|
|
119
|
+
await write('packages/api/package.json', JSON.stringify({ dependencies: { express: '5' }, scripts: { start: 'node index.js' } }));
|
|
120
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
121
|
+
const resolved = await (0, config_1.resolveApp)((0, config_1.directoryReader)(dir), 'production');
|
|
122
|
+
strict_1.default.ok(resolved === null || resolved === void 0 ? void 0 : resolved.ok, resolved && !resolved.ok ? resolved.error : '');
|
|
123
|
+
strict_1.default.deepEqual(Object.keys(resolved.config.services).sort(), ['admin', 'api', 'shop', 'web']);
|
|
124
|
+
strict_1.default.equal(resolved.config.services.web.root, 'packages/web');
|
|
125
|
+
});
|
|
126
|
+
(0, node_test_1.it)('leaves a builder.json a person changed alone from then on', async () => {
|
|
127
|
+
await write('index.html', '');
|
|
128
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
129
|
+
const edited = '{\n "services": { "site": { "outputDirectory": ".", "headers": [] } }\n}\n';
|
|
130
|
+
await write('.builder/builder.json', edited);
|
|
131
|
+
await write('package.json', JSON.stringify({ dependencies: { next: '15' } }));
|
|
132
|
+
strict_1.default.deepEqual(await (0, manifest_1.syncManifest)(dir), { text: edited, platform: false });
|
|
133
|
+
strict_1.default.equal(await manifest(), edited);
|
|
134
|
+
});
|
|
135
|
+
(0, node_test_1.it)('takes the smallest edit for a person\'s, the mark left in place or removed', async () => {
|
|
136
|
+
await write('public/index.html', '');
|
|
137
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
138
|
+
const written = JSON.parse((await manifest()));
|
|
139
|
+
for (const edited of [
|
|
140
|
+
{ ...written, services: { web: { ...written.services.web, outputDirectory: 'site' } } },
|
|
141
|
+
{ services: written.services, rewrites: written.rewrites },
|
|
142
|
+
]) {
|
|
143
|
+
const text = JSON.stringify(edited, null, 2);
|
|
144
|
+
await write('.builder/builder.json', text);
|
|
145
|
+
await write('package.json', JSON.stringify({ devDependencies: { vite: '7' } }));
|
|
146
|
+
strict_1.default.deepEqual(await (0, manifest_1.syncManifest)(dir), { text, platform: false });
|
|
147
|
+
strict_1.default.equal(await manifest(), text);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
(0, node_test_1.it)('needs nothing beside the file to know it wrote it, so a clone or a merge keeps following the app', async () => {
|
|
151
|
+
await write('public/index.html', '');
|
|
152
|
+
await (0, manifest_1.syncManifest)(dir);
|
|
153
|
+
strict_1.default.deepEqual(await node_fs_1.promises.readdir(node_path_1.default.join(dir, '.builder')), ['builder.json']);
|
|
154
|
+
await write('package.json', JSON.stringify({ devDependencies: { vite: '7' } }));
|
|
155
|
+
const { platform } = await (0, manifest_1.syncManifest)(dir);
|
|
156
|
+
strict_1.default.equal(platform, true);
|
|
157
|
+
strict_1.default.equal(JSON.parse((await manifest())).services.web.framework, 'vite');
|
|
158
|
+
});
|
|
159
|
+
(0, node_test_1.it)('keeps its mark out of what actually runs', async () => {
|
|
160
|
+
await write('index.html', '');
|
|
161
|
+
await (0, manifest_1.syncManifest)(dir, 'https://a.example.com/s.json');
|
|
162
|
+
const resolved = await (0, config_1.resolveApp)((0, config_1.directoryReader)(dir), 'production');
|
|
163
|
+
strict_1.default.ok(resolved === null || resolved === void 0 ? void 0 : resolved.ok);
|
|
164
|
+
strict_1.default.deepEqual(Object.keys(resolved.config).filter((key) => key.startsWith('$')), []);
|
|
165
|
+
});
|
|
166
|
+
(0, node_test_1.it)('never takes over one it did not write', async () => {
|
|
167
|
+
const own = '{ "services": { "api": { "devCommand": "node server.js" } } }';
|
|
168
|
+
await write('.builder/builder.json', own);
|
|
169
|
+
await write('index.html', '');
|
|
170
|
+
strict_1.default.deepEqual(await (0, manifest_1.syncManifest)(dir), { text: own, platform: false });
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=manifest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.test.js","sourceRoot":"","sources":["../../src/app/manifest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type SiteEncoding } from '../transport/protocol';
|
|
2
|
+
import type { AppConfig } from './config';
|
|
3
|
+
export interface ReleaseFile {
|
|
4
|
+
/** From the workspace, as builder.json's paths are. */
|
|
5
|
+
path: string;
|
|
6
|
+
size: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ReleaseSiteFile extends ReleaseFile {
|
|
9
|
+
/** Of its content, so the gateway can answer whether it changed without reading it. */
|
|
10
|
+
hash: string;
|
|
11
|
+
/** The compressed copies it has, by their size: only those smaller than the file. */
|
|
12
|
+
encodings?: Partial<Record<SiteEncoding, number>>;
|
|
13
|
+
}
|
|
14
|
+
export interface ReleaseManifest {
|
|
15
|
+
version: 1;
|
|
16
|
+
/** The static files the gateway serves, by their path from the workspace. */
|
|
17
|
+
site: ReleaseSiteFile[];
|
|
18
|
+
}
|
|
19
|
+
/** Why a build's output can't become a release. */
|
|
20
|
+
export declare class ReleaseOutputError extends Error {
|
|
21
|
+
}
|
|
22
|
+
/** What goes in a release, once `config` is built in `dir`. Throws ReleaseOutputError when the output can't be released. */
|
|
23
|
+
export declare function collectReleaseFiles(config: AppConfig, dir: string): Promise<{
|
|
24
|
+
site: ReleaseFile[];
|
|
25
|
+
run: string[];
|
|
26
|
+
}>;
|
|
27
|
+
export interface ReleaseUpload {
|
|
28
|
+
/** The git service's route for this release. */
|
|
29
|
+
url: string;
|
|
30
|
+
token: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Uploads what `config` built in `dir`, with its logs. The manifest goes last: the storage refuses
|
|
34
|
+
* anything after it, since a release that has one is finished.
|
|
35
|
+
*/
|
|
36
|
+
export declare function uploadRelease(upload: ReleaseUpload, config: AppConfig, dir: string): Promise<ReleaseManifest>;
|
|
37
|
+
/** Uploads the build's logs, for whoever looks into it later, a build that failed too. */
|
|
38
|
+
export declare function uploadReleaseLogs(upload: ReleaseUpload, logDir: string): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=release-artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-artifacts.d.ts","sourceRoot":"","sources":["../../src/app/release-artifacts.ts"],"names":[],"mappings":"AAaA,OAAO,EAAkG,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzJ,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAoBzC,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAA;IACZ,qFAAqF;IACrF,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAA;IACV,6EAA6E;IAC7E,IAAI,EAAE,eAAe,EAAE,CAAA;CACxB;AAED,mDAAmD;AACnD,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAuDhD,4HAA4H;AAC5H,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsBzH;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAgFD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAenH;AAED,0FAA0F;AAC1F,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5F"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReleaseOutputError = void 0;
|
|
7
|
+
exports.collectReleaseFiles = collectReleaseFiles;
|
|
8
|
+
exports.uploadRelease = uploadRelease;
|
|
9
|
+
exports.uploadReleaseLogs = uploadReleaseLogs;
|
|
10
|
+
// What a release holds once it is built, and getting it there (AGENT_MODE=build). A static service's
|
|
11
|
+
// output is what the gateway serves, with no VM (site/); a service or daemon with a command is its
|
|
12
|
+
// whole folder as it was built, dependencies and all, in one archive for the VM that runs it, which
|
|
13
|
+
// installs and builds nothing. manifest.json goes last, so a release that has one is complete.
|
|
14
|
+
const node_crypto_1 = require("node:crypto");
|
|
15
|
+
const node_fs_1 = require("node:fs");
|
|
16
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
17
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
|
+
const node_stream_1 = require("node:stream");
|
|
19
|
+
const node_util_1 = require("node:util");
|
|
20
|
+
const node_zlib_1 = require("node:zlib");
|
|
21
|
+
const snapshot_sync_1 = require("../persistence/snapshot-sync");
|
|
22
|
+
const workload_1 = require("../runtime/workload");
|
|
23
|
+
const protocol_1 = require("../transport/protocol");
|
|
24
|
+
const runner_1 = require("./runner");
|
|
25
|
+
const static_server_1 = require("./static-server");
|
|
26
|
+
/** What a site never serves, in the folder a build left it in. */
|
|
27
|
+
const NEVER_SERVED = new Set(['node_modules', '.venv', '.git', '.builder', '__pycache__', '.turbo', '.cache']);
|
|
28
|
+
/** What a VM never reads of what a build left: its caches and history. Python's compiled files stay, for a faster start. */
|
|
29
|
+
const NOT_IN_ARCHIVE = ['.git', '.builder', '.turbo', '.cache', '.next/cache'];
|
|
30
|
+
/** Must match MAX_RELEASE_ARCHIVE_BYTES in services/git/src/server.py. */
|
|
31
|
+
const MAX_RELEASE_ARCHIVE_BYTES = 1024 * 1024 * 1024;
|
|
32
|
+
/** Too little to gain below this, and what's over it isn't text. */
|
|
33
|
+
const MIN_COMPRESSED_BYTES = 1024;
|
|
34
|
+
const MAX_COMPRESSED_BYTES = 16 * 1024 * 1024;
|
|
35
|
+
const COMPRESSIBLE = /\.(html?|css|[cm]?js|json|map|svg|xml|txt|md|csv|webmanifest|wasm|ttf|otf|eot|rss|atom)$/i;
|
|
36
|
+
/** Brotli's best is worth its time on the size most files are, and is slow past it. */
|
|
37
|
+
const BEST_BROTLI_BYTES = 1024 * 1024;
|
|
38
|
+
const UPLOAD_ATTEMPTS = 3;
|
|
39
|
+
const UPLOAD_TIMEOUT_MS = 5 * 60000;
|
|
40
|
+
const ARCHIVE_UPLOAD_TIMEOUT_MS = 15 * 60000;
|
|
41
|
+
/** Why a build's output can't become a release. */
|
|
42
|
+
class ReleaseOutputError extends Error {
|
|
43
|
+
}
|
|
44
|
+
exports.ReleaseOutputError = ReleaseOutputError;
|
|
45
|
+
function folderOf(root, inner = '.') {
|
|
46
|
+
return node_path_1.default.posix.normalize(node_path_1.default.posix.join(root !== null && root !== void 0 ? root : '.', inner)).replace(/\/+$/, '') || '.';
|
|
47
|
+
}
|
|
48
|
+
async function leadsInside(dir, file) {
|
|
49
|
+
return node_fs_1.promises.realpath(node_path_1.default.join(dir, file)).then(async (real) => (0, workload_1.isInsideDir)(await node_fs_1.promises.realpath(dir), real), () => false);
|
|
50
|
+
}
|
|
51
|
+
/** Every file under `folder` of the workspace but what's NEVER_SERVED; a link counts as the file it leads to. */
|
|
52
|
+
async function filesUnder(dir, folder) {
|
|
53
|
+
const found = [];
|
|
54
|
+
const walk = async (relative) => {
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = await node_fs_1.promises.readdir(node_path_1.default.join(dir, relative), { withFileTypes: true });
|
|
58
|
+
}
|
|
59
|
+
catch (_a) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (NEVER_SERVED.has(entry.name) || (entry.name === 'cache' && node_path_1.default.posix.basename(relative) === '.next'))
|
|
64
|
+
continue;
|
|
65
|
+
const file = node_path_1.default.posix.normalize(node_path_1.default.posix.join(relative, entry.name));
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
await walk(file);
|
|
68
|
+
}
|
|
69
|
+
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
70
|
+
// A link leading out of the workspace is no file of this release.
|
|
71
|
+
if (entry.isSymbolicLink() && !(await leadsInside(dir, file)))
|
|
72
|
+
continue;
|
|
73
|
+
const stats = await node_fs_1.promises.stat(node_path_1.default.join(dir, file)).catch(() => undefined);
|
|
74
|
+
if (!(stats === null || stats === void 0 ? void 0 : stats.isFile()))
|
|
75
|
+
continue;
|
|
76
|
+
if (stats.size > snapshot_sync_1.MAX_SESSION_FILE_BYTES) {
|
|
77
|
+
throw new ReleaseOutputError(`${file} is ${Math.ceil(stats.size / (1024 * 1024))} MiB, over the ${snapshot_sync_1.MAX_SESSION_FILE_BYTES / (1024 * 1024)} MiB limit for a file in a release`);
|
|
78
|
+
}
|
|
79
|
+
found.push({ path: file, size: stats.size });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
await walk(folder);
|
|
84
|
+
return found;
|
|
85
|
+
}
|
|
86
|
+
/** A package in a workspace installs from the top, with its dependencies there: its VM needs what's around it too. */
|
|
87
|
+
async function isWorkspaceProject(dir) {
|
|
88
|
+
if (await node_fs_1.promises.access(node_path_1.default.join(dir, 'pnpm-workspace.yaml')).then(() => true, () => false))
|
|
89
|
+
return true;
|
|
90
|
+
const text = await (0, workload_1.readInside)(dir, node_path_1.default.join(dir, 'package.json')).then((bytes) => bytes.toString('utf8'), () => undefined);
|
|
91
|
+
try {
|
|
92
|
+
return Boolean(text && JSON.parse(text).workspaces);
|
|
93
|
+
}
|
|
94
|
+
catch (_a) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** What goes in a release, once `config` is built in `dir`. Throws ReleaseOutputError when the output can't be released. */
|
|
99
|
+
async function collectReleaseFiles(config, dir) {
|
|
100
|
+
var _a;
|
|
101
|
+
const site = new Map();
|
|
102
|
+
const runFolders = new Set();
|
|
103
|
+
for (const [name, service] of Object.entries(config.services)) {
|
|
104
|
+
if (service.startCommand) {
|
|
105
|
+
runFolders.add(folderOf(service.root));
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const output = folderOf(service.root, service.outputDirectory);
|
|
109
|
+
const ownFolder = output === folderOf(service.root);
|
|
110
|
+
const files = (await filesUnder(dir, output)).filter((file) => {
|
|
111
|
+
const inside = `/${output === '.' ? file.path : file.path.slice(output.length + 1)}`;
|
|
112
|
+
return !(0, protocol_1.isHiddenSitePath)(inside) && !(ownFolder && (0, static_server_1.isProjectFilePath)(inside));
|
|
113
|
+
});
|
|
114
|
+
if (!files.length)
|
|
115
|
+
throw new ReleaseOutputError(`${name}: its build left nothing to serve in ${output}`);
|
|
116
|
+
for (const file of files)
|
|
117
|
+
site.set(file.path, file);
|
|
118
|
+
}
|
|
119
|
+
for (const daemon of Object.values((_a = config.daemons) !== null && _a !== void 0 ? _a : {}))
|
|
120
|
+
runFolders.add(folderOf(daemon.root));
|
|
121
|
+
for (const folder of runFolders) {
|
|
122
|
+
if (!(0, workload_1.isInsideDir)(dir, node_path_1.default.resolve(dir, folder)))
|
|
123
|
+
throw new ReleaseOutputError(`${folder} is outside the app`);
|
|
124
|
+
}
|
|
125
|
+
return { site: [...site.values()], run: runFolders.size && (await isWorkspaceProject(dir)) ? ['.'] : [...runFolders] };
|
|
126
|
+
}
|
|
127
|
+
async function put({ url, token }, route, body, timeoutMs = UPLOAD_TIMEOUT_MS) {
|
|
128
|
+
var _a;
|
|
129
|
+
const target = `${url.replace(/\/+$/, '')}${route}`;
|
|
130
|
+
for (let attempt = 1;; attempt++) {
|
|
131
|
+
try {
|
|
132
|
+
const content = await body();
|
|
133
|
+
const response = await fetch(target, {
|
|
134
|
+
method: 'PUT',
|
|
135
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/octet-stream' },
|
|
136
|
+
...(content instanceof node_stream_1.Readable
|
|
137
|
+
? { body: node_stream_1.Readable.toWeb(content), duplex: 'half' }
|
|
138
|
+
: { body: Buffer.from(content) }),
|
|
139
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
140
|
+
});
|
|
141
|
+
await ((_a = response.body) === null || _a === void 0 ? void 0 : _a.cancel());
|
|
142
|
+
if (response.ok)
|
|
143
|
+
return;
|
|
144
|
+
const message = `Uploading ${route} failed: ${response.status}`;
|
|
145
|
+
// The service refused it: the next try gets the same answer.
|
|
146
|
+
if (response.status < 500 || attempt >= UPLOAD_ATTEMPTS)
|
|
147
|
+
throw new ReleaseOutputError(message);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error instanceof ReleaseOutputError || attempt >= UPLOAD_ATTEMPTS)
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Packs what a VM runs, away from the workspace, so another try sends the same archive. */
|
|
156
|
+
async function uploadRunArchive(upload, dir, folders) {
|
|
157
|
+
const staging = await node_fs_1.promises.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), 'builder-release-'));
|
|
158
|
+
try {
|
|
159
|
+
const archive = node_path_1.default.join(staging, protocol_1.RELEASE_ARCHIVE_FILE);
|
|
160
|
+
await (0, workload_1.packAsWorkload)(dir, folders, NOT_IN_ARCHIVE, (0, node_fs_1.createWriteStream)(archive));
|
|
161
|
+
const { size } = await node_fs_1.promises.stat(archive);
|
|
162
|
+
if (size > MAX_RELEASE_ARCHIVE_BYTES) {
|
|
163
|
+
const mib = (bytes) => Math.ceil(bytes / (1024 * 1024));
|
|
164
|
+
throw new ReleaseOutputError(`What this app runs is ${mib(size)} MiB compressed, over the ${mib(MAX_RELEASE_ARCHIVE_BYTES)} MiB limit`);
|
|
165
|
+
}
|
|
166
|
+
await put(upload, `/${protocol_1.RELEASE_ARCHIVE_FILE}`, () => (0, node_fs_1.createReadStream)(archive), ARCHIVE_UPLOAD_TIMEOUT_MS);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
await node_fs_1.promises.rm(staging, { recursive: true, force: true });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const compressors = {
|
|
173
|
+
br: (content) => (0, node_util_1.promisify)(node_zlib_1.brotliCompress)(content, {
|
|
174
|
+
params: {
|
|
175
|
+
[node_zlib_1.constants.BROTLI_PARAM_QUALITY]: content.length <= BEST_BROTLI_BYTES ? node_zlib_1.constants.BROTLI_MAX_QUALITY : 9,
|
|
176
|
+
[node_zlib_1.constants.BROTLI_PARAM_SIZE_HINT]: content.length,
|
|
177
|
+
},
|
|
178
|
+
}),
|
|
179
|
+
gzip: (content) => (0, node_util_1.promisify)(node_zlib_1.gzip)(content, { level: node_zlib_1.constants.Z_BEST_COMPRESSION }),
|
|
180
|
+
};
|
|
181
|
+
/** A site's file, with a copy for each encoding that makes it smaller. */
|
|
182
|
+
async function uploadSiteFile(upload, dir, file) {
|
|
183
|
+
const content = await (0, workload_1.readInside)(dir, node_path_1.default.join(dir, file.path));
|
|
184
|
+
const route = (0, snapshot_sync_1.fileRoute)(file.path).slice('/files'.length);
|
|
185
|
+
await put(upload, `/site${route}`, () => content);
|
|
186
|
+
const encodings = {};
|
|
187
|
+
if (COMPRESSIBLE.test(file.path) && content.length >= MIN_COMPRESSED_BYTES && content.length <= MAX_COMPRESSED_BYTES) {
|
|
188
|
+
for (const encoding of protocol_1.SITE_ENCODINGS) {
|
|
189
|
+
const compressed = await compressors[encoding](content);
|
|
190
|
+
if (compressed.length >= content.length)
|
|
191
|
+
continue;
|
|
192
|
+
await put(upload, `/encoded/${encoding}${route}`, () => compressed);
|
|
193
|
+
encodings[encoding] = compressed.length;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
path: file.path,
|
|
198
|
+
size: content.length,
|
|
199
|
+
hash: (0, node_crypto_1.createHash)('sha256').update(content).digest('base64url'),
|
|
200
|
+
...(Object.keys(encodings).length ? { encodings } : {}),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Uploads what `config` built in `dir`, with its logs. The manifest goes last: the storage refuses
|
|
205
|
+
* anything after it, since a release that has one is finished.
|
|
206
|
+
*/
|
|
207
|
+
async function uploadRelease(upload, config, dir) {
|
|
208
|
+
const { site, run } = await collectReleaseFiles(config, dir);
|
|
209
|
+
const siteFiles = new Map();
|
|
210
|
+
await (0, snapshot_sync_1.inPool)(site, async (file) => {
|
|
211
|
+
siteFiles.set(file.path, await uploadSiteFile(upload, dir, file));
|
|
212
|
+
});
|
|
213
|
+
if (run.length)
|
|
214
|
+
await uploadRunArchive(upload, dir, run);
|
|
215
|
+
const json = (value) => () => Buffer.from(`${JSON.stringify(value, null, 2)}\n`);
|
|
216
|
+
// What was built, with every preset filled in, so nothing is left to detect from the output: what
|
|
217
|
+
// the VM runs and the gateway routes by.
|
|
218
|
+
await put(upload, (0, snapshot_sync_1.fileRoute)(protocol_1.APP_CONFIG_FILE), json(config));
|
|
219
|
+
await uploadReleaseLogs(upload, node_path_1.default.join(dir, runner_1.APP_LOG_DIR));
|
|
220
|
+
const manifest = { version: 1, site: site.map((file) => siteFiles.get(file.path)) };
|
|
221
|
+
await put(upload, `/${protocol_1.RELEASE_MANIFEST_FILE}`, json(manifest));
|
|
222
|
+
return manifest;
|
|
223
|
+
}
|
|
224
|
+
/** Uploads the build's logs, for whoever looks into it later, a build that failed too. */
|
|
225
|
+
async function uploadReleaseLogs(upload, logDir) {
|
|
226
|
+
const names = await node_fs_1.promises.readdir(logDir).catch(() => []);
|
|
227
|
+
await (0, snapshot_sync_1.inPool)(names, (name) => put(upload, `/logs/${encodeURIComponent(name)}`, () => (0, workload_1.readInside)(logDir, node_path_1.default.join(logDir, name))));
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=release-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-artifacts.js","sourceRoot":"","sources":["../../src/app/release-artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-artifacts.test.d.ts","sourceRoot":"","sources":["../../src/app/release-artifacts.test.ts"],"names":[],"mappings":""}
|