@dxos/plugin-script 0.8.4-main.2c6827d → 0.8.4-main.3c1ae3b
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/dist/lib/browser/DeploymentDialog-FIHD4UVK.mjs +15 -0
- package/dist/lib/browser/{NotebookContainer-RTESC4OV.mjs → NotebookContainer-GL2Z5I5Q.mjs} +26 -26
- package/dist/lib/browser/NotebookContainer-GL2Z5I5Q.mjs.map +7 -0
- package/dist/lib/browser/{ScriptContainer-T2BAZDJ4.mjs → ScriptContainer-F4OK3OG6.mjs} +9 -7
- package/dist/lib/browser/ScriptContainer-F4OK3OG6.mjs.map +7 -0
- package/dist/lib/browser/{chunk-4M7U2WVT.mjs → chunk-2SXDKBM7.mjs} +7 -7
- package/dist/lib/browser/chunk-2SXDKBM7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-M6KJPUJK.mjs → chunk-6X7QVTRB.mjs} +4 -3
- package/dist/lib/browser/{chunk-M6KJPUJK.mjs.map → chunk-6X7QVTRB.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-3IJASGG5.mjs → chunk-75RTLLH4.mjs} +2 -2
- package/dist/lib/browser/{chunk-GAFCKEII.mjs → chunk-7WFISUBY.mjs} +11 -10
- package/dist/lib/browser/chunk-7WFISUBY.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LNNCD2H4.mjs → chunk-MQHBMJLH.mjs} +7 -6
- package/dist/lib/browser/chunk-MQHBMJLH.mjs.map +7 -0
- package/dist/lib/browser/{chunk-2G2NA6DQ.mjs → chunk-S22N3BUR.mjs} +5 -5
- package/dist/lib/browser/chunk-S22N3BUR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5JSNQYZZ.mjs → chunk-UGDRMROB.mjs} +147 -122
- package/dist/lib/browser/chunk-UGDRMROB.mjs.map +7 -0
- package/dist/lib/browser/compiler-2HV5KXV4.mjs +143 -0
- package/dist/lib/browser/compiler-2HV5KXV4.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +40 -58
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/{intent-resolver-AFJ575VK.mjs → intent-resolver-3B4ESSCU.mjs} +9 -8
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-QEQ3QUQA.mjs → react-surface-ASV2KBRA.mjs} +15 -15
- package/dist/lib/browser/react-surface-ASV2KBRA.mjs.map +7 -0
- package/dist/lib/browser/{settings-LNLSTZM4.mjs → settings-4NKLTJTT.mjs} +3 -3
- package/dist/lib/browser/templates/index.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node-esm/{DeploymentDialog-GL5AUWMR.mjs → DeploymentDialog-5EN2KZE5.mjs} +6 -5
- package/dist/lib/node-esm/{NotebookContainer-SVD3A3D6.mjs → NotebookContainer-7RCEXND7.mjs} +26 -26
- package/dist/lib/node-esm/NotebookContainer-7RCEXND7.mjs.map +7 -0
- package/dist/lib/node-esm/{ScriptContainer-2CE3H3JJ.mjs → ScriptContainer-763IAKOD.mjs} +9 -7
- package/dist/lib/node-esm/ScriptContainer-763IAKOD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-57JA6XL5.mjs → chunk-2S43VHAM.mjs} +5 -5
- package/dist/lib/node-esm/chunk-2S43VHAM.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-NNHWLRHT.mjs → chunk-32AMTGGN.mjs} +7 -6
- package/dist/lib/node-esm/chunk-32AMTGGN.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-IQTBVH4L.mjs → chunk-4VVV5L5A.mjs} +147 -122
- package/dist/lib/node-esm/chunk-4VVV5L5A.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-RIE676OW.mjs → chunk-535YDI5V.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-HDKR5WCD.mjs → chunk-6H4FYMCX.mjs} +4 -3
- package/dist/lib/node-esm/{chunk-HDKR5WCD.mjs.map → chunk-6H4FYMCX.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-KJKZ4KNO.mjs → chunk-DKS2EQW6.mjs} +11 -10
- package/dist/lib/node-esm/chunk-DKS2EQW6.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YRTA4EHU.mjs → chunk-NQN3JE2R.mjs} +7 -7
- package/dist/lib/node-esm/chunk-NQN3JE2R.mjs.map +7 -0
- package/dist/lib/node-esm/compiler-KPEZKEHC.mjs +144 -0
- package/dist/lib/node-esm/compiler-KPEZKEHC.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +40 -58
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/{intent-resolver-A5VVK746.mjs → intent-resolver-GIACMXI4.mjs} +9 -8
- package/dist/lib/{browser/intent-resolver-AFJ575VK.mjs.map → node-esm/intent-resolver-GIACMXI4.mjs.map} +1 -1
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-U77YT7VF.mjs → react-surface-NXBO7VYB.mjs} +15 -15
- package/dist/lib/node-esm/react-surface-NXBO7VYB.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-IUFMOCXY.mjs → settings-PW5NXWLW.mjs} +3 -3
- package/dist/lib/node-esm/templates/index.mjs +1 -1
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/compiler.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/compiler/compiler.d.ts +1 -1
- package/dist/types/src/compiler/compiler.d.ts.map +1 -1
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +3 -0
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
- package/dist/types/src/components/NotebookContainer.d.ts.map +1 -1
- package/dist/types/src/components/NotebookContainer.stories.d.ts +3 -0
- package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -1
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +3 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -1
- package/dist/types/src/components/QueryEditor/QueryEditor.d.ts +5 -0
- package/dist/types/src/components/QueryEditor/QueryEditor.d.ts.map +1 -0
- package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts +13 -0
- package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/QueryEditor/index.d.ts +2 -0
- package/dist/types/src/components/QueryEditor/index.d.ts.map +1 -0
- package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +3 -0
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
- package/dist/types/src/e2e/deploy.test.d.ts +2 -0
- package/dist/types/src/e2e/deploy.test.d.ts.map +1 -0
- package/dist/types/src/hooks/deploy.d.ts +3 -21
- package/dist/types/src/hooks/deploy.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useCompiler.d.ts +7 -0
- package/dist/types/src/hooks/useCompiler.d.ts.map +1 -0
- package/dist/types/src/templates/chess.d.ts +6 -1
- package/dist/types/src/templates/chess.d.ts.map +1 -1
- package/dist/types/src/templates/forex-effect.d.ts +4 -1
- package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
- package/dist/types/src/templates/forex.d.ts +4 -1
- package/dist/types/src/templates/forex.d.ts.map +1 -1
- package/dist/types/src/testing/deploy.test.d.ts +2 -0
- package/dist/types/src/testing/deploy.test.d.ts.map +1 -0
- package/dist/types/src/testing/simulator.test.d.ts +2 -0
- package/dist/types/src/testing/simulator.test.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +2 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Notebook.d.ts +7 -7
- package/dist/types/src/types/Notebook.d.ts.map +1 -1
- package/dist/types/src/types/actions.d.ts +3 -3
- package/dist/types/src/util/deploy.d.ts.map +1 -1
- package/dist/types/src/util/functions.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +63 -59
- package/src/ScriptPlugin.tsx +13 -28
- package/src/capabilities/artifact-definition.ts +11 -11
- package/src/capabilities/compiler.ts +66 -16
- package/src/capabilities/react-surface.tsx +5 -6
- package/src/compiler/compiler.ts +10 -3
- package/src/components/FrameContainer/FrameContainer.tsx +3 -1
- package/src/components/NotebookContainer.tsx +14 -17
- package/src/components/NotebookStack/NotebookCell.tsx +6 -4
- package/src/components/QueryEditor/QueryEditor.stories.tsx +89 -0
- package/src/components/QueryEditor/QueryEditor.tsx +47 -0
- package/src/components/QueryEditor/index.ts +5 -0
- package/src/components/ScriptContainer.tsx +3 -2
- package/src/components/Settings/ScriptObjectSettings.tsx +5 -4
- package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +1 -1
- package/src/components/TypescriptEditor/TypescriptEditor.tsx +2 -2
- package/src/e2e/deploy.test.ts +64 -0
- package/src/hooks/deploy.ts +3 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useCompiler.ts +23 -0
- package/src/templates/chess.ts +9 -8
- package/src/templates/data-generator.ts +1 -1
- package/src/templates/forex-effect.ts +22 -27
- package/src/templates/forex.ts +7 -6
- package/src/testing/deploy.test.ts +63 -0
- package/src/testing/simulator.test.ts +40 -0
- package/src/translations.ts +2 -0
- package/src/types/Notebook.ts +5 -4
- package/src/util/deploy.ts +18 -28
- package/src/util/functions.ts +3 -2
- package/src/vite-env.d.ts +2 -0
- package/dist/lib/browser/DeploymentDialog-MZX4T77L.mjs +0 -14
- package/dist/lib/browser/NotebookContainer-RTESC4OV.mjs.map +0 -7
- package/dist/lib/browser/ScriptContainer-T2BAZDJ4.mjs.map +0 -7
- package/dist/lib/browser/chunk-2G2NA6DQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-4M7U2WVT.mjs.map +0 -7
- package/dist/lib/browser/chunk-5JSNQYZZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-GAFCKEII.mjs.map +0 -7
- package/dist/lib/browser/chunk-LNNCD2H4.mjs.map +0 -7
- package/dist/lib/browser/compiler-4KHRSX7J.mjs +0 -86
- package/dist/lib/browser/compiler-4KHRSX7J.mjs.map +0 -7
- package/dist/lib/browser/react-surface-QEQ3QUQA.mjs.map +0 -7
- package/dist/lib/node-esm/NotebookContainer-SVD3A3D6.mjs.map +0 -7
- package/dist/lib/node-esm/ScriptContainer-2CE3H3JJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57JA6XL5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IQTBVH4L.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KJKZ4KNO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NNHWLRHT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YRTA4EHU.mjs.map +0 -7
- package/dist/lib/node-esm/compiler-DU5NQISX.mjs +0 -87
- package/dist/lib/node-esm/compiler-DU5NQISX.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-U77YT7VF.mjs.map +0 -7
- /package/dist/lib/browser/{DeploymentDialog-MZX4T77L.mjs.map → DeploymentDialog-FIHD4UVK.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-3IJASGG5.mjs.map → chunk-75RTLLH4.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-resolver-A5VVK746.mjs.map → browser/intent-resolver-3B4ESSCU.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-LNLSTZM4.mjs.map → settings-4NKLTJTT.mjs.map} +0 -0
- /package/dist/lib/node-esm/{DeploymentDialog-GL5AUWMR.mjs.map → DeploymentDialog-5EN2KZE5.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-RIE676OW.mjs.map → chunk-535YDI5V.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-IUFMOCXY.mjs.map → settings-PW5NXWLW.mjs.map} +0 -0
|
@@ -1,22 +1,98 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ScriptAction
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MQHBMJLH.mjs";
|
|
4
4
|
import {
|
|
5
5
|
templates
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-S22N3BUR.mjs";
|
|
7
|
+
import {
|
|
8
|
+
ScriptCapabilities
|
|
9
|
+
} from "./chunk-UOQ6NCH3.mjs";
|
|
7
10
|
import {
|
|
8
11
|
meta
|
|
9
12
|
} from "./chunk-EB6AXFXO.mjs";
|
|
10
13
|
|
|
14
|
+
// src/util/deploy.ts
|
|
15
|
+
import { Obj, Ref } from "@dxos/echo";
|
|
16
|
+
import { Function, getUserFunctionIdInMetadata } from "@dxos/functions";
|
|
17
|
+
import { bundleFunction } from "@dxos/functions-runtime/bundler";
|
|
18
|
+
import { FunctionsServiceClient, incrementSemverPatch } from "@dxos/functions-runtime/edge";
|
|
19
|
+
import { log } from "@dxos/log";
|
|
20
|
+
import { FunctionRuntimeKind } from "@dxos/protocols";
|
|
21
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-script/src/util/deploy.ts";
|
|
22
|
+
var isScriptDeployed = ({ script, fn }) => {
|
|
23
|
+
const existingFunctionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));
|
|
24
|
+
return Boolean(existingFunctionId) && !script.changed;
|
|
25
|
+
};
|
|
26
|
+
var deployScript = async ({ script, client, space, fn, existingFunctionId }) => {
|
|
27
|
+
const validationError = validateDeployInputs(script, space);
|
|
28
|
+
if (validationError) {
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: validationError
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const buildResult = await bundleFunction({
|
|
36
|
+
source: script.source.target.content
|
|
37
|
+
});
|
|
38
|
+
if ("error" in buildResult) {
|
|
39
|
+
throw buildResult.error || new Error("Bundle creation failed");
|
|
40
|
+
}
|
|
41
|
+
const functionsServiceClient = FunctionsServiceClient.fromClient(client);
|
|
42
|
+
const newFunction = await functionsServiceClient.deploy({
|
|
43
|
+
// TODO(dmaretskyi): Space key or identity key.
|
|
44
|
+
ownerPublicKey: space.key,
|
|
45
|
+
version: fn ? incrementSemverPatch(fn.version) : "0.0.1",
|
|
46
|
+
functionId: existingFunctionId,
|
|
47
|
+
entryPoint: buildResult.entryPoint,
|
|
48
|
+
assets: buildResult.assets,
|
|
49
|
+
runtime: FunctionRuntimeKind.enums.WORKER_LOADER
|
|
50
|
+
});
|
|
51
|
+
const storedFunction = createOrUpdateFunctionInSpace(space, fn, script, newFunction);
|
|
52
|
+
script.changed = false;
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
functionId: getUserFunctionIdInMetadata(Obj.getMeta(storedFunction))
|
|
56
|
+
};
|
|
57
|
+
} catch (err) {
|
|
58
|
+
log.catch(err, void 0, {
|
|
59
|
+
F: __dxlog_file,
|
|
60
|
+
L: 68,
|
|
61
|
+
S: void 0,
|
|
62
|
+
C: (f, a) => f(...a)
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: err
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
var validateDeployInputs = (script, space) => {
|
|
71
|
+
if (!script.source || !space) {
|
|
72
|
+
return new Error("Script source or space not available");
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
};
|
|
76
|
+
var createOrUpdateFunctionInSpace = (space, fn, script, newFunction) => {
|
|
77
|
+
if (fn) {
|
|
78
|
+
Function.setFrom(fn, newFunction);
|
|
79
|
+
return fn;
|
|
80
|
+
} else {
|
|
81
|
+
newFunction.source = Ref.make(script);
|
|
82
|
+
return space.db.add(newFunction);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
11
86
|
// src/util/functions.ts
|
|
12
|
-
import {
|
|
87
|
+
import { Obj as Obj2 } from "@dxos/echo";
|
|
88
|
+
import { getUserFunctionIdInMetadata as getUserFunctionIdInMetadata2 } from "@dxos/functions";
|
|
13
89
|
import { getInvocationUrl } from "@dxos/functions-runtime";
|
|
14
|
-
import { log } from "@dxos/log";
|
|
15
|
-
import {
|
|
16
|
-
var
|
|
90
|
+
import { log as log2 } from "@dxos/log";
|
|
91
|
+
import { getSpace } from "@dxos/react-client/echo";
|
|
92
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-script/src/util/functions.ts";
|
|
17
93
|
var getFunctionUrl = ({ script, fn, edgeUrl }) => {
|
|
18
94
|
const space = getSpace(script);
|
|
19
|
-
const existingFunctionId = fn &&
|
|
95
|
+
const existingFunctionId = fn && getUserFunctionIdInMetadata2(Obj2.getMeta(fn));
|
|
20
96
|
if (!existingFunctionId) {
|
|
21
97
|
return void 0;
|
|
22
98
|
}
|
|
@@ -30,11 +106,11 @@ var updateFunctionMetadata = (script, storedFunction, meta2, functionId) => {
|
|
|
30
106
|
} else if (meta2.description) {
|
|
31
107
|
storedFunction.description = meta2.description;
|
|
32
108
|
} else {
|
|
33
|
-
|
|
109
|
+
log2.verbose("no description in function metadata", {
|
|
34
110
|
functionId
|
|
35
111
|
}, {
|
|
36
|
-
F:
|
|
37
|
-
L:
|
|
112
|
+
F: __dxlog_file2,
|
|
113
|
+
L: 47,
|
|
38
114
|
S: void 0,
|
|
39
115
|
C: (f, a) => f(...a)
|
|
40
116
|
});
|
|
@@ -42,11 +118,11 @@ var updateFunctionMetadata = (script, storedFunction, meta2, functionId) => {
|
|
|
42
118
|
if (meta2.inputSchema) {
|
|
43
119
|
storedFunction.inputSchema = meta2.inputSchema;
|
|
44
120
|
} else {
|
|
45
|
-
|
|
121
|
+
log2.verbose("no input schema in function metadata", {
|
|
46
122
|
functionId
|
|
47
123
|
}, {
|
|
48
|
-
F:
|
|
49
|
-
L:
|
|
124
|
+
F: __dxlog_file2,
|
|
125
|
+
L: 53,
|
|
50
126
|
S: void 0,
|
|
51
127
|
C: (f, a) => f(...a)
|
|
52
128
|
});
|
|
@@ -54,11 +130,11 @@ var updateFunctionMetadata = (script, storedFunction, meta2, functionId) => {
|
|
|
54
130
|
if (meta2.outputSchema) {
|
|
55
131
|
storedFunction.outputSchema = meta2.outputSchema;
|
|
56
132
|
} else {
|
|
57
|
-
|
|
133
|
+
log2.verbose("no output schema in function metadata", {
|
|
58
134
|
functionId
|
|
59
135
|
}, {
|
|
60
|
-
F:
|
|
61
|
-
L:
|
|
136
|
+
F: __dxlog_file2,
|
|
137
|
+
L: 59,
|
|
62
138
|
S: void 0,
|
|
63
139
|
C: (f, a) => f(...a)
|
|
64
140
|
});
|
|
@@ -66,11 +142,11 @@ var updateFunctionMetadata = (script, storedFunction, meta2, functionId) => {
|
|
|
66
142
|
if (meta2.key) {
|
|
67
143
|
storedFunction.key = meta2.key;
|
|
68
144
|
} else {
|
|
69
|
-
|
|
145
|
+
log2.verbose("no key in function metadata", {
|
|
70
146
|
functionId
|
|
71
147
|
}, {
|
|
72
|
-
F:
|
|
73
|
-
L:
|
|
148
|
+
F: __dxlog_file2,
|
|
149
|
+
L: 65,
|
|
74
150
|
S: void 0,
|
|
75
151
|
C: (f, a) => f(...a)
|
|
76
152
|
});
|
|
@@ -95,104 +171,13 @@ var getAccessCredential = (identityKey) => {
|
|
|
95
171
|
};
|
|
96
172
|
};
|
|
97
173
|
|
|
98
|
-
// src/util/deploy.ts
|
|
99
|
-
import { Obj, Ref } from "@dxos/echo";
|
|
100
|
-
import { Function, getUserFunctionIdInMetadata as getUserFunctionIdInMetadata2, setUserFunctionIdInMetadata } from "@dxos/functions";
|
|
101
|
-
import { Bundler } from "@dxos/functions-runtime/bundler";
|
|
102
|
-
import { incrementSemverPatch, uploadWorkerFunction } from "@dxos/functions-runtime/edge";
|
|
103
|
-
import { log as log2 } from "@dxos/log";
|
|
104
|
-
import { isNode } from "@dxos/util";
|
|
105
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-script/src/util/deploy.ts";
|
|
106
|
-
var isScriptDeployed = ({ script, fn }) => {
|
|
107
|
-
const existingFunctionId = fn && getUserFunctionIdInMetadata2(Obj.getMeta(fn));
|
|
108
|
-
return Boolean(existingFunctionId) && !script.changed;
|
|
109
|
-
};
|
|
110
|
-
var deployScript = async ({ script, client, space, fn, existingFunctionId }) => {
|
|
111
|
-
const validationError = validateDeployInputs(script, space);
|
|
112
|
-
if (validationError) {
|
|
113
|
-
return {
|
|
114
|
-
success: false,
|
|
115
|
-
error: validationError
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
const bundler = new Bundler({
|
|
120
|
-
platform: isNode() ? "node" : "browser",
|
|
121
|
-
sandboxedModules: [],
|
|
122
|
-
remoteModules: {}
|
|
123
|
-
});
|
|
124
|
-
const buildResult = await bundler.bundle({
|
|
125
|
-
source: script.source.target.content
|
|
126
|
-
});
|
|
127
|
-
if ("error" in buildResult) {
|
|
128
|
-
throw buildResult.error || new Error("Bundle creation failed");
|
|
129
|
-
}
|
|
130
|
-
const { functionId, version, meta: meta2 } = await uploadWorkerFunction({
|
|
131
|
-
client,
|
|
132
|
-
ownerPublicKey: space.key,
|
|
133
|
-
version: fn ? incrementSemverPatch(fn.version) : "0.0.1",
|
|
134
|
-
functionId: existingFunctionId,
|
|
135
|
-
entryPoint: buildResult.entryPoint,
|
|
136
|
-
assets: {
|
|
137
|
-
[buildResult.entryPoint]: buildResult.asset
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
if (functionId === void 0 || version === void 0) {
|
|
141
|
-
throw new Error(`Upload didn't return expected data: ${JSON.stringify({
|
|
142
|
-
functionId,
|
|
143
|
-
version
|
|
144
|
-
})}`);
|
|
145
|
-
}
|
|
146
|
-
const storedFunction = createOrUpdateFunctionInSpace(space, fn, script, functionId, version);
|
|
147
|
-
script.changed = false;
|
|
148
|
-
updateFunctionMetadata(script, storedFunction, meta2, functionId);
|
|
149
|
-
setUserFunctionIdInMetadata(Obj.getMeta(storedFunction), functionId);
|
|
150
|
-
return {
|
|
151
|
-
success: true,
|
|
152
|
-
functionId
|
|
153
|
-
};
|
|
154
|
-
} catch (err) {
|
|
155
|
-
log2.catch(err, void 0, {
|
|
156
|
-
F: __dxlog_file2,
|
|
157
|
-
L: 74,
|
|
158
|
-
S: void 0,
|
|
159
|
-
C: (f, a) => f(...a)
|
|
160
|
-
});
|
|
161
|
-
return {
|
|
162
|
-
success: false,
|
|
163
|
-
error: err
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
var validateDeployInputs = (script, space) => {
|
|
168
|
-
if (!script.source || !space) {
|
|
169
|
-
return new Error("Script source or space not available");
|
|
170
|
-
}
|
|
171
|
-
return null;
|
|
172
|
-
};
|
|
173
|
-
var createOrUpdateFunctionInSpace = (space, fn, script, functionId, version) => {
|
|
174
|
-
if (fn) {
|
|
175
|
-
fn.name = script.name ?? "New Function";
|
|
176
|
-
fn.version = version;
|
|
177
|
-
return fn;
|
|
178
|
-
} else {
|
|
179
|
-
const fn2 = Function.make({
|
|
180
|
-
name: script.name ?? "New Function",
|
|
181
|
-
version,
|
|
182
|
-
source: Ref.make(script)
|
|
183
|
-
});
|
|
184
|
-
space.db.add(fn2);
|
|
185
|
-
setUserFunctionIdInMetadata(Obj.getMeta(fn2), functionId);
|
|
186
|
-
return fn2;
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
|
|
190
174
|
// src/hooks/deploy.ts
|
|
191
175
|
import { useEffect, useMemo } from "react";
|
|
176
|
+
import { Obj as Obj3, Query, Ref as Ref2 } from "@dxos/echo";
|
|
192
177
|
import { Function as Function2, getUserFunctionIdInMetadata as getUserFunctionIdInMetadata3 } from "@dxos/functions";
|
|
193
178
|
import { log as log3 } from "@dxos/log";
|
|
194
179
|
import { useClient } from "@dxos/react-client";
|
|
195
|
-
import {
|
|
180
|
+
import { getSpace as getSpace2, useQuery } from "@dxos/react-client/echo";
|
|
196
181
|
import { createMenuAction } from "@dxos/react-ui-menu";
|
|
197
182
|
import { errorMessageColors } from "@dxos/react-ui-theme";
|
|
198
183
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-script/src/hooks/deploy.ts";
|
|
@@ -225,7 +210,7 @@ var createDeploy = ({ state, script, space, fn, client, existingFunctionId, t })
|
|
|
225
210
|
if (!result.success) {
|
|
226
211
|
log3.catch(result.error, void 0, {
|
|
227
212
|
F: __dxlog_file3,
|
|
228
|
-
L:
|
|
213
|
+
L: 60,
|
|
229
214
|
S: void 0,
|
|
230
215
|
C: (f, a) => f(...a)
|
|
231
216
|
});
|
|
@@ -319,7 +304,7 @@ var useDeployDeps = ({ script }) => {
|
|
|
319
304
|
const [fn] = useQuery(space, Query.type(Function2.Function, {
|
|
320
305
|
source: Ref2.make(script)
|
|
321
306
|
}));
|
|
322
|
-
const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata3(
|
|
307
|
+
const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata3(Obj3.getMeta(fn)), [
|
|
323
308
|
fn
|
|
324
309
|
]);
|
|
325
310
|
return {
|
|
@@ -337,6 +322,38 @@ var useToolbarState = (initialState = {}) => {
|
|
|
337
322
|
return useMemo2(() => live(initialState), []);
|
|
338
323
|
};
|
|
339
324
|
|
|
325
|
+
// src/hooks/useCompiler.ts
|
|
326
|
+
import { useCapabilities, usePluginManager } from "@dxos/app-framework/react";
|
|
327
|
+
import { useAsyncEffect } from "@dxos/react-ui";
|
|
328
|
+
|
|
329
|
+
// src/capabilities/index.ts
|
|
330
|
+
import { lazy } from "@dxos/app-framework";
|
|
331
|
+
var AppGraphBuilder = lazy(() => import("./app-graph-builder-2WR2ATTJ.mjs"));
|
|
332
|
+
var BlueprintDefinition = lazy(() => import("./blueprint-definition-6PZWZM2Y.mjs"));
|
|
333
|
+
var Compiler = lazy(() => import("./compiler-2HV5KXV4.mjs"));
|
|
334
|
+
var IntentResolver = lazy(() => import("./intent-resolver-3B4ESSCU.mjs"));
|
|
335
|
+
var ReactSurface = lazy(() => import("./react-surface-ASV2KBRA.mjs"));
|
|
336
|
+
var ScriptSettings = lazy(() => import("./settings-4NKLTJTT.mjs"));
|
|
337
|
+
|
|
338
|
+
// src/events.ts
|
|
339
|
+
import { defineEvent } from "@dxos/app-framework";
|
|
340
|
+
(function(ScriptEvents2) {
|
|
341
|
+
ScriptEvents2.SetupCompiler = defineEvent(`${meta.id}/event/setup-compiler`);
|
|
342
|
+
})(ScriptEvents || (ScriptEvents = {}));
|
|
343
|
+
var ScriptEvents;
|
|
344
|
+
|
|
345
|
+
// src/hooks/useCompiler.ts
|
|
346
|
+
var useCompiler = () => {
|
|
347
|
+
const manager = usePluginManager();
|
|
348
|
+
useAsyncEffect(async () => {
|
|
349
|
+
await manager.activate(ScriptEvents.SetupCompiler);
|
|
350
|
+
}, [
|
|
351
|
+
manager
|
|
352
|
+
]);
|
|
353
|
+
const [compiler] = useCapabilities(ScriptCapabilities.Compiler);
|
|
354
|
+
return compiler;
|
|
355
|
+
};
|
|
356
|
+
|
|
340
357
|
// src/hooks/format.ts
|
|
341
358
|
import { format } from "prettier";
|
|
342
359
|
import prettierPluginEstree from "prettier/plugins/estree";
|
|
@@ -390,7 +407,7 @@ var createFormat = (script) => {
|
|
|
390
407
|
};
|
|
391
408
|
|
|
392
409
|
// src/hooks/template.ts
|
|
393
|
-
import { Obj as
|
|
410
|
+
import { Obj as Obj4 } from "@dxos/echo";
|
|
394
411
|
import { FUNCTIONS_PRESET_META_KEY } from "@dxos/functions";
|
|
395
412
|
import { createMenuAction as createMenuAction3 } from "@dxos/react-ui-menu";
|
|
396
413
|
var createTemplateSelectActions = (script) => {
|
|
@@ -398,7 +415,7 @@ var createTemplateSelectActions = (script) => {
|
|
|
398
415
|
return createMenuAction3(`template--${template.id}`, () => {
|
|
399
416
|
script.name = template.name;
|
|
400
417
|
script.source.target.content = template.source;
|
|
401
|
-
const metaKeys =
|
|
418
|
+
const metaKeys = Obj4.getMeta(script).keys;
|
|
402
419
|
const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);
|
|
403
420
|
if (oldPresetIndex >= 0) {
|
|
404
421
|
metaKeys.splice(oldPresetIndex, 1);
|
|
@@ -440,7 +457,7 @@ import * as Function3 from "effect/Function";
|
|
|
440
457
|
import { useCallback, useState } from "react";
|
|
441
458
|
import { chain, createIntent } from "@dxos/app-framework";
|
|
442
459
|
import { useIntentDispatcher } from "@dxos/app-framework/react";
|
|
443
|
-
import { Obj as
|
|
460
|
+
import { Obj as Obj5 } from "@dxos/echo";
|
|
444
461
|
import { Script } from "@dxos/functions";
|
|
445
462
|
import { invariant } from "@dxos/invariant";
|
|
446
463
|
import { SpaceAction } from "@dxos/plugin-space/types";
|
|
@@ -470,7 +487,7 @@ var useCreateAndDeployScriptTemplates = (space, scriptTemplates) => {
|
|
|
470
487
|
}), chain(SpaceAction.AddObject, {
|
|
471
488
|
target: space
|
|
472
489
|
})));
|
|
473
|
-
invariant(
|
|
490
|
+
invariant(Obj5.instanceOf(Script.Script, result.data?.object), void 0, {
|
|
474
491
|
F: __dxlog_file5,
|
|
475
492
|
L: 52,
|
|
476
493
|
S: void 0,
|
|
@@ -501,17 +518,25 @@ var useCreateAndDeployScriptTemplates = (space, scriptTemplates) => {
|
|
|
501
518
|
};
|
|
502
519
|
|
|
503
520
|
export {
|
|
521
|
+
isScriptDeployed,
|
|
522
|
+
deployScript,
|
|
504
523
|
getFunctionUrl,
|
|
505
524
|
updateFunctionMetadata,
|
|
506
525
|
getAccessCredential,
|
|
507
|
-
isScriptDeployed,
|
|
508
|
-
deployScript,
|
|
509
526
|
createDeploy,
|
|
510
527
|
useDeployState,
|
|
511
528
|
useDeployDeps,
|
|
512
529
|
createFormat,
|
|
513
530
|
createTemplateSelect,
|
|
514
531
|
useCreateAndDeployScriptTemplates,
|
|
515
|
-
useToolbarState
|
|
532
|
+
useToolbarState,
|
|
533
|
+
ScriptEvents,
|
|
534
|
+
useCompiler,
|
|
535
|
+
AppGraphBuilder,
|
|
536
|
+
BlueprintDefinition,
|
|
537
|
+
Compiler,
|
|
538
|
+
IntentResolver,
|
|
539
|
+
ReactSurface,
|
|
540
|
+
ScriptSettings
|
|
516
541
|
};
|
|
517
|
-
//# sourceMappingURL=chunk-
|
|
542
|
+
//# sourceMappingURL=chunk-UGDRMROB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/util/deploy.ts", "../../../src/util/functions.ts", "../../../src/hooks/deploy.ts", "../../../src/hooks/useToolbarState.ts", "../../../src/hooks/useCompiler.ts", "../../../src/capabilities/index.ts", "../../../src/events.ts", "../../../src/hooks/format.ts", "../../../src/hooks/template.ts", "../../../src/hooks/useCreateAndDeployScriptTemplates.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Client } from '@dxos/client';\nimport { Obj, Ref } from '@dxos/echo';\nimport { Function, type Script, getUserFunctionIdInMetadata } from '@dxos/functions';\nimport { bundleFunction } from '@dxos/functions-runtime/bundler';\nimport { FunctionsServiceClient, incrementSemverPatch } from '@dxos/functions-runtime/edge';\nimport { log } from '@dxos/log';\nimport { FunctionRuntimeKind } from '@dxos/protocols';\nimport { type Space } from '@dxos/react-client/echo';\n\nexport const isScriptDeployed = ({ script, fn }: { script: Script.Script; fn: any }): boolean => {\n const existingFunctionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));\n return Boolean(existingFunctionId) && !script.changed;\n};\n\ntype DeployScriptProps = {\n script: Script.Script;\n client: Client;\n space: Space;\n fn?: Function.Function;\n existingFunctionId?: string;\n};\n\ntype DeployScriptResult = { success: boolean; error?: Error; functionId?: string };\n\n/**\n * Deploy a script to a space, handling bundling and uploading to the FaaS infrastructure.\n */\nexport const deployScript = async ({\n script,\n client,\n space,\n fn,\n existingFunctionId,\n}: DeployScriptProps): Promise<DeployScriptResult> => {\n const validationError = validateDeployInputs(script, space);\n if (validationError) {\n return { success: false, error: validationError };\n }\n\n try {\n const buildResult = await bundleFunction({\n source: script.source!.target!.content,\n });\n if ('error' in buildResult) {\n throw buildResult.error || new Error('Bundle creation failed');\n }\n\n const functionsServiceClient = FunctionsServiceClient.fromClient(client);\n const newFunction = await functionsServiceClient.deploy({\n // TODO(dmaretskyi): Space key or identity key.\n ownerPublicKey: space.key,\n version: fn ? incrementSemverPatch(fn.version) : '0.0.1',\n functionId: existingFunctionId,\n entryPoint: buildResult.entryPoint,\n assets: buildResult.assets,\n runtime: FunctionRuntimeKind.enums.WORKER_LOADER,\n });\n\n const storedFunction = createOrUpdateFunctionInSpace(space, fn, script, newFunction);\n script.changed = false;\n\n return { success: true, functionId: getUserFunctionIdInMetadata(Obj.getMeta(storedFunction)) };\n } catch (err: any) {\n log.catch(err);\n return { success: false, error: err };\n }\n};\n\n/**\n * Validate inputs for script deployment.\n */\nconst validateDeployInputs = (script: Script.Script, space: Space): Error | null => {\n if (!script.source || !space) {\n return new Error('Script source or space not available');\n }\n return null;\n};\n\nconst createOrUpdateFunctionInSpace = (\n space: Space,\n fn: Function.Function | undefined,\n script: Script.Script,\n newFunction: Function.Function,\n): Function.Function => {\n if (fn) {\n Function.setFrom(fn, newFunction);\n return fn;\n } else {\n newFunction.source = Ref.make(script);\n return space.db.add(newFunction);\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Obj } from '@dxos/echo';\nimport { type Function, type Script, getUserFunctionIdInMetadata } from '@dxos/functions';\nimport { getInvocationUrl } from '@dxos/functions-runtime';\nimport { type PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { getSpace } from '@dxos/react-client/echo';\n/**\n * Get the function URL for a given script and client configuration\n */\nexport const getFunctionUrl = ({\n script,\n fn,\n edgeUrl,\n}: {\n script: Script.Script;\n fn: any;\n edgeUrl: string;\n}): string | undefined => {\n const space = getSpace(script);\n const existingFunctionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));\n\n if (!existingFunctionId) {\n return undefined;\n }\n\n return getInvocationUrl(existingFunctionId, edgeUrl, {\n spaceId: space?.id,\n });\n};\n\nexport const updateFunctionMetadata = (\n script: Script.Script,\n storedFunction: Function.Function,\n meta: any,\n functionId: string,\n) => {\n if (script.description !== undefined && script.description.trim() !== '') {\n storedFunction.description = script.description;\n } else if (meta.description) {\n storedFunction.description = meta.description;\n } else {\n log.verbose('no description in function metadata', { functionId });\n }\n\n if (meta.inputSchema) {\n storedFunction.inputSchema = meta.inputSchema;\n } else {\n log.verbose('no input schema in function metadata', { functionId });\n }\n\n if (meta.outputSchema) {\n storedFunction.outputSchema = meta.outputSchema;\n } else {\n log.verbose('no output schema in function metadata', { functionId });\n }\n\n if (meta.key) {\n storedFunction.key = meta.key;\n } else {\n log.verbose('no key in function metadata', { functionId });\n }\n};\n\nexport const getAccessCredential = (identityKey: PublicKey): Credential => {\n return {\n issuer: identityKey,\n issuanceDate: new Date(),\n subject: {\n id: identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.ServiceAccess',\n serverName: 'hub.dxos.network',\n serverKey: identityKey,\n identityKey,\n capabilities: ['composer:beta'],\n },\n },\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { Obj, Query, Ref } from '@dxos/echo';\nimport { Function, type Script, getUserFunctionIdInMetadata } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { type Space, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { type TFunction } from '@dxos/react-ui';\nimport { createMenuAction } from '@dxos/react-ui-menu';\nimport { errorMessageColors } from '@dxos/react-ui-theme';\n\nimport { meta } from '../meta';\nimport { deployScript, getFunctionUrl, isScriptDeployed } from '../util';\n\nexport type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };\n\nexport type DeployState = {\n deploying: boolean;\n deployed: boolean;\n functionUrl: string;\n error: string;\n};\n\nexport type CreateDeployOptions = {\n state: Partial<DeployState>;\n script: Script.Script;\n fn: Function.Function;\n space?: Space;\n existingFunctionId?: string;\n client: Client;\n t: TFunction;\n};\n\nexport const createDeploy = ({ state, script, space, fn, client, existingFunctionId, t }: CreateDeployOptions) => {\n // TODO(wittjosiah): Should this be an action?\n const errorItem = createMenuAction('error', () => {}, {\n label: state.error ?? ['no error label', { ns: meta.id }],\n icon: 'ph--warning-circle--regular',\n hidden: !state.error,\n classNames: state.error && errorMessageColors,\n });\n\n const deployAction = createMenuAction<DeployActionProperties>(\n 'deploy',\n async () => {\n if (!script.source || !space) {\n return;\n }\n\n state.error = undefined;\n state.deploying = true;\n\n const result = await deployScript({ script, client, space, fn, existingFunctionId });\n\n if (!result.success) {\n log.catch(result.error);\n state.error = t('upload failed label');\n }\n\n state.deploying = false;\n },\n {\n type: 'deploy',\n label: [state.deploying ? 'publishing label' : 'deploy label', { ns: meta.id }],\n icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',\n disabled: state.deploying,\n classNames: state.deploying ? '[&_svg]:animate-spin' : '',\n },\n );\n\n const copyAction = createMenuAction<DeployActionProperties>(\n 'copy',\n async () => {\n if (state.functionUrl) {\n await navigator.clipboard.writeText(state.functionUrl);\n }\n },\n {\n type: 'copy',\n label: ['copy link label', { ns: meta.id }],\n icon: 'ph--link--regular',\n disabled: !state.functionUrl,\n },\n );\n\n return {\n nodes: [errorItem, deployAction, copyAction],\n edges: [\n { source: 'root', target: 'error' },\n { source: 'root', target: 'deploy' },\n { source: 'root', target: 'copy' },\n ],\n };\n};\n\nexport const useDeployState = ({ state, script }: { state: Partial<DeployState>; script: Script.Script }) => {\n const { space, client, fn, existingFunctionId } = useDeployDeps({ script });\n useEffect(() => {\n if (!existingFunctionId) {\n return;\n }\n\n state.functionUrl = getFunctionUrl({\n script,\n fn,\n edgeUrl: client.config.values.runtime?.services?.edge?.url ?? '',\n });\n }, [existingFunctionId, space, fn, script, client.config.values.runtime?.services?.edge?.url]);\n\n useEffect(() => {\n state.deployed = isScriptDeployed({ script, fn });\n }, [script.changed, existingFunctionId, fn, script]);\n};\n\nexport const useDeployDeps = ({ script }: { script: Script.Script }) => {\n const client = useClient();\n const space = getSpace(script);\n const [fn] = useQuery(space, Query.type(Function.Function, { source: Ref.make(script) }));\n const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata(Obj.getMeta(fn)), [fn]);\n return { client, space, fn, existingFunctionId };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { live } from '@dxos/live-object';\n\nimport { type DeployState } from './deploy';\n\nexport type ScriptToolbarState = Partial<DeployState>;\n\n// TODO(burdon): Replace with context provider?\nexport const useToolbarState = (initialState: ScriptToolbarState = {}) => {\n return useMemo(() => live<ScriptToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCapabilities, usePluginManager } from '@dxos/app-framework/react';\nimport { useAsyncEffect } from '@dxos/react-ui';\n\nimport { ScriptCapabilities } from '../capabilities';\nimport type { Compiler } from '../compiler';\nimport { ScriptEvents } from '../events';\n\n/**\n * Asynchronously sets up the compiler and returns it.\n * @returns The compiler instance or undefined if it is not ready.\n */\nexport const useCompiler = (): Compiler | undefined => {\n const manager = usePluginManager();\n useAsyncEffect(async () => {\n await manager.activate(ScriptEvents.SetupCompiler);\n }, [manager]);\n const [compiler] = useCapabilities(ScriptCapabilities.Compiler);\n return compiler;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const BlueprintDefinition = lazy(() => import('./blueprint-definition'));\nexport const Compiler = lazy(() => import('./compiler'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const ScriptSettings = lazy(() => import('./settings'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineEvent } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\nexport namespace ScriptEvents {\n export const SetupCompiler = defineEvent(`${meta.id}/event/setup-compiler`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { format } from 'prettier';\nimport prettierPluginEstree from 'prettier/plugins/estree';\nimport prettierPluginTypescript from 'prettier/plugins/typescript';\n\nimport { type Script } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { meta } from '../meta';\n\nexport type FormatActionProperties = { type: 'format' };\n\nexport const createFormat = (script: Script.Script) => {\n const formatAction = createMenuAction(\n 'format',\n async () => {\n if (!script.source) {\n return;\n }\n\n try {\n script.source.target!.content = await format(script.source.target!.content, {\n parser: 'typescript',\n plugins: [prettierPluginEstree, prettierPluginTypescript],\n semi: true,\n singleQuote: true,\n });\n } catch (err: any) {\n // TODO(wittjosiah): Show error in UI.\n log.catch(err);\n }\n },\n {\n label: ['format label', { ns: meta.id }],\n icon: 'ph--magic-wand--regular',\n },\n );\n\n return {\n nodes: [formatAction],\n edges: [\n {\n source: 'root',\n target: 'format',\n },\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Obj } from '@dxos/echo';\nimport { FUNCTIONS_PRESET_META_KEY, type Script } from '@dxos/functions';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { templates } from '../templates';\n\nexport type TemplateActionProperties = { type: 'template'; value: string };\n\nconst createTemplateSelectActions = (script: Script.Script) => {\n return templates.map((template) => {\n return createMenuAction<TemplateActionProperties>(\n `template--${template.id}`,\n () => {\n script.name = template.name;\n script.source!.target!.content = template.source;\n const metaKeys = Obj.getMeta(script).keys;\n const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);\n if (oldPresetIndex >= 0) {\n metaKeys.splice(oldPresetIndex, 1);\n }\n if ('presetId' in template) {\n metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });\n }\n },\n {\n label: template.name,\n value: template.id,\n type: 'template',\n },\n );\n });\n};\n\nexport const createTemplateSelect = (script: Script.Script) => {\n const templateSelectActions = createTemplateSelectActions(script);\n return {\n nodes: [...templateSelectActions],\n edges: [\n { source: 'root', target: 'template-select' },\n ...templateSelectActions.map((action) => ({ source: 'template-select', target: action.id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Function from 'effect/Function';\nimport { useCallback, useState } from 'react';\n\nimport { chain, createIntent } from '@dxos/app-framework';\nimport { useIntentDispatcher } from '@dxos/app-framework/react';\nimport { Obj } from '@dxos/echo';\nimport { Script } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { useClient } from '@dxos/react-client';\nimport { type Space } from '@dxos/react-client/echo';\n\nimport { type Template } from '../templates';\nimport { ScriptAction } from '../types';\nimport { deployScript } from '../util';\n\ntype DeploymentStatus = 'idle' | 'pending' | 'success' | 'error';\n\n/**\n * Hook for creating and deploying multiple script templates concurrently.\n *\n * Takes a space and an array of script template IDs, then provides a callback\n * function that creates each script from its template and deploys it to the space.\n * All creation / deployment operations run concurrently for improved performance.\n */\nexport const useCreateAndDeployScriptTemplates = (space: Space | undefined, scriptTemplates: Template[]) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const client = useClient();\n const [status, setStatus] = useState<DeploymentStatus>('idle');\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const handleCreateAndDeployScripts = useCallback(async () => {\n invariant(space);\n setStatus('pending');\n setError(undefined);\n\n const deploymentResults = await Promise.all(\n scriptTemplates.map(async (template) => {\n const result = await dispatch(\n Function.pipe(\n createIntent(ScriptAction.CreateScript, {\n space,\n initialTemplateId: template.id as any,\n }),\n chain(SpaceAction.AddObject, { target: space }),\n ),\n );\n invariant(Obj.instanceOf(Script.Script, result.data?.object));\n\n return deployScript({ space, client, script: result.data.object });\n }),\n );\n\n const hasErrors = deploymentResults.some((result) => !result.success);\n setStatus(hasErrors ? 'error' : 'success');\n }, [space, dispatch, client, scriptTemplates]);\n\n // TODO(burdon): Return onCreateAndDeployScripts.\n return { handleCreateAndDeployScripts, status, error };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Obj", "Ref", "Function", "getUserFunctionIdInMetadata", "bundleFunction", "FunctionsServiceClient", "incrementSemverPatch", "log", "FunctionRuntimeKind", "isScriptDeployed", "script", "fn", "existingFunctionId", "getMeta", "Boolean", "changed", "deployScript", "client", "space", "validationError", "validateDeployInputs", "success", "error", "buildResult", "source", "target", "content", "Error", "functionsServiceClient", "fromClient", "newFunction", "deploy", "ownerPublicKey", "key", "version", "functionId", "entryPoint", "assets", "runtime", "enums", "WORKER_LOADER", "storedFunction", "createOrUpdateFunctionInSpace", "err", "catch", "setFrom", "make", "db", "add", "Obj", "getUserFunctionIdInMetadata", "getInvocationUrl", "log", "getSpace", "getFunctionUrl", "script", "fn", "edgeUrl", "space", "existingFunctionId", "getMeta", "undefined", "spaceId", "id", "updateFunctionMetadata", "storedFunction", "meta", "functionId", "description", "trim", "verbose", "inputSchema", "outputSchema", "key", "getAccessCredential", "identityKey", "issuer", "issuanceDate", "Date", "subject", "assertion", "serverName", "serverKey", "capabilities", "useEffect", "useMemo", "Obj", "Query", "Ref", "Function", "getUserFunctionIdInMetadata", "log", "useClient", "getSpace", "useQuery", "createMenuAction", "errorMessageColors", "createDeploy", "state", "script", "space", "fn", "client", "existingFunctionId", "t", "errorItem", "createMenuAction", "label", "error", "ns", "meta", "id", "icon", "hidden", "classNames", "errorMessageColors", "deployAction", "source", "undefined", "deploying", "result", "deployScript", "success", "log", "catch", "type", "disabled", "copyAction", "functionUrl", "navigator", "clipboard", "writeText", "nodes", "edges", "target", "useDeployState", "useDeployDeps", "useEffect", "getFunctionUrl", "edgeUrl", "config", "values", "runtime", "services", "edge", "url", "deployed", "isScriptDeployed", "changed", "useClient", "getSpace", "useQuery", "Query", "Function", "Ref", "make", "useMemo", "getUserFunctionIdInMetadata", "Obj", "getMeta", "useMemo", "live", "useToolbarState", "initialState", "useMemo", "live", "useCapabilities", "usePluginManager", "useAsyncEffect", "lazy", "AppGraphBuilder", "lazy", "BlueprintDefinition", "Compiler", "IntentResolver", "ReactSurface", "ScriptSettings", "defineEvent", "ScriptEvents", "SetupCompiler", "defineEvent", "meta", "id", "useCompiler", "manager", "usePluginManager", "useAsyncEffect", "activate", "ScriptEvents", "SetupCompiler", "compiler", "useCapabilities", "ScriptCapabilities", "Compiler", "format", "prettierPluginEstree", "prettierPluginTypescript", "log", "createMenuAction", "createFormat", "script", "formatAction", "createMenuAction", "source", "target", "content", "format", "parser", "plugins", "prettierPluginEstree", "prettierPluginTypescript", "semi", "singleQuote", "err", "log", "catch", "label", "ns", "meta", "id", "icon", "nodes", "edges", "Obj", "FUNCTIONS_PRESET_META_KEY", "createMenuAction", "createTemplateSelectActions", "script", "templates", "map", "template", "createMenuAction", "id", "name", "source", "target", "content", "metaKeys", "Obj", "getMeta", "keys", "oldPresetIndex", "findIndex", "key", "FUNCTIONS_PRESET_META_KEY", "splice", "push", "presetId", "label", "value", "type", "createTemplateSelect", "templateSelectActions", "nodes", "edges", "action", "Function", "useCallback", "useState", "chain", "createIntent", "useIntentDispatcher", "Obj", "Script", "invariant", "SpaceAction", "useClient", "useCreateAndDeployScriptTemplates", "space", "scriptTemplates", "dispatchPromise", "dispatch", "useIntentDispatcher", "client", "useClient", "status", "setStatus", "useState", "error", "setError", "undefined", "handleCreateAndDeployScripts", "useCallback", "invariant", "deploymentResults", "Promise", "all", "map", "template", "result", "pipe", "createIntent", "ScriptAction", "CreateScript", "initialTemplateId", "id", "chain", "SpaceAction", "AddObject", "target", "Obj", "instanceOf", "Script", "data", "object", "deployScript", "script", "hasErrors", "some", "success"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ScriptCapabilities
|
|
3
|
+
} from "./chunk-UOQ6NCH3.mjs";
|
|
4
|
+
import "./chunk-EB6AXFXO.mjs";
|
|
5
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
6
|
+
|
|
7
|
+
// src/capabilities/compiler.ts
|
|
8
|
+
import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
|
|
9
|
+
import * as HttpClient from "@effect/platform/HttpClient";
|
|
10
|
+
import * as Effect from "effect/Effect";
|
|
11
|
+
import * as Schedule from "effect/Schedule";
|
|
12
|
+
import * as Schema from "effect/Schema";
|
|
13
|
+
import wasmUrl from "esbuild-wasm/esbuild.wasm?url";
|
|
14
|
+
import * as ts2 from "typescript";
|
|
15
|
+
import { contributes } from "@dxos/app-framework";
|
|
16
|
+
import { initializeBundler } from "@dxos/functions-runtime/bundler";
|
|
17
|
+
import { trim } from "@dxos/util";
|
|
18
|
+
|
|
19
|
+
// src/compiler/compiler.ts
|
|
20
|
+
import { createDefaultMapFromCDN, createSystem, createVirtualTypeScriptEnvironment } from "@typescript/vfs";
|
|
21
|
+
import ts from "typescript";
|
|
22
|
+
import { invariant } from "@dxos/invariant";
|
|
23
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-script/src/compiler/compiler.ts";
|
|
24
|
+
var GLOBALS = "globals.d.ts";
|
|
25
|
+
var defaultOptions = {
|
|
26
|
+
lib: [
|
|
27
|
+
"DOM",
|
|
28
|
+
"es2022"
|
|
29
|
+
],
|
|
30
|
+
target: ts.ScriptTarget.ES2022
|
|
31
|
+
};
|
|
32
|
+
var Compiler = class {
|
|
33
|
+
_options;
|
|
34
|
+
_env;
|
|
35
|
+
_fsMap;
|
|
36
|
+
constructor(_options = defaultOptions) {
|
|
37
|
+
this._options = _options;
|
|
38
|
+
}
|
|
39
|
+
async initialize(globals) {
|
|
40
|
+
if (this._env) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
this._fsMap = await createDefaultMapFromCDN(this._options, "5.7.2", true, ts);
|
|
44
|
+
if (globals) {
|
|
45
|
+
this._fsMap.set(GLOBALS, globals);
|
|
46
|
+
}
|
|
47
|
+
const rootFiles = globals ? [
|
|
48
|
+
GLOBALS
|
|
49
|
+
] : [];
|
|
50
|
+
const system = createSystem(this._fsMap);
|
|
51
|
+
this._env = createVirtualTypeScriptEnvironment(system, rootFiles, ts, this._options);
|
|
52
|
+
}
|
|
53
|
+
get environment() {
|
|
54
|
+
invariant(this._env, "Compiler environment not initialized.", {
|
|
55
|
+
F: __dxlog_file,
|
|
56
|
+
L: 46,
|
|
57
|
+
S: this,
|
|
58
|
+
A: [
|
|
59
|
+
"this._env",
|
|
60
|
+
"'Compiler environment not initialized.'"
|
|
61
|
+
]
|
|
62
|
+
});
|
|
63
|
+
return this._env;
|
|
64
|
+
}
|
|
65
|
+
setFile(fileName, content) {
|
|
66
|
+
invariant(this._fsMap, "File system map not initialized.", {
|
|
67
|
+
F: __dxlog_file,
|
|
68
|
+
L: 51,
|
|
69
|
+
S: this,
|
|
70
|
+
A: [
|
|
71
|
+
"this._fsMap",
|
|
72
|
+
"'File system map not initialized.'"
|
|
73
|
+
]
|
|
74
|
+
});
|
|
75
|
+
this.environment.createFile(fileName, content);
|
|
76
|
+
}
|
|
77
|
+
compile(fileName) {
|
|
78
|
+
return this.environment.languageService.getEmitOutput(fileName);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// src/capabilities/compiler.ts
|
|
83
|
+
var SCRIPT_PACKAGES_BUCKET = "https://pub-5745ae82e450484aa28f75fc6a175935.r2.dev/dev/";
|
|
84
|
+
var DECLARATION_EXTS = [
|
|
85
|
+
".d.ts",
|
|
86
|
+
".d.mts"
|
|
87
|
+
];
|
|
88
|
+
var NO_TYPES = true;
|
|
89
|
+
var compiler_default = (async () => {
|
|
90
|
+
await initializeBundler({
|
|
91
|
+
wasmUrl
|
|
92
|
+
});
|
|
93
|
+
const runtimeModules = await Effect.runPromise(fetchRuntimeModules().pipe(Effect.provide(FetchHttpClient.layer)));
|
|
94
|
+
const compiler = new Compiler({
|
|
95
|
+
skipLibCheck: true,
|
|
96
|
+
moduleResolution: ts2.ModuleResolutionKind.Bundler,
|
|
97
|
+
allowImportingTsExtensions: true,
|
|
98
|
+
noEmit: true,
|
|
99
|
+
strict: true,
|
|
100
|
+
esModuleInterop: true,
|
|
101
|
+
paths: Object.fromEntries(runtimeModules.map((mod) => [
|
|
102
|
+
mod.moduleName,
|
|
103
|
+
[
|
|
104
|
+
`./src/${mod.filename}`
|
|
105
|
+
]
|
|
106
|
+
]))
|
|
107
|
+
});
|
|
108
|
+
await compiler.initialize(trim`
|
|
109
|
+
declare module 'https://*';
|
|
110
|
+
${NO_TYPES ? "" : 'declare module "*";'}
|
|
111
|
+
`);
|
|
112
|
+
if (!NO_TYPES) {
|
|
113
|
+
for (const mod of runtimeModules) {
|
|
114
|
+
compiler.setFile(`/src/${mod.filename}`, mod.content);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return contributes(ScriptCapabilities.Compiler, compiler);
|
|
118
|
+
});
|
|
119
|
+
var fetchRuntimeModules = Effect.fnUntraced(function* () {
|
|
120
|
+
const manifest = yield* HttpClient.get(new URL("manifest.json", SCRIPT_PACKAGES_BUCKET)).pipe(Effect.flatMap((_) => _.json), Effect.flatMap(Schema.decodeUnknown(Schema.Struct({
|
|
121
|
+
files: Schema.Array(Schema.String)
|
|
122
|
+
}))));
|
|
123
|
+
const declarationFiles = manifest.files.filter((file) => DECLARATION_EXTS.some((ext) => file.endsWith(ext)));
|
|
124
|
+
let fetched = 0;
|
|
125
|
+
const modules = yield* Effect.forEach(declarationFiles, Effect.fnUntraced(function* (file) {
|
|
126
|
+
const response = yield* HttpClient.get(new URL(file, SCRIPT_PACKAGES_BUCKET)).pipe(Effect.retry(Schedule.exponential(1e3).pipe(Schedule.compose(Schedule.recurs(3)))));
|
|
127
|
+
const content = yield* response.text;
|
|
128
|
+
fetched++;
|
|
129
|
+
const moduleName = file.replace(/\.d\.(ts|mts)$/, "");
|
|
130
|
+
return {
|
|
131
|
+
moduleName,
|
|
132
|
+
filename: file,
|
|
133
|
+
content
|
|
134
|
+
};
|
|
135
|
+
}, Effect.retry(Schedule.exponential(1e3).pipe(Schedule.compose(Schedule.recurs(3))))), {
|
|
136
|
+
concurrency: 20
|
|
137
|
+
});
|
|
138
|
+
return modules;
|
|
139
|
+
});
|
|
140
|
+
export {
|
|
141
|
+
compiler_default as default
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=compiler-2HV5KXV4.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/compiler.ts", "../../../src/compiler/compiler.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as FetchHttpClient from '@effect/platform/FetchHttpClient';\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as Effect from 'effect/Effect';\nimport * as Schedule from 'effect/Schedule';\nimport * as Schema from 'effect/Schema';\nimport wasmUrl from 'esbuild-wasm/esbuild.wasm?url';\nimport * as ts from 'typescript';\n\nimport { contributes } from '@dxos/app-framework';\nimport { initializeBundler } from '@dxos/functions-runtime/bundler';\nimport { trim } from '@dxos/util';\n\nimport { Compiler } from '../compiler';\n\nimport { ScriptCapabilities } from './capabilities';\n\nconst SCRIPT_PACKAGES_BUCKET = 'https://pub-5745ae82e450484aa28f75fc6a175935.r2.dev/dev/';\nconst DECLARATION_EXTS = ['.d.ts', '.d.mts'];\nconst NO_TYPES = true; // Types temopararly disabled due to compiler erorrs.\n\nexport default async () => {\n await initializeBundler({ wasmUrl });\n\n const runtimeModules = await Effect.runPromise(fetchRuntimeModules().pipe(Effect.provide(FetchHttpClient.layer)));\n\n const compiler = new Compiler({\n skipLibCheck: true,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n allowImportingTsExtensions: true,\n noEmit: true,\n strict: true,\n esModuleInterop: true,\n paths: Object.fromEntries(runtimeModules.map((mod) => [mod.moduleName, [`./src/${mod.filename}`]])),\n });\n\n await compiler.initialize(trim`\n declare module 'https://*';\n ${NO_TYPES ? '' : 'declare module \"*\";'}\n `);\n if (!NO_TYPES) {\n for (const mod of runtimeModules) {\n compiler.setFile(`/src/${mod.filename}`, mod.content);\n }\n }\n\n return contributes(ScriptCapabilities.Compiler, compiler);\n};\n\nconst fetchRuntimeModules = Effect.fnUntraced(function* () {\n const manifest = yield* HttpClient.get(new URL('manifest.json', SCRIPT_PACKAGES_BUCKET)).pipe(\n Effect.flatMap((_) => _.json),\n Effect.flatMap(Schema.decodeUnknown(Schema.Struct({ files: Schema.Array(Schema.String) }))),\n );\n\n const declarationFiles = manifest.files.filter((file) => DECLARATION_EXTS.some((ext) => file.endsWith(ext)));\n\n let fetched = 0;\n const modules = yield* Effect.forEach(\n declarationFiles,\n Effect.fnUntraced(\n function* (file) {\n const response = yield* HttpClient.get(new URL(file, SCRIPT_PACKAGES_BUCKET)).pipe(\n Effect.retry(Schedule.exponential(1_000).pipe(Schedule.compose(Schedule.recurs(3)))),\n );\n const content = yield* response.text;\n fetched++;\n\n const moduleName = file.replace(/\\.d\\.(ts|mts)$/, '');\n return {\n moduleName,\n filename: file,\n content,\n };\n },\n Effect.retry(Schedule.exponential(1_000).pipe(Schedule.compose(Schedule.recurs(3)))),\n ),\n { concurrency: 20 },\n );\n return modules;\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n type VirtualTypeScriptEnvironment,\n createDefaultMapFromCDN,\n createSystem,\n createVirtualTypeScriptEnvironment,\n} from '@typescript/vfs';\nimport ts from 'typescript';\n\nimport { invariant } from '@dxos/invariant';\n\nconst GLOBALS = 'globals.d.ts';\n\nconst defaultOptions: ts.CompilerOptions = {\n lib: ['DOM', 'es2022'],\n target: ts.ScriptTarget.ES2022,\n};\n\nexport class Compiler {\n private _env: VirtualTypeScriptEnvironment | undefined;\n private _fsMap: Map<string, string> | undefined;\n\n constructor(private readonly _options: ts.CompilerOptions = defaultOptions) {}\n\n async initialize(globals?: string): Promise<void> {\n if (this._env) {\n return;\n }\n\n // TODO(wittjosiah): Figure out how to get workers working in plugin packages.\n // https://github.com/val-town/codemirror-ts?tab=readme-ov-file#setup-worker\n this._fsMap = await createDefaultMapFromCDN(this._options, '5.7.2', true, ts);\n if (globals) {\n this._fsMap.set(GLOBALS, globals);\n }\n\n const rootFiles = globals ? [GLOBALS] : [];\n const system = createSystem(this._fsMap);\n this._env = createVirtualTypeScriptEnvironment(system, rootFiles, ts, this._options);\n }\n\n get environment() {\n invariant(this._env, 'Compiler environment not initialized.');\n return this._env;\n }\n\n setFile(fileName: string, content: string): void {\n invariant(this._fsMap, 'File system map not initialized.');\n this.environment.createFile(fileName, content);\n }\n\n compile(fileName: string): ts.EmitOutput {\n return this.environment.languageService.getEmitOutput(fileName);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["FetchHttpClient", "HttpClient", "Effect", "Schedule", "Schema", "wasmUrl", "ts", "contributes", "initializeBundler", "trim", "createDefaultMapFromCDN", "createSystem", "createVirtualTypeScriptEnvironment", "ts", "invariant", "GLOBALS", "defaultOptions", "lib", "target", "ScriptTarget", "ES2022", "Compiler", "_env", "_fsMap", "_options", "initialize", "globals", "set", "rootFiles", "system", "environment", "setFile", "fileName", "content", "createFile", "compile", "languageService", "getEmitOutput", "SCRIPT_PACKAGES_BUCKET", "DECLARATION_EXTS", "NO_TYPES", "initializeBundler", "wasmUrl", "runtimeModules", "runPromise", "fetchRuntimeModules", "pipe", "provide", "layer", "compiler", "Compiler", "skipLibCheck", "moduleResolution", "ModuleResolutionKind", "Bundler", "allowImportingTsExtensions", "noEmit", "strict", "esModuleInterop", "paths", "Object", "fromEntries", "map", "mod", "moduleName", "filename", "initialize", "trim", "setFile", "content", "contributes", "ScriptCapabilities", "fnUntraced", "manifest", "get", "URL", "flatMap", "_", "json", "decodeUnknown", "Struct", "files", "Array", "String", "declarationFiles", "filter", "file", "some", "ext", "endsWith", "fetched", "modules", "forEach", "response", "retry", "exponential", "compose", "recurs", "text", "replace", "concurrency"]
|
|
7
|
+
}
|