@platforma-sdk/test 1.5.28 → 1.5.30

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/ts-helpers"),A=require("@milaboratories/pl-client");function m(o){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const r in o)if(r!=="default"){const t=Object.getOwnPropertyDescriptor(o,r);Object.defineProperty(e,r,t.get?t:{enumerable:!0,get:()=>o[r]})}}return e.default=o,Object.freeze(e)}const F=m(i),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 L=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,new j.ConsoleLoggerAdapter,{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(A.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=F;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=L;
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;
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 {\n PlTreeEntry,\n PlTreeNodeAccessor,\n SynchronizedTreeState\n} 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:\n | TestRenderResults<'result'>\n | 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\n .computeOutput('context', (cb) => cb?.id)\n .withStableType();\n }\n\n /**\n * Returns context id of this workflow\n * */\n public result(): ComputableStableDefined<ResourceId> {\n return this.renderResult\n .computeOutput('result', (cb) => cb?.id)\n .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(\n acc?.traverse({ field: name, assertFieldType: 'Input' }),\n ctx\n );\n });\n else\n return this.renderResult.computeOutput('context', (acc, ctx) => {\n return cb(\n acc?.traverse({ field: `values/${name}`, assertFieldType: 'Input' }),\n ctx\n );\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: (\n tx: PlTransaction\n ) => 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(\n 'TemplateRender',\n 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 );\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'> =\n await this.renderTemplate(true, workflow, ['result', 'context'], (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 const exports: TestRenderResults<'result'> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n const exports = await this.renderTemplate(\n true,\n ops.exportProcessor,\n ['result'],\n (tx) => ({\n pf: tx.getFutureFieldValue(\n mainResult.resultEntry.rid,\n 'context',\n 'Input'\n )\n })\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, new ConsoleLoggerAdapter(), {\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","ConsoleLoggerAdapter","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 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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"}
package/dist/index.mjs CHANGED
@@ -1,13 +1,12 @@
1
- import { TestHelpers as f, resourceIdToString as D, NullResourceId as I, Pl as w, field as y, toGlobalResourceId as v, initDriverKit as P, MiddleLayer as m, prepareTemplateSpec as T, loadTemplate as F, createRenderTemplate as A } from "@milaboratories/pl-middle-layer";
2
- import * as N from "@milaboratories/pl-middle-layer";
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
3
  import { SynchronizedTreeState as B } from "@milaboratories/pl-tree";
4
4
  import { randomUUID as p } from "node:crypto";
5
5
  import * as d from "node:fs/promises";
6
6
  import c from "node:path";
7
7
  import { test as O } from "vitest";
8
8
  import { Computable as j } from "@milaboratories/computable";
9
- import { ConsoleLoggerAdapter as M } from "@milaboratories/ts-helpers";
10
- import { isTimeoutOrCancelError as L } from "@milaboratories/pl-client";
9
+ import { isTimeoutOrCancelError as M } from "@milaboratories/pl-client";
11
10
  const R = O.extend({
12
11
  tmpFolder: async ({}, o) => {
13
12
  const e = c.resolve(`work/${p()}`);
@@ -45,7 +44,7 @@ const R = O.extend({
45
44
  await r(await e(o.clientRoot));
46
45
  }
47
46
  });
48
- class x {
47
+ class L {
49
48
  constructor(e) {
50
49
  this.resultEntry = e;
51
50
  }
@@ -56,7 +55,7 @@ class x {
56
55
  });
57
56
  }
58
57
  }
59
- class C {
58
+ class x {
60
59
  constructor(e, r, t) {
61
60
  this.renderResult = e, this.processedExportsResult = r, this.blockId = t;
62
61
  }
@@ -73,19 +72,13 @@ class C {
73
72
  return this.renderResult.computeOutput("result", (e) => e == null ? void 0 : e.id).withStableType();
74
73
  }
75
74
  export(e, r) {
76
- return this.processedExportsResult !== void 0 ? this.processedExportsResult.computeOutput("result", (t, a) => r(
77
- t == null ? void 0 : t.traverse({ field: e, assertFieldType: "Input" }),
78
- a
79
- )) : this.renderResult.computeOutput("context", (t, a) => r(
80
- t == null ? void 0 : t.traverse({ field: `values/${e}`, assertFieldType: "Input" }),
81
- a
82
- ));
75
+ 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));
83
76
  }
84
77
  output(e, r) {
85
78
  return this.renderResult.computeOutput("result", (t, a) => r(t == null ? void 0 : t.traverse({ field: e, assertFieldType: "Input" }), a));
86
79
  }
87
80
  }
88
- class $ {
81
+ class C {
89
82
  constructor(e, r, t) {
90
83
  this.pl = e, this.resultRootRid = r, this.resultRootTree = t;
91
84
  }
@@ -93,77 +86,70 @@ class $ {
93
86
  const n = p(), l = typeof r == "string" ? await T({
94
87
  type: "from-file",
95
88
  path: `./dist/tengo/tpl/${r}.plj.gz`
96
- }) : await T(r), { resultMapRid: s } = await this.pl.withWriteTx(
97
- "TemplateRender",
98
- async (i) => {
99
- const u = F(i, l), E = await a(i), k = await A(
100
- i,
101
- u,
102
- e,
103
- E,
104
- t
105
- ), h = w.createPlMap(i, k, e);
106
- i.createField(y(this.resultRootRid, n), "Dynamic", h);
107
- const b = await v(h);
108
- return await i.commit(), {
109
- resultMapRid: b
110
- };
111
- }
112
- );
113
- return await this.resultRootTree.refreshState(), new x(this.resultRootTree.entry(s));
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,
93
+ e,
94
+ E,
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(), {
100
+ resultMapRid: b
101
+ };
102
+ });
103
+ return await this.resultRootTree.refreshState(), new L(this.resultRootTree.entry(s));
114
104
  }
115
105
  createObject(e, r) {
116
106
  return e.createValue(w.JsonObject, JSON.stringify(r));
117
107
  }
118
108
  async renderWorkflow(e, r, t, a = {}) {
119
- const n = p(), l = await this.renderTemplate(!0, e, ["result", "context"], (i) => {
120
- let u;
121
- return a.parent ? u = a.parent : (u = i.createEphemeral({ name: "BContextEnd", version: "1" }), i.lock(u)), {
122
- args: this.createObject(i, t),
123
- blockId: this.createObject(i, n),
124
- isProduction: this.createObject(i, !r),
125
- context: u
126
- };
127
- }), s = void 0;
128
- return a.exportProcessor !== void 0 && await this.renderTemplate(
109
+ const n = p(), l = await this.renderTemplate(
129
110
  !0,
130
- a.exportProcessor,
131
- ["result"],
132
- (i) => ({
133
- pf: i.getFutureFieldValue(
134
- l.resultEntry.rid,
135
- "context",
136
- "Input"
137
- )
138
- })
139
- ), new C(l, s, n);
111
+ e,
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
120
+ };
121
+ }
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);
140
126
  }
