@platforma-sdk/test 1.37.19 → 1.39.0

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/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("@milaboratories/pl-middle-layer"),I=require("@milaboratories/pl-tree"),p=require("node:crypto"),O=require("node:fs/promises"),d=require("node:path"),P=require("vitest"),M=require("@milaboratories/computable"),j=require("@milaboratories/pl-client");function m(o){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const r in o)if(r!=="default"){const t=Object.getOwnPropertyDescriptor(o,r);Object.defineProperty(e,r,t.get?t:{enumerable:!0,get:()=>o[r]})}}return e.default=o,Object.freeze(e)}const F=m(i),w=m(O),T=P.test.extend({tmpFolder:async({onTestFinished:o},e)=>{const r=d.resolve(`work/${p.randomUUID()}`);await w.mkdir(r,{recursive:!0}),await e(r),o(async t=>{t.errors!==void 0?console.log(`TEST FAILED TMP FOLDER IS PRESERVED: ${r}`):await w.rm(r,{recursive:!0})})},pl:async({onTestFinished:o},e)=>{const r=`test_${Date.now()}_${p.randomUUID()}`;let t=i.NullResourceId;const a=await i.TestHelpers.getTestClient(r);t=a.clientRoot,await e(a),o(async n=>{n.errors!==void 0?console.log(`TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${r} (${i.resourceIdToString(t)})`):await(await i.TestHelpers.getTestClient()).deleteAlternativeRoot(r)})},createTree:async({pl:o},e)=>{const r=new Map;await e((t,a)=>{let n=r.get(t);return n===void 0&&(n=I.SynchronizedTreeState.init(o,t,a??{pollingInterval:200,stopPollingDelay:400}),r.set(t,n)),n});for(const[,t]of r)await(await t).terminate()},rootTree:async({pl:o,createTree:e},r)=>{await r(await e(o.clientRoot))}});class y{constructor(e){this.resultEntry=e}computeOutput(e,r){return M.Computable.make(t=>{const a=t.accessor(this.resultEntry).node().traverse({field:e,assertFieldType:"Input"});return r(a,t)})}}class g{constructor(e,r,t){this.renderResult=e,this.processedExportsResult=r,this.blockId=t}context(){return this.renderResult.computeOutput("context",e=>e==null?void 0:e.id).withStableType()}result(){return this.renderResult.computeOutput("result",e=>e==null?void 0:e.id).withStableType()}export(e,r){return this.processedExportsResult!==void 0?this.processedExportsResult.computeOutput("result",(t,a)=>r(t==null?void 0:t.traverse({field:e,assertFieldType:"Input"}),a)):this.renderResult.computeOutput("context",(t,a)=>r(t==null?void 0:t.traverse({field:`values/${e}`,assertFieldType:"Input"}),a))}output(e,r){return this.renderResult.computeOutput("result",(t,a)=>r(t==null?void 0:t.traverse({field:e,assertFieldType:"Input"}),a))}}class v{constructor(e,r,t){this.pl=e,this.resultRootRid=r,this.resultRootTree=t}async renderTemplate(e,r,t,a){const n=p.randomUUID(),c=typeof r=="string"?await i.prepareTemplateSpec({type:"from-file",path:`./dist/tengo/tpl/${r}.plj.gz`}):await i.prepareTemplateSpec(r),{resultMapRid:l}=await this.pl.withWriteTx("TemplateRender",async s=>{const u=i.loadTemplate(s,c),b=await a(s),k=await i.createRenderTemplate(s,u,e,b,t),f=i.Pl.createPlMap(s,k,e);s.createField(i.field(this.resultRootRid,n),"Dynamic",f);const D=await i.toGlobalResourceId(f);return await s.commit(),{resultMapRid:D}});return await this.resultRootTree.refreshState(),new y(this.resultRootTree.entry(l))}createObject(e,r){return e.createValue(i.Pl.JsonObject,JSON.stringify(r))}async renderWorkflow(e,r,t,a={}){const n=a.blockId??p.randomUUID(),c=await this.renderTemplate(!0,e,["result","context"],s=>{let u;return a.parent?u=a.parent:(u=s.createEphemeral({name:"BContextEnd",version:"1"}),s.lock(u)),{args:this.createObject(s,t),blockId:this.createObject(s,n),isProduction:this.createObject(s,!r),context:u}}),l=void 0;return a.exportProcessor!==void 0&&await this.renderTemplate(!0,a.exportProcessor,["result"],s=>({pf:s.getFutureFieldValue(c.resultEntry.rid,"context","Input")})),new g(c,l,n)}}const A=T.extend({helper:async({pl:o,createTree:e},r)=>{const t=await o.withWriteTx("CreatingHelpers",async n=>{const c=n.createEphemeral(i.Pl.EphStdMap),l=i.field(n.clientRoot,"templateTeste");return n.createField(l,"Dynamic",c),await n.commit(),await i.toGlobalResourceId(c)}),a=await e(t);await r(new v(o,t,a))},driverKit:async({pl:o,tmpFolder:e},r)=>{const t=await i.initDriverKit(o,e,{localSecret:i.MiddleLayer.generateLocalSecret(),localProjections:[],openFileDialogCallback:()=>{throw new Error("Not implemented.")}});await r(t)}});async function R(o,e=5e3){try{return await o.awaitStableValue(typeof e=="number"?AbortSignal.timeout(e):e)}catch(r){if(j.isTimeoutOrCancelError(r)){const t=await o.getFullValue();throw console.dir(t,{depth:5}),new Error(`Aborted while awaiting stable value. Unstable marker: ${t.unstableMarker}`,{cause:r})}else throw r}}function S(o){let e={};return o!==void 0&&(typeof o=="object"&&!(o instanceof AbortSignal)?e={...e,...o}:e.timeout=o),{timeout:typeof e.timeout>"u"?AbortSignal.timeout(E):typeof e.timeout=="number"?AbortSignal.timeout(e.timeout):e.timeout,ignoreBlockError:!!e.ignoreBlockError}}const E=5e3;async function h(o,e,r){const t=S(r),a=o.overview,n=o.getBlockState(e);for(;;){const l=(await a.getValue()).blocks.find(s=>s.id==e);if(l===void 0)throw new Error(`Blocks not found: ${e}`);if(l.outputErrors){if(t.ignoreBlockError)return;{let s=l.outputsError;throw s===void 0&&(s=l.exportsError),new Error("Block error: "+(s??"no message"))}}if(l.calculationStatus==="Done")return;if(l.calculationStatus!=="Running")throw new Error(`Unexpected block status, block not calculating anything at the moment: ${l.calculationStatus}`);try{await a.awaitChange(t.timeout)}catch(s){throw console.dir(l,{depth:5}),console.dir(await n.getValue(),{depth:5}),new Error("Aborted while awaiting block done.",{cause:s})}}}const L=T.extend({ml:async({pl:o,tmpFolder:e},r)=>{const t=d.join(e,"frontend"),a=d.join(e,"download");await w.mkdir(t,{recursive:!0}),await w.mkdir(a,{recursive:!0});const n=await i.MiddleLayer.init(o,e,{defaultTreeOptions:{pollingInterval:250,stopPollingDelay:500},devBlockUpdateRecheckInterval:300,localSecret:i.MiddleLayer.generateLocalSecret(),localProjections:[],openFileDialogCallback:()=>{throw new Error("Not implemented.")}});await r(n),await n.close()},rawPrj:async({ml:o},e)=>{const r=await o.createProject({label:"Test Project"},"test_project");await o.openProject(r);const t=o.getOpenedProject(r);await e(t),o.closeProject(r)},helpers:async({ml:o,rawPrj:e},r)=>{await r({async awaitBlockDone(t,a){await h(e,t,a)},awaitBlockDoneAndGetStableBlockState:async(t,a)=>{const n=S(a);return await h(e,t,n),await R(e.getBlockState(t),n.timeout)},async getLocalFileHandle(t){return await o.internalDriverKit.lsDriver.getLocalFileHandle(d.resolve(t))}})}});exports.ML=F;exports.DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT=E;exports.TestRenderResults=y;exports.TestWorkflowResults=g;exports.TplTestHelpers=v;exports.awaitStableState=R;exports.blockTest=L;exports.plTest=T;exports.tplTest=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("@milaboratories/pl-middle-layer"),D=require("@milaboratories/pl-tree"),p=require("node:crypto"),O=require("node:fs/promises"),d=require("node:path"),P=require("vitest"),A=require("@milaboratories/computable"),M=require("@milaboratories/pl-client");function y(o){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const r in o)if(r!=="default"){const t=Object.getOwnPropertyDescriptor(o,r);Object.defineProperty(e,r,t.get?t:{enumerable:!0,get:()=>o[r]})}}return e.default=o,Object.freeze(e)}const j=y(s),w=y(O),T=P.test.extend({tmpFolder:async({onTestFinished:o},e)=>{const r=d.resolve(`work/${p.randomUUID()}`);await w.mkdir(r,{recursive:!0}),await e(r),o(async t=>{t.errors!==void 0?console.log(`TEST FAILED TMP FOLDER IS PRESERVED: ${r}`):await w.rm(r,{recursive:!0})})},pl:async({onTestFinished:o},e)=>{const r=`test_${Date.now()}_${p.randomUUID()}`;let t=s.NullResourceId;const a=await s.TestHelpers.getTestClient(r);t=a.clientRoot,await e(a),o(async n=>{n.errors!==void 0?console.log(`TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${r} (${s.resourceIdToString(t)})`):await(await s.TestHelpers.getTestClient()).deleteAlternativeRoot(r)})},createTree:async({pl:o},e)=>{const r=new Map;await e((t,a)=>{let n=r.get(t);return n===void 0&&(n=D.SynchronizedTreeState.init(o,t,a??{pollingInterval:200,stopPollingDelay:400}),r.set(t,n)),n});for(const[,t]of r)await(await t).terminate()},rootTree:async({pl:o,createTree:e},r)=>{await r(await e(o.clientRoot))}});class h{constructor(e){this.resultEntry=e}computeOutput(e,r){return A.Computable.make(t=>{const a=t.accessor(this.resultEntry).node().traverse({field:e,assertFieldType:"Input"});return r(a,t)})}}class g{constructor(e,r,t){this.renderResult=e,this.processedExportsResult=r,this.blockId=t}context(){return this.renderResult.computeOutput("context",e=>e==null?void 0:e.id).withStableType()}result(){return this.renderResult.computeOutput("result",e=>e==null?void 0:e.id).withStableType()}export(e,r){return this.processedExportsResult!==void 0?this.processedExportsResult.computeOutput("result",(t,a)=>r(t==null?void 0:t.traverse({field:e,assertFieldType:"Input"}),a)):this.renderResult.computeOutput("context",(t,a)=>r(t==null?void 0:t.traverse({field:`values/${e}`,assertFieldType:"Input"}),a))}output(e,r){return this.renderResult.computeOutput("result",(t,a)=>r(t==null?void 0:t.traverse({field:e,assertFieldType:"Input"}),a))}}class v{constructor(e,r,t){this.pl=e,this.resultRootRid=r,this.resultRootTree=t}async renderTemplate(e,r,t,a){const n=p.randomUUID(),c=typeof r=="string"?await s.prepareTemplateSpec({type:"from-file",path:`./dist/tengo/tpl/${r}.plj.gz`}):await s.prepareTemplateSpec(r),{resultMapRid:l}=await this.pl.withWriteTx("TemplateRender",async i=>{const u=s.loadTemplate(i,c),b=await a(i),k=await s.createRenderTemplate(i,u,e,b,t),f=s.Pl.createPlMap(i,k,e);i.createField(s.field(this.resultRootRid,n),"Dynamic",f);const I=await s.toGlobalResourceId(f);return await i.commit(),{resultMapRid:I}});return await this.resultRootTree.refreshState(),new h(this.resultRootTree.entry(l))}createObject(e,r){return e.createValue(s.Pl.JsonObject,JSON.stringify(r))}async renderWorkflow(e,r,t,a={}){const n=a.blockId??p.randomUUID(),c=await this.renderTemplate(!0,e,["result","context"],i=>{let u;return a.parent?u=a.parent:(u=i.createEphemeral({name:"BContextEnd",version:"1"}),i.lock(u)),{args:this.createObject(i,t),blockId:this.createObject(i,n),isProduction:this.createObject(i,!r),context:u}}),l=void 0;return a.exportProcessor!==void 0&&await this.renderTemplate(!0,a.exportProcessor,["result"],i=>({pf:i.getFutureFieldValue(c.resultEntry.rid,"context","Input")})),new g(c,l,n)}}const F=T.extend({helper:async({pl:o,createTree:e},r)=>{const t=await o.withWriteTx("CreatingHelpers",async n=>{const c=n.createEphemeral(s.Pl.EphStdMap),l=s.field(n.clientRoot,"templateTeste");return n.createField(l,"Dynamic",c),await n.commit(),await s.toGlobalResourceId(c)}),a=await e(t);await r(new v(o,t,a))},driverKit:async({pl:o,tmpFolder:e},r)=>{const t=await s.initDriverKit(o,e,{localSecret:s.MiddleLayer.generateLocalSecret(),localProjections:[],openFileDialogCallback:()=>{throw new Error("Not implemented.")}});await r(t)}});async function R(o,e=5e3){try{return await o.awaitStableValue(typeof e=="number"?AbortSignal.timeout(e):e)}catch(r){if(M.isTimeoutOrCancelError(r)){const t=await o.getFullValue();throw console.dir(t,{depth:5}),new Error(`Aborted while awaiting stable value. Unstable marker: ${t.unstableMarker}`,{cause:r})}else throw r}}function S(o){let e={};return o!==void 0&&(typeof o=="object"&&!(o instanceof AbortSignal)?e={...e,...o}:e.timeout=o),{timeout:typeof e.timeout>"u"?AbortSignal.timeout(E):typeof e.timeout=="number"?AbortSignal.timeout(e.timeout):e.timeout,ignoreBlockError:!!e.ignoreBlockError}}const E=5e3;async function m(o,e,r){const t=S(r),a=o.overview,n=o.getBlockState(e);for(;;){const l=(await a.getValue()).blocks.find(i=>i.id==e);if(l===void 0)throw new Error(`Blocks not found: ${e}`);if(l.outputErrors){if(t.ignoreBlockError)return;{let i=l.outputsError;throw i===void 0&&(i=l.exportsError),new Error("Block error: "+(i??"no message"))}}if(l.calculationStatus==="Done")return;if(l.calculationStatus!=="Running")throw new Error(`Unexpected block status, block not calculating anything at the moment: ${l.calculationStatus}`);try{await a.awaitChange(t.timeout)}catch(i){throw console.dir(l,{depth:5}),console.dir(await n.getValue(),{depth:5}),new Error("Aborted while awaiting block done.",{cause:i})}}}const L=T.extend({ml:async({pl:o,tmpFolder:e},r)=>{const t=d.join(e,"frontend"),a=d.join(e,"download");await w.mkdir(t,{recursive:!0}),await w.mkdir(a,{recursive:!0});const n=await s.MiddleLayer.init(o,e,{defaultTreeOptions:{pollingInterval:250,stopPollingDelay:500},devBlockUpdateRecheckInterval:300,localSecret:s.MiddleLayer.generateLocalSecret(),localProjections:[],openFileDialogCallback:()=>{throw new Error("Not implemented.")}});n.addRuntimeCapability("requiresUIAPIVersion",1),n.addRuntimeCapability("requiresUIAPIVersion",2),await r(n),await n.close()},rawPrj:async({ml:o},e)=>{const r=await o.createProject({label:"Test Project"},"test_project");await o.openProject(r);const t=o.getOpenedProject(r);await e(t),o.closeProject(r)},helpers:async({ml:o,rawPrj:e},r)=>{await r({async awaitBlockDone(t,a){await m(e,t,a)},awaitBlockDoneAndGetStableBlockState:async(t,a)=>{const n=S(a);return await m(e,t,n),await R(e.getBlockState(t),n.timeout)},async getLocalFileHandle(t){return await o.internalDriverKit.lsDriver.getLocalFileHandle(d.resolve(t))}})}});exports.ML=j;exports.DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT=E;exports.TestRenderResults=h;exports.TestWorkflowResults=g;exports.TplTestHelpers=v;exports.awaitStableState=R;exports.blockTest=L;exports.plTest=T;exports.tplTest=F;
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/test-pl.ts","../src/test-template.ts","../src/util.ts","../src/test-block.ts"],"sourcesContent":["import type {\n OptionalResourceId,\n PlClient,\n ResourceId } from '@milaboratories/pl-middle-layer';\nimport {\n NullResourceId,\n resourceIdToString,\n TestHelpers,\n} from '@milaboratories/pl-middle-layer';\nimport type { SynchronizedTreeOps } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { randomUUID } from 'crypto';\nimport * as fsp from 'node:fs/promises';\nimport path from 'path';\nimport { test } from 'vitest';\n\nexport const plTest = test.extend<{\n pl: PlClient;\n createTree: (\n res: ResourceId,\n ops?: SynchronizedTreeOps\n ) => 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 (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED TMP FOLDER IS PRESERVED: ${workFolder}`,\n );\n } else {\n await fsp.rm(workFolder, { recursive: true });\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 await use(client);\n onTestFinished(async (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${alternativeRoot} (${resourceIdToString(\n altRootId,\n )})`,\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(alternativeRoot);\n }\n });\n },\n\n createTree: async ({ pl }, use) => {\n const trees = new Map<ResourceId, Promise<SynchronizedTreeState>>();\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 for (const [, treePromise] of trees) {\n // TODO implement termination\n await (await treePromise).terminate();\n }\n },\n\n rootTree: async ({ pl, createTree: tree }, use) => {\n await use(await tree(pl.clientRoot));\n },\n });\n","import type {\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables,\n} from '@milaboratories/computable';\nimport {\n Computable,\n} from '@milaboratories/computable';\nimport type {\n AnyRef,\n MiddleLayerDriverKit,\n PlClient,\n PlTransaction,\n ResourceId,\n TemplateSpecAny } from '@milaboratories/pl-middle-layer';\nimport {\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n Pl,\n prepareTemplateSpec,\n toGlobalResourceId,\n} from '@milaboratories/pl-middle-layer';\nimport type { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\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 ) {\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 ) {\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 // prettier-ignore\n const futureOutputs = await createRenderTemplate(\n 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: any) {\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, any> | Promise<Record<string, any>>,\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 const exports: TestRenderResults<'result'> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n const 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) => {\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) => {\n const driverKit = await initDriverKit(pl, tmpFolder, {\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","import type { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport type { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function awaitStableState<S>(\n computable: Computable<unknown, S>,\n timeout: number | AbortSignal = 5000,\n): Promise<S> {\n try {\n return await computable.awaitStableValue(\n typeof timeout === 'number' ? AbortSignal.timeout(timeout) : timeout,\n );\n } catch (e: unknown) {\n if (isTimeoutOrCancelError(e)) {\n const fullValue = await computable.getFullValue();\n console.dir(fullValue, { depth: 5 });\n throw new Error(\n `Aborted while awaiting stable value. Unstable marker: ${fullValue.unstableMarker}`,\n { cause: e },\n );\n } else throw e;\n }\n}\n","import path from 'path';\nimport * as fsp from 'node:fs/promises';\nimport type {\n InferBlockState, LocalImportFileHandle,\n Platforma,\n Project,\n} from '@milaboratories/pl-middle-layer';\nimport {\n MiddleLayer,\n} from '@milaboratories/pl-middle-layer';\nimport { plTest } from './test-pl';\nimport { awaitStableState } from './util';\n\nexport type AwaitBlockDoneOps = {\n timeout?: number | AbortSignal;\n ignoreBlockError?: boolean;\n};\n\nexport type AwaitBlockDoneNormalized = {\n timeout: AbortSignal;\n ignoreBlockError: boolean;\n};\n\nfunction normalizeABDOpts(\n timeoutOrOps?: number | AwaitBlockDoneOps,\n): AwaitBlockDoneNormalized {\n let ops: AwaitBlockDoneOps = {};\n if (timeoutOrOps !== undefined) {\n if (\n typeof timeoutOrOps === 'object'\n && !(timeoutOrOps instanceof AbortSignal)\n )\n ops = { ...ops, ...timeoutOrOps };\n else ops.timeout = timeoutOrOps;\n }\n const abortSignal\n = typeof ops.timeout === 'undefined'\n ? AbortSignal.timeout(DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT)\n : typeof ops.timeout === 'number'\n ? AbortSignal.timeout(ops.timeout)\n : ops.timeout;\n return {\n timeout: abortSignal,\n ignoreBlockError: Boolean(ops.ignoreBlockError),\n };\n}\n\nexport const DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT = 5000;\n\nasync function awaitBlockDone(\n prj: Project,\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n) {\n const ops = normalizeABDOpts(timeoutOrOps);\n const overview = prj.overview;\n const state = prj.getBlockState(blockId);\n while (true) {\n const overviewSnapshot = (await overview.getValue())!;\n const blockOverview = overviewSnapshot.blocks.find((b) => b.id == blockId);\n if (blockOverview === undefined)\n throw new Error(`Blocks not found: ${blockId}`);\n if (blockOverview.outputErrors) {\n if (ops.ignoreBlockError) return;\n else {\n let errorMessage = blockOverview.outputsError;\n if (errorMessage === undefined)\n errorMessage = blockOverview.exportsError;\n throw new Error('Block error: ' + (errorMessage ?? 'no message'));\n }\n }\n if (blockOverview.calculationStatus === 'Done') return;\n if (blockOverview.calculationStatus !== 'Running')\n throw new Error(\n `Unexpected block status, block not calculating anything at the moment: ${blockOverview.calculationStatus}`,\n );\n try {\n await overview.awaitChange(ops.timeout);\n } catch (e: any) {\n console.dir(blockOverview, { depth: 5 });\n console.dir(await state.getValue(), { depth: 5 });\n throw new Error('Aborted while awaiting block done.', { cause: e });\n }\n }\n}\n\nexport interface RawHelpers {\n awaitBlockDone(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<void>;\n awaitBlockDoneAndGetStableBlockState<Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<InferBlockState<Pl>>;\n getLocalFileHandle(localPath: string): Promise<LocalImportFileHandle>;\n}\n\nexport const blockTest = plTest.extend<{\n ml: MiddleLayer;\n rawPrj: Project;\n helpers: RawHelpers;\n}>({\n ml: async ({ pl, tmpFolder }, use) => {\n const frontendFolder = path.join(tmpFolder, 'frontend');\n const downloadFolder = path.join(tmpFolder, 'download');\n await fsp.mkdir(frontendFolder, { recursive: true });\n await fsp.mkdir(downloadFolder, { recursive: true });\n\n const ml = await MiddleLayer.init(pl, tmpFolder, {\n defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },\n devBlockUpdateRecheckInterval: 300,\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(ml);\n\n await ml.close();\n },\n rawPrj: async ({ ml }, use) => {\n const pRid1 = await ml.createProject(\n { label: 'Test Project' },\n 'test_project',\n );\n await ml.openProject(pRid1);\n const prj = ml.getOpenedProject(pRid1);\n await use(prj);\n ml.closeProject(pRid1);\n },\n helpers: async ({ ml, rawPrj }, use) => {\n await use({\n async awaitBlockDone(blockId, timeout) {\n await awaitBlockDone(rawPrj, blockId, timeout);\n },\n awaitBlockDoneAndGetStableBlockState: async <Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n ) => {\n const ops = normalizeABDOpts(timeoutOrOps);\n await awaitBlockDone(rawPrj, blockId, ops);\n return (await awaitStableState(\n rawPrj.getBlockState(blockId),\n ops.timeout,\n )) as InferBlockState<Pl>;\n },\n async getLocalFileHandle(localPath) {\n return await ml.internalDriverKit.lsDriver.getLocalFileHandle(\n path.resolve(localPath),\n );\n },\n });\n },\n});\n"],"names":["plTest","test","onTestFinished","use","workFolder","path","randomUUID","fsp","task","alternativeRoot","altRootId","NullResourceId","client","TestHelpers","resourceIdToString","pl","trees","res","ops","treePromise","SynchronizedTreeState","tree","TestRenderResults","resultEntry","name","cb","Computable","ctx","outputAccessor","TestWorkflowResults","renderResult","processedExportsResult","blockId","acc","TplTestHelpers","resultRootRid","resultRootTree","ephemeral","template","outputs","inputs","runId","spec","prepareTemplateSpec","resultMapRid","tx","tpl","loadTemplate","renderedInputs","futureOutputs","createRenderTemplate","resultMap","Pl","field","toGlobalResourceId","value","workflow","preRun","args","mainResult","exports","tplTest","createTree","map","rootField","resultMapTree","tmpFolder","driverKit","initDriverKit","MiddleLayer","awaitStableState","computable","timeout","e","isTimeoutOrCancelError","fullValue","normalizeABDOpts","timeoutOrOps","DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT","awaitBlockDone","prj","overview","state","blockOverview","b","errorMessage","blockTest","frontendFolder","downloadFolder","ml","pRid1","rawPrj","localPath"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/test-pl.ts","../src/test-template.ts","../src/util.ts","../src/test-block.ts"],"sourcesContent":["import type {\n OptionalResourceId,\n PlClient,\n ResourceId } from '@milaboratories/pl-middle-layer';\nimport {\n NullResourceId,\n resourceIdToString,\n TestHelpers,\n} from '@milaboratories/pl-middle-layer';\nimport type { SynchronizedTreeOps } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { randomUUID } from 'crypto';\nimport * as fsp from 'node:fs/promises';\nimport path from 'path';\nimport { test } from 'vitest';\n\nexport const plTest = test.extend<{\n pl: PlClient;\n createTree: (\n res: ResourceId,\n ops?: SynchronizedTreeOps\n ) => 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 (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED TMP FOLDER IS PRESERVED: ${workFolder}`,\n );\n } else {\n await fsp.rm(workFolder, { recursive: true });\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 await use(client);\n onTestFinished(async (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${alternativeRoot} (${resourceIdToString(\n altRootId,\n )})`,\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(alternativeRoot);\n }\n });\n },\n\n createTree: async ({ pl }, use) => {\n const trees = new Map<ResourceId, Promise<SynchronizedTreeState>>();\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 for (const [, treePromise] of trees) {\n // TODO implement termination\n await (await treePromise).terminate();\n }\n },\n\n rootTree: async ({ pl, createTree: tree }, use) => {\n await use(await tree(pl.clientRoot));\n },\n });\n","import type {\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables,\n} from '@milaboratories/computable';\nimport {\n Computable,\n} from '@milaboratories/computable';\nimport type {\n AnyRef,\n MiddleLayerDriverKit,\n PlClient,\n PlTransaction,\n ResourceId,\n TemplateSpecAny } from '@milaboratories/pl-middle-layer';\nimport {\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n Pl,\n prepareTemplateSpec,\n toGlobalResourceId,\n} from '@milaboratories/pl-middle-layer';\nimport type { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\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 ) {\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 ) {\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 // prettier-ignore\n const futureOutputs = await createRenderTemplate(\n 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: any) {\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, any> | Promise<Record<string, any>>,\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 const exports: TestRenderResults<'result'> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n const 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) => {\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) => {\n const driverKit = await initDriverKit(pl, tmpFolder, {\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","import type { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport type { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function awaitStableState<S>(\n computable: Computable<unknown, S>,\n timeout: number | AbortSignal = 5000,\n): Promise<S> {\n try {\n return await computable.awaitStableValue(\n typeof timeout === 'number' ? AbortSignal.timeout(timeout) : timeout,\n );\n } catch (e: unknown) {\n if (isTimeoutOrCancelError(e)) {\n const fullValue = await computable.getFullValue();\n console.dir(fullValue, { depth: 5 });\n throw new Error(\n `Aborted while awaiting stable value. Unstable marker: ${fullValue.unstableMarker}`,\n { cause: e },\n );\n } else throw e;\n }\n}\n","import path from 'path';\nimport * as fsp from 'node:fs/promises';\nimport type {\n InferBlockState, LocalImportFileHandle,\n Platforma,\n Project,\n} from '@milaboratories/pl-middle-layer';\nimport {\n MiddleLayer,\n} from '@milaboratories/pl-middle-layer';\nimport { plTest } from './test-pl';\nimport { awaitStableState } from './util';\n\nexport type AwaitBlockDoneOps = {\n timeout?: number | AbortSignal;\n ignoreBlockError?: boolean;\n};\n\nexport type AwaitBlockDoneNormalized = {\n timeout: AbortSignal;\n ignoreBlockError: boolean;\n};\n\nfunction normalizeABDOpts(\n timeoutOrOps?: number | AwaitBlockDoneOps,\n): AwaitBlockDoneNormalized {\n let ops: AwaitBlockDoneOps = {};\n if (timeoutOrOps !== undefined) {\n if (\n typeof timeoutOrOps === 'object'\n && !(timeoutOrOps instanceof AbortSignal)\n )\n ops = { ...ops, ...timeoutOrOps };\n else ops.timeout = timeoutOrOps;\n }\n const abortSignal\n = typeof ops.timeout === 'undefined'\n ? AbortSignal.timeout(DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT)\n : typeof ops.timeout === 'number'\n ? AbortSignal.timeout(ops.timeout)\n : ops.timeout;\n return {\n timeout: abortSignal,\n ignoreBlockError: Boolean(ops.ignoreBlockError),\n };\n}\n\nexport const DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT = 5000;\n\nasync function awaitBlockDone(\n prj: Project,\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n) {\n const ops = normalizeABDOpts(timeoutOrOps);\n const overview = prj.overview;\n const state = prj.getBlockState(blockId);\n while (true) {\n const overviewSnapshot = (await overview.getValue())!;\n const blockOverview = overviewSnapshot.blocks.find((b) => b.id == blockId);\n if (blockOverview === undefined)\n throw new Error(`Blocks not found: ${blockId}`);\n if (blockOverview.outputErrors) {\n if (ops.ignoreBlockError) return;\n else {\n let errorMessage = blockOverview.outputsError;\n if (errorMessage === undefined)\n errorMessage = blockOverview.exportsError;\n throw new Error('Block error: ' + (errorMessage ?? 'no message'));\n }\n }\n if (blockOverview.calculationStatus === 'Done') return;\n if (blockOverview.calculationStatus !== 'Running')\n throw new Error(\n `Unexpected block status, block not calculating anything at the moment: ${blockOverview.calculationStatus}`,\n );\n try {\n await overview.awaitChange(ops.timeout);\n } catch (e: any) {\n console.dir(blockOverview, { depth: 5 });\n console.dir(await state.getValue(), { depth: 5 });\n throw new Error('Aborted while awaiting block done.', { cause: e });\n }\n }\n}\n\nexport interface RawHelpers {\n awaitBlockDone(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<void>;\n awaitBlockDoneAndGetStableBlockState<Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<InferBlockState<Pl>>;\n getLocalFileHandle(localPath: string): Promise<LocalImportFileHandle>;\n}\n\nexport const blockTest = plTest.extend<{\n ml: MiddleLayer;\n rawPrj: Project;\n helpers: RawHelpers;\n}>({\n ml: async ({ pl, tmpFolder }, use) => {\n const frontendFolder = path.join(tmpFolder, 'frontend');\n const downloadFolder = path.join(tmpFolder, 'download');\n await fsp.mkdir(frontendFolder, { recursive: true });\n await fsp.mkdir(downloadFolder, { recursive: true });\n\n const ml = await MiddleLayer.init(pl, tmpFolder, {\n defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },\n devBlockUpdateRecheckInterval: 300,\n localSecret: MiddleLayer.generateLocalSecret(),\n localProjections: [], // TODO must be different with local pl\n openFileDialogCallback: () => {\n throw new Error('Not implemented.');\n },\n });\n ml.addRuntimeCapability('requiresUIAPIVersion', 1);\n ml.addRuntimeCapability('requiresUIAPIVersion', 2);\n\n await use(ml);\n\n await ml.close();\n },\n rawPrj: async ({ ml }, use) => {\n const pRid1 = await ml.createProject(\n { label: 'Test Project' },\n 'test_project',\n );\n await ml.openProject(pRid1);\n const prj = ml.getOpenedProject(pRid1);\n await use(prj);\n ml.closeProject(pRid1);\n },\n helpers: async ({ ml, rawPrj }, use) => {\n await use({\n async awaitBlockDone(blockId, timeout) {\n await awaitBlockDone(rawPrj, blockId, timeout);\n },\n awaitBlockDoneAndGetStableBlockState: async <Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n ) => {\n const ops = normalizeABDOpts(timeoutOrOps);\n await awaitBlockDone(rawPrj, blockId, ops);\n return (await awaitStableState(\n rawPrj.getBlockState(blockId),\n ops.timeout,\n )) as InferBlockState<Pl>;\n },\n async getLocalFileHandle(localPath) {\n return await ml.internalDriverKit.lsDriver.getLocalFileHandle(\n path.resolve(localPath),\n );\n },\n });\n },\n});\n"],"names":["plTest","test","onTestFinished","use","workFolder","path","randomUUID","fsp","task","alternativeRoot","altRootId","NullResourceId","client","TestHelpers","resourceIdToString","pl","trees","res","ops","treePromise","SynchronizedTreeState","tree","TestRenderResults","resultEntry","name","cb","Computable","ctx","outputAccessor","TestWorkflowResults","renderResult","processedExportsResult","blockId","acc","TplTestHelpers","resultRootRid","resultRootTree","ephemeral","template","outputs","inputs","runId","spec","prepareTemplateSpec","resultMapRid","tx","tpl","loadTemplate","renderedInputs","futureOutputs","createRenderTemplate","resultMap","Pl","field","toGlobalResourceId","value","workflow","preRun","args","mainResult","exports","tplTest","createTree","map","rootField","resultMapTree","tmpFolder","driverKit","initDriverKit","MiddleLayer","awaitStableState","computable","timeout","e","isTimeoutOrCancelError","fullValue","normalizeABDOpts","timeoutOrOps","DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT","awaitBlockDone","prj","overview","state","blockOverview","b","errorMessage","blockTest","frontendFolder","downloadFolder","ml","pRid1","rawPrj","localPath"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { TestHelpers as f, resourceIdToString as I, NullResourceId as D, initDriverKit as F, MiddleLayer as w, Pl as m, field as g, toGlobalResourceId as v, prepareTemplateSpec as T, loadTemplate as P, createRenderTemplate as A } from "@milaboratories/pl-middle-layer";
2
- import * as U from "@milaboratories/pl-middle-layer";
1
+ import { TestHelpers as f, resourceIdToString as I, NullResourceId as D, initDriverKit as P, MiddleLayer as w, Pl as m, field as g, toGlobalResourceId as v, prepareTemplateSpec as T, loadTemplate as F, createRenderTemplate as A } from "@milaboratories/pl-middle-layer";
2
+ import * as N from "@milaboratories/pl-middle-layer";
3
3
  import { SynchronizedTreeState as O } from "@milaboratories/pl-tree";
4
4
  import { randomUUID as p } from "node:crypto";
5
5
  import * as d from "node:fs/promises";
@@ -48,7 +48,7 @@ const R = j.extend({
48
48
  await r(await e(o.clientRoot));
49
49
  }
50
50
  });
51
- class L {
51
+ class C {
52
52
  constructor(e) {
53
53
  this.resultEntry = e;
54
54
  }
@@ -59,7 +59,7 @@ class L {
59
59
  });
60
60
  }
61
61
  }
