@liquidmetal-ai/raindrop 0.9.6 → 0.9.7

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 (90) hide show
  1. package/README.md +69 -69
  2. package/bundle/chunk-2HWWLWLM.js +74 -0
  3. package/bundle/chunk-6AU7I5YZ.js +44 -0
  4. package/bundle/chunk-6VCATADU.js +384 -0
  5. package/bundle/chunk-BC3Z5E5X.js +502 -0
  6. package/bundle/chunk-DSP542FN.js +12148 -0
  7. package/bundle/chunk-FFKINGT5.js +231 -0
  8. package/bundle/chunk-FV4QERYA.js +48 -0
  9. package/bundle/chunk-KYP4ZWG7.js +292 -0
  10. package/bundle/chunk-O75RZNCU.js +4539 -0
  11. package/bundle/chunk-QN2OJEAL.js +238746 -0
  12. package/bundle/chunk-RUORC7A6.js +315 -0
  13. package/bundle/chunk-T7WFDN3I.js +805 -0
  14. package/bundle/chunk-VW5YPIKL.js +4458 -0
  15. package/bundle/chunk-WTTFYUHL.js +133 -0
  16. package/bundle/chunk-XN52RPCA.js +75 -0
  17. package/bundle/chunk-ZEKMKKMJ.js +22452 -0
  18. package/bundle/commands/annotation/get.js +3 -3
  19. package/bundle/commands/annotation/list.js +3 -3
  20. package/bundle/commands/annotation/put.js +3 -3
  21. package/bundle/commands/auth/list.js +2 -2
  22. package/bundle/commands/auth/login.js +3 -3
  23. package/bundle/commands/auth/logout.js +2 -2
  24. package/bundle/commands/auth/select.js +3 -3
  25. package/bundle/commands/bucket/create-credential.js +2 -2
  26. package/bundle/commands/bucket/delete-credential.js +2 -2
  27. package/bundle/commands/bucket/get-credential.js +2 -2
  28. package/bundle/commands/bucket/list-credentials.js +2 -2
  29. package/bundle/commands/build/branch.js +9 -9
  30. package/bundle/commands/build/checkout.js +6 -6
  31. package/bundle/commands/build/clone.js +5 -5
  32. package/bundle/commands/build/delete.js +6 -6
  33. package/bundle/commands/build/deploy.js +9 -9
  34. package/bundle/commands/build/env/get.js +2 -2
  35. package/bundle/commands/build/env/set.js +2 -2
  36. package/bundle/commands/build/find.js +4 -4
  37. package/bundle/commands/build/generate.js +3 -3
  38. package/bundle/commands/build/init-workspace.js +3 -3
  39. package/bundle/commands/build/init.js +3 -3
  40. package/bundle/commands/build/list.js +5 -5
  41. package/bundle/commands/build/sandbox.js +7 -7
  42. package/bundle/commands/build/start.js +2 -2
  43. package/bundle/commands/build/status.js +5 -5
  44. package/bundle/commands/build/stop.js +2 -2
  45. package/bundle/commands/build/tools/check.js +2 -2
  46. package/bundle/commands/build/tools/fmt.js +2 -2
  47. package/bundle/commands/build/unsandbox.js +7 -7
  48. package/bundle/commands/build/upload.js +5 -5
  49. package/bundle/commands/build/validate.js +4 -4
  50. package/bundle/commands/build/workos/delete.js +4 -4
  51. package/bundle/commands/build/workos/env/attach.js +3 -3
  52. package/bundle/commands/build/workos/env/create.js +3 -3
  53. package/bundle/commands/build/workos/env/delete.js +3 -3
  54. package/bundle/commands/build/workos/env/detach.js +3 -3
  55. package/bundle/commands/build/workos/env/get.js +3 -3
  56. package/bundle/commands/build/workos/env/list.js +3 -3
  57. package/bundle/commands/build/workos/env/set.js +3 -3
  58. package/bundle/commands/build/workos/invite.js +3 -3
  59. package/bundle/commands/build/workos/setup.js +3 -3
  60. package/bundle/commands/build/workos/status.js +3 -3
  61. package/bundle/commands/dns/create.js +2 -2
  62. package/bundle/commands/dns/delete.js +4 -4
  63. package/bundle/commands/dns/get.js +4 -4
  64. package/bundle/commands/dns/list.js +3 -3
  65. package/bundle/commands/dns/records/create.js +2 -2
  66. package/bundle/commands/dns/records/delete.js +3 -3
  67. package/bundle/commands/dns/records/get.js +2 -2
  68. package/bundle/commands/dns/records/list.js +2 -2
  69. package/bundle/commands/dns/records/update.js +2 -2
  70. package/bundle/commands/logs/query.js +3 -3
  71. package/bundle/commands/logs/tail.js +3 -3
  72. package/bundle/commands/mcp/install-claude.js +2 -2
  73. package/bundle/commands/mcp/install-gemini.js +2 -2
  74. package/bundle/commands/mcp/install-goose.js +2 -2
  75. package/bundle/commands/mcp/status.js +2 -2
  76. package/bundle/commands/object/delete.js +2 -2
  77. package/bundle/commands/object/get.js +2 -2
  78. package/bundle/commands/object/list.js +2 -2
  79. package/bundle/commands/object/put.js +2 -2
  80. package/bundle/commands/query/chunk-search.js +3 -3
  81. package/bundle/commands/query/document.js +3 -3
  82. package/bundle/commands/query/events.js +2 -2
  83. package/bundle/commands/query/reindex.js +2 -2
  84. package/bundle/commands/query/search.js +3 -3
  85. package/bundle/commands/tail.js +2 -2
  86. package/bundle/index.js +1 -1
  87. package/oclif.manifest.json +2807 -2807
  88. package/package.json +4 -4
  89. package/templates/init/RAINDROP.md.hbs +21 -25
  90. package/templates/init/src/_app/cors.ts +4 -5
