@platforma-sdk/test 1.58.6 → 1.58.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"test-pl.js","sources":["../src/test-pl.ts"],"sourcesContent":["import type { OptionalResourceId, PlClient, ResourceId } from \"@milaboratories/pl-middle-layer\";\nimport { NullResourceId, resourceIdToString, TestHelpers } from \"@milaboratories/pl-middle-layer\";\nimport type { SynchronizedTreeOps } from \"@milaboratories/pl-tree\";\nimport { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { test } from \"vitest\";\n\n// oxlint-disable-next-line jest/expect-expect jest/no-disabled-tests\nexport const plTest = test.extend<{\n pl: PlClient;\n createTree: (res: ResourceId, ops?: SynchronizedTreeOps) => Promise<SynchronizedTreeState>;\n rootTree: SynchronizedTreeState;\n tmpFolder: string;\n}>({\n tmpFolder: async ({ onTestFinished }, use) => {\n const workFolder = path.resolve(`work/${randomUUID()}`);\n await fsp.mkdir(workFolder, { recursive: true });\n await use(workFolder);\n onTestFinished(async (context) => {\n if (context.task.result?.state === \"pass\") {\n await fsp.rm(workFolder, { recursive: true });\n } else {\n console.log(`TEST FAILED TMP FOLDER IS PRESERVED: ${workFolder}`);\n }\n });\n },\n\n pl: async ({ onTestFinished }, use) => {\n const alternativeRoot = `test_${Date.now()}_${randomUUID()}`;\n let altRootId: OptionalResourceId = NullResourceId;\n const client = await TestHelpers.getTestClient(alternativeRoot);\n altRootId = client.clientRoot;\n try {\n await use(client);\n } finally {\n // Close the test client to avoid dangling gRPC channels\n // that can cause segfaults during process exit\n await client.close();\n }\n onTestFinished(async (context) => {\n if (context.task.result?.state === \"pass\") {\n const rawClient = await TestHelpers.getTestClient();\n try {\n await rawClient.deleteAlternativeRoot(alternativeRoot);\n } finally {\n // Close the cleanup client to avoid dangling gRPC channels\n // that can cause segfaults during process exit\n await rawClient.close();\n }\n } else {\n console.log(\n `TEST FAILED SO ALTERNATIVE ROOT IS PRESERVED IN PL: ${alternativeRoot} (${resourceIdToString(\n altRootId,\n )})`,\n );\n }\n });\n },\n\n createTree: async ({ pl }, use) => {\n const trees = new Map<ResourceId, Promise<SynchronizedTreeState>>();\n try {\n await use((res, ops) => {\n let treePromise = trees.get(res);\n if (treePromise === undefined) {\n treePromise = SynchronizedTreeState.init(\n pl,\n res,\n ops ?? {\n pollingInterval: 200,\n stopPollingDelay: 400,\n },\n );\n trees.set(res, treePromise);\n }\n return treePromise;\n });\n } finally {\n for (const [, treePromise] of trees) {\n await (await treePromise).terminate();\n }\n }\n },\n\n rootTree: async ({ pl, createTree: tree }, use) => {\n await use(await tree(pl.clientRoot));\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-pl.js","names":[],"sources":["../src/test-pl.ts"],"sourcesContent":["import type { OptionalResourceId, PlClient, ResourceId } from \"@milaboratories/pl-middle-layer\";\nimport { NullResourceId, resourceIdToString, TestHelpers } from \"@milaboratories/pl-middle-layer\";\nimport type { SynchronizedTreeOps } from \"@milaboratories/pl-tree\";\nimport { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { test } from \"vitest\";\n\n// oxlint-disable-next-line jest/expect-expect jest/no-disabled-tests\nexport const plTest = test.extend<{\n pl: PlClient;\n createTree: (res: ResourceId, ops?: SynchronizedTreeOps) => Promise<SynchronizedTreeState>;\n rootTree: SynchronizedTreeState;\n tmpFolder: string;\n}>({\n tmpFolder: async ({ onTestFinished }, use) => {\n const workFolder = path.resolve(`work/${randomUUID()}`);\n await fsp.mkdir(workFolder, { recursive: true });\n await use(workFolder);\n onTestFinished(async (context) => {\n if (context.task.result?.state === \"pass\") {\n await fsp.rm(workFolder, { recursive: true });\n } else {\n console.log(`TEST FAILED TMP FOLDER IS PRESERVED: ${workFolder}`);\n }\n });\n },\n\n pl: async ({ onTestFinished }, use) => {\n const alternativeRoot = `test_${Date.now()}_${randomUUID()}`;\n let altRootId: OptionalResourceId = NullResourceId;\n const client = await TestHelpers.getTestClient(alternativeRoot);\n altRootId = client.clientRoot;\n try {\n await use(client);\n } finally {\n // Close the test client to avoid dangling gRPC channels\n // that can cause segfaults during process exit\n await client.close();\n }\n onTestFinished(async (context) => {\n if (context.task.result?.state === \"pass\") {\n const rawClient = await TestHelpers.getTestClient();\n try {\n await rawClient.deleteAlternativeRoot(alternativeRoot);\n } finally {\n // Close the cleanup client to avoid dangling gRPC channels\n // that can cause segfaults during process exit\n await rawClient.close();\n }\n } else {\n console.log(\n `TEST FAILED SO ALTERNATIVE ROOT IS PRESERVED IN PL: ${alternativeRoot} (${resourceIdToString(\n altRootId,\n )})`,\n );\n }\n });\n },\n\n createTree: async ({ pl }, use) => {\n const trees = new Map<ResourceId, Promise<SynchronizedTreeState>>();\n try {\n await use((res, ops) => {\n let treePromise = trees.get(res);\n if (treePromise === undefined) {\n treePromise = SynchronizedTreeState.init(\n pl,\n res,\n ops ?? {\n pollingInterval: 200,\n stopPollingDelay: 400,\n },\n );\n trees.set(res, treePromise);\n }\n return treePromise;\n });\n } finally {\n for (const [, treePromise] of trees) {\n await (await treePromise).terminate();\n }\n }\n },\n\n rootTree: async ({ pl, createTree: tree }, use) => {\n await use(await tree(pl.clientRoot));\n },\n});\n"],"mappings":";;;;;;;;AAUA,MAAa,SAAS,KAAK,OAKxB;CACD,WAAW,OAAO,EAAE,kBAAkB,QAAQ;EAC5C,MAAM,aAAa,KAAK,QAAQ,QAAQ,YAAY,GAAG;AACvD,QAAM,IAAI,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC;AAChD,QAAM,IAAI,WAAW;AACrB,iBAAe,OAAO,YAAY;AAChC,OAAI,QAAQ,KAAK,QAAQ,UAAU,OACjC,OAAM,IAAI,GAAG,YAAY,EAAE,WAAW,MAAM,CAAC;OAE7C,SAAQ,IAAI,wCAAwC,aAAa;IAEnE;;CAGJ,IAAI,OAAO,EAAE,kBAAkB,QAAQ;EACrC,MAAM,kBAAkB,QAAQ,KAAK,KAAK,CAAC,GAAG,YAAY;EAC1D,IAAI,YAAgC;EACpC,MAAM,SAAS,MAAM,YAAY,cAAc,gBAAgB;AAC/D,cAAY,OAAO;AACnB,MAAI;AACF,SAAM,IAAI,OAAO;YACT;AAGR,SAAM,OAAO,OAAO;;AAEtB,iBAAe,OAAO,YAAY;AAChC,OAAI,QAAQ,KAAK,QAAQ,UAAU,QAAQ;IACzC,MAAM,YAAY,MAAM,YAAY,eAAe;AACnD,QAAI;AACF,WAAM,UAAU,sBAAsB,gBAAgB;cAC9C;AAGR,WAAM,UAAU,OAAO;;SAGzB,SAAQ,IACN,uDAAuD,gBAAgB,IAAI,mBACzE,UACD,CAAC,GACH;IAEH;;CAGJ,YAAY,OAAO,EAAE,MAAM,QAAQ;EACjC,MAAM,wBAAQ,IAAI,KAAiD;AACnE,MAAI;AACF,SAAM,KAAK,KAAK,QAAQ;IACtB,IAAI,cAAc,MAAM,IAAI,IAAI;AAChC,QAAI,gBAAgB,QAAW;AAC7B,mBAAc,sBAAsB,KAClC,IACA,KACA,OAAO;MACL,iBAAiB;MACjB,kBAAkB;MACnB,CACF;AACD,WAAM,IAAI,KAAK,YAAY;;AAE7B,WAAO;KACP;YACM;AACR,QAAK,MAAM,GAAG,gBAAgB,MAC5B,QAAO,MAAM,aAAa,WAAW;;;CAK3C,UAAU,OAAO,EAAE,IAAI,YAAY,QAAQ,QAAQ;AACjD,QAAM,IAAI,MAAM,KAAK,GAAG,WAAW,CAAC;;CAEvC,CAAC"}
@@ -1,152 +1,141 @@
1
- 'use strict';
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ const require_test_pl = require('./test-pl.cjs');
3
+ let _milaboratories_pl_middle_layer = require("@milaboratories/pl-middle-layer");
4
+ let node_crypto = require("node:crypto");
5
+ let node_path = require("node:path");
6
+ node_path = require_runtime.__toESM(node_path);
7
+ let _milaboratories_computable = require("@milaboratories/computable");
2
8
 