141
127
  }
142
- const Q = R.extend({
128
+ const J = R.extend({
143
129
  helper: async ({ pl: o, createTree: e }, r) => {
144
130
  const t = await o.withWriteTx("CreatingHelpers", async (n) => {
145
- const l = n.createEphemeral(w.EphStdMap), s = y(n.clientRoot, "templateTeste");
146
- return n.createField(s, "Dynamic", l), await n.commit(), await v(l);
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);
147
133
  }), a = await e(t);
148
- await r(new $(o, t, a));
134
+ await r(new C(o, t, a));
149
135
  },
150
136
  driverKit: async ({ pl: o, tmpFolder: e }, r) => {
151
137
  const t = c.join(e, "download");
152
138
  await d.mkdir(t, { recursive: !0 });
153
- const a = await P(o, new M(), {
139
+ const a = await P(o, {
154
140
  blobDownloadPath: t,
155
141
  localSecret: m.generateLocalSecret()
156
142
  });
157
143
  await r(a);
158
144
  }
159
145
  });
160
- async function V(o, e = 2e3) {
146
+ async function $(o, e = 2e3) {
161
147
  try {
162
148
  return await o.awaitStableValue(
163
149
  typeof e == "number" ? AbortSignal.timeout(e) : e
164
150
  );
165
151
  } catch (r) {
166
- if (L(r)) {
152
+ if (M(r)) {
167
153
  const t = await o.getFullValue();
168
154
  throw console.dir(t, { depth: 5 }), new Error(
169
155
  `Aborted while awaiting stable value. Unstable marker: ${t.unstableMarker}`,
@@ -175,12 +161,12 @@ async function V(o, e = 2e3) {
175
161
  function S(o) {
176
162
  let e = {};
177
163
  return o !== void 0 && (typeof o == "object" && !(o instanceof AbortSignal) ? e = { ...e, ...o } : e.timeout = o), {
178
- timeout: typeof e.timeout > "u" ? AbortSignal.timeout(U) : typeof e.timeout == "number" ? AbortSignal.timeout(e.timeout) : e.timeout,
164
+ timeout: typeof e.timeout > "u" ? AbortSignal.timeout(V) : typeof e.timeout == "number" ? AbortSignal.timeout(e.timeout) : e.timeout,
179
165
  ignoreBlockError: !!e.ignoreBlockError
180
166
  };
181
167
  }
182
- const U = 5e3;
183
- async function g(o, e, r) {
168
+ const V = 5e3;
169
+ async function y(o, e, r) {
184
170
  const t = S(r), a = o.overview, n = o.getBlockState(e);
185
171
  for (; ; ) {
186
172
  const s = (await a.getValue()).blocks.find((i) => i.id == e);
@@ -205,7 +191,7 @@ async function g(o, e, r) {
205
191
  }
206
192
  }
207
193
  }
208
- const X = R.extend({
194
+ const q = R.extend({
209
195
  ml: async ({ pl: o, tmpFolder: e }, r) => {
210
196
  const t = c.join(e, "frontend"), a = c.join(e, "download");
211
197
  await d.mkdir(t, { recursive: !0 }), await d.mkdir(a, { recursive: !0 });
@@ -231,11 +217,11 @@ const X = R.extend({
231
217
  helpers: async ({ ml: o, rawPrj: e }, r) => {
232
218
  await r({
233
219
  async awaitBlockDone(t, a) {
234
- await g(e, t, a);
220
+ await y(e, t, a);
235
221
  },
236
222
  awaitBlockDoneAndGetStableBlockState: async (t, a) => {
237
223
  const n = S(a);
238
- return await g(e, t, n), await V(
224
+ return await y(e, t, n), await $(
239
225
  e.getBlockState(t),
240
226
  n.timeout
241
227
  );
@@ -249,14 +235,14 @@ const X = R.extend({
249
235
  }
250
236
  });
251
237
  export {
252
- U as DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT,
253
- N as ML,
254
- x as TestRenderResults,
255
- C as TestWorkflowResults,
256
- $ as TplTestHelpers,
257
- V as awaitStableState,
258
- X as blockTest,
238
+ V as DEFAULT_AWAIT_BLOCK_DONE_TIMEOUT,
239
+ _ as ML,
240
+ L as TestRenderResults,
241
+ x as TestWorkflowResults,
242
+ C as TplTestHelpers,
243
+ $ as awaitStableState,
244
+ q as blockTest,
259
245
  R as plTest,
260
- Q as tplTest
246
+ J as tplTest
261
247
  };
262
248
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/test-pl.ts","../src/test-template.ts","../src/util.ts","../src/test-block.ts"],"sourcesContent":["import {\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 {\n PlTreeEntry,\n PlTreeNodeAccessor,\n SynchronizedTreeState\n} 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:\n | TestRenderResults<'result'>\n | 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\n .computeOutput('context', (cb) => cb?.id)\n .withStableType();\n }\n\n /**\n * Returns context id of this workflow\n * */\n public result(): ComputableStableDefined<ResourceId> {\n return this.renderResult\n .computeOutput('result', (cb) => cb?.id)\n .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(\n acc?.traverse({ field: name, assertFieldType: 'Input' }),\n ctx\n );\n });\n else\n return this.renderResult.computeOutput('context', (acc, ctx) => {\n return cb(\n acc?.traverse({ field: `values/${name}`, assertFieldType: 'Input' }),\n ctx\n );\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: (\n tx: PlTransaction\n ) => 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(\n 'TemplateRender',\n 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 );\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'> =\n await this.renderTemplate(true, workflow, ['result', 'context'], (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 const exports: TestRenderResults<'result'> | undefined = undefined;\n if (ops.exportProcessor !== undefined) {\n const exports = await this.renderTemplate(\n true,\n ops.exportProcessor,\n ['result'],\n (tx) => ({\n pf: tx.getFutureFieldValue(\n mainResult.resultEntry.rid,\n 'context',\n 'Input'\n )\n })\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, new ConsoleLoggerAdapter(), {\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","ConsoleLoggerAdapter","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 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 +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,EACL,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAOjC,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,EAClC,iBAAiB,CAAC,QAAQ,CAAC,GAC3B,SAAS;aACG,OAAO,EAAE,MAAM;gBAJf,YAAY,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,CAAC,EACrD,sBAAsB,EAClC,iBAAiB,CAAC,QAAQ,CAAC,GAC3B,SAAS,EACG,OAAO,EAAE,MAAM;IAGjC;;SAEK;IACE,OAAO,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAMrD;;SAEK;IACE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAM7C,MAAM,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,KAAK,CAAC;IAkB7D,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,CACN,EAAE,EAAE,aAAa,KACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC5D,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA8BhC,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;CAsChC;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;;;;;;;EAyBlB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/test",
3
- "version": "1.5.28",
3
+ "version": "1.5.30",
4
4
  "description": "Typescript Block Test Helpers",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -18,12 +18,12 @@
18
18
  "license": "UNLICENSED",
19
19
  "dependencies": {
20
20
  "vitest": "^2.1.1",
21
- "@milaboratories/pl-middle-layer": "^1.10.33",
21
+ "@milaboratories/pl-middle-layer": "^1.10.35",
22
22
  "@platforma-sdk/model": "^1.2.29",
23
23
  "@milaboratories/pl-client": "^2.4.17",
24
- "@milaboratories/pl-tree": "^1.3.14",
25
- "@milaboratories/ts-helpers": "^1.0.28",
26
- "@milaboratories/computable": "^2.1.8"
24
+ "@milaboratories/pl-tree": "^1.3.15",
25
+ "@milaboratories/computable": "^2.1.9",
26
+ "@milaboratories/ts-helpers": "^1.0.28"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "~20.16.5",