@@ -0,0 +1,231 @@
1
+ import {
2
+ tmpdir
3
+ } from "./chunk-ZEKMKKMJ.js";
4
+ import {
5
+ FileSystemBundle,
6
+ archive
7
+ } from "./chunk-T7WFDN3I.js";
8
+ import {
9
+ buildHandlers
10
+ } from "./chunk-KYP4ZWG7.js";
11
+ import {
12
+ BundleArchiveType,
13
+ Code,
14
+ ConnectError,
15
+ ReleaseRequest_LockSchema,
16
+ create,
17
+ init_cjs_shims,
18
+ listEnvVars,
19
+ valueOf
20
+ } from "./chunk-QN2OJEAL.js";
21
+
22
+ // src/deploy.ts
23
+ init_cjs_shims();
24
+ import fs from "node:fs/promises";
25
+ import * as path from "node:path";
26
+ async function deploy(options) {
27
+ const { command, root, manifest, output } = options;
28
+ const manifestPath = path.isAbsolute(manifest) ? manifest : path.join(root, manifest);
29
+ const buildDir = path.isAbsolute(output) ? output : path.join(root, output);
30
+ const apps = await command.loadManifest();
31
+ if (apps[0] === void 0) {
32
+ command.error("There are no applications in the manifest");
33
+ return "";
34
+ }
35
+ const app = apps[0];
36
+ const manifestContents = await fs.readFile(manifestPath, "utf8");
37
+ await buildHandlers(command, apps, buildDir, root);
38
+ const runtimeVersion = await command.raindropFrameworkVersion();
39
+ const { client: catalogService, userId, organizationId: defaultOrganizationId } = await command.catalogService();
40
+ const organizationId = options.impersonate ?? defaultOrganizationId;
41
+ let deployResp;
42
+ try {
43
+ deployResp = await catalogService.deploy({
44
+ userId,
45
+ organizationId,
46
+ applications: [
47
+ {
48
+ application: valueOf(app.name),
49
+ previousVersionId: options.previousVersionId,
50
+ currentVersionId: options.currentVersionId,
51
+ branch: options.branch,
52
+ amend: options.amend,
53
+ metadata: {
54
+ runtimeVersion
55
+ },
56
+ manifest: manifestContents,
57
+ lock: options.lock,
58
+ suite: ""
59
+ }
60
+ ]
61
+ });
62
+ } catch (err) {
63
+ if (err instanceof ConnectError && err.code === Code.FailedPrecondition) {
64
+ command.error(
65
+ `Failed to ${options.amend ? "amend" : "deploy"} ${valueOf(app.name)}@${options.previousVersionId}=>${options.currentVersionId}: ${err.message}`
66
+ );
67
+ }
68
+ throw err;
69
+ }
70
+ if (deployResp.applications[0] === void 0) {
71
+ command.error("Failed to deploy application");
72
+ }
73
+ const currentVersionId = deployResp.applications[0].currentVersionId;
74
+ if (!currentVersionId) {
75
+ command.error("Failed to retrieve current version ID from deployment response.");
76
+ }
77
+ const lock = deployResp.applications[0].lock;
78
+ const config = await command.loadConfig();
79
+ config.versionId = currentVersionId;
80
+ config.lock = lock;
81
+ await command.saveConfig(config);
82
+ await checkEnvironmentVariables(command, app, catalogService, userId, organizationId, currentVersionId);
83
+ await uploadBundles(command, app, buildDir, catalogService, userId, organizationId, currentVersionId);
84
+ await uploadDbBundle(command, root, catalogService, userId, organizationId, app, currentVersionId);
85
+ if (options.start) {
86
+ await catalogService.setActive({
87
+ userId,
88
+ organizationId,
89
+ applications: deployResp.applications.map((a) => ({
90
+ applicationName: a.applicationName,
91
+ currentVersionId: a.currentVersionId,
92
+ isActive: options.start
93
+ }))
94
+ });
95
+ }
96
+ await catalogService.release({
97
+ userId,
98
+ organizationId,
99
+ locks: deployResp.applications.map(
100
+ (a) => create(ReleaseRequest_LockSchema, {
101
+ applicationName: a.applicationName,
102
+ currentVersionId: a.currentVersionId,
103
+ lock: a.lock
104
+ })
105
+ )
106
+ });
107
+ config.lock = void 0;
108
+ await command.saveConfig(config);
109
+ return currentVersionId;
110
+ }
111
+ async function checkEnvironmentVariables(command, app, catalogService, userId, organizationId, currentVersionId) {
112
+ const envVars = listEnvVars(app);
113
+ if (Object.keys(envVars).length > 0) {
114
+ const getEnvsResp = await catalogService.getEnvs({
115
+ userId,
116
+ organizationId,
117
+ envs: Object.keys(envVars).map((key) => ({
118
+ applicationName: valueOf(app.name),
119
+ currentVersionId,
120
+ key
121
+ }))
122
+ });
123
+ let unset = false;
124
+ const remoteEnvVars = Object.fromEntries(getEnvsResp.envs.map((env) => [env.key, env.value]));
125
+ for (const key of Object.keys(envVars)) {
126
+ const manifestDefault = envVars[key]?.default;
127
+ const remoteValue = remoteEnvVars[key];
128
+ if (remoteValue === void 0 && manifestDefault === void 0) {
129
+ if (!unset) {
130
+ command.warn(`The following environment variables were not set and are required for deployment:`);
131
+ }
132
+ unset = true;
133
+ command.warn(key);
134
+ }
135
+ }
136
+ if (unset) {
137
+ command.error(
138
+ "Please set environment variables before deploying. You can resume using `raindrop build deploy --amend`"
139
+ );
140
+ }
141
+ }
142
+ }
143
+ async function uploadBundles(command, app, buildDir, catalogService, userId, organizationId, currentVersionId) {
144
+ await Promise.all(
145
+ app.handlers().map(async (handler) => {
146
+ const bundle = new FileSystemBundle(path.join(buildDir, valueOf(handler.name)));
147
+ await catalogService.uploadBundle({
148
+ userId,
149
+ organizationId,
150
+ applicationName: valueOf(app.name),
151
+ applicationVersionId: currentVersionId,
152
+ archiveType: BundleArchiveType.ZIP,
153
+ bundleName: valueOf(handler.name),
154
+ archive: Buffer.from(await archive(bundle))
155
+ });
156
+ command.log(`Uploaded bundle "${valueOf(handler.name)}"`);
157
+ })
158
+ );
159
+ }
160
+ async function uploadDbBundle(command, root, catalogService, userId, organizationId, app, currentVersionId) {
161
+ const dbDir = path.join(root, "db");
162
+ let dbExists = false;
163
+ try {
164
+ const stat = await fs.lstat(dbDir);
165
+ dbExists = stat.isDirectory();
166
+ } catch (_e) {
167
+ }
168
+ if (dbExists) {
169
+ command.log(`Checking for SQL files in ${dbDir}`);
170
+ const files = await fs.readdir(dbDir, {
171
+ withFileTypes: true
172
+ });
173
+ const folders = files.filter((file) => file.isDirectory());
174
+ try {
175
+ const tempDir = tmpdir();
176
+ for (const folder of folders) {
177
+ const sqlFiles = (await fs.readdir(path.join(dbDir, folder.name))).filter((file) => file.endsWith(".sql"));
178
+ const tmpDbFolder = await fs.mkdir(path.join(tempDir, folder.name), { recursive: true });
179
+ for (const sqlFile of sqlFiles) {
180
+ await fs.copyFile(path.join(dbDir, folder.name, sqlFile), path.join(tmpDbFolder, sqlFile));
181
+ }
182
+ }
183
+ const dbBundle = new FileSystemBundle(tempDir);
184
+ await catalogService.uploadBundle({
185
+ userId,
186
+ organizationId,
187
+ applicationName: valueOf(app.name),
188
+ applicationVersionId: currentVersionId,
189
+ archiveType: BundleArchiveType.ZIP,
190
+ bundleName: "db",
191
+ archive: Buffer.from(await archive(dbBundle))
192
+ });
193
+ command.log(`Uploaded db bundle with SQL files`);
194
+ await fs.rm(tempDir, { recursive: true, force: true });
195
+ } catch (error) {
196
+ command.log(`Failed to upload db bundle: ${error}`);
197
+ }
198
+ }
199
+ }
200
+ async function sandbox(options) {
201
+ const { command, versionId: versionIdRaw, impersonate, isSandboxed } = options;
202
+ const config = await command.loadConfig();
203
+ const { client: catalogService, userId, organizationId: defaultOrganizationId } = await command.catalogService();
204
+ const organizationId = impersonate ?? defaultOrganizationId;
205
+ const apps = await command.loadManifest();
206
+ const app = apps[0];
207
+ const versionId = versionIdRaw ?? config.versionId;
208
+ if (!app) {
209
+ throw new Error("No application found");
210
+ }
211
+ const applications = [
212
+ {
213
+ applicationName: valueOf(app.name),
214
+ currentVersionId: versionId,
215
+ isSandboxed
216
+ }
217
+ ];
218
+ await catalogService.setSandbox({
219
+ userId,
220
+ organizationId,
221
+ applications
222
+ });
223
+ config.sandbox = isSandboxed;
224
+ await command.saveConfig(config);
225
+ return applications;
226
+ }
227
+
228
+ export {
229
+ deploy,
230
+ sandbox
231
+ };
@@ -0,0 +1,48 @@
1
+ import {
2
+ init_cjs_shims
3
+ } from "./chunk-QN2OJEAL.js";
4
+
5
+ // src/lib/dns-utils.ts
6
+ init_cjs_shims();
7
+ async function resolveDnsNameToZoneId(dnsClient, organizationId, userId, dnsName) {
8
+ try {
9
+ const normalizedDnsName = dnsName.endsWith(".") ? dnsName.slice(0, -1) : dnsName;
10
+ let pageToken;
11
+ do {
12
+ const response = await dnsClient.listDNSZones({
13
+ organizationId,
14
+ userId,
15
+ pageSize: 100,
16
+ // Use a larger page size for efficiency
17
+ pageToken
18
+ });
19
+ if (response.zones) {
20
+ const exactMatch = response.zones.find(
21
+ (zone) => zone.fullyQualifiedDomainName === normalizedDnsName
22
+ );
23
+ if (exactMatch?.zoneId) {
24
+ return exactMatch.zoneId;
25
+ }
26
+ const parentZone = response.zones.find((zone) => {
27
+ if (!zone.fullyQualifiedDomainName) return false;
28
+ const zoneFqdn = zone.fullyQualifiedDomainName;
29
+ return normalizedDnsName.endsWith(`.${zoneFqdn}`) || normalizedDnsName === zoneFqdn;
30
+ });
31
+ if (parentZone?.zoneId) {
32
+ return parentZone.zoneId;
33
+ }
34
+ }
35
+ pageToken = response.nextPageToken;
36
+ } while (pageToken);
37
+ throw new Error(`No DNS zone found for domain name: ${dnsName}`);
38
+ } catch (error) {
39
+ if (error instanceof Error) {
40
+ throw error;
41
+ }
42
+ throw new Error(`Failed to resolve DNS name to zone ID: ${error}`);
43
+ }
44
+ }
45
+
46
+ export {
47
+ resolveDnsNameToZoneId
48
+ };
@@ -0,0 +1,292 @@
1
+ import {
2
+ HANDLERS_DIR
3
+ } from "./chunk-VW5YPIKL.js";
4
+ import {
5
+ Actor,
6
+ Service,
7
+ init_cjs_shims,
8
+ valueOf
9
+ } from "./chunk-QN2OJEAL.js";
10
+
11
+ // src/build.ts
12
+ init_cjs_shims();
13
+
14
+ // ../../node_modules/.pnpm/es-module-lexer@1.7.0/node_modules/es-module-lexer/dist/lexer.js
15
+ init_cjs_shims();
16
+ var ImportType;
17
+ !function(A2) {
18
+ A2[A2.Static = 1] = "Static", A2[A2.Dynamic = 2] = "Dynamic", A2[A2.ImportMeta = 3] = "ImportMeta", A2[A2.StaticSourcePhase = 4] = "StaticSourcePhase", A2[A2.DynamicSourcePhase = 5] = "DynamicSourcePhase", A2[A2.StaticDeferPhase = 6] = "StaticDeferPhase", A2[A2.DynamicDeferPhase = 7] = "DynamicDeferPhase";
19
+ }(ImportType || (ImportType = {}));
20
+ var A = 1 === new Uint8Array(new Uint16Array([1]).buffer)[0];
21
+ function parse(E2, g = "@") {
22
+ if (!C) return init.then(() => parse(E2));
23
+ const I = E2.length + 1, w = (C.__heap_base.value || C.__heap_base) + 4 * I - C.memory.buffer.byteLength;
24
+ w > 0 && C.memory.grow(Math.ceil(w / 65536));
25
+ const K = C.sa(I - 1);
26
+ if ((A ? B : Q)(E2, new Uint16Array(C.memory.buffer, K, I)), !C.parse()) throw Object.assign(new Error(`Parse error ${g}:${E2.slice(0, C.e()).split("\n").length}:${C.e() - E2.lastIndexOf("\n", C.e() - 1)}`), { idx: C.e() });
27
+ const o = [], D = [];
28
+ for (; C.ri(); ) {
29
+ const A2 = C.is(), Q2 = C.ie(), B2 = C.it(), g2 = C.ai(), I2 = C.id(), w2 = C.ss(), K2 = C.se();
30
+ let D2;
31
+ C.ip() && (D2 = k(E2.slice(-1 === I2 ? A2 - 1 : A2, -1 === I2 ? Q2 + 1 : Q2))), o.push({ n: D2, t: B2, s: A2, e: Q2, ss: w2, se: K2, d: I2, a: g2 });
32
+ }
33
+ for (; C.re(); ) {
34
+ const A2 = C.es(), Q2 = C.ee(), B2 = C.els(), g2 = C.ele(), I2 = E2.slice(A2, Q2), w2 = I2[0], K2 = B2 < 0 ? void 0 : E2.slice(B2, g2), o2 = K2 ? K2[0] : "";
35
+ D.push({ s: A2, e: Q2, ls: B2, le: g2, n: '"' === w2 || "'" === w2 ? k(I2) : I2, ln: '"' === o2 || "'" === o2 ? k(K2) : K2 });
36
+ }
37
+ function k(A2) {
38
+ try {
39
+ return (0, eval)(A2);
40
+ } catch (A3) {
41
+ }
42
+ }
43
+ return [o, D, !!C.f(), !!C.ms()];
44
+ }
45
+ function Q(A2, Q2) {
46
+ const B2 = A2.length;
47
+ let C2 = 0;
48
+ for (; C2 < B2; ) {
49
+ const B3 = A2.charCodeAt(C2);
50
+ Q2[C2++] = (255 & B3) << 8 | B3 >>> 8;
51
+ }
52
+ }
53
+ function B(A2, Q2) {
54
+ const B2 = A2.length;
55
+ let C2 = 0;
56
+ for (; C2 < B2; ) Q2[C2] = A2.charCodeAt(C2++);
57
+ }
58
+ var C;
59
+ var E = () => {
60
+ return A2 = "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GzYCHAtBAEEAKAKwCkECajYCsAoCQAJAAkACQEEAECkiAUHhAEYNACABQfcARg0BQQAoArAKIQEMAgtBACgCsAoiAUECakHACEEKEC8NAUEGIQIMAgtBACgCsAoiAS8BAkHpAEcNACABLwEEQfQARw0AQQQhAiABLwEGQegARg0BC0EAIAFBfmo2ArAKDwtBACABIAJBAXRqNgKwCgJAQQEQKUH7AEYNAEEAIAE2ArAKDwtBACgCsAoiACECA0BBACACQQJqNgKwCgJAAkACQEEBECkiAkEiRg0AIAJBJ0cNAUEnEBpBAEEAKAKwCkECajYCsApBARApIQIMAgtBIhAaQQBBACgCsApBAmo2ArAKQQEQKSECDAELIAIQLCECCwJAIAJBOkYNAEEAIAE2ArAKDwtBAEEAKAKwCkECajYCsAoCQEEBECkiAkEiRg0AIAJBJ0YNAEEAIAE2ArAKDwsgAhAaQQBBACgCsApBAmo2ArAKAkACQEEBECkiAkEsRg0AIAJB/QBGDQFBACABNgKwCg8LQQBBACgCsApBAmo2ArAKQQEQKUH9AEYNAEEAKAKwCiECDAELC0EAKALwCSIBIAA2AhAgAUEAKAKwCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAoDQJBACECQQBBACgCsAoiAEECajYCsAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKwCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2ArAKQQEQKSECQQAoArAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAsGkEAKAKwCiEEDAELIAIQGkEAQQAoArAKQQJqIgQ2ArAKC0EBECkhA0EAKAKwCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKwCiEAQQAoArQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKwChAlQQAPC0EAIAI2ArAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+wBAgBBgAgLzgEAAHgAcABvAHIAdABtAHAAbwByAHQAZgBvAHIAZQB0AGEAbwB1AHIAYwBlAHIAbwBtAHUAbgBjAHQAaQBvAG4AcwBzAGUAcgB0AHYAbwB5AGkAZQBkAGUAbABlAGMAbwBuAHQAaQBuAGkAbgBzAHQAYQBuAHQAeQBiAHIAZQBhAHIAZQB0AHUAcgBkAGUAYgB1AGcAZwBlAGEAdwBhAGkAdABoAHIAdwBoAGkAbABlAGkAZgBjAGEAdABjAGYAaQBuAGEAbABsAGUAbABzAABB0AkLEAEAAAACAAAAAAQAAEA5AAA=", "undefined" != typeof Buffer ? Buffer.from(A2, "base64") : Uint8Array.from(atob(A2), (A3) => A3.charCodeAt(0));
61
+ var A2;
62
+ };
63
+ var init = WebAssembly.compile(E()).then(WebAssembly.instantiate).then(({ exports: A2 }) => {
64
+ C = A2;
65
+ });
66
+
67
+ // src/build.ts
68
+ import * as esbuild from "esbuild";
69
+ import { exec, spawn } from "node:child_process";
70
+ import fs from "node:fs/promises";
71
+ import * as path from "node:path";
72
+ import { promisify } from "node:util";
73
+ var execAsync = promisify(exec);
74
+ function raindropFrameworkPlugin() {
75
+ return {
76
+ name: "raindrop-framework-resolver",
77
+ setup(build3) {
78
+ build3.onResolve({ filter: /^@liquidmetal-ai\/raindrop-framework$/ }, (_args) => {
79
+ return {
80
+ path: "./runtime.js",
81
+ external: true
82
+ };
83
+ });
84
+ build3.onResolve({ filter: /^@liquidmetal-ai\/raindrop-framework\/.+/ }, (_args) => {
85
+ return void 0;
86
+ });
87
+ }
88
+ };
89
+ }
90
+ async function analyzeExports(indexPath) {
91
+ try {
92
+ await init;
93
+ const content = await fs.readFile(indexPath, "utf-8");
94
+ const [, exports] = parse(content);
95
+ const exportNames = /* @__PURE__ */ new Set();
96
+ for (const exp of exports) {
97
+ if (exp.n) {
98
+ exportNames.add(exp.n);
99
+ }
100
+ }
101
+ return exportNames;
102
+ } catch (_error) {
103
+ return /* @__PURE__ */ new Set();
104
+ }
105
+ }
106
+ async function generateEntryPoint(handlerDir, isProtected) {
107
+ const indexPath = path.join(handlerDir, "index.ts");
108
+ const userExports = await analyzeExports(indexPath);
109
+ let content = "";
110
+ if (isProtected) {
111
+ const authExports = ["verify", "authorize"];
112
+ const missingAuthExports = authExports.filter((exp) => !userExports.has(exp));
113
+ if (missingAuthExports.length > 0) {
114
+ content += `export { ${missingAuthExports.join(", ")} } from '../_app/auth.js';
115
+ `;
116
+ }
117
+ }
118
+ if (!userExports.has("cors")) {
119
+ content += `export { cors } from '../_app/cors.js';
120
+ `;
121
+ }
122
+ content += `export * from './index.js';
123
+ `;
124
+ content += `import * as userDefault from './index.js';
125
+ `;
126
+ content += `export default userDefault.default;
127
+ `;
128
+ return content;
129
+ }
130
+ async function typeCheck(cwd) {
131
+ return new Promise((resolve) => {
132
+ const tsc = spawn("npx", ["tsc", "--noEmit"], {
133
+ cwd,
134
+ stdio: "inherit"
135
+ // Inherit stdio to show compiler output in real-time
136
+ });
137
+ tsc.on("exit", (code) => {
138
+ resolve(code === 0);
139
+ });
140
+ });
141
+ }
142
+ async function build2(options) {
143
+ const typeCheckPassed = await typeCheck(options.root);
144
+ if (!typeCheckPassed) {
145
+ throw new Error(
146
+ `TypeScript type checking failed.Run 'raindrop build validate' and fix all errors before building.`
147
+ );
148
+ }
149
+ const gitCommitSha = await currentGitCommitSha();
150
+ const entryPointContent = await generateEntryPoint(options.handlerDir, options.isProtected);
151
+ const buildResult = await esbuild.build({
152
+ external: ["node:crypto", "crypto", "./runtime.js"],
153
+ plugins: [raindropFrameworkPlugin()],
154
+ banner: {
155
+ js: `globalThis.__RAINDROP_GIT_COMMIT_SHA = "${gitCommitSha}"; `
156
+ },
157
+ bundle: true,
158
+ outfile: `${options.outdir}/index.js`,
159
+ tsconfig: `${options.root}/tsconfig.json`,
160
+ // TODO [bosgood] Add support for middleware/code injection from wrangler
161
+ inject: [],
162
+ format: "esm",
163
+ // Only ES6 module format will be supported
164
+ // Until we switch to fflate for compression, we need to disable
165
+ // sourcemaps (JSZip uses ~10x memory).
166
+ sourcemap: false,
167
+ stdin: {
168
+ contents: entryPointContent,
169
+ loader: "ts",
170
+ resolveDir: options.handlerDir
171
+ },
172
+ // Experiment: let's see how far we can get without minification because:
173
+ // 1) It should be slightly faster to build
174
+ // 2) It should be easier to debug
175
+ minify: false,
176
+ metafile: true,
177
+ // From wrangler:
178
+ target: "es2022",
179
+ loader: { ".js": "jsx", ".mjs": "jsx", ".cjs": "jsx" },
180
+ // Wrangler uses the browser platform for all builds by default,
181
+ // even when node_compat is enabled.
182
+ platform: "browser",
183
+ // TODO [bosgood] Inlined from wrangler
184
+ // build conditions used by esbuild, and when resolving custom `import` calls
185
+ conditions: ["workerd", "worker", "browser"],
186
+ define: {
187
+ "navigator.userAgent": `"Cloudflare-Workers"`
188
+ // TODO [bosgood] wrangler also optionally defines overrides for process.env.NODE_ENV
189
+ },
190
+ // The default logLevel is "warning". So that we can rewrite errors before
191
+ // logging, we disable esbuild's default logging, and log build failures
192
+ // ourselves.
193
+ logLevel: "silent"
194
+ });
195
+ return buildResult;
196
+ }
197
+ async function buildHandlers(cmd, apps, buildDir, root) {
198
+ await fs.rm(buildDir, { force: true, recursive: true });
199
+ cmd.log(`Building to ${buildDir}`);
200
+ const buildTasks = [];
201
+ for (const app of apps) {
202
+ for (const handler of app.handlers()) {
203
+ const handlerName = valueOf(handler.name);
204
+ let isProtected = false;
205
+ if (handler instanceof Service || handler instanceof Actor) {
206
+ isProtected = handler.visibility !== void 0 && valueOf(handler.visibility) === "protected";
207
+ }
208
+ buildTasks.push({
209
+ handlerName,
210
+ isProtected,
211
+ handlerDir: `${root}/${HANDLERS_DIR}/${handlerName}`,
212
+ outdir: path.join(buildDir, handlerName)
213
+ });
214
+ }
215
+ }
216
+ const results = await Promise.allSettled(
217
+ buildTasks.map(async (task) => {
218
+ const buildResult = await build2({
219
+ root,
220
+ handlerDir: task.handlerDir,
221
+ outdir: task.outdir,
222
+ isProtected: task.isProtected
223
+ });
224
+ return { task, buildResult };
225
+ })
226
+ );
227
+ const successful = [];
228
+ const failed = [];
229
+ for (const result of results) {
230
+ if (result.status === "fulfilled") {
231
+ const { task, buildResult } = result.value;
232
+ if (buildResult.errors.length === 0) {
233
+ successful.push({ task, buildResult });
234
+ } else {
235
+ failed.push({ task, error: buildResult });
236
+ }
237
+ } else {
238
+ const index = results.indexOf(result);
239
+ const task = buildTasks[index];
240
+ failed.push({ task, error: result.reason });
241
+ }
242
+ }
243
+ cmd.log(`
244
+ Build Summary: ${successful.length}/${buildTasks.length} handlers built successfully`);
245
+ if (successful.length > 0) {
246
+ cmd.log("\nSuccessful builds:");
247
+ for (const { task } of successful) {
248
+ cmd.log(` \u2713 ${task.handlerName}`);
249
+ }
250
+ }
251
+ const buildsWithWarnings = [];
252
+ for (const { task, buildResult } of successful) {
253
+ if (buildResult.warnings.length > 0) {
254
+ buildsWithWarnings.push({ handler: task.handlerName, warnings: buildResult.warnings });
255
+ }
256
+ }
257
+ if (buildsWithWarnings.length > 0) {
258
+ cmd.log("\nWarnings:");
259
+ for (const { handler, warnings } of buildsWithWarnings) {
260
+ cmd.log(` ${handler}:`);
261
+ for (const warning of warnings) {
262
+ cmd.log(` ${warning.text}`);
263
+ }
264
+ }
265
+ }
266
+ if (failed.length > 0) {
267
+ cmd.log("\nFailed builds:");
268
+ for (const { task, error } of failed) {
269
+ cmd.log(` \u2717 ${task.handlerName}:`);
270
+ if (error instanceof Error) {
271
+ cmd.log(` ${error.message}`);
272
+ } else {
273
+ for (const err of error.errors) {
274
+ cmd.log(` ${err.text}`);
275
+ }
276
+ }
277
+ }
278
+ cmd.error(`Build failed for ${failed.length} handler(s)`, { exit: 1 });
279
+ }
280
+ cmd.log("\nBuild completed successfully");
281
+ }
282
+ async function currentGitCommitSha() {
283
+ try {
284
+ return (await execAsync("git rev-parse HEAD", { encoding: "utf8" })).stdout.trim();
285
+ } catch (_) {
286
+ return "unknown";
287
+ }
288
+ }
289
+
290
+ export {
291
+ buildHandlers
292
+ };