3
- var computable = require('@milaboratories/computable');
4
- var plMiddleLayer = require('@milaboratories/pl-middle-layer');
5
- var node_crypto = require('node:crypto');
6
- var path = require('node:path');
7
- var testPl = require('./test-pl.cjs');
8
-
9
- class TestRenderResults {
10
- resultEntry;
11
- constructor(resultEntry) {
12
- this.resultEntry = resultEntry;
13
- }
14
- computeOutput(name, cb) {
15
- return computable.Computable.make((ctx) => {
16
- const outputAccessor = ctx
17
- .accessor(this.resultEntry)
18
- .node()
19
- .traverse({ field: name, assertFieldType: "Input" });
20
- return cb(outputAccessor, ctx);
21
- });
22
- }
23
- }
24
- class TestWorkflowResults {
25
- renderResult;
26
- processedExportsResult;
27
- blockId;
28
- constructor(renderResult, processedExportsResult, blockId) {
29
- this.renderResult = renderResult;
30
- this.processedExportsResult = processedExportsResult;
31
- this.blockId = blockId;
32
- }
33
- /**
34
- * Returns context id of this workflow
35
- * */
36
- context() {
37
- return this.renderResult.computeOutput("context", (cb) => cb?.id).withStableType();
38
- }
39
- /**
40
- * Returns context id of this workflow
41
- * */
42
- result() {
43
- return this.renderResult.computeOutput("result", (cb) => cb?.id).withStableType();
44
- }
45
- export(name, cb) {
46
- if (this.processedExportsResult !== undefined)
47
- return this.processedExportsResult.computeOutput("result", (acc, ctx) => {
48
- return cb(acc?.traverse({ field: name, assertFieldType: "Input" }), ctx);
49
- });
50
- else
51
- return this.renderResult.computeOutput("context", (acc, ctx) => {
52
- return cb(acc?.traverse({ field: `values/${name}`, assertFieldType: "Input" }), ctx);
53
- });
54
- }
55
- output(name, cb) {
56
- return this.renderResult.computeOutput("result", (acc, ctx) => {
57
- return cb(acc?.traverse({ field: name, assertFieldType: "Input" }), ctx);
58
- });
59
- }
60
- }
61
- class TplTestHelpers {
62
- pl;
63
- resultRootRid;
64
- resultRootTree;
65
- constructor(pl, resultRootRid, resultRootTree) {
66
- this.pl = pl;
67
- this.resultRootRid = resultRootRid;
68
- this.resultRootTree = resultRootTree;
69
- }
70
- async renderTemplate(ephemeral, template, outputs, inputs) {
71
- const runId = node_crypto.randomUUID();
72
- const spec = typeof template === "string"
73
- ? await plMiddleLayer.prepareTemplateSpec({
74
- type: "from-file",
75
- path: `./dist/tengo/tpl/${template}.plj.gz`,
76
- })
77
- : await plMiddleLayer.prepareTemplateSpec(template);
78
- const { resultMapRid } = await this.pl.withWriteTx("TemplateRender", async (tx) => {
79
- const tpl = plMiddleLayer.loadTemplate(tx, spec);
80
- const renderedInputs = await inputs(tx);
81
- const futureOutputs = await plMiddleLayer.createRenderTemplate(tx, tpl, ephemeral, renderedInputs, outputs);
82
- const resultMap = plMiddleLayer.Pl.createPlMap(tx, futureOutputs, ephemeral);
83
- tx.createField(plMiddleLayer.field(this.resultRootRid, runId), "Dynamic", resultMap);
84
- const resultMapRid = await plMiddleLayer.toGlobalResourceId(resultMap);
85
- await tx.commit();
86
- return {
87
- resultMapRid,
88
- };
89
- });
90
- await this.resultRootTree.refreshState();
91
- return new TestRenderResults(this.resultRootTree.entry(resultMapRid));
92
- }
93
- createObject(tx, value) {
94
- return tx.createValue(plMiddleLayer.Pl.JsonObject, JSON.stringify(value));
95
- }
96
- async renderWorkflow(workflow, preRun, args, ops = {}) {
97
- const blockId = ops.blockId ?? node_crypto.randomUUID();
98
- const mainResult = await this.renderTemplate(true, workflow, ["result", "context"], (tx) => {
99
- let ctx = undefined;
100
- if (ops.parent) {
101
- ctx = ops.parent;
102
- }
103
- else {
104
- ctx = tx.createEphemeral({ name: "BContextEnd", version: "1" });
105
- tx.lock(ctx);
106
- }
107
- return {
108
- args: this.createObject(tx, args),
109
- blockId: this.createObject(tx, blockId),
110
- isProduction: this.createObject(tx, !preRun),
111
- context: ctx,
112
- };
113
- });
114
- let exports = undefined;
115
- if (ops.exportProcessor !== undefined) {
116
- exports = await this.renderTemplate(true, ops.exportProcessor, ["result"], (tx) => ({
117
- pf: tx.getFutureFieldValue(mainResult.resultEntry.rid, "context", "Input"),
118
- }));
119
- }
120
- return new TestWorkflowResults(mainResult, exports, blockId);
121
- }
122
- }
123
- const tplTest = testPl.plTest.extend({
124
- helper: async ({ pl, createTree }, use) => {
125
- const resultMap = await pl.withWriteTx("CreatingHelpers", async (tx) => {
126
- const map = tx.createEphemeral(plMiddleLayer.Pl.EphStdMap);
127
- const rootField = plMiddleLayer.field(tx.clientRoot, "templateTeste");
128
- tx.createField(rootField, "Dynamic", map);
129
- await tx.commit();
130
- return await plMiddleLayer.toGlobalResourceId(map);
131
- });
132
- const resultMapTree = await createTree(resultMap);
133
- await use(new TplTestHelpers(pl, resultMap, resultMapTree));
134
- },
135
- driverKit: async ({ pl, tmpFolder }, use) => {
136
- const frontendDownloadPath = path.join(tmpFolder, "frontend");
137
- const driverKit = await plMiddleLayer.initDriverKit(pl, tmpFolder, frontendDownloadPath, {
138
- localSecret: plMiddleLayer.MiddleLayer.generateLocalSecret(),
139
- localProjections: [], // TODO must be different with local pl
140
- openFileDialogCallback: () => {
141
- throw new Error("Not implemented.");
142
- },
143
- });
144
- await use(driverKit);
145
- },
9
+ //#region src/test-template.ts
10
+ var TestRenderResults = class {
11
+ constructor(resultEntry) {
12
+ this.resultEntry = resultEntry;
13
+ }
14
+ computeOutput(name, cb) {
15
+ return _milaboratories_computable.Computable.make((ctx) => {
16
+ return cb(ctx.accessor(this.resultEntry).node().traverse({
17
+ field: name,
18
+ assertFieldType: "Input"
19
+ }), ctx);
20
+ });
21
+ }
22
+ };
23
+ var TestWorkflowResults = class {
24
+ constructor(renderResult, processedExportsResult, blockId) {
25
+ this.renderResult = renderResult;
26
+ this.processedExportsResult = processedExportsResult;
27
+ this.blockId = blockId;
28
+ }
29
+ /**
30
+ * Returns context id of this workflow
31
+ * */
32
+ context() {
33
+ return this.renderResult.computeOutput("context", (cb) => cb?.id).withStableType();
34
+ }
35
+ /**
36
+ * Returns context id of this workflow
37
+ * */
38
+ result() {
39
+ return this.renderResult.computeOutput("result", (cb) => cb?.id).withStableType();
40
+ }
41
+ export(name, cb) {
42
+ if (this.processedExportsResult !== void 0) return this.processedExportsResult.computeOutput("result", (acc, ctx) => {
43
+ return cb(acc?.traverse({
44
+ field: name,
45
+ assertFieldType: "Input"
46
+ }), ctx);
47
+ });
48
+ else return this.renderResult.computeOutput("context", (acc, ctx) => {
49
+ return cb(acc?.traverse({
50
+ field: `values/${name}`,
51
+ assertFieldType: "Input"
52
+ }), ctx);
53
+ });
54
+ }
55
+ output(name, cb) {
56
+ return this.renderResult.computeOutput("result", (acc, ctx) => {
57
+ return cb(acc?.traverse({
58
+ field: name,
59
+ assertFieldType: "Input"
60
+ }), ctx);
61
+ });
62
+ }
63
+ };
64
+ var TplTestHelpers = class {
65
+ constructor(pl, resultRootRid, resultRootTree) {
66
+ this.pl = pl;
67
+ this.resultRootRid = resultRootRid;
68
+ this.resultRootTree = resultRootTree;
69
+ }
70
+ async renderTemplate(ephemeral, template, outputs, inputs) {
71
+ const runId = (0, node_crypto.randomUUID)();
72
+ const spec = typeof template === "string" ? await (0, _milaboratories_pl_middle_layer.prepareTemplateSpec)({
73
+ type: "from-file",
74
+ path: `./dist/tengo/tpl/${template}.plj.gz`
75
+ }) : await (0, _milaboratories_pl_middle_layer.prepareTemplateSpec)(template);
76
+ const { resultMapRid } = await this.pl.withWriteTx("TemplateRender", async (tx) => {
77
+ const futureOutputs = await (0, _milaboratories_pl_middle_layer.createRenderTemplate)(tx, (0, _milaboratories_pl_middle_layer.loadTemplate)(tx, spec), ephemeral, await inputs(tx), outputs);
78
+ const resultMap = _milaboratories_pl_middle_layer.Pl.createPlMap(tx, futureOutputs, ephemeral);
79
+ tx.createField((0, _milaboratories_pl_middle_layer.field)(this.resultRootRid, runId), "Dynamic", resultMap);
80
+ const resultMapRid = await (0, _milaboratories_pl_middle_layer.toGlobalResourceId)(resultMap);
81
+ await tx.commit();
82
+ return { resultMapRid };
83
+ });
84
+ await this.resultRootTree.refreshState();
85
+ return new TestRenderResults(this.resultRootTree.entry(resultMapRid));
86
+ }
87
+ createObject(tx, value) {
88
+ return tx.createValue(_milaboratories_pl_middle_layer.Pl.JsonObject, JSON.stringify(value));
89
+ }
90
+ async renderWorkflow(workflow, preRun, args, ops = {}) {
91
+ const blockId = ops.blockId ?? (0, node_crypto.randomUUID)();
92
+ const mainResult = await this.renderTemplate(true, workflow, ["result", "context"], (tx) => {
93
+ let ctx = void 0;
94
+ if (ops.parent) ctx = ops.parent;
95
+ else {
96
+ ctx = tx.createEphemeral({
97
+ name: "BContextEnd",
98
+ version: "1"
99
+ });
100
+ tx.lock(ctx);
101
+ }
102
+ return {
103
+ args: this.createObject(tx, args),
104
+ blockId: this.createObject(tx, blockId),
105
+ isProduction: this.createObject(tx, !preRun),
106
+ context: ctx
107
+ };
108
+ });
109
+ let exports = void 0;
110
+ if (ops.exportProcessor !== void 0) exports = await this.renderTemplate(true, ops.exportProcessor, ["result"], (tx) => ({ pf: tx.getFutureFieldValue(mainResult.resultEntry.rid, "context", "Input") }));
111
+ return new TestWorkflowResults(mainResult, exports, blockId);
112
+ }
113
+ };
114
+ const tplTest = require_test_pl.plTest.extend({
115
+ helper: async ({ pl, createTree }, use) => {
116
+ const resultMap = await pl.withWriteTx("CreatingHelpers", async (tx) => {
117
+ const map = tx.createEphemeral(_milaboratories_pl_middle_layer.Pl.EphStdMap);
118
+ const rootField = (0, _milaboratories_pl_middle_layer.field)(tx.clientRoot, "templateTeste");
119
+ tx.createField(rootField, "Dynamic", map);
120
+ await tx.commit();
121
+ return await (0, _milaboratories_pl_middle_layer.toGlobalResourceId)(map);
122
+ });
123
+ await use(new TplTestHelpers(pl, resultMap, await createTree(resultMap)));
124
+ },
125
+ driverKit: async ({ pl, tmpFolder }, use) => {
126
+ await use(await (0, _milaboratories_pl_middle_layer.initDriverKit)(pl, tmpFolder, node_path.default.join(tmpFolder, "frontend"), {
127
+ localSecret: _milaboratories_pl_middle_layer.MiddleLayer.generateLocalSecret(),
128
+ localProjections: [],
129
+ openFileDialogCallback: () => {
130
+ throw new Error("Not implemented.");
131
+ }
132
+ }));
133
+ }
146
134
  });
147
135
 
136
+ //#endregion
148
137
  exports.TestRenderResults = TestRenderResults;
149
138
  exports.TestWorkflowResults = TestWorkflowResults;
150
139
  exports.TplTestHelpers = TplTestHelpers;
151
140
  exports.tplTest = tplTest;
152
- //# sourceMappingURL=test-template.cjs.map
141
+ //# sourceMappingURL=test-template.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-template.cjs","sources":["../src/test-template.ts"],"sourcesContent":["import type {\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables,\n} from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type {\n AnyRef,\n MiddleLayerDriverKit,\n PlClient,\n PlTransaction,\n ResourceId,\n TemplateSpecAny,\n} from \"@milaboratories/pl-middle-layer\";\nimport {\n createRenderTemplate,\n field,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n Pl,\n prepareTemplateSpec,\n toGlobalResourceId,\n} from \"@milaboratories/pl-middle-layer\";\nimport type {\n PlTreeEntry,\n PlTreeNodeAccessor,\n SynchronizedTreeState,\n} from \"@milaboratories/pl-tree\";\nimport { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { plTest } from \"./test-pl\";\n\nexport type WorkflowRenderOps = {\n parent?: ResourceId;\n exportProcessor?: TemplateSpecAny;\n blockId?: string;\n};\n\nexport class TestRenderResults<O extends string> {\n constructor(public readonly resultEntry: PlTreeEntry) {}\n\n public computeOutput<R>(\n name: O,\n cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R,\n ): Computable<UnwrapComputables<R> | undefined> {\n return Computable.make((ctx) => {\n const outputAccessor = ctx\n .accessor(this.resultEntry)\n .node()\n .traverse({ field: name, assertFieldType: \"Input\" });\n return cb(outputAccessor, ctx);\n });\n }\n}\n\nexport class TestWorkflowResults {\n constructor(\n public readonly renderResult: TestRenderResults<\"context\" | \"result\">,\n public readonly processedExportsResult: TestRenderResults<\"result\"> | undefined,\n public readonly blockId: string,\n ) {}\n\n /**\n * Returns context id of this workflow\n * */\n public context(): ComputableStableDefined<ResourceId> {\n return this.renderResult.computeOutput(\"context\", (cb) => cb?.id).withStableType();\n }\n\n /**\n * Returns context id of this workflow\n * */\n public result(): ComputableStableDefined<ResourceId> {\n return this.renderResult.computeOutput(\"result\", (cb) => cb?.id).withStableType();\n }\n\n public export<R>(\n name: string,\n cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R,\n ): Computable<UnwrapComputables<R> | undefined> {\n if (this.processedExportsResult !== undefined)\n return this.processedExportsResult.computeOutput(\"result\", (acc, ctx) => {\n return cb(acc?.traverse({ field: name, assertFieldType: \"Input\" }), ctx);\n });\n else\n return this.renderResult.computeOutput(\"context\", (acc, ctx) => {\n return cb(acc?.traverse({ field: `values/${name}`, assertFieldType: \"Input\" }), ctx);\n });\n }\n\n public output<R>(\n name: string,\n cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R,\n ): Computable<UnwrapComputables<R> | undefined> {\n return this.renderResult.computeOutput(\"result\", (acc, ctx) => {\n return cb(acc?.traverse({ field: name, assertFieldType: \"Input\" }), ctx);\n });\n }\n}\n\nexport class TplTestHelpers {\n constructor(\n private readonly pl: PlClient,\n private readonly resultRootRid: ResourceId,\n private readonly resultRootTree: SynchronizedTreeState,\n ) {}\n\n async renderTemplate<const O extends string>(\n ephemeral: boolean,\n template: string | TemplateSpecAny,\n outputs: O[],\n inputs: (tx: PlTransaction) => Record<string, AnyRef> | Promise<Record<string, AnyRef>>,\n ): Promise<TestRenderResults<O>> {\n const runId = randomUUID();\n const spec =\n typeof template === \"string\"\n ? await prepareTemplateSpec({\n type: \"from-file\",\n path: `./dist/tengo/tpl/${template}.plj.gz`,\n })\n : await prepareTemplateSpec(template);\n const { resultMapRid } = await this.pl.withWriteTx(\"TemplateRender\", async (tx) => {\n const tpl = loadTemplate(tx, spec);\n const renderedInputs = await inputs(tx);\n const futureOutputs = await createRenderTemplate(tx, tpl, ephemeral, renderedInputs, outputs);\n const resultMap = Pl.createPlMap(tx, futureOutputs, ephemeral);\n tx.createField(field(this.resultRootRid, runId), \"Dynamic\", resultMap);\n const resultMapRid = await toGlobalResourceId(resultMap);\n await tx.commit();\n return {\n resultMapRid,\n };\n });\n await this.resultRootTree.refreshState();\n return new TestRenderResults(this.resultRootTree.entry(resultMapRid));\n }\n\n createObject(tx: PlTransaction, value: unknown): AnyRef {\n return tx.createValue(Pl.JsonObject, JSON.stringify(value));\n }\n\n async renderWorkflow(\n workflow: string | TemplateSpecAny,\n preRun: boolean,\n args: Record<string, unknown> | Promise<Record<string, unknown>>,\n ops: WorkflowRenderOps = {},\n ): Promise<TestWorkflowResults> {\n const blockId = ops.blockId ?? randomUUID();\n const mainResult: TestRenderResults<\"result\" | \"context\"> = await this.renderTemplate(\n true,\n workflow,\n [\"result\", \"context\"],\n (tx) => {\n let ctx = undefined;\n if (ops.parent) {\n ctx = ops.parent;\n } else {\n ctx = tx.createEphemeral({ name: \"BContextEnd\", version: \"1\" });\n tx.lock(ctx);\n }\n\n return {\n args: this.createObject(tx, args),\n blockId: this.createObject(tx, blockId),\n isProduction: this.createObject(tx, !preRun),\n context: ctx,\n };\n },\n );\n\n let exports: TestRenderResults<\"result\"> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n exports = await this.renderTemplate(true, ops.exportProcessor, [\"result\"], (tx) => ({\n pf: tx.getFutureFieldValue(mainResult.resultEntry.rid, \"context\", \"Input\"),\n }));\n }\n\n return new TestWorkflowResults(mainResult, exports, blockId);\n }\n}\n\nexport const tplTest = plTest.extend<{\n helper: TplTestHelpers;\n driverKit: MiddleLayerDriverKit;\n}>({\n helper: async ({ pl, createTree }, use): Promise<void> => {\n const resultMap = await pl.withWriteTx(\"CreatingHelpers\", async (tx) => {\n const map = tx.createEphemeral(Pl.EphStdMap);\n const rootField = field(tx.clientRoot, \"templateTeste\");\n tx.createField(rootField, \"Dynamic\", map);\n await tx.commit();\n return await toGlobalResourceId(map);\n });\n const resultMapTree = await createTree(resultMap);\n await use(new TplTestHelpers(pl, resultMap, resultMapTree));\n },\n driverKit: async ({ pl, tmpFolder }, use): Promise<void> => {\n const frontendDownloadPath = path.join(tmpFolder, \"frontend\");\n\n const driverKit = await initDriverKit(pl, tmpFolder, frontendDownloadPath, {\n localSecret: MiddleLayer.generateLocalSecret(),\n localProjections: [], // TODO must be different with local pl\n openFileDialogCallback: () => {\n throw new Error(\"Not implemented.\");\n },\n });\n\n await use(driverKit);\n },\n});\n"],"names":["Computable","randomUUID","prepareTemplateSpec","loadTemplate","createRenderTemplate","Pl","field","toGlobalResourceId","plTest","initDriverKit","MiddleLayer"],"mappings":"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"}
1
+ {"version":3,"file":"test-template.cjs","names":["Computable","Pl","plTest","path","MiddleLayer"],"sources":["../src/test-template.ts"],"sourcesContent":["import type {\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables,\n} from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type {\n AnyRef,\n MiddleLayerDriverKit,\n PlClient,\n PlTransaction,\n ResourceId,\n TemplateSpecAny,\n} from \"@milaboratories/pl-middle-layer\";\nimport {\n createRenderTemplate,\n field,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n Pl,\n prepareTemplateSpec,\n toGlobalResourceId,\n} from \"@milaboratories/pl-middle-layer\";\nimport type {\n PlTreeEntry,\n PlTreeNodeAccessor,\n SynchronizedTreeState,\n} from \"@milaboratories/pl-tree\";\nimport { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { plTest } from \"./test-pl\";\n\nexport type WorkflowRenderOps = {\n parent?: ResourceId;\n exportProcessor?: TemplateSpecAny;\n blockId?: string;\n};\n\nexport class TestRenderResults<O extends string> {\n constructor(public readonly resultEntry: PlTreeEntry) {}\n\n public computeOutput<R>(\n name: O,\n cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R,\n ): Computable<UnwrapComputables<R> | undefined> {\n return Computable.make((ctx) => {\n const outputAccessor = ctx\n .accessor(this.resultEntry)\n .node()\n .traverse({ field: name, assertFieldType: \"Input\" });\n return cb(outputAccessor, ctx);\n });\n }\n}\n\nexport class TestWorkflowResults {\n constructor(\n public readonly renderResult: TestRenderResults<\"context\" | \"result\">,\n public readonly processedExportsResult: TestRenderResults<\"result\"> | undefined,\n public readonly blockId: string,\n ) {}\n\n /**\n * Returns context id of this workflow\n * */\n public context(): ComputableStableDefined<ResourceId> {\n return this.renderResult.computeOutput(\"context\", (cb) => cb?.id).withStableType();\n }\n\n /**\n * Returns context id of this workflow\n * */\n public result(): ComputableStableDefined<ResourceId> {\n return this.renderResult.computeOutput(\"result\", (cb) => cb?.id).withStableType();\n }\n\n public export<R>(\n name: string,\n cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R,\n ): Computable<UnwrapComputables<R> | undefined> {\n if (this.processedExportsResult !== undefined)\n return this.processedExportsResult.computeOutput(\"result\", (acc, ctx) => {\n return cb(acc?.traverse({ field: name, assertFieldType: \"Input\" }), ctx);\n });\n else\n return this.renderResult.computeOutput(\"context\", (acc, ctx) => {\n return cb(acc?.traverse({ field: `values/${name}`, assertFieldType: \"Input\" }), ctx);\n });\n }\n\n public output<R>(\n name: string,\n cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R,\n ): Computable<UnwrapComputables<R> | undefined> {\n return this.renderResult.computeOutput(\"result\", (acc, ctx) => {\n return cb(acc?.traverse({ field: name, assertFieldType: \"Input\" }), ctx);\n });\n }\n}\n\nexport class TplTestHelpers {\n constructor(\n private readonly pl: PlClient,\n private readonly resultRootRid: ResourceId,\n private readonly resultRootTree: SynchronizedTreeState,\n ) {}\n\n async renderTemplate<const O extends string>(\n ephemeral: boolean,\n template: string | TemplateSpecAny,\n outputs: O[],\n inputs: (tx: PlTransaction) => Record<string, AnyRef> | Promise<Record<string, AnyRef>>,\n ): Promise<TestRenderResults<O>> {\n const runId = randomUUID();\n const spec =\n typeof template === \"string\"\n ? await prepareTemplateSpec({\n type: \"from-file\",\n path: `./dist/tengo/tpl/${template}.plj.gz`,\n })\n : await prepareTemplateSpec(template);\n const { resultMapRid } = await this.pl.withWriteTx(\"TemplateRender\", async (tx) => {\n const tpl = loadTemplate(tx, spec);\n const renderedInputs = await inputs(tx);\n const futureOutputs = await createRenderTemplate(tx, tpl, ephemeral, renderedInputs, outputs);\n const resultMap = Pl.createPlMap(tx, futureOutputs, ephemeral);\n tx.createField(field(this.resultRootRid, runId), \"Dynamic\", resultMap);\n const resultMapRid = await toGlobalResourceId(resultMap);\n await tx.commit();\n return {\n resultMapRid,\n };\n });\n await this.resultRootTree.refreshState();\n return new TestRenderResults(this.resultRootTree.entry(resultMapRid));\n }\n\n createObject(tx: PlTransaction, value: unknown): AnyRef {\n return tx.createValue(Pl.JsonObject, JSON.stringify(value));\n }\n\n async renderWorkflow(\n workflow: string | TemplateSpecAny,\n preRun: boolean,\n args: Record<string, unknown> | Promise<Record<string, unknown>>,\n ops: WorkflowRenderOps = {},\n ): Promise<TestWorkflowResults> {\n const blockId = ops.blockId ?? randomUUID();\n const mainResult: TestRenderResults<\"result\" | \"context\"> = await this.renderTemplate(\n true,\n workflow,\n [\"result\", \"context\"],\n (tx) => {\n let ctx = undefined;\n if (ops.parent) {\n ctx = ops.parent;\n } else {\n ctx = tx.createEphemeral({ name: \"BContextEnd\", version: \"1\" });\n tx.lock(ctx);\n }\n\n return {\n args: this.createObject(tx, args),\n blockId: this.createObject(tx, blockId),\n isProduction: this.createObject(tx, !preRun),\n context: ctx,\n };\n },\n );\n\n let exports: TestRenderResults<\"result\"> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n exports = await this.renderTemplate(true, ops.exportProcessor, [\"result\"], (tx) => ({\n pf: tx.getFutureFieldValue(mainResult.resultEntry.rid, \"context\", \"Input\"),\n }));\n }\n\n return new TestWorkflowResults(mainResult, exports, blockId);\n }\n}\n\nexport const tplTest = plTest.extend<{\n helper: TplTestHelpers;\n driverKit: MiddleLayerDriverKit;\n}>({\n helper: async ({ pl, createTree }, use): Promise<void> => {\n const resultMap = await pl.withWriteTx(\"CreatingHelpers\", async (tx) => {\n const map = tx.createEphemeral(Pl.EphStdMap);\n const rootField = field(tx.clientRoot, \"templateTeste\");\n tx.createField(rootField, \"Dynamic\", map);\n await tx.commit();\n return await toGlobalResourceId(map);\n });\n const resultMapTree = await createTree(resultMap);\n await use(new TplTestHelpers(pl, resultMap, resultMapTree));\n },\n driverKit: async ({ pl, tmpFolder }, use): Promise<void> => {\n const frontendDownloadPath = path.join(tmpFolder, \"frontend\");\n\n const driverKit = await initDriverKit(pl, tmpFolder, frontendDownloadPath, {\n localSecret: MiddleLayer.generateLocalSecret(),\n localProjections: [], // TODO must be different with local pl\n openFileDialogCallback: () => {\n throw new Error(\"Not implemented.\");\n },\n });\n\n await use(driverKit);\n },\n});\n"],"mappings":"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"}
@@ -1,48 +1,53 @@
1
- import type { ComputableCtx, ComputableStableDefined, UnwrapComputables } from "@milaboratories/computable";
2
- import { Computable } from "@milaboratories/computable";
3
- import type { AnyRef, MiddleLayerDriverKit, PlClient, PlTransaction, ResourceId, TemplateSpecAny } from "@milaboratories/pl-middle-layer";
4
- import type { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState } from "@milaboratories/pl-tree";
5
- export type WorkflowRenderOps = {
6
- parent?: ResourceId;
7
- exportProcessor?: TemplateSpecAny;
8
- blockId?: string;
1
+ import { AnyRef, MiddleLayerDriverKit, PlClient, PlTransaction, ResourceId, TemplateSpecAny } from "@milaboratories/pl-middle-layer";
2
+ import * as _milaboratories_pl_tree0 from "@milaboratories/pl-tree";
3
+ import { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState } from "@milaboratories/pl-tree";
4
+ import * as vitest from "vitest";
5
+ import { Computable, ComputableCtx, ComputableStableDefined, UnwrapComputables } from "@milaboratories/computable";
6
+
7
+ //#region src/test-template.d.ts
8
+ type WorkflowRenderOps = {
9
+ parent?: ResourceId;
10
+ exportProcessor?: TemplateSpecAny;
11
+ blockId?: string;
9
12
  };
10
- export declare class TestRenderResults<O extends string> {
11
- readonly resultEntry: PlTreeEntry;
12
- constructor(resultEntry: PlTreeEntry);
13
- computeOutput<R>(name: O, cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R): Computable<UnwrapComputables<R> | undefined>;
13
+ declare class TestRenderResults<O extends string> {
14
+ readonly resultEntry: PlTreeEntry;
15
+ constructor(resultEntry: PlTreeEntry);
16
+ computeOutput<R>(name: O, cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R): Computable<UnwrapComputables<R> | undefined>;
14
17
  }
15
- export declare class TestWorkflowResults {
16
- readonly renderResult: TestRenderResults<"context" | "result">;
17
- readonly processedExportsResult: TestRenderResults<"result"> | undefined;
18
- readonly blockId: string;
19
- constructor(renderResult: TestRenderResults<"context" | "result">, processedExportsResult: TestRenderResults<"result"> | undefined, blockId: string);
20
- /**
21
- * Returns context id of this workflow
22
- * */
23
- context(): ComputableStableDefined<ResourceId>;
24
- /**
25
- * Returns context id of this workflow
26
- * */
27
- result(): ComputableStableDefined<ResourceId>;
28
- export<R>(name: string, cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R): Computable<UnwrapComputables<R> | undefined>;
29
- output<R>(name: string, cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R): Computable<UnwrapComputables<R> | undefined>;
18
+ declare class TestWorkflowResults {
19
+ readonly renderResult: TestRenderResults<"context" | "result">;
20
+ readonly processedExportsResult: TestRenderResults<"result"> | undefined;
21
+ readonly blockId: string;
22
+ constructor(renderResult: TestRenderResults<"context" | "result">, processedExportsResult: TestRenderResults<"result"> | undefined, blockId: string);
23
+ /**
24
+ * Returns context id of this workflow
25
+ * */
26
+ context(): ComputableStableDefined<ResourceId>;
27
+ /**
28
+ * Returns context id of this workflow
29
+ * */
30
+ result(): ComputableStableDefined<ResourceId>;
31
+ export<R>(name: string, cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R): Computable<UnwrapComputables<R> | undefined>;
32
+ output<R>(name: string, cb: (acc: PlTreeNodeAccessor | undefined, ctx: ComputableCtx) => R): Computable<UnwrapComputables<R> | undefined>;
30
33
  }
31
- export declare class TplTestHelpers {
32
- private readonly pl;
33
- private readonly resultRootRid;
34
- private readonly resultRootTree;
35
- constructor(pl: PlClient, resultRootRid: ResourceId, resultRootTree: SynchronizedTreeState);
36
- renderTemplate<const O extends string>(ephemeral: boolean, template: string | TemplateSpecAny, outputs: O[], inputs: (tx: PlTransaction) => Record<string, AnyRef> | Promise<Record<string, AnyRef>>): Promise<TestRenderResults<O>>;
37
- createObject(tx: PlTransaction, value: unknown): AnyRef;
38
- renderWorkflow(workflow: string | TemplateSpecAny, preRun: boolean, args: Record<string, unknown> | Promise<Record<string, unknown>>, ops?: WorkflowRenderOps): Promise<TestWorkflowResults>;
34
+ declare class TplTestHelpers {
35
+ private readonly pl;
36
+ private readonly resultRootRid;
37
+ private readonly resultRootTree;
38
+ constructor(pl: PlClient, resultRootRid: ResourceId, resultRootTree: SynchronizedTreeState);
39
+ renderTemplate<const O extends string>(ephemeral: boolean, template: string | TemplateSpecAny, outputs: O[], inputs: (tx: PlTransaction) => Record<string, AnyRef> | Promise<Record<string, AnyRef>>): Promise<TestRenderResults<O>>;
40
+ createObject(tx: PlTransaction, value: unknown): AnyRef;
41
+ renderWorkflow(workflow: string | TemplateSpecAny, preRun: boolean, args: Record<string, unknown> | Promise<Record<string, unknown>>, ops?: WorkflowRenderOps): Promise<TestWorkflowResults>;
39
42
  }
40
- export declare const tplTest: import("vitest").TestAPI<{
41
- pl: PlClient;
42
- createTree: (res: ResourceId, ops?: import("@milaboratories/pl-tree").SynchronizedTreeOps) => Promise<SynchronizedTreeState>;
43
- rootTree: SynchronizedTreeState;
44
- tmpFolder: string;
45
- helper: TplTestHelpers;
46
- driverKit: MiddleLayerDriverKit;
43
+ declare const tplTest: vitest.TestAPI<{
44
+ pl: PlClient;
45
+ createTree: (res: ResourceId, ops?: _milaboratories_pl_tree0.SynchronizedTreeOps) => Promise<SynchronizedTreeState>;
46
+ rootTree: SynchronizedTreeState;
47
+ tmpFolder: string;
48
+ helper: TplTestHelpers;
49
+ driverKit: MiddleLayerDriverKit;
47
50
  }>;
51
+ //#endregion
52
+ export { TestRenderResults, TestWorkflowResults, TplTestHelpers, WorkflowRenderOps, tplTest };
48
53
  //# sourceMappingURL=test-template.d.ts.map