@platforma-sdk/test 1.5.56 → 1.7.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"),w=require("node:crypto"),O=require("node:fs/promises"),u=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 A=m(i),p=m(O),T=P.test.extend({tmpFolder:async({},o)=>{const e=u.resolve(`work/${w.randomUUID()}`);await p.mkdir(e,{recursive:!0}),await o(e),await p.rm(e,{recursive:!0})},pl:async({onTestFinished:o},e)=>{const r=`test_${Date.now()}_${w.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=w.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 d=i.loadTemplate(s,c),E=await a(s),k=await i.createRenderTemplate(s,d,e,E,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=w.randomUUID(),c=await this.renderTemplate(!0,e,["result","context"],s=>{let d;return a.parent?d=a.parent:(d=s.createEphemeral({name:"BContextEnd",version:"1"}),s.lock(d)),{args:this.createObject(s,t),blockId:this.createObject(s,n),isProduction:this.createObject(s,!r),context:d}}),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 F=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=u.join(e,"download");await p.mkdir(t,{recursive:!0});const a=await i.initDriverKit(o,{blobDownloadPath:t,localSecret:i.MiddleLayer.generateLocalSecret()});await r(a)}});async function S(o,e=2e3){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 R(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(b):typeof e.timeout=="number"?AbortSignal.timeout(e.timeout):e.timeout,ignoreBlockError:!!e.ignoreBlockError}}const b=5e3;async function h(o,e,r){const t=R(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 B=T.extend({ml:async({pl:o,tmpFolder:e},r)=>{const t=u.join(e,"frontend"),a=u.join(e,"download");await p.mkdir(t,{recursive:!0}),await p.mkdir(a,{recursive:!0});const n=await i.MiddleLayer.init(o,{defaultTreeOptions:{pollingInterval:250,stopPollingDelay:500},devBlockUpdateRecheckInterval:300,frontendDownloadPath:u.resolve(t),localSecret:i.MiddleLayer.generateLocalSecret(),blobDownloadPath:u.resolve(a),localStorageNameToPath:{local:""}});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=R(a);return await h(e,t,n),await S(e.getBlockState(t),n.timeout)},async getLocalFileHandle(t){return await o.internalDriverKit.lsDriver.getLocalFileHandle(u.resolve(t))}})}});exports.ML=A;exports.DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT=b;exports.TestRenderResults=y;exports.TestWorkflowResults=g;exports.TplTestHelpers=v;exports.awaitStableState=S;exports.blockTest=B;exports.plTest=T;exports.tplTest=F;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("@milaboratories/pl-middle-layer"),I=require("@milaboratories/pl-tree"),d=require("node:crypto"),O=require("node:fs/promises"),p=require("node:path"),P=require("vitest"),j=require("@milaboratories/computable"),M=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 A=m(i),w=m(O),T=P.test.extend({tmpFolder:async({},o)=>{const e=p.resolve(`work/${d.randomUUID()}`);await w.mkdir(e,{recursive:!0}),await o(e),await w.rm(e,{recursive:!0})},pl:async({onTestFinished:o},e)=>{const r=`test_${Date.now()}_${d.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 j.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=d.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),E=await a(s),k=await i.createRenderTemplate(s,u,e,E,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=d.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 F=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=2e3){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(b):typeof e.timeout=="number"?AbortSignal.timeout(e.timeout):e.timeout,ignoreBlockError:!!e.ignoreBlockError}}const b=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 B=T.extend({ml:async({pl:o,tmpFolder:e},r)=>{const t=p.join(e,"frontend"),a=p.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(p.resolve(t))}})}});exports.ML=A;exports.DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT=b;exports.TestRenderResults=y;exports.TestWorkflowResults=g;exports.TplTestHelpers=v;exports.awaitStableState=R;exports.blockTest=B;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 {\n NullResourceId,\n OptionalResourceId,\n PlClient,\n ResourceId,\n resourceIdToString,\n TestHelpers\n} from '@milaboratories/pl-middle-layer';\nimport {\n SynchronizedTreeOps,\n SynchronizedTreeState\n} 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 ({}, use) => {\n const workFolder = path.resolve(`work/${randomUUID()}`);\n await fsp.mkdir(workFolder, { recursive: true });\n await use(workFolder);\n await fsp.rm(workFolder, { recursive: true });\n },\n\n pl: async ({ onTestFinished }, use) => {\n const altRoot = `test_${Date.now()}_${randomUUID()}`;\n let altRootId: OptionalResourceId = NullResourceId;\n const client = await TestHelpers.getTestClient(altRoot);\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: ${altRoot} (${resourceIdToString(\n altRootId\n )})`\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(altRoot);\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 {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables\n} from '@milaboratories/computable';\nimport {\n AnyRef,\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n MiddleLayerDriverKit,\n Pl,\n PlClient,\n PlTransaction,\n prepareTemplateSpec,\n ResourceId,\n TemplateSpecAny,\n toGlobalResourceId\n} from '@milaboratories/pl-middle-layer';\nimport { 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};\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 = 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 downloadFolder = path.join(tmpFolder, 'download');\n await fsp.mkdir(downloadFolder, { recursive: true });\n const driverKit = await initDriverKit(pl, {\n blobDownloadPath: downloadFolder,\n localSecret: MiddleLayer.generateLocalSecret()\n });\n\n await use(driverKit);\n }\n});\n","import { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport { 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 = 2000\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 {\n BlockModel,\n BlockState,\n ImportFileHandleUpload,\n InferBlockState,\n MiddleLayer,\n Platforma,\n Project\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<ImportFileHandleUpload>;\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, {\n defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },\n devBlockUpdateRecheckInterval: 300,\n frontendDownloadPath: path.resolve(frontendFolder),\n localSecret: MiddleLayer.generateLocalSecret(),\n blobDownloadPath: path.resolve(downloadFolder),\n localStorageNameToPath: { local: '' }\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","use","workFolder","path","randomUUID","fsp","onTestFinished","altRoot","altRootId","NullResourceId","client","TestHelpers","task","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","downloadFolder","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","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 {\n NullResourceId,\n OptionalResourceId,\n PlClient,\n ResourceId,\n resourceIdToString,\n TestHelpers\n} from '@milaboratories/pl-middle-layer';\nimport {\n SynchronizedTreeOps,\n SynchronizedTreeState\n} 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 ({}, use) => {\n const workFolder = path.resolve(`work/${randomUUID()}`);\n await fsp.mkdir(workFolder, { recursive: true });\n await use(workFolder);\n await fsp.rm(workFolder, { recursive: true });\n },\n\n pl: async ({ onTestFinished }, use) => {\n const altRoot = `test_${Date.now()}_${randomUUID()}`;\n let altRootId: OptionalResourceId = NullResourceId;\n const client = await TestHelpers.getTestClient(altRoot);\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: ${altRoot} (${resourceIdToString(\n altRootId\n )})`\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(altRoot);\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 {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables\n} from '@milaboratories/computable';\nimport {\n AnyRef,\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n MiddleLayerDriverKit,\n Pl,\n PlClient,\n PlTransaction,\n prepareTemplateSpec,\n ResourceId,\n TemplateSpecAny,\n toGlobalResourceId\n} from '@milaboratories/pl-middle-layer';\nimport { 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};\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 = 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 { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport { 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 = 2000\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 {\n InferBlockState, LocalImportFileHandle,\n MiddleLayer,\n Platforma,\n Project\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","use","workFolder","path","randomUUID","fsp","onTestFinished","altRoot","altRootId","NullResourceId","client","TestHelpers","task","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,24 +1,24 @@
1
- import { TestHelpers as f, resourceIdToString as D, NullResourceId as I, Pl as w, field as v, toGlobalResourceId as g, initDriverKit as P, MiddleLayer as m, prepareTemplateSpec as T, loadTemplate as F, createRenderTemplate as A } from "@milaboratories/pl-middle-layer";
2
- import * as _ from "@milaboratories/pl-middle-layer";
3
- import { SynchronizedTreeState as B } from "@milaboratories/pl-tree";
1
+ import { TestHelpers as f, resourceIdToString as I, NullResourceId as D, Pl as w, field as g, toGlobalResourceId as v, initDriverKit as F, MiddleLayer as m, prepareTemplateSpec as T, loadTemplate as P, createRenderTemplate as j } from "@milaboratories/pl-middle-layer";
2
+ import * as U from "@milaboratories/pl-middle-layer";
3
+ import { SynchronizedTreeState as A } from "@milaboratories/pl-tree";
4
4
  import { randomUUID as p } from "node:crypto";