62
- class C {
62
+ class L {
63
63
  constructor(e, r, t) {
64
64
  this.renderResult = e, this.processedExportsResult = r, this.blockId = t;
65
65
  }
@@ -82,7 +82,7 @@ class C {
82
82
  return this.renderResult.computeOutput("result", (t, a) => r(t == null ? void 0 : t.traverse({ field: e, assertFieldType: "Input" }), a));
83
83
  }
84
84
  }
85
- class x {
85
+ class V {
86
86
  constructor(e, r, t) {
87
87
  this.pl = e, this.resultRootRid = r, this.resultRootTree = t;
88
88
  }
@@ -91,7 +91,7 @@ class x {
91
91
  type: "from-file",
92
92
  path: `./dist/tengo/tpl/${r}.plj.gz`
93
93
  }) : await T(r), { resultMapRid: s } = await this.pl.withWriteTx("TemplateRender", async (n) => {
94
- const c = P(n, l), S = await a(n), k = await A(
94
+ const c = F(n, l), S = await a(n), k = await A(
95
95
  n,
96
96
  c,
97
97
  e,
@@ -104,7 +104,7 @@ class x {
104
104
  resultMapRid: b
105
105
  };
106
106
  });
107
- return await this.resultRootTree.refreshState(), new L(this.resultRootTree.entry(s));
107
+ return await this.resultRootTree.refreshState(), new C(this.resultRootTree.entry(s));
108
108
  }
109
109
  createObject(e, r) {
110
110
  return e.createValue(m.JsonObject, JSON.stringify(r));
@@ -126,19 +126,19 @@ class x {
126
126
  ), s = void 0;
127
127
  return a.exportProcessor !== void 0 && await this.renderTemplate(!0, a.exportProcessor, ["result"], (n) => ({
128
128
  pf: n.getFutureFieldValue(l.resultEntry.rid, "context", "Input")
129
- })), new C(l, s, i);
129
+ })), new L(l, s, i);
130
130
  }
