@dxos/functions 0.8.4-main.f5c0578 → 0.8.4-main.fcc0d83b33
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 +4 -6
- package/dist/lib/neutral/Trace.mjs +42 -0
- package/dist/lib/neutral/Trace.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LI2RBI7V.mjs +49 -0
- package/dist/lib/neutral/chunk-LI2RBI7V.mjs.map +7 -0
- package/dist/lib/neutral/chunk-VOFFKJP4.mjs +178 -0
- package/dist/lib/neutral/chunk-VOFFKJP4.mjs.map +7 -0
- package/dist/lib/neutral/fib-WEAWVJIJ.mjs +23 -0
- package/dist/lib/neutral/fib-WEAWVJIJ.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +1082 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/reply-AIAJ3PTW.mjs +19 -0
- package/dist/lib/neutral/reply-AIAJ3PTW.mjs.map +7 -0
- package/dist/lib/neutral/sleep-M4YMO6FP.mjs +15 -0
- package/dist/lib/neutral/sleep-M4YMO6FP.mjs.map +7 -0
- package/dist/types/src/Trace.d.ts +174 -0
- package/dist/types/src/Trace.d.ts.map +1 -0
- package/dist/types/src/errors.d.ts +150 -41
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/example/definitions.d.ts +11 -0
- package/dist/types/src/example/definitions.d.ts.map +1 -0
- package/dist/types/src/example/fib.d.ts +8 -0
- package/dist/types/src/example/fib.d.ts.map +1 -0
- package/dist/types/src/example/forex-effect.d.ts +3 -0
- package/dist/types/src/example/forex-effect.d.ts.map +1 -0
- package/dist/types/src/example/index.d.ts +4 -0
- package/dist/types/src/example/index.d.ts.map +1 -0
- package/dist/types/src/example/reply.d.ts +4 -0
- package/dist/types/src/example/reply.d.ts.map +1 -0
- package/dist/types/src/example/sleep.d.ts +6 -0
- package/dist/types/src/example/sleep.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +9 -7
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/process/Process.d.ts +246 -0
- package/dist/types/src/process/Process.d.ts.map +1 -0
- package/dist/types/src/process/ServiceResolver.d.ts +74 -0
- package/dist/types/src/process/ServiceResolver.d.ts.map +1 -0
- package/dist/types/src/process/StorageService.d.ts +58 -0
- package/dist/types/src/process/StorageService.d.ts.map +1 -0
- package/dist/types/src/protocol/functions-ai-http-client.d.ts +12 -0
- package/dist/types/src/protocol/functions-ai-http-client.d.ts.map +1 -0
- package/dist/types/src/protocol/index.d.ts +2 -0
- package/dist/types/src/protocol/index.d.ts.map +1 -0
- package/dist/types/src/protocol/protocol.d.ts +7 -0
- package/dist/types/src/protocol/protocol.d.ts.map +1 -0
- package/dist/types/src/protocol/protocol.test.d.ts +2 -0
- package/dist/types/src/protocol/protocol.test.d.ts.map +1 -0
- package/dist/types/src/sdk.d.ts +11 -0
- package/dist/types/src/sdk.d.ts.map +1 -0
- package/dist/types/src/services/credentials.d.ts +20 -4
- package/dist/types/src/services/credentials.d.ts.map +1 -1
- package/dist/types/src/services/function-invocation-service.d.ts +16 -0
- package/dist/types/src/services/function-invocation-service.d.ts.map +1 -0
- package/dist/types/src/services/index.d.ts +4 -7
- package/dist/types/src/services/index.d.ts.map +1 -1
- package/dist/types/src/services/queues.d.ts +1 -43
- package/dist/types/src/services/queues.d.ts.map +1 -1
- package/dist/types/src/services/tracing.d.ts +2 -52
- package/dist/types/src/services/tracing.d.ts.map +1 -1
- package/dist/types/src/types/Script.d.ts +22 -0
- package/dist/types/src/types/Script.d.ts.map +1 -0
- package/dist/types/src/types/Trigger.d.ts +150 -0
- package/dist/types/src/types/Trigger.d.ts.map +1 -0
- package/dist/types/src/types/TriggerEvent.d.ts +75 -0
- package/dist/types/src/types/TriggerEvent.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +5 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/url.d.ts +13 -0
- package/dist/types/src/types/url.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +31 -73
- package/src/Trace.ts +231 -0
- package/src/errors.ts +23 -5
- package/src/example/definitions.ts +49 -0
- package/src/example/fib.ts +23 -0
- package/src/example/forex-effect.ts +40 -0
- package/src/example/index.ts +12 -0
- package/src/example/reply.ts +19 -0
- package/src/example/sleep.ts +17 -0
- package/src/index.ts +9 -9
- package/src/process/Process.ts +489 -0
- package/src/process/ServiceResolver.ts +174 -0
- package/src/process/StorageService.ts +99 -0
- package/src/protocol/functions-ai-http-client.ts +67 -0
- package/src/{executor → protocol}/index.ts +1 -1
- package/src/protocol/protocol.test.ts +58 -0
- package/src/protocol/protocol.ts +283 -0
- package/src/sdk.ts +30 -0
- package/src/services/credentials.ts +70 -9
- package/src/services/function-invocation-service.ts +35 -0
- package/src/services/index.ts +4 -7
- package/src/services/queues.ts +1 -73
- package/src/services/tracing.ts +1 -116
- package/src/types/Script.ts +38 -0
- package/src/types/Trigger.ts +207 -0
- package/src/types/TriggerEvent.ts +62 -0
- package/src/types/index.ts +8 -0
- package/src/types/url.ts +32 -0
- package/dist/lib/browser/bundler/index.mjs +0 -248
- package/dist/lib/browser/bundler/index.mjs.map +0 -7
- package/dist/lib/browser/chunk-IGZ7KK4A.mjs +0 -526
- package/dist/lib/browser/chunk-IGZ7KK4A.mjs.map +0 -7
- package/dist/lib/browser/edge/index.mjs +0 -69
- package/dist/lib/browser/edge/index.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -502
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs +0 -59
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/bundler/index.mjs +0 -250
- package/dist/lib/node-esm/bundler/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NE5CWLJE.mjs +0 -528
- package/dist/lib/node-esm/chunk-NE5CWLJE.mjs.map +0 -7
- package/dist/lib/node-esm/edge/index.mjs +0 -71
- package/dist/lib/node-esm/edge/index.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -503
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -60
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/bundler/bundler.d.ts +0 -50
- package/dist/types/src/bundler/bundler.d.ts.map +0 -1
- package/dist/types/src/bundler/bundler.test.d.ts +0 -2
- package/dist/types/src/bundler/bundler.test.d.ts.map +0 -1
- package/dist/types/src/bundler/index.d.ts +0 -2
- package/dist/types/src/bundler/index.d.ts.map +0 -1
- package/dist/types/src/edge/functions.d.ts +0 -16
- package/dist/types/src/edge/functions.d.ts.map +0 -1
- package/dist/types/src/edge/index.d.ts +0 -2
- package/dist/types/src/edge/index.d.ts.map +0 -1
- package/dist/types/src/executor/executor.d.ts +0 -11
- package/dist/types/src/executor/executor.d.ts.map +0 -1
- package/dist/types/src/executor/index.d.ts +0 -2
- package/dist/types/src/executor/index.d.ts.map +0 -1
- package/dist/types/src/handler.d.ts +0 -65
- package/dist/types/src/handler.d.ts.map +0 -1
- package/dist/types/src/schema.d.ts +0 -38
- package/dist/types/src/schema.d.ts.map +0 -1
- package/dist/types/src/services/database.d.ts +0 -79
- package/dist/types/src/services/database.d.ts.map +0 -1
- package/dist/types/src/services/event-logger.d.ts +0 -72
- package/dist/types/src/services/event-logger.d.ts.map +0 -1
- package/dist/types/src/services/local-function-execution.d.ts +0 -12
- package/dist/types/src/services/local-function-execution.d.ts.map +0 -1
- package/dist/types/src/services/remote-function-execution-service.d.ts +0 -15
- package/dist/types/src/services/remote-function-execution-service.d.ts.map +0 -1
- package/dist/types/src/services/service-container.d.ts +0 -56
- package/dist/types/src/services/service-container.d.ts.map +0 -1
- package/dist/types/src/services/service-registry.d.ts +0 -29
- package/dist/types/src/services/service-registry.d.ts.map +0 -1
- package/dist/types/src/services/service-registry.test.d.ts +0 -2
- package/dist/types/src/services/service-registry.test.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -3
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/layer.d.ts +0 -10
- package/dist/types/src/testing/layer.d.ts.map +0 -1
- package/dist/types/src/testing/logger.d.ts +0 -5
- package/dist/types/src/testing/logger.d.ts.map +0 -1
- package/dist/types/src/testing/services.d.ts +0 -59
- package/dist/types/src/testing/services.d.ts.map +0 -1
- package/dist/types/src/trace.d.ts +0 -122
- package/dist/types/src/trace.d.ts.map +0 -1
- package/dist/types/src/translations.d.ts +0 -12
- package/dist/types/src/translations.d.ts.map +0 -1
- package/dist/types/src/types.d.ts +0 -411
- package/dist/types/src/types.d.ts.map +0 -1
- package/dist/types/src/url.d.ts +0 -17
- package/dist/types/src/url.d.ts.map +0 -1
- package/src/bundler/bundler.test.ts +0 -59
- package/src/bundler/bundler.ts +0 -292
- package/src/bundler/index.ts +0 -5
- package/src/edge/functions.ts +0 -64
- package/src/edge/index.ts +0 -9
- package/src/executor/executor.ts +0 -54
- package/src/handler.ts +0 -122
- package/src/schema.ts +0 -57
- package/src/services/database.ts +0 -116
- package/src/services/event-logger.ts +0 -118
- package/src/services/local-function-execution.ts +0 -74
- package/src/services/remote-function-execution-service.ts +0 -66
- package/src/services/service-container.ts +0 -114
- package/src/services/service-registry.test.ts +0 -42
- package/src/services/service-registry.ts +0 -59
- package/src/testing/index.ts +0 -6
- package/src/testing/layer.ts +0 -31
- package/src/testing/logger.ts +0 -16
- package/src/testing/services.ts +0 -115
- package/src/trace.ts +0 -178
- package/src/translations.ts +0 -20
- package/src/types.ts +0 -211
- package/src/url.ts +0 -52
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
// src/bundler/bundler.ts
|
|
2
|
-
import { FetchHttpClient, HttpClient } from "@effect/platform";
|
|
3
|
-
import { Duration, Effect, Schedule, pipe } from "effect";
|
|
4
|
-
import { build, initialize } from "esbuild-wasm";
|
|
5
|
-
import { subtleCrypto } from "@dxos/crypto";
|
|
6
|
-
import { runAndForwardErrors } from "@dxos/effect";
|
|
7
|
-
import { invariant } from "@dxos/invariant";
|
|
8
|
-
import { log } from "@dxos/log";
|
|
9
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/core/functions/src/bundler/bundler.ts";
|
|
10
|
-
var initialized;
|
|
11
|
-
var initializeBundler = async (options) => {
|
|
12
|
-
await (initialized ??= initialize({
|
|
13
|
-
wasmURL: options.wasmUrl
|
|
14
|
-
}));
|
|
15
|
-
};
|
|
16
|
-
var Bundler = class {
|
|
17
|
-
_options;
|
|
18
|
-
constructor(_options) {
|
|
19
|
-
this._options = _options;
|
|
20
|
-
}
|
|
21
|
-
async bundle({ path, source }) {
|
|
22
|
-
const { sandboxedModules: providedModules, ...options } = this._options;
|
|
23
|
-
const createResult = async (result) => {
|
|
24
|
-
return {
|
|
25
|
-
timestamp: Date.now(),
|
|
26
|
-
sourceHash: source ? Buffer.from(await subtleCrypto.digest("SHA-256", Buffer.from(source))) : void 0,
|
|
27
|
-
...result
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
if (this._options.platform === "browser") {
|
|
31
|
-
invariant(initialized, "Compiler not initialized.", {
|
|
32
|
-
F: __dxlog_file,
|
|
33
|
-
L: 73,
|
|
34
|
-
S: this,
|
|
35
|
-
A: [
|
|
36
|
-
"initialized",
|
|
37
|
-
"'Compiler not initialized.'"
|
|
38
|
-
]
|
|
39
|
-
});
|
|
40
|
-
await initialized;
|
|
41
|
-
}
|
|
42
|
-
const imports = source ? analyzeSourceFileImports(source) : [];
|
|
43
|
-
try {
|
|
44
|
-
const result = await build({
|
|
45
|
-
platform: options.platform,
|
|
46
|
-
conditions: [
|
|
47
|
-
"workerd",
|
|
48
|
-
"browser"
|
|
49
|
-
],
|
|
50
|
-
metafile: true,
|
|
51
|
-
write: false,
|
|
52
|
-
entryPoints: [
|
|
53
|
-
path ?? "memory:main.tsx"
|
|
54
|
-
],
|
|
55
|
-
bundle: true,
|
|
56
|
-
format: "esm",
|
|
57
|
-
plugins: [
|
|
58
|
-
{
|
|
59
|
-
name: "memory",
|
|
60
|
-
setup: (build2) => {
|
|
61
|
-
build2.onResolve({
|
|
62
|
-
filter: /^\.\/runtime\.js$/
|
|
63
|
-
}, ({ path: path2 }) => {
|
|
64
|
-
return {
|
|
65
|
-
path: path2,
|
|
66
|
-
external: true
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
build2.onResolve({
|
|
70
|
-
filter: /^dxos:functions$/
|
|
71
|
-
}, ({ path: path2 }) => {
|
|
72
|
-
return {
|
|
73
|
-
path: "./runtime.js",
|
|
74
|
-
external: true
|
|
75
|
-
};
|
|
76
|
-
});
|
|
77
|
-
build2.onResolve({
|
|
78
|
-
filter: /^memory:/
|
|
79
|
-
}, ({ path: path2 }) => {
|
|
80
|
-
return {
|
|
81
|
-
path: path2.split(":")[1],
|
|
82
|
-
namespace: "memory"
|
|
83
|
-
};
|
|
84
|
-
});
|
|
85
|
-
build2.onLoad({
|
|
86
|
-
filter: /.*/,
|
|
87
|
-
namespace: "memory"
|
|
88
|
-
}, ({ path: path2 }) => {
|
|
89
|
-
if (path2 === "main.tsx") {
|
|
90
|
-
return {
|
|
91
|
-
contents: source,
|
|
92
|
-
loader: "tsx"
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
for (const module of providedModules) {
|
|
97
|
-
build2.onResolve({
|
|
98
|
-
filter: new RegExp(`^${module}$`)
|
|
99
|
-
}, ({ path: path2 }) => {
|
|
100
|
-
return {
|
|
101
|
-
path: path2,
|
|
102
|
-
namespace: "injected-module"
|
|
103
|
-
};
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
build2.onLoad({
|
|
107
|
-
filter: /.*/,
|
|
108
|
-
namespace: "injected-module"
|
|
109
|
-
}, ({ path: path2 }) => {
|
|
110
|
-
const namedImports = imports.find((entry) => entry.moduleIdentifier === path2)?.namedImports ?? [];
|
|
111
|
-
return {
|
|
112
|
-
contents: `
|
|
113
|
-
const { ${namedImports.join(",")} } = window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path2)}];
|
|
114
|
-
export { ${namedImports.join(",")} };
|
|
115
|
-
export default window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path2)}].default;
|
|
116
|
-
`,
|
|
117
|
-
loader: "tsx"
|
|
118
|
-
};
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
httpPlugin
|
|
123
|
-
]
|
|
124
|
-
});
|
|
125
|
-
log("compile complete", result.metafile, {
|
|
126
|
-
F: __dxlog_file,
|
|
127
|
-
L: 137,
|
|
128
|
-
S: this,
|
|
129
|
-
C: (f, a) => f(...a)
|
|
130
|
-
});
|
|
131
|
-
return await createResult({
|
|
132
|
-
imports: this.analyzeImports(result),
|
|
133
|
-
bundle: result.outputFiles[0].text
|
|
134
|
-
});
|
|
135
|
-
} catch (err) {
|
|
136
|
-
return await createResult({
|
|
137
|
-
error: err
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// TODO(dmaretskyi): In the future we can replace the compiler with SWC with plugins running in WASM.
|
|
142
|
-
analyzeImports(result) {
|
|
143
|
-
invariant(result.outputFiles, void 0, {
|
|
144
|
-
F: __dxlog_file,
|
|
145
|
-
L: 150,
|
|
146
|
-
S: this,
|
|
147
|
-
A: [
|
|
148
|
-
"result.outputFiles",
|
|
149
|
-
""
|
|
150
|
-
]
|
|
151
|
-
});
|
|
152
|
-
const parsedImports = allMatches(IMPORT_REGEX, result.outputFiles[0].text);
|
|
153
|
-
return Object.values(result.metafile.outputs)[0].imports.map((entry) => {
|
|
154
|
-
const namedImports = [];
|
|
155
|
-
const parsedImport = parsedImports.find((capture) => capture?.[4] === entry.path);
|
|
156
|
-
if (parsedImport?.[2]) {
|
|
157
|
-
NAMED_IMPORTS_REGEX.lastIndex = 0;
|
|
158
|
-
const namedImportsMatch = NAMED_IMPORTS_REGEX.exec(parsedImport[2]);
|
|
159
|
-
if (namedImportsMatch) {
|
|
160
|
-
namedImportsMatch[1].split(",").forEach((importName) => {
|
|
161
|
-
namedImports.push(importName.trim());
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
moduleUrl: entry.path,
|
|
167
|
-
defaultImport: !!parsedImport?.[1],
|
|
168
|
-
namedImports
|
|
169
|
-
};
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
analyzeSourceFileImports(code) {
|
|
173
|
-
const parsedImports = allMatches(IMPORT_REGEX, code);
|
|
174
|
-
return parsedImports.map((capture) => {
|
|
175
|
-
return {
|
|
176
|
-
defaultImportName: capture[1],
|
|
177
|
-
namedImports: capture[2]?.split(",").map((importName) => importName.trim()),
|
|
178
|
-
wildcardImportName: capture[3],
|
|
179
|
-
moduleIdentifier: capture[4],
|
|
180
|
-
quotes: capture[5]
|
|
181
|
-
};
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
var IMPORT_REGEX = /import(?:(?:(?:[ \n\t]+([^ *\n\t{},]+)[ \n\t]*(?:,|[ \n\t]+))?([ \n\t]*{(?:[ \n\t]*[^ \n\t"'{}]+[ \n\t]*,?)+})?[ \n\t]*)|[ \n\t]*\*[ \n\t]*as[ \n\t]+([^ \n\t{}]+)[ \n\t]+)from[ \n\t]*(?:['"])([^'"\n]+)(['"])/gm;
|
|
186
|
-
var NAMED_IMPORTS_REGEX = /[ \n\t]*{((?:[ \n\t]*[^ \n\t"'{}]+[ \n\t]*,?)+)}[ \n\t]*/gm;
|
|
187
|
-
var allMatches = (regex, str) => {
|
|
188
|
-
regex.lastIndex = 0;
|
|
189
|
-
let match;
|
|
190
|
-
const matches = [];
|
|
191
|
-
while (match = regex.exec(str)) {
|
|
192
|
-
matches.push(match);
|
|
193
|
-
}
|
|
194
|
-
return matches;
|
|
195
|
-
};
|
|
196
|
-
var analyzeSourceFileImports = (code) => {
|
|
197
|
-
const parsedImports = allMatches(IMPORT_REGEX, code);
|
|
198
|
-
return parsedImports.map((capture) => {
|
|
199
|
-
return {
|
|
200
|
-
defaultImportName: capture[1],
|
|
201
|
-
namedImports: capture[2]?.trim().slice(1, -1).split(",").map((importName) => importName.trim()),
|
|
202
|
-
wildcardImportName: capture[3],
|
|
203
|
-
moduleIdentifier: capture[4],
|
|
204
|
-
quotes: capture[5]
|
|
205
|
-
};
|
|
206
|
-
});
|
|
207
|
-
};
|
|
208
|
-
var MAX_RETRIES = 5;
|
|
209
|
-
var INITIAL_DELAY = 1e3;
|
|
210
|
-
var httpPlugin = {
|
|
211
|
-
name: "http",
|
|
212
|
-
setup: (build2) => {
|
|
213
|
-
build2.onResolve({
|
|
214
|
-
filter: /^https?:\/\//
|
|
215
|
-
}, (args) => ({
|
|
216
|
-
path: args.path,
|
|
217
|
-
namespace: "http-url"
|
|
218
|
-
}));
|
|
219
|
-
build2.onResolve({
|
|
220
|
-
filter: /.*/,
|
|
221
|
-
namespace: "http-url"
|
|
222
|
-
}, (args) => ({
|
|
223
|
-
path: new URL(args.path, args.importer).toString(),
|
|
224
|
-
namespace: "http-url"
|
|
225
|
-
}));
|
|
226
|
-
build2.onLoad({
|
|
227
|
-
filter: /.*/,
|
|
228
|
-
namespace: "http-url"
|
|
229
|
-
}, async (args) => {
|
|
230
|
-
return Effect.gen(function* () {
|
|
231
|
-
const response = yield* HttpClient.get(args.path);
|
|
232
|
-
if (response.status !== 200) {
|
|
233
|
-
throw new Error(`failed to fetch: ${response.status}`);
|
|
234
|
-
}
|
|
235
|
-
const text = yield* response.text;
|
|
236
|
-
return {
|
|
237
|
-
contents: text,
|
|
238
|
-
loader: "jsx"
|
|
239
|
-
};
|
|
240
|
-
}).pipe(Effect.retry(pipe(Schedule.exponential(Duration.millis(INITIAL_DELAY)), Schedule.jittered, Schedule.intersect(Schedule.recurs(MAX_RETRIES - 1)))), Effect.provide(FetchHttpClient.layer), runAndForwardErrors);
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
export {
|
|
245
|
-
Bundler,
|
|
246
|
-
initializeBundler
|
|
247
|
-
};
|
|
248
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/bundler/bundler.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { FetchHttpClient, HttpClient } from '@effect/platform';\nimport { Duration, Effect, Schedule, pipe } from 'effect';\nimport { type BuildOptions, type BuildResult, type Loader, type Plugin, build, initialize } from 'esbuild-wasm';\n\nimport { subtleCrypto } from '@dxos/crypto';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nexport type Import = {\n moduleUrl: string;\n defaultImport: boolean;\n namedImports: string[];\n};\n\nexport type BundleOptions = {\n /**\n * Path to the source file on the local file system.\n * If provided, the path will be used instead of the `source` code.\n */\n path?: string;\n\n /**\n * Source code to bundle.\n * Required if `path` is not provided.\n */\n source?: string;\n};\n\nexport type BundleResult = {\n timestamp: number;\n sourceHash?: Buffer;\n imports?: Import[];\n bundle?: string;\n error?: any;\n};\n\nexport type BundlerOptions = {\n platform: BuildOptions['platform'];\n sandboxedModules: string[];\n remoteModules: Record<string, string>;\n};\n\nlet initialized: Promise<void>;\nexport const initializeBundler = async (options: { wasmUrl: string }) => {\n await (initialized ??= initialize({\n wasmURL: options.wasmUrl,\n }));\n};\n\n/**\n * ESBuild bundler.\n */\nexport class Bundler {\n constructor(private readonly _options: BundlerOptions) {}\n\n async bundle({ path, source }: BundleOptions): Promise<BundleResult> {\n const { sandboxedModules: providedModules, ...options } = this._options;\n\n const createResult = async (result?: Partial<BundleResult>) => {\n return {\n timestamp: Date.now(),\n sourceHash: source ? Buffer.from(await subtleCrypto.digest('SHA-256', Buffer.from(source))) : undefined,\n ...result,\n };\n };\n\n if (this._options.platform === 'browser') {\n invariant(initialized, 'Compiler not initialized.');\n await initialized;\n }\n\n const imports = source ? analyzeSourceFileImports(source) : [];\n\n // https://esbuild.github.io/api/#build\n try {\n const result = await build({\n platform: options.platform,\n conditions: ['workerd', 'browser'],\n metafile: true,\n write: false,\n entryPoints: [path ?? 'memory:main.tsx'],\n bundle: true,\n format: 'esm',\n plugins: [\n {\n name: 'memory',\n setup: (build) => {\n build.onResolve({ filter: /^\\.\\/runtime\\.js$/ }, ({ path }) => {\n return { path, external: true };\n });\n\n build.onResolve({ filter: /^dxos:functions$/ }, ({ path }) => {\n return { path: './runtime.js', external: true };\n });\n\n build.onResolve({ filter: /^memory:/ }, ({ path }) => {\n return { path: path.split(':')[1], namespace: 'memory' };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'memory' }, ({ path }) => {\n if (path === 'main.tsx') {\n return {\n contents: source,\n loader: 'tsx',\n };\n }\n });\n\n for (const module of providedModules) {\n build.onResolve({ filter: new RegExp(`^${module}$`) }, ({ path }) => {\n return { path, namespace: 'injected-module' };\n });\n }\n\n build.onLoad({ filter: /.*/, namespace: 'injected-module' }, ({ path }) => {\n const namedImports = imports.find((entry) => entry.moduleIdentifier === path)?.namedImports ?? [];\n return {\n contents: `\n const { ${namedImports.join(',')} } = window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path)}];\n export { ${namedImports.join(',')} };\n export default window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path)}].default;\n `,\n loader: 'tsx',\n };\n });\n },\n },\n httpPlugin,\n ],\n });\n\n log('compile complete', result.metafile);\n\n return await createResult({\n imports: this.analyzeImports(result),\n bundle: result.outputFiles![0].text,\n });\n } catch (err) {\n return await createResult({ error: err });\n }\n }\n\n // TODO(dmaretskyi): In the future we can replace the compiler with SWC with plugins running in WASM.\n analyzeImports(result: BuildResult): Import[] {\n invariant(result.outputFiles);\n\n // TODO(dmaretskyi): Support import aliases and wildcard imports.\n const parsedImports = allMatches(IMPORT_REGEX, result.outputFiles[0].text);\n return Object.values(result.metafile!.outputs)[0].imports.map((entry): Import => {\n const namedImports: string[] = [];\n\n const parsedImport = parsedImports.find((capture) => capture?.[4] === entry.path);\n if (parsedImport?.[2]) {\n NAMED_IMPORTS_REGEX.lastIndex = 0;\n const namedImportsMatch = NAMED_IMPORTS_REGEX.exec(parsedImport[2]);\n if (namedImportsMatch) {\n namedImportsMatch[1].split(',').forEach((importName) => {\n namedImports.push(importName.trim());\n });\n }\n }\n\n return {\n moduleUrl: entry.path,\n defaultImport: !!parsedImport?.[1],\n namedImports,\n };\n });\n }\n\n analyzeSourceFileImports(code: string): {\n defaultImportName: string;\n namedImports: string[];\n wildcardImportName: string;\n moduleIdentifier: string;\n quotes: string;\n }[] {\n // TODO(dmaretskyi): Support import aliases and wildcard imports.\n const parsedImports = allMatches(IMPORT_REGEX, code);\n return parsedImports.map((capture) => {\n return {\n defaultImportName: capture[1],\n namedImports: capture[2]?.split(',').map((importName) => importName.trim()),\n wildcardImportName: capture[3],\n moduleIdentifier: capture[4],\n quotes: capture[5],\n };\n });\n }\n}\n\n// https://regex101.com/r/FEN5ks/1\n// https://stackoverflow.com/a/73265022\n// $1 = default import name (can be non-existent)\n// $2 = destructured exports (can be non-existent)\n// $3 = wildcard import name (can be non-existent)\n// $4 = module identifier\n// $5 = quotes used (either ' or \")\nconst IMPORT_REGEX =\n /import(?:(?:(?:[ \\n\\t]+([^ *\\n\\t{},]+)[ \\n\\t]*(?:,|[ \\n\\t]+))?([ \\n\\t]*{(?:[ \\n\\t]*[^ \\n\\t\"'{}]+[ \\n\\t]*,?)+})?[ \\n\\t]*)|[ \\n\\t]*\\*[ \\n\\t]*as[ \\n\\t]+([^ \\n\\t{}]+)[ \\n\\t]+)from[ \\n\\t]*(?:['\"])([^'\"\\n]+)(['\"])/gm;\n\nconst NAMED_IMPORTS_REGEX = /[ \\n\\t]*{((?:[ \\n\\t]*[^ \\n\\t\"'{}]+[ \\n\\t]*,?)+)}[ \\n\\t]*/gm;\n\nconst allMatches = (regex: RegExp, str: string) => {\n regex.lastIndex = 0;\n\n let match;\n const matches = [];\n while ((match = regex.exec(str))) {\n matches.push(match);\n }\n\n return matches;\n};\n\ntype ParsedImport = {\n defaultImportName?: string;\n namedImports: string[];\n wildcardImportName?: string;\n moduleIdentifier: string;\n quotes: string;\n};\n\nconst analyzeSourceFileImports = (code: string): ParsedImport[] => {\n // TODO(dmaretskyi): Support import aliases and wildcard imports.\n const parsedImports = allMatches(IMPORT_REGEX, code);\n return parsedImports.map((capture) => {\n return {\n defaultImportName: capture[1],\n namedImports: capture[2]\n ?.trim()\n .slice(1, -1)\n .split(',')\n .map((importName) => importName.trim()),\n wildcardImportName: capture[3],\n moduleIdentifier: capture[4],\n quotes: capture[5],\n };\n });\n};\n\nconst MAX_RETRIES = 5;\nconst INITIAL_DELAY = 1_000;\n\nconst httpPlugin: Plugin = {\n name: 'http',\n setup: (build) => {\n // Intercept import paths starting with \"http:\" and \"https:\" so esbuild doesn't attempt to map them to a file system location.\n // Tag them with the \"http-url\" namespace to associate them with this plugin.\n build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n path: args.path,\n namespace: 'http-url',\n }));\n\n // We also want to intercept all import paths inside downloaded files and resolve them against the original URL.\n // All of these files will be in the \"http-url\" namespace.\n // Make sure to keep the newly resolved URL in the \"http-url\" namespace so imports inside it will also be resolved as URLs recursively.\n build.onResolve({ filter: /.*/, namespace: 'http-url' }, (args) => ({\n path: new URL(args.path, args.importer).toString(),\n namespace: 'http-url',\n }));\n\n // When a URL is loaded, we want to actually download the content from the internet.\n // This has just enough logic to be able to handle the example import from unpkg.com but in reality this would probably need to be more complex.\n build.onLoad({ filter: /.*/, namespace: 'http-url' }, async (args) => {\n return Effect.gen(function* () {\n const response = yield* HttpClient.get(args.path);\n if (response.status !== 200) {\n throw new Error(`failed to fetch: ${response.status}`);\n }\n\n const text = yield* response.text;\n return { contents: text, loader: 'jsx' as Loader };\n }).pipe(\n Effect.retry(\n pipe(\n Schedule.exponential(Duration.millis(INITIAL_DELAY)),\n Schedule.jittered,\n Schedule.intersect(Schedule.recurs(MAX_RETRIES - 1)),\n ),\n ),\n Effect.provide(FetchHttpClient.layer),\n runAndForwardErrors,\n );\n });\n },\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["FetchHttpClient", "HttpClient", "Duration", "Effect", "Schedule", "pipe", "build", "initialize", "subtleCrypto", "runAndForwardErrors", "invariant", "log", "initialized", "initializeBundler", "options", "wasmURL", "wasmUrl", "Bundler", "_options", "bundle", "path", "source", "sandboxedModules", "providedModules", "createResult", "result", "timestamp", "Date", "now", "sourceHash", "Buffer", "from", "digest", "undefined", "platform", "imports", "analyzeSourceFileImports", "conditions", "metafile", "write", "entryPoints", "format", "plugins", "name", "setup", "onResolve", "filter", "external", "split", "namespace", "onLoad", "contents", "loader", "module", "RegExp", "namedImports", "find", "entry", "moduleIdentifier", "join", "JSON", "stringify", "httpPlugin", "analyzeImports", "outputFiles", "text", "err", "error", "parsedImports", "allMatches", "IMPORT_REGEX", "Object", "values", "outputs", "map", "parsedImport", "capture", "NAMED_IMPORTS_REGEX", "lastIndex", "namedImportsMatch", "exec", "forEach", "importName", "push", "trim", "moduleUrl", "defaultImport", "code", "defaultImportName", "wildcardImportName", "quotes", "regex", "str", "match", "matches", "slice", "MAX_RETRIES", "INITIAL_DELAY", "args", "URL", "importer", "toString", "gen", "response", "get", "status", "Error", "retry", "exponential", "millis", "jittered", "intersect", "recurs", "provide", "layer"]
|
|
7
|
-
}
|