5
5
  import * as d from "node:fs/promises";
6
- import c from "node:path";
7
- import { test as O } from "vitest";
8
- import { Computable as j } from "@milaboratories/computable";
6
+ import u from "node:path";
7
+ import { test as B } from "vitest";
8
+ import { Computable as O } from "@milaboratories/computable";
9
9
  import { isTimeoutOrCancelError as M } from "@milaboratories/pl-client";
10
- const R = O.extend({
10
+ const R = B.extend({
11
11
  tmpFolder: async ({}, o) => {
12
- const e = c.resolve(`work/${p()}`);
12
+ const e = u.resolve(`work/${p()}`);
13
13
  await d.mkdir(e, { recursive: !0 }), await o(e), await d.rm(e, { recursive: !0 });
14
14
  },
15
15
  pl: async ({ onTestFinished: o }, e) => {
16
16
  const r = `test_${Date.now()}_${p()}`;
17
- let t = I;
17
+ let t = D;
18
18
  const a = await f.getTestClient(r);
19
- t = a.clientRoot, await e(a), o(async (n) => {
20
- n.errors !== void 0 ? console.log(
21
- `TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${r} (${D(
19
+ t = a.clientRoot, await e(a), o(async (i) => {
20
+ i.errors !== void 0 ? console.log(
21
+ `TEST FAILED SO ALTERNATIVE ROOT IS PRESETVED IN PL: ${r} (${I(
22
22
  t
23
23
  )})`
24
24
  ) : await (await f.getTestClient()).deleteAlternativeRoot(r);
@@ -27,15 +27,15 @@ const R = O.extend({
27
27
  createTree: async ({ pl: o }, e) => {
28
28
  const r = /* @__PURE__ */ new Map();
29
29
  await e((t, a) => {
30
- let n = r.get(t);
31
- return n === void 0 && (n = B.init(
30
+ let i = r.get(t);
31
+ return i === void 0 && (i = A.init(
32
32
  o,
33
33
  t,
34
34
  a ?? {
35
35
  pollingInterval: 200,
36
36
  stopPollingDelay: 400
37
37
  }
38
- ), r.set(t, n)), n;
38
+ ), r.set(t, i)), i;
39
39
  });
40
40
  for (const [, t] of r)
41
41
  await (await t).terminate();
@@ -44,18 +44,18 @@ const R = O.extend({
44
44
  await r(await e(o.clientRoot));
45
45
  }
46
46
  });
47
- class L {
47
+ class C {
48
48
  constructor(e) {
49
49
  this.resultEntry = e;
50
50
  }
51
51
  computeOutput(e, r) {
52
- return j.make((t) => {
52
+ return O.make((t) => {
53
53
  const a = t.accessor(this.resultEntry).node().traverse({ field: e, assertFieldType: "Input" });
54
54
  return r(a, t);
55
55
  });
56
56
  }
57
57
  }
58
- class x {
58
+ class L {
59
59
  constructor(e, r, t) {
60
60
  this.renderResult = e, this.processedExportsResult = r, this.blockId = t;
61
61
  }
@@ -78,69 +78,71 @@ class x {
78
78
  return this.renderResult.computeOutput("result", (t, a) => r(t == null ? void 0 : t.traverse({ field: e, assertFieldType: "Input" }), a));
79
79
  }
80
80
  }
81
- class C {
81
+ class x {
82
82
  constructor(e, r, t) {
83
83
  this.pl = e, this.resultRootRid = r, this.resultRootTree = t;
84
84
  }
85
85
  async renderTemplate(e, r, t, a) {
86
- const n = p(), l = typeof r == "string" ? await T({
86
+ const i = p(), l = typeof r == "string" ? await T({
87
87
  type: "from-file",
88
88
  path: `./dist/tengo/tpl/${r}.plj.gz`
89
- }) : await T(r), { resultMapRid: s } = await this.pl.withWriteTx("TemplateRender", async (i) => {
90
- const u = F(i, l), E = await a(i), k = await A(
91
- i,
92
- u,
89
+ }) : await T(r), { resultMapRid: s } = await this.pl.withWriteTx("TemplateRender", async (n) => {
90
+ const c = P(n, l), E = await a(n), k = await j(
91
+ n,
92
+ c,
93
93
  e,
94
94
  E,
95
95
  t
96
- ), h = w.createPlMap(i, k, e);
97
- i.createField(v(this.resultRootRid, n), "Dynamic", h);
98
- const b = await g(h);
99
- return await i.commit(), {
96
+ ), h = w.createPlMap(n, k, e);
97
+ n.createField(g(this.resultRootRid, i), "Dynamic", h);
98
+ const b = await v(h);
99
+ return await n.commit(), {
100
100
  resultMapRid: b
101
101
  };
102
102
  });
103
- return await this.resultRootTree.refreshState(), new L(this.resultRootTree.entry(s));
103
+ return await this.resultRootTree.refreshState(), new C(this.resultRootTree.entry(s));
104
104
  }
105
105
  createObject(e, r) {
106
106
  return e.createValue(w.JsonObject, JSON.stringify(r));
107
107
  }
108
108
  async renderWorkflow(e, r, t, a = {}) {
109
- const n = p(), l = await this.renderTemplate(
109
+ const i = p(), l = await this.renderTemplate(
110
110
  !0,
111
111
  e,
112
112
  ["result", "context"],
113
- (i) => {
114
- let u;
115
- return a.parent ? u = a.parent : (u = i.createEphemeral({ name: "BContextEnd", version: "1" }), i.lock(u)), {
116
- args: this.createObject(i, t),
117
- blockId: this.createObject(i, n),
118
- isProduction: this.createObject(i, !r),
119
- context: u
113
+ (n) => {
114
+ let c;
115
+ return a.parent ? c = a.parent : (c = n.createEphemeral({ name: "BContextEnd", version: "1" }), n.lock(c)), {
116
+ args: this.createObject(n, t),
117
+ blockId: this.createObject(n, i),
118
+ isProduction: this.createObject(n, !r),
119
+ context: c
120
120
  };
121
121
  }
122
122
  ), s = void 0;
123
- return a.exportProcessor !== void 0 && await this.renderTemplate(!0, a.exportProcessor, ["result"], (i) => ({
124
- pf: i.getFutureFieldValue(l.resultEntry.rid, "context", "Input")
125
- })), new x(l, s, n);
123
+ return a.exportProcessor !== void 0 && await this.renderTemplate(!0, a.exportProcessor, ["result"], (n) => ({
124
+ pf: n.getFutureFieldValue(l.resultEntry.rid, "context", "Input")
125
+ })), new L(l, s, i);
126
126
  }
127
127
  }
128
128
  const J = R.extend({
129
129
  helper: async ({ pl: o, createTree: e }, r) => {
130
- const t = await o.withWriteTx("CreatingHelpers", async (n) => {
131
- const l = n.createEphemeral(w.EphStdMap), s = v(n.clientRoot, "templateTeste");
132
- return n.createField(s, "Dynamic", l), await n.commit(), await g(l);
130
+ const t = await o.withWriteTx("CreatingHelpers", async (i) => {
131
+ const l = i.createEphemeral(w.EphStdMap), s = g(i.clientRoot, "templateTeste");
132
+ return i.createField(s, "Dynamic", l), await i.commit(), await v(l);
133
133
  }), a = await e(t);
134
- await r(new C(o, t, a));
134
+ await r(new x(o, t, a));
135
135
  },
136
136
  driverKit: async ({ pl: o, tmpFolder: e }, r) => {
137
- const t = c.join(e, "download");
138
- await d.mkdir(t, { recursive: !0 });
139
- const a = await P(o, {
140
- blobDownloadPath: t,
141
- localSecret: m.generateLocalSecret()
137
+ const t = await F(o, e, {
138
+ localSecret: m.generateLocalSecret(),
139
+ localProjections: [],
140
+ // TODO must be different with local pl
141
+ openFileDialogCallback: () => {
142
+ throw new Error("Not implemented.");
143
+ }
142
144
  });
143
- await r(a);
145
+ await r(t);
144
146
  }
145
147
  });
146
148
  async function $(o, e = 2e3) {
@@ -167,16 +169,16 @@ function S(o) {
167
169
  }
168
170
  const V = 5e3;
169
171
  async function y(o, e, r) {
170
- const t = S(r), a = o.overview, n = o.getBlockState(e);
172
+ const t = S(r), a = o.overview, i = o.getBlockState(e);
171
173
  for (; ; ) {
172
- const s = (await a.getValue()).blocks.find((i) => i.id == e);
174
+ const s = (await a.getValue()).blocks.find((n) => n.id == e);
173
175
  if (s === void 0)
174
176
  throw new Error(`Blocks not found: ${e}`);
175
177
  if (s.outputErrors) {
176
178
  if (t.ignoreBlockError) return;
177
179
  {
178
- let i = s.outputsError;
179
- throw i === void 0 && (i = s.exportsError), new Error("Block error: " + (i ?? "no message"));
180
+ let n = s.outputsError;
181
+ throw n === void 0 && (n = s.exportsError), new Error("Block error: " + (n ?? "no message"));
180
182
  }
181
183
  }
182
184
  if (s.calculationStatus === "Done") return;
@@ -186,24 +188,26 @@ async function y(o, e, r) {
186
188
  );
187
189
  try {
188
190
  await a.awaitChange(t.timeout);
189
- } catch (i) {
190
- throw console.dir(s, { depth: 5 }), console.dir(await n.getValue(), { depth: 5 }), new Error("Aborted while awaiting block done.", { cause: i });
191
+ } catch (n) {
192
+ throw console.dir(s, { depth: 5 }), console.dir(await i.getValue(), { depth: 5 }), new Error("Aborted while awaiting block done.", { cause: n });
191
193
  }
192
194
  }
193
195
  }
194
196
  const q = R.extend({
195
197
  ml: async ({ pl: o, tmpFolder: e }, r) => {
196
- const t = c.join(e, "frontend"), a = c.join(e, "download");
198
+ const t = u.join(e, "frontend"), a = u.join(e, "download");
197
199
  await d.mkdir(t, { recursive: !0 }), await d.mkdir(a, { recursive: !0 });
198
- const n = await m.init(o, {
200
+ const i = await m.init(o, e, {
199
201
  defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },
200
202
  devBlockUpdateRecheckInterval: 300,
201
- frontendDownloadPath: c.resolve(t),
202
203
  localSecret: m.generateLocalSecret(),
203
- blobDownloadPath: c.resolve(a),
204
- localStorageNameToPath: { local: "" }
204
+ localProjections: [],
205
+ // TODO must be different with local pl
206
+ openFileDialogCallback: () => {
207
+ throw new Error("Not implemented.");
208
+ }
205
209
  });
206
- await r(n), await n.close();
210
+ await r(i), await i.close();
207
211
  },
208
212
  rawPrj: async ({ ml: o }, e) => {
209
213
  const r = await o.createProject(
@@ -220,15 +224,15 @@ const q = R.extend({
220
224
  await y(e, t, a);
221
225
  },
222
226
  awaitBlockDoneAndGetStableBlockState: async (t, a) => {
223
- const n = S(a);
224
- return await y(e, t, n), await $(
227
+ const i = S(a);
228
+ return await y(e, t, i), await $(
225
229
  e.getBlockState(t),
226
- n.timeout
230
+ i.timeout
227
231
  );
228
232
  },
229
233
  async getLocalFileHandle(t) {
230
234
  return await o.internalDriverKit.lsDriver.getLocalFileHandle(
231
- c.resolve(t)
235
+ u.resolve(t)
232
236
  );
233
237
  }
234
238
  });
@@ -236,10 +240,10 @@ const q = R.extend({
236
240
  });
237
241
  export {
238
242
  V as DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT,
239
- _ as ML,
240
- L as TestRenderResults,
241
- x as TestWorkflowResults,
242
- C as TplTestHelpers,
243
+ U as ML,
244
+ C as TestRenderResults,
245
+ L as TestWorkflowResults,
246
+ x as TplTestHelpers,
243
247
  $ as awaitStableState,
244
248
  q as blockTest,
245
249
  R as plTest,
@@ -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 {\n NullResourceId,\n OptionalResourceId,\n PlClient,\n ResourceId,\n resourceIdToString,\n TestHelpers\n} from '@milaboratories/pl-middle-layer';\nimport {\n SynchronizedTreeOps,\n SynchronizedTreeState\n} 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 ({}, use) => {\n const workFolder = path.resolve(`work/${randomUUID()}`);\n await fsp.mkdir(workFolder, { recursive: true });\n await use(workFolder);\n await fsp.rm(workFolder, { recursive: true });\n },\n\n pl: async ({ onTestFinished }, use) => {\n const altRoot = `test_${Date.now()}_${randomUUID()}`;\n let altRootId: OptionalResourceId = NullResourceId;\n const client = await TestHelpers.getTestClient(altRoot);\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: ${altRoot} (${resourceIdToString(\n altRootId\n )})`\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(altRoot);\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 {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables\n} from '@milaboratories/computable';\nimport {\n AnyRef,\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n MiddleLayerDriverKit,\n Pl,\n PlClient,\n PlTransaction,\n prepareTemplateSpec,\n ResourceId,\n TemplateSpecAny,\n toGlobalResourceId\n} from '@milaboratories/pl-middle-layer';\nimport { 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};\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 = 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 downloadFolder = path.join(tmpFolder, 'download');\n await fsp.mkdir(downloadFolder, { recursive: true });\n const driverKit = await initDriverKit(pl, {\n blobDownloadPath: downloadFolder,\n localSecret: MiddleLayer.generateLocalSecret()\n });\n\n await use(driverKit);\n }\n});\n","import { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport { 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 = 2000\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 {\n BlockModel,\n BlockState,\n ImportFileHandleUpload,\n InferBlockState,\n MiddleLayer,\n Platforma,\n Project\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<ImportFileHandleUpload>;\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, {\n defaultTreeOptions: { pollingInterval: 250, stopPollingDelay: 500 },\n devBlockUpdateRecheckInterval: 300,\n frontendDownloadPath: path.resolve(frontendFolder),\n localSecret: MiddleLayer.generateLocalSecret(),\n blobDownloadPath: path.resolve(downloadFolder),\n localStorageNameToPath: { local: '' }\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","use","workFolder","path","randomUUID","fsp","onTestFinished","altRoot","altRootId","NullResourceId","client","TestHelpers","task","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","downloadFolder","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","ml","pRid1","rawPrj","localPath"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/test-pl.ts","../src/test-template.ts","../src/util.ts","../src/test-block.ts"],"sourcesContent":["import {\n NullResourceId,\n OptionalResourceId,\n PlClient,\n ResourceId,\n resourceIdToString,\n TestHelpers\n} from '@milaboratories/pl-middle-layer';\nimport {\n SynchronizedTreeOps,\n SynchronizedTreeState\n} 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 ({}, use) => {\n const workFolder = path.resolve(`work/${randomUUID()}`);\n await fsp.mkdir(workFolder, { recursive: true });\n await use(workFolder);\n await fsp.rm(workFolder, { recursive: true });\n },\n\n pl: async ({ onTestFinished }, use) => {\n const altRoot = `test_${Date.now()}_${randomUUID()}`;\n let altRootId: OptionalResourceId = NullResourceId;\n const client = await TestHelpers.getTestClient(altRoot);\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: ${altRoot} (${resourceIdToString(\n altRootId\n )})`\n );\n } else {\n const rawClient = await TestHelpers.getTestClient();\n await rawClient.deleteAlternativeRoot(altRoot);\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 {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n UnwrapComputables\n} from '@milaboratories/computable';\nimport {\n AnyRef,\n createRenderTemplate,\n field,\n FieldRef,\n initDriverKit,\n loadTemplate,\n MiddleLayer,\n MiddleLayerDriverKit,\n Pl,\n PlClient,\n PlTransaction,\n prepareTemplateSpec,\n ResourceId,\n TemplateSpecAny,\n toGlobalResourceId\n} from '@milaboratories/pl-middle-layer';\nimport { 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};\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 = 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 { Computable } from '@milaboratories/computable';\nimport { isTimeoutOrCancelError } from '@milaboratories/pl-client';\nimport { 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 = 2000\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 {\n InferBlockState, LocalImportFileHandle,\n MiddleLayer,\n Platforma,\n Project\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","use","workFolder","path","randomUUID","fsp","onTestFinished","altRoot","altRootId","NullResourceId","client","TestHelpers","task","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,4 +1,4 @@
1
- import { ImportFileHandleUpload, InferBlockState, MiddleLayer, Platforma, Project, PlClient, ResourceId } from '@milaboratories/pl-middle-layer';
1
+ import { InferBlockState, LocalImportFileHandle, MiddleLayer, Platforma, Project, PlClient, ResourceId } from '@milaboratories/pl-middle-layer';
2
2
  import { CustomAPI } from '@vitest/runner';
3
3
  import { SynchronizedTreeOps, SynchronizedTreeState } from '@milaboratories/pl-tree';
4
4
  export type AwaitBlockDoneOps = {
@@ -13,7 +13,7 @@ export declare const DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT = 5000;
13
13
  export interface RawHelpers {
14
14
  awaitBlockDone(blockId: string, timeoutOrOps?: number | AwaitBlockDoneOps): Promise<void>;
15
15
  awaitBlockDoneAndGetStableBlockState<Pl extends Platforma>(blockId: string, timeoutOrOps?: number | AwaitBlockDoneOps): Promise<InferBlockState<Pl>>;
16
- getLocalFileHandle(localPath: string): Promise<ImportFileHandleUpload>;
16
+ getLocalFileHandle(localPath: string): Promise<LocalImportFileHandle>;
17
17
  }
18
18
  export declare const blockTest: CustomAPI<{
19
19
  pl: PlClient;
@@ -1 +1 @@
1
- {"version":3,"file":"test-block.d.ts","sourceRoot":"","sources":["../src/test-block.ts"],"names":[],"mappings":";;AAEA,OAAO,EAGL,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,SAAS,EACT,OAAO,EACR,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,sBAAsB,CAAC,CAAC;CACxE;AAED,eAAO,MAAM,SAAS;;;;;;;;EAyDpB,CAAC"}
1
+ {"version":3,"file":"test-block.d.ts","sourceRoot":"","sources":["../src/test-block.ts"],"names":[],"mappings":";;AAEA,OAAO,EACL,eAAe,EAAE,qBAAqB,EACtC,WAAW,EACX,SAAS,EACT,OAAO,EACR,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 +1 @@
1
- {"version":3,"file":"test-template.d.ts","sourceRoot":"","sources":["../src/test-template.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,MAAM,EAON,oBAAoB,EAEpB,QAAQ,EACR,aAAa,EAEb,UAAU,EACV,eAAe,EAEhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOjG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM;aACjB,WAAW,EAAE,WAAW;gBAAxB,WAAW,EAAE,WAAW;IAE7C,aAAa,CAAC,CAAC,EACpB,IAAI,EAAE,CAAC,EACP,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC,GACjE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAShD;AAED,qBAAa,mBAAmB;aAEZ,YAAY,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,CAAC;aACrD,sBAAsB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS;aAC/D,OAAO,EAAE,MAAM;gBAFf,YAAY,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,CAAC,EACrD,sBAAsB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS,EAC/D,OAAO,EAAE,MAAM;IAGjC;;SAEK;IACE,OAAO,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAIrD;;SAEK;IACE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAI7C,MAAM,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC;IAY7D,MAAM,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC;CAMrE;AAED,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAFd,EAAE,EAAE,QAAQ,EACZ,aAAa,EAAE,UAAU,EACzB,cAAc,EAAE,qBAAqB;IAGlD,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EACzC,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,eAAe,EAClC,OAAO,EAAE,CAAC,EAAE,EACZ,MAAM,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACtF,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA2BhC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG;IAIpC,cAAc,CAClB,QAAQ,EAAE,MAAM,GAAG,eAAe,EAClC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACxD,GAAG,GAAE,iBAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;CAiChC;AAED,eAAO,MAAM,OAAO;;;;;;;EAyBlB,CAAC"}
1
+ {"version":3,"file":"test-template.d.ts","sourceRoot":"","sources":["../src/test-template.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,MAAM,EAON,oBAAoB,EAEpB,QAAQ,EACR,aAAa,EAEb,UAAU,EACV,eAAe,EAEhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOjG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM;aACjB,WAAW,EAAE,WAAW;gBAAxB,WAAW,EAAE,WAAW;IAE7C,aAAa,CAAC,CAAC,EACpB,IAAI,EAAE,CAAC,EACP,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC,GACjE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAShD;AAED,qBAAa,mBAAmB;aAEZ,YAAY,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,CAAC;aACrD,sBAAsB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS;aAC/D,OAAO,EAAE,MAAM;gBAFf,YAAY,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,CAAC,EACrD,sBAAsB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS,EAC/D,OAAO,EAAE,MAAM;IAGjC;;SAEK;IACE,OAAO,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAIrD;;SAEK;IACE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAI7C,MAAM,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC;IAY7D,MAAM,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC;CAMrE;AAED,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAFd,EAAE,EAAE,QAAQ,EACZ,aAAa,EAAE,UAAU,EACzB,cAAc,EAAE,qBAAqB;IAGlD,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EACzC,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,eAAe,EAClC,OAAO,EAAE,CAAC,EAAE,EACZ,MAAM,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACtF,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA2BhC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG;IAIpC,cAAc,CAClB,QAAQ,EAAE,MAAM,GAAG,eAAe,EAClC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACxD,GAAG,GAAE,iBAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;CAiChC;AAED,eAAO,MAAM,OAAO;;;;;;;EA0BlB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/test",
3
- "version": "1.5.56",
3
+ "version": "1.7.0",
4
4
  "description": "Typescript Block Test Helpers",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -18,11 +18,11 @@
18
18
  "license": "UNLICENSED",
19
19
  "dependencies": {
20
20
  "vitest": "^2.1.2",
21
- "@milaboratories/pl-middle-layer": "^1.12.3",
22
- "@platforma-sdk/model": "^1.5.40",
23
- "@milaboratories/pl-tree": "^1.4.3",
24
- "@milaboratories/pl-client": "^2.5.2",
25
- "@milaboratories/computable": "^2.1.13",
21
+ "@milaboratories/pl-middle-layer": "^1.13.0",
22
+ "@platforma-sdk/model": "^1.7.0",
23
+ "@milaboratories/pl-client": "^2.5.3",
24
+ "@milaboratories/computable": "^2.2.0",
25
+ "@milaboratories/pl-tree": "^1.4.4",
26
26
  "@milaboratories/ts-helpers": "^1.1.0"
27
27
  },
28
28
  "devDependencies": {