131
131
  }
132
- const J = R.extend({
132
+ const G = R.extend({
133
133
  helper: async ({ pl: o, createTree: e }, r) => {
134
134
  const t = await o.withWriteTx("CreatingHelpers", async (i) => {
135
135
  const l = i.createEphemeral(m.EphStdMap), s = g(i.clientRoot, "templateTeste");
136
136
  return i.createField(s, "Dynamic", l), await i.commit(), await v(l);
137
137
  }), a = await e(t);
138
- await r(new x(o, t, a));
138
+ await r(new V(o, t, a));
139
139
  },
140
140
  driverKit: async ({ pl: o, tmpFolder: e }, r) => {
141
- const t = await F(o, e, {
141
+ const t = await P(o, e, {
142
142
  localSecret: w.generateLocalSecret(),
143
143
  localProjections: [],
144
144
  // TODO must be different with local pl
@@ -149,7 +149,7 @@ const J = R.extend({
149
149
  await r(t);
150
150
  }
151
151
  });
152
- async function $(o, e = 5e3) {
152
+ async function x(o, e = 5e3) {
153
153
  try {
154
154
  return await o.awaitStableValue(
155
155
  typeof e == "number" ? AbortSignal.timeout(e) : e
@@ -167,11 +167,11 @@ async function $(o, e = 5e3) {
167
167
  function E(o) {
168
168
  let e = {};
169
169
  return o !== void 0 && (typeof o == "object" && !(o instanceof AbortSignal) ? e = { ...e, ...o } : e.timeout = o), {
170
- timeout: typeof e.timeout > "u" ? AbortSignal.timeout(V) : typeof e.timeout == "number" ? AbortSignal.timeout(e.timeout) : e.timeout,
170
+ timeout: typeof e.timeout > "u" ? AbortSignal.timeout($) : typeof e.timeout == "number" ? AbortSignal.timeout(e.timeout) : e.timeout,
171
171
  ignoreBlockError: !!e.ignoreBlockError
172
172
  };
173
173
  }
174
- const V = 5e3;
174
+ const $ = 5e3;
175
175
  async function y(o, e, r) {
176
176
  const t = E(r), a = o.overview, i = o.getBlockState(e);
177
177
  for (; ; ) {
@@ -197,7 +197,7 @@ async function y(o, e, r) {
197
197
  }
198
198
  }
199
199
  }
200
- const q = R.extend({
200
+ const J = R.extend({
201
201
  ml: async ({ pl: o, tmpFolder: e }, r) => {
202
202
  const t = u.join(e, "frontend"), a = u.join(e, "download");
203
203
  await d.mkdir(t, { recursive: !0 }), await d.mkdir(a, { recursive: !0 });
@@ -211,7 +211,7 @@ const q = R.extend({
211
211
  throw new Error("Not implemented.");
212
212
  }
213
213
  });
214
- await r(i), await i.close();
214
+ i.addRuntimeCapability("requiresUIAPIVersion", 1), i.addRuntimeCapability("requiresUIAPIVersion", 2), await r(i), await i.close();
215
215
  },
216
216
  rawPrj: async ({ ml: o }, e) => {
217
217
  const r = await o.createProject(
@@ -229,7 +229,7 @@ const q = R.extend({
229
229
  },
230
230
  awaitBlockDoneAndGetStableBlockState: async (t, a) => {
231
231
  const i = E(a);
232
- return await y(e, t, i), await $(
232
+ return await y(e, t, i), await x(
233
233
  e.getBlockState(t),
234
234
  i.timeout
235
235
  );
@@ -243,14 +243,14 @@ const q = R.extend({
243
243
  }
244
244
  });
245
245
  export {
246
- V as DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT,
247
- U as ML,
248
- L as TestRenderResults,
249
- C as TestWorkflowResults,
250
- x as TplTestHelpers,
251
- $ as awaitStableState,
252
- q as blockTest,
246
+ $ as DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT,
247
+ N as ML,
248
+ C as TestRenderResults,
249
+ L as TestWorkflowResults,
250
+ V as TplTestHelpers,
251
+ x as awaitStableState,
252
+ J as blockTest,
253
253
  R as plTest,
254
- J as tplTest
254
+ G as tplTest
255
255
  };
256
256
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/test-pl.ts","../src/test-template.ts","../src/util.ts","../src/test-block.ts"],"sourcesContent":["import type {\n OptionalResourceId,\n PlClient,\n ResourceId } from '@milaboratories/pl-middle-layer';\nimport {\n NullResourceId,\n resourceIdToString,\n TestHelpers,\n} from '@milaboratories/pl-middle-layer';\nimport type { SynchronizedTreeOps } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { randomUUID } from 'crypto';\nimport * as fsp from 'node:fs/promises';\nimport path from 'path';\nimport { test } from 'vitest';\n\nexport const plTest = test.extend<{\n pl: PlClient;\n createTree: (\n res: ResourceId,\n ops?: SynchronizedTreeOps\n ) => 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 (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED TMP FOLDER IS PRESERVED: ${workFolder}`,\n );\n } else {\n await fsp.rm(workFolder, { recursive: true });\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 await use(client);\n onTestFinished(async (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${alternativeRoot} (${resourceIdToString(\n altRootId,\n )})`,\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(alternativeRoot);\n }\n });\n },\n\n createTree: async ({ pl }, use) => {\n const trees = new Map<ResourceId, Promise<SynchronizedTreeState>>();\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 for (const [, treePromise] of trees) {\n // TODO implement termination\n await (await treePromise).terminate();\n }\n },\n\n rootTree: async ({ pl, createTree: tree }, use) => {\n await use(await tree(pl.clientRoot));\n },\n });\n","import type {\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables,\n} from '@milaboratories/computable';\nimport {\n Computable,\n} from '@milaboratories/computable';\nimport type {\n AnyRef,\n MiddleLayerDriverKit,\n PlClient,\n PlTransaction,\n ResourceId,\n TemplateSpecAny } from '@milaboratories/pl-middle-layer';\nimport {\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n Pl,\n prepareTemplateSpec,\n toGlobalResourceId,\n} from '@milaboratories/pl-middle-layer';\nimport type { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\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 ) {\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 ) {\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 // prettier-ignore\n const futureOutputs = await createRenderTemplate(\n 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: any) {\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, any> | Promise<Record<string, any>>,\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 const exports: TestRenderResults<'result'> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n const 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) => {\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) => {\n const driverKit = await initDriverKit(pl, tmpFolder, {\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","import type { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport type { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function awaitStableState<S>(\n computable: Computable<unknown, S>,\n timeout: number | AbortSignal = 5000,\n): Promise<S> {\n try {\n return await computable.awaitStableValue(\n typeof timeout === 'number' ? AbortSignal.timeout(timeout) : timeout,\n );\n } catch (e: unknown) {\n if (isTimeoutOrCancelError(e)) {\n const fullValue = await computable.getFullValue();\n console.dir(fullValue, { depth: 5 });\n throw new Error(\n `Aborted while awaiting stable value. Unstable marker: ${fullValue.unstableMarker}`,\n { cause: e },\n );\n } else throw e;\n }\n}\n","import path from 'path';\nimport * as fsp from 'node:fs/promises';\nimport type {\n InferBlockState, LocalImportFileHandle,\n Platforma,\n Project,\n} from '@milaboratories/pl-middle-layer';\nimport {\n MiddleLayer,\n} from '@milaboratories/pl-middle-layer';\nimport { plTest } from './test-pl';\nimport { awaitStableState } from './util';\n\nexport type AwaitBlockDoneOps = {\n timeout?: number | AbortSignal;\n ignoreBlockError?: boolean;\n};\n\nexport type AwaitBlockDoneNormalized = {\n timeout: AbortSignal;\n ignoreBlockError: boolean;\n};\n\nfunction normalizeABDOpts(\n timeoutOrOps?: number | AwaitBlockDoneOps,\n): AwaitBlockDoneNormalized {\n let ops: AwaitBlockDoneOps = {};\n if (timeoutOrOps !== undefined) {\n if (\n typeof timeoutOrOps === 'object'\n && !(timeoutOrOps instanceof AbortSignal)\n )\n ops = { ...ops, ...timeoutOrOps };\n else ops.timeout = timeoutOrOps;\n }\n const abortSignal\n = typeof ops.timeout === 'undefined'\n ? AbortSignal.timeout(DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT)\n : typeof ops.timeout === 'number'\n ? AbortSignal.timeout(ops.timeout)\n : ops.timeout;\n return {\n timeout: abortSignal,\n ignoreBlockError: Boolean(ops.ignoreBlockError),\n };\n}\n\nexport const DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT = 5000;\n\nasync function awaitBlockDone(\n prj: Project,\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n) {\n const ops = normalizeABDOpts(timeoutOrOps);\n const overview = prj.overview;\n const state = prj.getBlockState(blockId);\n while (true) {\n const overviewSnapshot = (await overview.getValue())!;\n const blockOverview = overviewSnapshot.blocks.find((b) => b.id == blockId);\n if (blockOverview === undefined)\n throw new Error(`Blocks not found: ${blockId}`);\n if (blockOverview.outputErrors) {\n if (ops.ignoreBlockError) return;\n else {\n let errorMessage = blockOverview.outputsError;\n if (errorMessage === undefined)\n errorMessage = blockOverview.exportsError;\n throw new Error('Block error: ' + (errorMessage ?? 'no message'));\n }\n }\n if (blockOverview.calculationStatus === 'Done') return;\n if (blockOverview.calculationStatus !== 'Running')\n throw new Error(\n `Unexpected block status, block not calculating anything at the moment: ${blockOverview.calculationStatus}`,\n );\n try {\n await overview.awaitChange(ops.timeout);\n } catch (e: any) {\n console.dir(blockOverview, { depth: 5 });\n console.dir(await state.getValue(), { depth: 5 });\n throw new Error('Aborted while awaiting block done.', { cause: e });\n }\n }\n}\n\nexport interface RawHelpers {\n awaitBlockDone(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<void>;\n awaitBlockDoneAndGetStableBlockState<Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<InferBlockState<Pl>>;\n getLocalFileHandle(localPath: string): Promise<LocalImportFileHandle>;\n}\n\nexport const blockTest = plTest.extend<{\n ml: MiddleLayer;\n rawPrj: Project;\n helpers: RawHelpers;\n}>({\n ml: async ({ pl, tmpFolder }, use) => {\n const frontendFolder = path.join(tmpFolder, 'frontend');\n const downloadFolder = path.join(tmpFolder, 'download');\n await fsp.mkdir(frontendFolder, { recursive: true });\n await fsp.mkdir(downloadFolder, { recursive: true });\n\n const ml = await MiddleLayer.init(pl, tmpFolder, {\n defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },\n devBlockUpdateRecheckInterval: 300,\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(ml);\n\n await ml.close();\n },\n rawPrj: async ({ ml }, use) => {\n const pRid1 = await ml.createProject(\n { label: 'Test Project' },\n 'test_project',\n );\n await ml.openProject(pRid1);\n const prj = ml.getOpenedProject(pRid1);\n await use(prj);\n ml.closeProject(pRid1);\n },\n helpers: async ({ ml, rawPrj }, use) => {\n await use({\n async awaitBlockDone(blockId, timeout) {\n await awaitBlockDone(rawPrj, blockId, timeout);\n },\n awaitBlockDoneAndGetStableBlockState: async <Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n ) => {\n const ops = normalizeABDOpts(timeoutOrOps);\n await awaitBlockDone(rawPrj, blockId, ops);\n return (await awaitStableState(\n rawPrj.getBlockState(blockId),\n ops.timeout,\n )) as InferBlockState<Pl>;\n },\n async getLocalFileHandle(localPath) {\n return await ml.internalDriverKit.lsDriver.getLocalFileHandle(\n path.resolve(localPath),\n );\n },\n });\n },\n});\n"],"names":["plTest","test","onTestFinished","use","workFolder","path","randomUUID","fsp","task","alternativeRoot","altRootId","NullResourceId","client","TestHelpers","resourceIdToString","pl","trees","res","ops","treePromise","SynchronizedTreeState","tree","TestRenderResults","resultEntry","name","cb","Computable","ctx","outputAccessor","TestWorkflowResults","renderResult","processedExportsResult","blockId","acc","TplTestHelpers","resultRootRid","resultRootTree","ephemeral","template","outputs","inputs","runId","spec","prepareTemplateSpec","resultMapRid","tx","tpl","loadTemplate","renderedInputs","futureOutputs","createRenderTemplate","resultMap","Pl","field","toGlobalResourceId","value","workflow","preRun","args","mainResult","exports","tplTest","createTree","map","rootField","resultMapTree","tmpFolder","driverKit","initDriverKit","MiddleLayer","awaitStableState","computable","timeout","e","isTimeoutOrCancelError","fullValue","normalizeABDOpts","timeoutOrOps","DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT","awaitBlockDone","prj","overview","state","blockOverview","b","errorMessage","blockTest","frontendFolder","downloadFolder","ml","pRid1","rawPrj","localPath"],"mappings":";;;;;;;;;AAgBa,MAAAA,IAASC,EAAK,OAQxB;AAAA,EACG,WAAW,OAAO,EAAE,gBAAAC,KAAkBC,MAAQ;AAC5C,UAAMC,IAAaC,EAAK,QAAQ,QAAQC,EAAY,CAAA,EAAE;AACtD,UAAMC,EAAI,MAAMH,GAAY,EAAE,WAAW,IAAM,GAC/C,MAAMD,EAAIC,CAAU,GACpBF,EAAe,OAAOM,MAAS;AACzB,MAAAA,EAAK,WAAW,SACV,QAAA;AAAA,QACN,wCAAwCJ,CAAU;AAAA,MACpD,IAEA,MAAMG,EAAI,GAAGH,GAAY,EAAE,WAAW,IAAM;AAAA,IAC9C,CACD;AAAA,EACH;AAAA,EAEA,IAAI,OAAO,EAAE,gBAAAF,KAAkBC,MAAQ;AACrC,UAAMM,IAAkB,QAAQ,KAAK,KAAK,IAAIH,GAAY;AAC1D,QAAII,IAAgCC;AACpC,UAAMC,IAAS,MAAMC,EAAY,cAAcJ,CAAe;AAC9D,IAAAC,IAAYE,EAAO,YACnB,MAAMT,EAAIS,CAAM,GAChBV,EAAe,OAAOM,MAAS;AACzB,MAAAA,EAAK,WAAW,SACV,QAAA;AAAA,QACN,uDAAuDC,CAAe,KAAKK;AAAA,UACzEJ;AAAA,QAAA,CACD;AAAA,MACH,IAGM,OADY,MAAMG,EAAY,cAAc,GAClC,sBAAsBJ,CAAe;AAAA,IACvD,CACD;AAAA,EACH;AAAA,EAEA,YAAY,OAAO,EAAE,IAAAM,KAAMZ,MAAQ;AAC3B,UAAAa,wBAAY,IAAgD;AAC5D,UAAAb,EAAI,CAACc,GAAKC,MAAQ;AAClB,UAAAC,IAAcH,EAAM,IAAIC,CAAG;AAC/B,aAAIE,MAAgB,WAClBA,IAAcC,EAAsB;AAAA,QAClCL;AAAA,QACAE;AAAA,QACAC,KAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,kBAAkB;AAAA,QAAA;AAAA,MAEtB,GACMF,EAAA,IAAIC,GAAKE,CAAW,IAErBA;AAAA,IAAA,CACR;AACD,eAAW,CAAA,EAAGA,CAAW,KAAKH;AAErB,aAAA,MAAMG,GAAa,UAAU;AAAA,EAExC;AAAA,EAEA,UAAU,OAAO,EAAE,IAAAJ,GAAI,YAAYM,EAAA,GAAQlB,MAAQ;AACjD,UAAMA,EAAI,MAAMkB,EAAKN,EAAG,UAAU,CAAC;AAAA,EAAA;AAEvC,CAAC;AC/CE,MAAMO,EAAoC;AAAA,EAC/C,YAA4BC,GAA0B;AAA1B,SAAA,cAAAA;AAAA,EAAA;AAAA,EAErB,cACLC,GACAC,GAC8C;AACvC,WAAAC,EAAW,KAAK,CAACC,MAAQ;AAC9B,YAAMC,IAAiBD,EACpB,SAAS,KAAK,WAAW,EACzB,OACA,SAAS,EAAE,OAAOH,GAAM,iBAAiB,SAAS;AAC9C,aAAAC,EAAGG,GAAgBD,CAAG;AAAA,IAAA,CAC9B;AAAA,EAAA;AAEL;AAEO,MAAME,EAAoB;AAAA,EAC/B,YACkBC,GACAC,GACAC,GAChB;AAHgB,SAAA,eAAAF,GACA,KAAA,yBAAAC,GACA,KAAA,UAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMX,UAA+C;AAC7C,WAAA,KAAK,aAAa,cAAc,WAAW,CAACP,MAAOA,KAAA,gBAAAA,EAAI,EAAE,EAAE,eAAe;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM5E,SAA8C;AAC5C,WAAA,KAAK,aAAa,cAAc,UAAU,CAACA,MAAOA,KAAA,gBAAAA,EAAI,EAAE,EAAE,eAAe;AAAA,EAAA;AAAA,EAG3E,OACLD,GACAC,GACA;AACA,WAAI,KAAK,2BAA2B,SAC3B,KAAK,uBAAuB,cAAc,UAAU,CAACQ,GAAKN,MACxDF,EAAGQ,KAAA,gBAAAA,EAAK,SAAS,EAAE,OAAOT,GAAM,iBAAiB,YAAYG,CAAG,CACxE,IAEM,KAAK,aAAa,cAAc,WAAW,CAACM,GAAKN,MAC/CF,EAAGQ,KAAA,gBAAAA,EAAK,SAAS,EAAE,OAAO,UAAUT,CAAI,IAAI,iBAAiB,QAAS,IAAGG,CAAG,CACpF;AAAA,EAAA;AAAA,EAGE,OACLH,GACAC,GACA;AACA,WAAO,KAAK,aAAa,cAAc,UAAU,CAACQ,GAAKN,MAC9CF,EAAGQ,KAAA,gBAAAA,EAAK,SAAS,EAAE,OAAOT,GAAM,iBAAiB,YAAYG,CAAG,CACxE;AAAA,EAAA;AAEL;AAEO,MAAMO,EAAe;AAAA,EAC1B,YACmBnB,GACAoB,GACAC,GACjB;AAHiB,SAAA,KAAArB,GACA,KAAA,gBAAAoB,GACA,KAAA,iBAAAC;AAAA,EAAA;AAAA,EAGnB,MAAM,eACJC,GACAC,GACAC,GACAC,GAC+B;AAC/B,UAAMC,IAAQnC,EAAW,GACnBoC,IACF,OAAOJ,KAAa,WAClB,MAAMK,EAAoB;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM,oBAAoBL,CAAQ;AAAA,IAAA,CACnC,IACC,MAAMK,EAAoBL,CAAQ,GAClC,EAAE,cAAAM,EAAiB,IAAA,MAAM,KAAK,GAAG,YAAY,kBAAkB,OAAOC,MAAO;AAC3E,YAAAC,IAAMC,EAAaF,GAAIH,CAAI,GAC3BM,IAAiB,MAAMR,EAAOK,CAAE,GAEhCI,IAAgB,MAAMC;AAAA,QAC1BL;AAAA,QAAIC;AAAA,QAAKT;AAAA,QAAWW;AAAA,QAAgBT;AAAA,MAAO,GACvCY,IAAYC,EAAG,YAAYP,GAAII,GAAeZ,CAAS;AAC7D,MAAAQ,EAAG,YAAYQ,EAAM,KAAK,eAAeZ,CAAK,GAAG,WAAWU,CAAS;AAC/DP,YAAAA,IAAe,MAAMU,EAAmBH,CAAS;AACvD,mBAAMN,EAAG,OAAO,GACT;AAAA,QACL,cAAAD;AAAAA,MACF;AAAA,IAAA,CACD;AACK,iBAAA,KAAK,eAAe,aAAa,GAChC,IAAItB,EAAkB,KAAK,eAAe,MAAMsB,CAAY,CAAC;AAAA,EAAA;AAAA,EAGtE,aAAaC,GAAmBU,GAAY;AAC1C,WAAOV,EAAG,YAAYO,EAAG,YAAY,KAAK,UAAUG,CAAK,CAAC;AAAA,EAAA;AAAA,EAG5D,MAAM,eACJC,GACAC,GACAC,GACAxC,IAAyB,CAAA,GACK;AACxB,UAAAc,IAAUd,EAAI,WAAWZ,EAAW,GACpCqD,IAAsD,MAAM,KAAK;AAAA,MACrE;AAAA,MACAH;AAAA,MACA,CAAC,UAAU,SAAS;AAAA,MACpB,CAACX,MAAO;AACN,YAAIlB;AACJ,eAAIT,EAAI,SACNS,IAAMT,EAAI,UAEVS,IAAMkB,EAAG,gBAAgB,EAAE,MAAM,eAAe,SAAS,KAAK,GAC9DA,EAAG,KAAKlB,CAAG,IAGN;AAAA,UACL,MAAM,KAAK,aAAakB,GAAIa,CAAI;AAAA,UAChC,SAAS,KAAK,aAAab,GAAIb,CAAO;AAAA,UACtC,cAAc,KAAK,aAAaa,GAAI,CAACY,CAAM;AAAA,UAC3C,SAAS9B;AAAA,QACX;AAAA,MAAA;AAAA,IAEJ,GAEMiC,IAAmD;AACrD,WAAA1C,EAAI,oBAAoB,UACV,MAAM,KAAK,eAAe,IAAMA,EAAI,iBAAiB,CAAC,QAAQ,GAAG,CAAC2B,OAAQ;AAAA,MACxF,IAAIA,EAAG,oBAAoBc,EAAW,YAAY,KAAK,WAAW,OAAO;AAAA,IAAA,EACzE,GAGG,IAAI9B,EAAoB8B,GAAYC,GAAS5B,CAAO;AAAA,EAAA;AAE/D;AAEa,MAAA6B,IAAU7D,EAAO,OAG3B;AAAA,EACD,QAAQ,OAAO,EAAE,IAAAe,GAAI,YAAA+C,EAAA,GAAc3D,MAAQ;AACzC,UAAMgD,IAAY,MAAMpC,EAAG,YAAY,mBAAmB,OAAO8B,MAAO;AACtE,YAAMkB,IAAMlB,EAAG,gBAAgBO,EAAG,SAAS,GACrCY,IAAYX,EAAMR,EAAG,YAAY,eAAe;AACnD,aAAAA,EAAA,YAAYmB,GAAW,WAAWD,CAAG,GACxC,MAAMlB,EAAG,OAAO,GACT,MAAMS,EAAmBS,CAAG;AAAA,IAAA,CACpC,GACKE,IAAgB,MAAMH,EAAWX,CAAS;AAChD,UAAMhD,EAAI,IAAI+B,EAAenB,GAAIoC,GAAWc,CAAa,CAAC;AAAA,EAC5D;AAAA,EACA,WAAW,OAAO,EAAE,IAAAlD,GAAI,WAAAmD,EAAA,GAAa/D,MAAQ;AAC3C,UAAMgE,IAAY,MAAMC,EAAcrD,GAAImD,GAAW;AAAA,MACnD,aAAaG,EAAY,oBAAoB;AAAA,MAC7C,kBAAkB,CAAC;AAAA;AAAA,MACnB,wBAAwB,MAAM;AACtB,cAAA,IAAI,MAAM,kBAAkB;AAAA,MAAA;AAAA,IACpC,CACD;AAED,UAAMlE,EAAIgE,CAAS;AAAA,EAAA;AAEvB,CAAC;AClMqB,eAAAG,EACpBC,GACAC,IAAgC,KACpB;AACR,MAAA;AACF,WAAO,MAAMD,EAAW;AAAA,MACtB,OAAOC,KAAY,WAAW,YAAY,QAAQA,CAAO,IAAIA;AAAA,IAC/D;AAAA,WACOC,GAAY;AACf,QAAAC,EAAuBD,CAAC,GAAG;AACvB,YAAAE,IAAY,MAAMJ,EAAW,aAAa;AAChD,oBAAQ,IAAII,GAAW,EAAE,OAAO,GAAG,GAC7B,IAAI;AAAA,QACR,yDAAyDA,EAAU,cAAc;AAAA,QACjF,EAAE,OAAOF,EAAE;AAAA,MACb;AAAA,UACW,OAAAA;AAAA,EAAA;AAEjB;ACXA,SAASG,EACPC,GAC0B;AAC1B,MAAI3D,IAAyB,CAAC;AAC9B,SAAI2D,MAAiB,WAEjB,OAAOA,KAAiB,YACrB,EAAEA,aAAwB,eAE7B3D,IAAM,EAAE,GAAGA,GAAK,GAAG2D,EAAa,MACzB,UAAUA,IAQd;AAAA,IACL,SANE,OAAO3D,EAAI,UAAY,MACrB,YAAY,QAAQ4D,CAAgC,IACpD,OAAO5D,EAAI,WAAY,WACrB,YAAY,QAAQA,EAAI,OAAO,IAC/BA,EAAI;AAAA,IAGV,kBAAkB,EAAQA,EAAI;AAAA,EAChC;AACF;AAEO,MAAM4D,IAAmC;AAEhD,eAAeC,EACbC,GACAhD,GACA6C,GACA;AACM,QAAA3D,IAAM0D,EAAiBC,CAAY,GACnCI,IAAWD,EAAI,UACfE,IAAQF,EAAI,cAAchD,CAAO;AACvC,aAAa;AAEL,UAAAmD,KADoB,MAAMF,EAAS,SAAS,GACX,OAAO,KAAK,CAACG,MAAMA,EAAE,MAAMpD,CAAO;AACzE,QAAImD,MAAkB;AACpB,YAAM,IAAI,MAAM,qBAAqBnD,CAAO,EAAE;AAChD,QAAImD,EAAc,cAAc;AAC9B,UAAIjE,EAAI,iBAAkB;AACrB;AACH,YAAImE,IAAeF,EAAc;AACjC,cAAIE,MAAiB,WACnBA,IAAeF,EAAc,eACzB,IAAI,MAAM,mBAAmBE,KAAgB,aAAa;AAAA,MAAA;AAAA,IAClE;AAEE,QAAAF,EAAc,sBAAsB,OAAQ;AAChD,QAAIA,EAAc,sBAAsB;AACtC,YAAM,IAAI;AAAA,QACR,0EAA0EA,EAAc,iBAAiB;AAAA,MAC3G;AACE,QAAA;AACI,YAAAF,EAAS,YAAY/D,EAAI,OAAO;AAAA,aAC/BuD,GAAQ;AACf,oBAAQ,IAAIU,GAAe,EAAE,OAAO,GAAG,GAC/B,QAAA,IAAI,MAAMD,EAAM,SAAA,GAAY,EAAE,OAAO,GAAG,GAC1C,IAAI,MAAM,sCAAsC,EAAE,OAAOT,GAAG;AAAA,IAAA;AAAA,EACpE;AAEJ;AAca,MAAAa,IAAYtF,EAAO,OAI7B;AAAA,EACD,IAAI,OAAO,EAAE,IAAAe,GAAI,WAAAmD,EAAA,GAAa/D,MAAQ;AACpC,UAAMoF,IAAiBlF,EAAK,KAAK6D,GAAW,UAAU,GAChDsB,IAAiBnF,EAAK,KAAK6D,GAAW,UAAU;AACtD,UAAM3D,EAAI,MAAMgF,GAAgB,EAAE,WAAW,IAAM,GACnD,MAAMhF,EAAI,MAAMiF,GAAgB,EAAE,WAAW,IAAM;AAEnD,UAAMC,IAAK,MAAMpB,EAAY,KAAKtD,GAAImD,GAAW;AAAA,MAC/C,oBAAoB,EAAE,iBAAiB,KAAK,kBAAkB,IAAI;AAAA,MAClE,+BAA+B;AAAA,MAC/B,aAAaG,EAAY,oBAAoB;AAAA,MAC7C,kBAAkB,CAAC;AAAA;AAAA,MACnB,wBAAwB,MAAM;AACtB,cAAA,IAAI,MAAM,kBAAkB;AAAA,MAAA;AAAA,IACpC,CACD;AAED,UAAMlE,EAAIsF,CAAE,GAEZ,MAAMA,EAAG,MAAM;AAAA,EACjB;AAAA,EACA,QAAQ,OAAO,EAAE,IAAAA,KAAMtF,MAAQ;AACvB,UAAAuF,IAAQ,MAAMD,EAAG;AAAA,MACrB,EAAE,OAAO,eAAe;AAAA,MACxB;AAAA,IACF;AACM,UAAAA,EAAG,YAAYC,CAAK;AACpB,UAAAV,IAAMS,EAAG,iBAAiBC,CAAK;AACrC,UAAMvF,EAAI6E,CAAG,GACbS,EAAG,aAAaC,CAAK;AAAA,EACvB;AAAA,EACA,SAAS,OAAO,EAAE,IAAAD,GAAI,QAAAE,EAAA,GAAUxF,MAAQ;AACtC,UAAMA,EAAI;AAAA,MACR,MAAM,eAAe6B,GAASwC,GAAS;AAC/B,cAAAO,EAAeY,GAAQ3D,GAASwC,CAAO;AAAA,MAC/C;AAAA,MACA,sCAAsC,OACpCxC,GACA6C,MACG;AACG,cAAA3D,IAAM0D,EAAiBC,CAAY;AACnC,qBAAAE,EAAeY,GAAQ3D,GAASd,CAAG,GACjC,MAAMoD;AAAA,UACZqB,EAAO,cAAc3D,CAAO;AAAA,UAC5Bd,EAAI;AAAA,QACN;AAAA,MACF;AAAA,MACA,MAAM,mBAAmB0E,GAAW;AAC3B,eAAA,MAAMH,EAAG,kBAAkB,SAAS;AAAA,UACzCpF,EAAK,QAAQuF,CAAS;AAAA,QACxB;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EAAA;AAEL,CAAC;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/test-pl.ts","../src/test-template.ts","../src/util.ts","../src/test-block.ts"],"sourcesContent":["import type {\n OptionalResourceId,\n PlClient,\n ResourceId } from '@milaboratories/pl-middle-layer';\nimport {\n NullResourceId,\n resourceIdToString,\n TestHelpers,\n} from '@milaboratories/pl-middle-layer';\nimport type { SynchronizedTreeOps } from '@milaboratories/pl-tree';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { randomUUID } from 'crypto';\nimport * as fsp from 'node:fs/promises';\nimport path from 'path';\nimport { test } from 'vitest';\n\nexport const plTest = test.extend<{\n pl: PlClient;\n createTree: (\n res: ResourceId,\n ops?: SynchronizedTreeOps\n ) => 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 (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED TMP FOLDER IS PRESERVED: ${workFolder}`,\n );\n } else {\n await fsp.rm(workFolder, { recursive: true });\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 await use(client);\n onTestFinished(async (task) => {\n if (task.errors !== undefined) {\n console.log(\n `TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${alternativeRoot} (${resourceIdToString(\n altRootId,\n )})`,\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(alternativeRoot);\n }\n });\n },\n\n createTree: async ({ pl }, use) => {\n const trees = new Map<ResourceId, Promise<SynchronizedTreeState>>();\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 for (const [, treePromise] of trees) {\n // TODO implement termination\n await (await treePromise).terminate();\n }\n },\n\n rootTree: async ({ pl, createTree: tree }, use) => {\n await use(await tree(pl.clientRoot));\n },\n });\n","import type {\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables,\n} from '@milaboratories/computable';\nimport {\n Computable,\n} from '@milaboratories/computable';\nimport type {\n AnyRef,\n MiddleLayerDriverKit,\n PlClient,\n PlTransaction,\n ResourceId,\n TemplateSpecAny } from '@milaboratories/pl-middle-layer';\nimport {\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n Pl,\n prepareTemplateSpec,\n toGlobalResourceId,\n} from '@milaboratories/pl-middle-layer';\nimport type { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { ConsoleLoggerAdapter } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\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 ) {\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 ) {\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 // prettier-ignore\n const futureOutputs = await createRenderTemplate(\n 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: any) {\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, any> | Promise<Record<string, any>>,\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 const exports: TestRenderResults<'result'> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n const 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) => {\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) => {\n const driverKit = await initDriverKit(pl, tmpFolder, {\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","import type { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport type { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function awaitStableState<S>(\n computable: Computable<unknown, S>,\n timeout: number | AbortSignal = 5000,\n): Promise<S> {\n try {\n return await computable.awaitStableValue(\n typeof timeout === 'number' ? AbortSignal.timeout(timeout) : timeout,\n );\n } catch (e: unknown) {\n if (isTimeoutOrCancelError(e)) {\n const fullValue = await computable.getFullValue();\n console.dir(fullValue, { depth: 5 });\n throw new Error(\n `Aborted while awaiting stable value. Unstable marker: ${fullValue.unstableMarker}`,\n { cause: e },\n );\n } else throw e;\n }\n}\n","import path from 'path';\nimport * as fsp from 'node:fs/promises';\nimport type {\n InferBlockState, LocalImportFileHandle,\n Platforma,\n Project,\n} from '@milaboratories/pl-middle-layer';\nimport {\n MiddleLayer,\n} from '@milaboratories/pl-middle-layer';\nimport { plTest } from './test-pl';\nimport { awaitStableState } from './util';\n\nexport type AwaitBlockDoneOps = {\n timeout?: number | AbortSignal;\n ignoreBlockError?: boolean;\n};\n\nexport type AwaitBlockDoneNormalized = {\n timeout: AbortSignal;\n ignoreBlockError: boolean;\n};\n\nfunction normalizeABDOpts(\n timeoutOrOps?: number | AwaitBlockDoneOps,\n): AwaitBlockDoneNormalized {\n let ops: AwaitBlockDoneOps = {};\n if (timeoutOrOps !== undefined) {\n if (\n typeof timeoutOrOps === 'object'\n && !(timeoutOrOps instanceof AbortSignal)\n )\n ops = { ...ops, ...timeoutOrOps };\n else ops.timeout = timeoutOrOps;\n }\n const abortSignal\n = typeof ops.timeout === 'undefined'\n ? AbortSignal.timeout(DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT)\n : typeof ops.timeout === 'number'\n ? AbortSignal.timeout(ops.timeout)\n : ops.timeout;\n return {\n timeout: abortSignal,\n ignoreBlockError: Boolean(ops.ignoreBlockError),\n };\n}\n\nexport const DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT = 5000;\n\nasync function awaitBlockDone(\n prj: Project,\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n) {\n const ops = normalizeABDOpts(timeoutOrOps);\n const overview = prj.overview;\n const state = prj.getBlockState(blockId);\n while (true) {\n const overviewSnapshot = (await overview.getValue())!;\n const blockOverview = overviewSnapshot.blocks.find((b) => b.id == blockId);\n if (blockOverview === undefined)\n throw new Error(`Blocks not found: ${blockId}`);\n if (blockOverview.outputErrors) {\n if (ops.ignoreBlockError) return;\n else {\n let errorMessage = blockOverview.outputsError;\n if (errorMessage === undefined)\n errorMessage = blockOverview.exportsError;\n throw new Error('Block error: ' + (errorMessage ?? 'no message'));\n }\n }\n if (blockOverview.calculationStatus === 'Done') return;\n if (blockOverview.calculationStatus !== 'Running')\n throw new Error(\n `Unexpected block status, block not calculating anything at the moment: ${blockOverview.calculationStatus}`,\n );\n try {\n await overview.awaitChange(ops.timeout);\n } catch (e: any) {\n console.dir(blockOverview, { depth: 5 });\n console.dir(await state.getValue(), { depth: 5 });\n throw new Error('Aborted while awaiting block done.', { cause: e });\n }\n }\n}\n\nexport interface RawHelpers {\n awaitBlockDone(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<void>;\n awaitBlockDoneAndGetStableBlockState<Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps\n ): Promise<InferBlockState<Pl>>;\n getLocalFileHandle(localPath: string): Promise<LocalImportFileHandle>;\n}\n\nexport const blockTest = plTest.extend<{\n ml: MiddleLayer;\n rawPrj: Project;\n helpers: RawHelpers;\n}>({\n ml: async ({ pl, tmpFolder }, use) => {\n const frontendFolder = path.join(tmpFolder, 'frontend');\n const downloadFolder = path.join(tmpFolder, 'download');\n await fsp.mkdir(frontendFolder, { recursive: true });\n await fsp.mkdir(downloadFolder, { recursive: true });\n\n const ml = await MiddleLayer.init(pl, tmpFolder, {\n defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },\n devBlockUpdateRecheckInterval: 300,\n localSecret: MiddleLayer.generateLocalSecret(),\n localProjections: [], // TODO must be different with local pl\n openFileDialogCallback: () => {\n throw new Error('Not implemented.');\n },\n });\n ml.addRuntimeCapability('requiresUIAPIVersion', 1);\n ml.addRuntimeCapability('requiresUIAPIVersion', 2);\n\n await use(ml);\n\n await ml.close();\n },\n rawPrj: async ({ ml }, use) => {\n const pRid1 = await ml.createProject(\n { label: 'Test Project' },\n 'test_project',\n );\n await ml.openProject(pRid1);\n const prj = ml.getOpenedProject(pRid1);\n await use(prj);\n ml.closeProject(pRid1);\n },\n helpers: async ({ ml, rawPrj }, use) => {\n await use({\n async awaitBlockDone(blockId, timeout) {\n await awaitBlockDone(rawPrj, blockId, timeout);\n },\n awaitBlockDoneAndGetStableBlockState: async <Pl extends Platforma>(\n blockId: string,\n timeoutOrOps?: number | AwaitBlockDoneOps,\n ) => {\n const ops = normalizeABDOpts(timeoutOrOps);\n await awaitBlockDone(rawPrj, blockId, ops);\n return (await awaitStableState(\n rawPrj.getBlockState(blockId),\n ops.timeout,\n )) as InferBlockState<Pl>;\n },\n async getLocalFileHandle(localPath) {\n return await ml.internalDriverKit.lsDriver.getLocalFileHandle(\n path.resolve(localPath),\n );\n },\n });\n },\n});\n"],"names":["plTest","test","onTestFinished","use","workFolder","path","randomUUID","fsp","task","alternativeRoot","altRootId","NullResourceId","client","TestHelpers","resourceIdToString","pl","trees","res","ops","treePromise","SynchronizedTreeState","tree","TestRenderResults","resultEntry","name","cb","Computable","ctx","outputAccessor","TestWorkflowResults","renderResult","processedExportsResult","blockId","acc","TplTestHelpers","resultRootRid","resultRootTree","ephemeral","template","outputs","inputs","runId","spec","prepareTemplateSpec","resultMapRid","tx","tpl","loadTemplate","renderedInputs","futureOutputs","createRenderTemplate","resultMap","Pl","field","toGlobalResourceId","value","workflow","preRun","args","mainResult","exports","tplTest","createTree","map","rootField","resultMapTree","tmpFolder","driverKit","initDriverKit","MiddleLayer","awaitStableState","computable","timeout","e","isTimeoutOrCancelError","fullValue","normalizeABDOpts","timeoutOrOps","DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT","awaitBlockDone","prj","overview","state","blockOverview","b","errorMessage","blockTest","frontendFolder","downloadFolder","ml","pRid1","rawPrj","localPath"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { InferBlockState, LocalImportFileHandle, Platforma, Project, MiddleLayer, PlClient, ResourceId } from '@milaboratories/pl-middle-layer';
1
+ import { InferBlockState, LocalImportFileHandle, Platforma, Project, MiddleLayer } from '@milaboratories/pl-middle-layer';
2
2
  import { TestAPI } from 'vitest';
3
+ import { PlClient, ResourceId } from '@milaboratories/pl-client';
3
4
  import { SynchronizedTreeOps, SynchronizedTreeState } from '@milaboratories/pl-tree';
4
5
  export type AwaitBlockDoneOps = {
5
6
  timeout?: number | AbortSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"test-block.d.ts","sourceRoot":"","sources":["../src/test-block.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EACV,eAAe,EAAE,qBAAqB,EACtC,SAAS,EACT,OAAO,EACR,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACZ,MAAM,iCAAiC,CAAC;AAIzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AA0BF,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAuCrD,MAAM,WAAW,UAAU;IACzB,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GAAG,iBAAiB,GACxC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,oCAAoC,CAAC,EAAE,SAAS,SAAS,EACvD,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GAAG,iBAAiB,GACxC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACvE;AAED,eAAO,MAAM,SAAS;;;;;;;;EA0DpB,CAAC"}
1
+ {"version":3,"file":"test-block.d.ts","sourceRoot":"","sources":["../src/test-block.ts"],"names":[],"mappings":";;AAEA,OAAO,KAAK,EACV,eAAe,EAAE,qBAAqB,EACtC,SAAS,EACT,OAAO,EACR,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACZ,MAAM,iCAAiC,CAAC;AAIzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AA0BF,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAuCrD,MAAM,WAAW,UAAU;IACzB,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GAAG,iBAAiB,GACxC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,oCAAoC,CAAC,EAAE,SAAS,SAAS,EACvD,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GAAG,iBAAiB,GACxC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACvE;AAED,eAAO,MAAM,SAAS;;;;;;;;EA4DpB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { ComputableCtx, ComputableStableDefined, UnwrapComputables, Computable } from '@milaboratories/computable';
2
- import { AnyRef, MiddleLayerDriverKit, PlClient, PlTransaction, ResourceId, TemplateSpecAny, ResourceRef } from '@milaboratories/pl-middle-layer';
2
+ import { AnyRef, MiddleLayerDriverKit, PlClient, PlTransaction, ResourceId, TemplateSpecAny } from '@milaboratories/pl-middle-layer';
3
3
  import { PlTreeEntry, PlTreeNodeAccessor, SynchronizedTreeState, SynchronizedTreeOps } from '@milaboratories/pl-tree';
4
+ import { ResourceRef } from '@milaboratories/pl-client';
4
5
  import { TestAPI } from 'vitest';
5
6
  export type WorkflowRenderOps = {
6
7
  parent?: ResourceId;
@@ -1 +1 @@
1
- {"version":3,"file":"test-template.d.ts","sourceRoot":"","sources":["../src/test-template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-template.d.ts","sourceRoot":"","sources":["../src/test-template.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/test",
3
- "version": "1.37.19",
3
+ "version": "1.39.0",
4
4
  "description": "Typescript Block Test Helpers",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -18,16 +18,16 @@
18
18
  "license": "UNLICENSED",
19
19
  "dependencies": {
20
20
  "vitest": "^2.1.9",
21
- "@platforma-sdk/model": "^1.37.18",
22
- "@milaboratories/pl-middle-layer": "^1.37.99",
23
- "@milaboratories/computable": "^2.5.1",
24
- "@milaboratories/pl-client": "^2.11.2",
21
+ "@platforma-sdk/model": "~1.39.0",
22
+ "@milaboratories/pl-tree": "^1.7.0",
23
+ "@milaboratories/pl-client": "~2.11.2",
24
+ "@milaboratories/pl-middle-layer": "~1.38.0",
25
25
  "@milaboratories/ts-helpers": "^1.4.1",
26
- "@milaboratories/pl-tree": "^1.6.12"
26
+ "@milaboratories/computable": "^2.6.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "~20.16.15",
30
- "typescript": "~5.5.4",
30
+ "typescript": "~5.6.3",
31
31
  "vite": "^6.3.5",
32
32
  "@milaboratories/build-configs": "1.0.4"
33
33
  },