@milaboratories/pl-middle-layer 1.10.12
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/block_registry/index.d.ts +4 -0
- package/dist/block_registry/index.d.ts.map +1 -0
- package/dist/block_registry/registry.d.ts +37 -0
- package/dist/block_registry/registry.d.ts.map +1 -0
- package/dist/block_registry/registry_spec.d.ts +12 -0
- package/dist/block_registry/registry_spec.d.ts.map +1 -0
- package/dist/block_registry/watcher.d.ts +15 -0
- package/dist/block_registry/watcher.d.ts.map +1 -0
- package/dist/block_registry/well_known_registries.d.ts +4 -0
- package/dist/block_registry/well_known_registries.d.ts.map +1 -0
- package/dist/cfg_render/executor.d.ts +8 -0
- package/dist/cfg_render/executor.d.ts.map +1 -0
- package/dist/cfg_render/operation.d.ts +29 -0
- package/dist/cfg_render/operation.d.ts.map +1 -0
- package/dist/cfg_render/renderer.d.ts +6 -0
- package/dist/cfg_render/renderer.d.ts.map +1 -0
- package/dist/cfg_render/traverse.d.ts +3 -0
- package/dist/cfg_render/traverse.d.ts.map +1 -0
- package/dist/cfg_render/util.d.ts +5 -0
- package/dist/cfg_render/util.d.ts.map +1 -0
- package/dist/dev/index.d.ts +21 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/util.d.ts +3 -0
- package/dist/dev/util.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3587 -0
- package/dist/index.mjs.map +1 -0
- package/dist/js_render/context.d.ts +68 -0
- package/dist/js_render/context.d.ts.map +1 -0
- package/dist/js_render/index.d.ts +6 -0
- package/dist/js_render/index.d.ts.map +1 -0
- package/dist/middle_layer/active_cfg.d.ts +6 -0
- package/dist/middle_layer/active_cfg.d.ts.map +1 -0
- package/dist/middle_layer/block.d.ts +9 -0
- package/dist/middle_layer/block.d.ts.map +1 -0
- package/dist/middle_layer/block_ctx.d.ts +20 -0
- package/dist/middle_layer/block_ctx.d.ts.map +1 -0
- package/dist/middle_layer/block_ctx_unsafe.d.ts +16 -0
- package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -0
- package/dist/middle_layer/driver_kit.d.ts +31 -0
- package/dist/middle_layer/driver_kit.d.ts.map +1 -0
- package/dist/middle_layer/frontend_path.d.ts +6 -0
- package/dist/middle_layer/frontend_path.d.ts.map +1 -0
- package/dist/middle_layer/index.d.ts +5 -0
- package/dist/middle_layer/index.d.ts.map +1 -0
- package/dist/middle_layer/middle_layer.d.ts +78 -0
- package/dist/middle_layer/middle_layer.d.ts.map +1 -0
- package/dist/middle_layer/navigation_states.d.ts +10 -0
- package/dist/middle_layer/navigation_states.d.ts.map +1 -0
- package/dist/middle_layer/ops.d.ts +64 -0
- package/dist/middle_layer/ops.d.ts.map +1 -0
- package/dist/middle_layer/project.d.ts +110 -0
- package/dist/middle_layer/project.d.ts.map +1 -0
- package/dist/middle_layer/project_list.d.ts +11 -0
- package/dist/middle_layer/project_list.d.ts.map +1 -0
- package/dist/middle_layer/project_overview.d.ts +8 -0
- package/dist/middle_layer/project_overview.d.ts.map +1 -0
- package/dist/middle_layer/render.d.ts +6 -0
- package/dist/middle_layer/render.d.ts.map +1 -0
- package/dist/middle_layer/types.d.ts +11 -0
- package/dist/middle_layer/types.d.ts.map +1 -0
- package/dist/middle_layer/util.d.ts +3 -0
- package/dist/middle_layer/util.d.ts.map +1 -0
- package/dist/model/args.d.ts +12 -0
- package/dist/model/args.d.ts.map +1 -0
- package/dist/model/block_pack.d.ts +8 -0
- package/dist/model/block_pack.d.ts.map +1 -0
- package/dist/model/block_pack_spec.d.ts +40 -0
- package/dist/model/block_pack_spec.d.ts.map +1 -0
- package/dist/model/frontend.d.ts +10 -0
- package/dist/model/frontend.d.ts.map +1 -0
- package/dist/model/index.d.ts +3 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/project_model.d.ts +67 -0
- package/dist/model/project_model.d.ts.map +1 -0
- package/dist/model/project_model_util.d.ts +29 -0
- package/dist/model/project_model_util.d.ts.map +1 -0
- package/dist/model/template_spec.d.ts +16 -0
- package/dist/model/template_spec.d.ts.map +1 -0
- package/dist/mutator/block-pack/block_pack.d.ts +17 -0
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
- package/dist/mutator/block-pack/frontend.d.ts +4 -0
- package/dist/mutator/block-pack/frontend.d.ts.map +1 -0
- package/dist/mutator/context_export.d.ts +9 -0
- package/dist/mutator/context_export.d.ts.map +1 -0
- package/dist/mutator/project.d.ts +121 -0
- package/dist/mutator/project.d.ts.map +1 -0
- package/dist/mutator/template/render_block.d.ts +32 -0
- package/dist/mutator/template/render_block.d.ts.map +1 -0
- package/dist/mutator/template/render_template.d.ts +12 -0
- package/dist/mutator/template/render_template.d.ts.map +1 -0
- package/dist/mutator/template/template_loading.d.ts +13 -0
- package/dist/mutator/template/template_loading.d.ts.map +1 -0
- package/dist/pool/data.d.ts +24 -0
- package/dist/pool/data.d.ts.map +1 -0
- package/dist/pool/driver.d.ts +22 -0
- package/dist/pool/driver.d.ts.map +1 -0
- package/dist/pool/index.d.ts +3 -0
- package/dist/pool/index.d.ts.map +1 -0
- package/dist/pool/p_object_collection.d.ts +29 -0
- package/dist/pool/p_object_collection.d.ts.map +1 -0
- package/dist/pool/ref_count_pool.d.ts +25 -0
- package/dist/pool/ref_count_pool.d.ts.map +1 -0
- package/dist/pool/result_pool.d.ts +25 -0
- package/dist/pool/result_pool.d.ts.map +1 -0
- package/dist/test/block_packs.d.ts +6 -0
- package/dist/test/block_packs.d.ts.map +1 -0
- package/dist/test/explicit_templates.d.ts +3 -0
- package/dist/test/explicit_templates.d.ts.map +1 -0
- package/dist/test/known_templates.d.ts +6 -0
- package/dist/test/known_templates.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/block_registry/index.ts +3 -0
- package/src/block_registry/registry.test.ts +35 -0
- package/src/block_registry/registry.ts +180 -0
- package/src/block_registry/registry_spec.ts +13 -0
- package/src/block_registry/watcher.ts +72 -0
- package/src/block_registry/well_known_registries.ts +13 -0
- package/src/cfg_render/executor.test.ts +120 -0
- package/src/cfg_render/executor.ts +253 -0
- package/src/cfg_render/operation.ts +38 -0
- package/src/cfg_render/renderer.ts +540 -0
- package/src/cfg_render/traverse.ts +58 -0
- package/src/cfg_render/util.ts +29 -0
- package/src/dev/index.ts +89 -0
- package/src/dev/util.ts +13 -0
- package/src/index.ts +21 -0
- package/src/js_render/context.ts +768 -0
- package/src/js_render/index.ts +41 -0
- package/src/middle_layer/active_cfg.ts +56 -0
- package/src/middle_layer/block.ts +70 -0
- package/src/middle_layer/block_ctx.ts +90 -0
- package/src/middle_layer/block_ctx_unsafe.ts +29 -0
- package/src/middle_layer/driver_kit.ts +107 -0
- package/src/middle_layer/frontend_path.ts +83 -0
- package/src/middle_layer/index.ts +4 -0
- package/src/middle_layer/middle_layer.test.ts +720 -0
- package/src/middle_layer/middle_layer.ts +235 -0
- package/src/middle_layer/navigation_states.ts +48 -0
- package/src/middle_layer/ops.ts +147 -0
- package/src/middle_layer/project.ts +380 -0
- package/src/middle_layer/project_list.ts +59 -0
- package/src/middle_layer/project_overview.ts +220 -0
- package/src/middle_layer/render.test.ts +129 -0
- package/src/middle_layer/render.ts +19 -0
- package/src/middle_layer/types.ts +16 -0
- package/src/middle_layer/util.ts +22 -0
- package/src/model/args.ts +62 -0
- package/src/model/block_pack.ts +8 -0
- package/src/model/block_pack_spec.ts +52 -0
- package/src/model/frontend.ts +10 -0
- package/src/model/index.ts +2 -0
- package/src/model/project_model.test.ts +26 -0
- package/src/model/project_model.ts +142 -0
- package/src/model/project_model_util.test.ts +88 -0
- package/src/model/project_model_util.ts +169 -0
- package/src/model/template_spec.ts +18 -0
- package/src/mutator/block-pack/block_pack.test.ts +53 -0
- package/src/mutator/block-pack/block_pack.ts +187 -0
- package/src/mutator/block-pack/frontend.ts +29 -0
- package/src/mutator/context_export.ts +25 -0
- package/src/mutator/project.test.ts +272 -0
- package/src/mutator/project.ts +1112 -0
- package/src/mutator/template/render_block.ts +91 -0
- package/src/mutator/template/render_template.ts +40 -0
- package/src/mutator/template/template_loading.ts +77 -0
- package/src/mutator/template/template_render.test.ts +272 -0
- package/src/pool/data.ts +239 -0
- package/src/pool/driver.ts +325 -0
- package/src/pool/index.ts +2 -0
- package/src/pool/p_object_collection.ts +122 -0
- package/src/pool/ref_count_pool.ts +76 -0
- package/src/pool/result_pool.ts +284 -0
- package/src/test/block_packs.ts +23 -0
- package/src/test/explicit_templates.ts +8 -0
- package/src/test/known_templates.ts +24 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result_pool.d.ts","sourceRoot":"","sources":["../../src/pool/result_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EACL,MAAM,EACN,OAAO,EACP,WAAW,EACX,cAAc,EACd,GAAG,EACH,gBAAgB,EAEhB,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQzC,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC;AAYtD,MAAM,WAAW,wBAAwB,CAAC,CAAC,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B;AAED,qBAAa,UAAU;IAGnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO;IAuBA,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC,OAAO,IAAI,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAoBhE,iBAAiB,IAAI,wBAAwB,CAClD,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAClE;IAuDM,QAAQ,IAAI,wBAAwB,CAAC,WAAW,CAAC;IA6CjD,gBAAgB,CAAC,SAAS,EAAE,cAAc,GAAG,cAAc,EAAE;WAuBtD,MAAM,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU;CAwCjG"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BlockPackPreparer } from '../mutator/block-pack/block_pack';
|
|
2
|
+
import { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';
|
|
3
|
+
export declare const TestBPPreparer: BlockPackPreparer;
|
|
4
|
+
export declare const BPSpecEnterV041NotPrepared: BlockPackSpec;
|
|
5
|
+
export declare const BPSpecSumV042NotPrepared: BlockPackSpec;
|
|
6
|
+
//# sourceMappingURL=block_packs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block_packs.d.ts","sourceRoot":"","sources":["../../src/test/block_packs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAEtE,eAAO,MAAM,cAAc,mBAE1B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,aAMxC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,aAMtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explicit_templates.d.ts","sourceRoot":"","sources":["../../src/test/explicit_templates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,QAGtC,CAAC;AACF,eAAO,MAAM,4BAA4B,QAGxC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TemplateSpecPrepared } from '../model/template_spec';
|
|
2
|
+
export declare const TplSpecEnterExplicit: TemplateSpecPrepared;
|
|
3
|
+
export declare const TplSpecEnterFromRegistry: TemplateSpecPrepared;
|
|
4
|
+
export declare const TplSpecSumExplicit: TemplateSpecPrepared;
|
|
5
|
+
export declare const TplSpecSumFromRegistry: TemplateSpecPrepared;
|
|
6
|
+
//# sourceMappingURL=known_templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known_templates.d.ts","sourceRoot":"","sources":["../../src/test/known_templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,eAAO,MAAM,oBAAoB,EAAE,oBAGlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,oBAItC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,oBAGhC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,oBAIpC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@milaboratories/pl-middle-layer",
|
|
3
|
+
"version": "1.10.12",
|
|
4
|
+
"description": "Pl Middle Layer",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"import": "./dist/index.mjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*",
|
|
17
|
+
"src/**/*"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [],
|
|
20
|
+
"license": "UNLICENSED",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@milaboratories/pframes-node": "^1.5.0",
|
|
23
|
+
"canonicalize": "^2.0.0",
|
|
24
|
+
"denque": "^2.1.0",
|
|
25
|
+
"quickjs-emscripten": "^0.31.0",
|
|
26
|
+
"undici": "^6.19.8",
|
|
27
|
+
"utility-types": "^3.11.0",
|
|
28
|
+
"yaml": "^2.5.1",
|
|
29
|
+
"zod": "^3.23.8",
|
|
30
|
+
"@milaboratories/computable": "^2.1.4",
|
|
31
|
+
"@milaboratories/pl-client": "^2.4.12",
|
|
32
|
+
"@milaboratories/pl-drivers": "^1.2.17",
|
|
33
|
+
"@platforma-sdk/block-tools": "^2.1.7",
|
|
34
|
+
"@milaboratories/pl-model-middle-layer": "^1.2.18",
|
|
35
|
+
"@milaboratories/pl-model-common": "^1.3.11",
|
|
36
|
+
"@milaboratories/pl-tree": "^1.3.8",
|
|
37
|
+
"@platforma-sdk/model": "^1.2.24",
|
|
38
|
+
"@milaboratories/ts-helpers": "^1.0.24",
|
|
39
|
+
"@platforma-sdk/workflow-tengo": "1.2.6"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "~5.5.4",
|
|
43
|
+
"vite": "^5.4.7",
|
|
44
|
+
"@types/jest": "^29.5.13",
|
|
45
|
+
"@types/node": "~20.16.5",
|
|
46
|
+
"jest": "^29.7.0",
|
|
47
|
+
"ts-jest": "^29.2.5",
|
|
48
|
+
"@milaboratories/platforma-build-configs": "1.0.1"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"type-check": "tsc --noEmit --composite false",
|
|
52
|
+
"build": "vite build",
|
|
53
|
+
"test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BlockPackRegistry } from './registry';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { CentralDevSnapshotRegistry, CentralRegistry } from './well_known_registries';
|
|
4
|
+
|
|
5
|
+
test('testing local dev registry', async () => {
|
|
6
|
+
const registry = new BlockPackRegistry([
|
|
7
|
+
{
|
|
8
|
+
type: 'folder_with_dev_packages',
|
|
9
|
+
label: 'Local dev',
|
|
10
|
+
path: path.resolve('integration')
|
|
11
|
+
}
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
expect(await registry.getPackagesOverview()).toHaveLength(2);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test.skip('testing local dev registry with v2', async () => {
|
|
18
|
+
const registry = new BlockPackRegistry([
|
|
19
|
+
{
|
|
20
|
+
type: 'folder_with_dev_packages',
|
|
21
|
+
label: 'Local dev',
|
|
22
|
+
path: path.resolve('/Volumes/Data/Projects/MiLaboratory/blocks-beta')
|
|
23
|
+
}
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
console.dir(await registry.getPackagesOverview(), { depth: 5 });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('testing remote registry', async () => {
|
|
30
|
+
const registry = new BlockPackRegistry([CentralRegistry, CentralDevSnapshotRegistry]);
|
|
31
|
+
|
|
32
|
+
const packages = await registry.getPackagesOverview();
|
|
33
|
+
console.log(packages);
|
|
34
|
+
expect(packages.length).toBeGreaterThanOrEqual(2);
|
|
35
|
+
});
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Dispatcher, request } from 'undici';
|
|
2
|
+
import { RegistrySpec } from './registry_spec';
|
|
3
|
+
import { BlockPackSpecAny } from '../model';
|
|
4
|
+
import { BlockPackDescriptionAbsolute, RegistryV1 } from '@platforma-sdk/block-tools';
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import YAML from 'yaml';
|
|
8
|
+
import { assertNever } from '@milaboratories/ts-helpers';
|
|
9
|
+
import { LegacyDevBlockPackFiles } from '../dev';
|
|
10
|
+
import { tryLoadPackDescription } from '@platforma-sdk/block-tools';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Information specified by the developer of the block.
|
|
14
|
+
* */
|
|
15
|
+
export type BlockPackMeta = {
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
[metaField: string]: unknown;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Information about specific package with specific organization and package names.
|
|
23
|
+
* Mainly contain information about latest version of the package.
|
|
24
|
+
* */
|
|
25
|
+
export type BlockPackPackageOverview = {
|
|
26
|
+
organization: string;
|
|
27
|
+
/** @deprecated */
|
|
28
|
+
package: string;
|
|
29
|
+
name: string;
|
|
30
|
+
latestVersion: string;
|
|
31
|
+
latestMeta: BlockPackMeta;
|
|
32
|
+
registryLabel: string;
|
|
33
|
+
latestSpec: BlockPackSpecAny;
|
|
34
|
+
otherVersions: string[];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
async function getFileContent(path: string) {
|
|
38
|
+
try {
|
|
39
|
+
return await fs.promises.readFile(path, 'utf8');
|
|
40
|
+
} catch (error: any) {
|
|
41
|
+
if (error.code === 'ENOENT') {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function getFileStat(path: string) {
|
|
49
|
+
try {
|
|
50
|
+
return await fs.promises.stat(path, { bigint: true });
|
|
51
|
+
} catch (error: any) {
|
|
52
|
+
if (error.code === 'ENOENT') {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function getDevV1PacketMtime(devPath: string): Promise<string> {
|
|
60
|
+
let mtime = 0n;
|
|
61
|
+
for (const f of LegacyDevBlockPackFiles) {
|
|
62
|
+
const fullPath = path.join(devPath, ...f);
|
|
63
|
+
const stat = await getFileStat(fullPath);
|
|
64
|
+
if (stat === undefined) continue;
|
|
65
|
+
if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;
|
|
66
|
+
}
|
|
67
|
+
return mtime.toString();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function getDevV2PacketMtime(
|
|
71
|
+
description: BlockPackDescriptionAbsolute
|
|
72
|
+
): Promise<string> {
|
|
73
|
+
let mtime = 0n;
|
|
74
|
+
const wfStats = await fs.promises.stat(description.components.workflow.file, { bigint: true });
|
|
75
|
+
const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });
|
|
76
|
+
return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export class BlockPackRegistry {
|
|
80
|
+
constructor(
|
|
81
|
+
private readonly registrySpecs: RegistrySpec[],
|
|
82
|
+
private readonly http?: Dispatcher
|
|
83
|
+
) {}
|
|
84
|
+
|
|
85
|
+
private async getPackagesForRoot(regSpec: RegistrySpec): Promise<BlockPackPackageOverview[]> {
|
|
86
|
+
const result: BlockPackPackageOverview[] = [];
|
|
87
|
+
switch (regSpec.type) {
|
|
88
|
+
case 'remote_v1':
|
|
89
|
+
const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};
|
|
90
|
+
|
|
91
|
+
const overviewResponse = await request(
|
|
92
|
+
`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,
|
|
93
|
+
httpOptions
|
|
94
|
+
);
|
|
95
|
+
const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;
|
|
96
|
+
for (const overviewEntry of overview) {
|
|
97
|
+
const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;
|
|
98
|
+
result.push({
|
|
99
|
+
organization,
|
|
100
|
+
package: pkg,
|
|
101
|
+
name: pkg,
|
|
102
|
+
latestVersion,
|
|
103
|
+
latestMeta: latestMeta as BlockPackMeta,
|
|
104
|
+
registryLabel: regSpec.label,
|
|
105
|
+
latestSpec: {
|
|
106
|
+
type: 'from-registry-v1',
|
|
107
|
+
registryUrl: regSpec.url,
|
|
108
|
+
organization,
|
|
109
|
+
package: pkg,
|
|
110
|
+
version: latestVersion
|
|
111
|
+
// `${regSpec.url}/${packageContentPrefix({ organization, package: pkg, version: latestVersion })}`
|
|
112
|
+
},
|
|
113
|
+
otherVersions: overviewEntry.allVersions
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
|
|
118
|
+
case 'folder_with_dev_packages':
|
|
119
|
+
for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {
|
|
120
|
+
if (!entry.isDirectory()) continue;
|
|
121
|
+
const devPath = path.join(regSpec.path, entry.name);
|
|
122
|
+
|
|
123
|
+
const legacyYamlContent = await getFileContent(
|
|
124
|
+
path.join(devPath, RegistryV1.PlPackageYamlConfigFile)
|
|
125
|
+
);
|
|
126
|
+
if (legacyYamlContent !== undefined) {
|
|
127
|
+
const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));
|
|
128
|
+
|
|
129
|
+
const mtime = await getDevV1PacketMtime(devPath);
|
|
130
|
+
|
|
131
|
+
result.push({
|
|
132
|
+
organization: config.organization,
|
|
133
|
+
package: config.package, // TODO delete
|
|
134
|
+
name: config.package,
|
|
135
|
+
latestVersion: 'DEV',
|
|
136
|
+
latestMeta: config.meta as BlockPackMeta,
|
|
137
|
+
registryLabel: regSpec.label,
|
|
138
|
+
latestSpec: {
|
|
139
|
+
type: 'dev-v1',
|
|
140
|
+
folder: devPath,
|
|
141
|
+
mtime
|
|
142
|
+
},
|
|
143
|
+
otherVersions: []
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const v2Description = await tryLoadPackDescription(devPath);
|
|
148
|
+
if (v2Description !== undefined) {
|
|
149
|
+
const mtime = await getDevV2PacketMtime(v2Description);
|
|
150
|
+
result.push({
|
|
151
|
+
organization: v2Description.id.organization,
|
|
152
|
+
package: v2Description.id.name, // TODO delete
|
|
153
|
+
name: v2Description.id.name,
|
|
154
|
+
latestVersion: `${v2Description.id.version}-DEV`,
|
|
155
|
+
latestMeta: v2Description.meta,
|
|
156
|
+
registryLabel: regSpec.label,
|
|
157
|
+
latestSpec: {
|
|
158
|
+
type: 'dev-v2',
|
|
159
|
+
folder: devPath,
|
|
160
|
+
mtime
|
|
161
|
+
},
|
|
162
|
+
otherVersions: []
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
default:
|
|
170
|
+
return assertNever(regSpec);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public async getPackagesOverview(): Promise<BlockPackPackageOverview[]> {
|
|
175
|
+
const packages: BlockPackPackageOverview[] = [];
|
|
176
|
+
for (const regSpecs of this.registrySpecs)
|
|
177
|
+
packages.push(...(await this.getPackagesForRoot(regSpecs)));
|
|
178
|
+
return packages;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RemoteRegistryV1Spec = {
|
|
2
|
+
type: 'remote_v1';
|
|
3
|
+
label: string;
|
|
4
|
+
url: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export type FolderWithDevPackagesRegistrySpec = {
|
|
8
|
+
type: 'folder_with_dev_packages';
|
|
9
|
+
label: string;
|
|
10
|
+
path: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type RegistrySpec = RemoteRegistryV1Spec | FolderWithDevPackagesRegistrySpec;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { PollComputablePool, PollPoolOps } from '@milaboratories/computable';
|
|
2
|
+
import { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';
|
|
3
|
+
import { Dispatcher } from 'undici';
|
|
4
|
+
import { getDevV1PacketMtime, getDevV2PacketMtime } from './registry';
|
|
5
|
+
import { tryLoadPackDescription } from '@platforma-sdk/block-tools';
|
|
6
|
+
|
|
7
|
+
export const DefaultBlockUpdateWatcherOps: PollPoolOps = {
|
|
8
|
+
minDelay: 1500
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type BlockUpdateWatcherOps = Partial<PollPoolOps> & { readonly http?: Dispatcher };
|
|
12
|
+
|
|
13
|
+
const NoUpdatesKey = '__no_updates__';
|
|
14
|
+
|
|
15
|
+
export class BlockUpdateWatcher extends PollComputablePool<
|
|
16
|
+
BlockPackSpec,
|
|
17
|
+
BlockPackSpec | undefined
|
|
18
|
+
> {
|
|
19
|
+
private readonly http?: Dispatcher;
|
|
20
|
+
|
|
21
|
+
constructor(ops: BlockUpdateWatcherOps = {}) {
|
|
22
|
+
super({ ...ops, ...DefaultBlockUpdateWatcherOps });
|
|
23
|
+
this.http = ops.http;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected getKey(req: BlockPackSpec): string {
|
|
27
|
+
switch (req.type) {
|
|
28
|
+
case 'dev':
|
|
29
|
+
case 'dev-v1':
|
|
30
|
+
return `dev_1_${req.folder}_${req.mtime}`;
|
|
31
|
+
case 'dev-v2':
|
|
32
|
+
return `dev_2_${req.folder}_${req.mtime}`;
|
|
33
|
+
default:
|
|
34
|
+
return NoUpdatesKey;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected async readValue(req: BlockPackSpec): Promise<BlockPackSpec | undefined> {
|
|
39
|
+
try {
|
|
40
|
+
switch (req.type) {
|
|
41
|
+
case 'dev':
|
|
42
|
+
case 'dev-v1': {
|
|
43
|
+
const mtime = await getDevV1PacketMtime(req.folder);
|
|
44
|
+
if (mtime === req.mtime) return undefined;
|
|
45
|
+
else return { ...req, mtime };
|
|
46
|
+
}
|
|
47
|
+
case 'dev-v2': {
|
|
48
|
+
const description = await tryLoadPackDescription(req.folder);
|
|
49
|
+
if (description === undefined) return undefined;
|
|
50
|
+
const mtime = await getDevV2PacketMtime(description);
|
|
51
|
+
if (mtime === req.mtime) return undefined;
|
|
52
|
+
else return { ...req, mtime: mtime };
|
|
53
|
+
}
|
|
54
|
+
default:
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
} catch (e: unknown) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
protected resultsEqual(
|
|
63
|
+
res1: BlockPackSpec | undefined,
|
|
64
|
+
res2: BlockPackSpec | undefined
|
|
65
|
+
): boolean {
|
|
66
|
+
if (res1 === undefined && res2 === undefined) return true;
|
|
67
|
+
if (res1 === undefined || res2 === undefined) return false;
|
|
68
|
+
if (res1.type === 'from-registry-v1' || res2.type === 'from-registry-v1')
|
|
69
|
+
throw new Error('Unexpected, not yet supported.');
|
|
70
|
+
return res1.folder === res2.folder && res1.mtime === res2.mtime;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RegistrySpec } from './registry_spec';
|
|
2
|
+
|
|
3
|
+
export const CentralRegistry: RegistrySpec = {
|
|
4
|
+
type: 'remote_v1',
|
|
5
|
+
label: 'Central Release Registry',
|
|
6
|
+
url: 'https://block.registry.platforma.bio/releases'
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const CentralDevSnapshotRegistry: RegistrySpec = {
|
|
10
|
+
type: 'remote_v1',
|
|
11
|
+
label: 'Central Dev Snapshot registry',
|
|
12
|
+
url: 'https://block.registry.platforma.bio/dev'
|
|
13
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Args,
|
|
3
|
+
BlockConfig,
|
|
4
|
+
BlockModel,
|
|
5
|
+
getJsonField,
|
|
6
|
+
getResourceField,
|
|
7
|
+
getResourceValueAsJson,
|
|
8
|
+
InferOutputType,
|
|
9
|
+
isolate,
|
|
10
|
+
It,
|
|
11
|
+
MainOutputs,
|
|
12
|
+
makeObject,
|
|
13
|
+
mapArrayValues,
|
|
14
|
+
PlResourceEntry,
|
|
15
|
+
TypedConfig
|
|
16
|
+
} from '@platforma-sdk/model';
|
|
17
|
+
import { computableFromCfg, computableFromCfgUnsafe } from './executor';
|
|
18
|
+
import { field, Pl, TestHelpers } from '@milaboratories/pl-client';
|
|
19
|
+
import { SynchronizedTreeState } from '@milaboratories/pl-tree';
|
|
20
|
+
import { Computable } from '@milaboratories/computable';
|
|
21
|
+
import { MiddleLayerDriverKit } from '../middle_layer/driver_kit';
|
|
22
|
+
|
|
23
|
+
test('local cfg test (no pl)', async () => {
|
|
24
|
+
const args = {
|
|
25
|
+
theC: 'c',
|
|
26
|
+
a: { c: 'hi' },
|
|
27
|
+
b: ['a', 'b', 'c']
|
|
28
|
+
};
|
|
29
|
+
const theCValue = getJsonField(Args, 'theC');
|
|
30
|
+
|
|
31
|
+
const cfg = (
|
|
32
|
+
BlockModel.create<typeof args>('Heavy')
|
|
33
|
+
.initialArgs(args)
|
|
34
|
+
.output('out1', getJsonField(getJsonField(Args, 'a'), theCValue))
|
|
35
|
+
.output(
|
|
36
|
+
'out2',
|
|
37
|
+
mapArrayValues(getJsonField(Args, 'b'), isolate(makeObject({ theField: It })))
|
|
38
|
+
)
|
|
39
|
+
.done() as any
|
|
40
|
+
).config as BlockConfig;
|
|
41
|
+
|
|
42
|
+
const ctx = { $args: args };
|
|
43
|
+
|
|
44
|
+
const computable1 = computableFromCfgUnsafe(
|
|
45
|
+
{} as MiddleLayerDriverKit,
|
|
46
|
+
ctx,
|
|
47
|
+
cfg.outputs['out1'] as TypedConfig
|
|
48
|
+
);
|
|
49
|
+
const out1 = (await computable1.getValue()) as InferOutputType<
|
|
50
|
+
(typeof cfg.outputs)['out1'],
|
|
51
|
+
typeof args,
|
|
52
|
+
unknown
|
|
53
|
+
>;
|
|
54
|
+
expect(out1).toEqual('hi');
|
|
55
|
+
|
|
56
|
+
const computable2 = computableFromCfgUnsafe(
|
|
57
|
+
{} as MiddleLayerDriverKit,
|
|
58
|
+
ctx,
|
|
59
|
+
cfg.outputs['out2'] as TypedConfig
|
|
60
|
+
);
|
|
61
|
+
const out2 = await computable2.getValue();
|
|
62
|
+
expect(out2).toStrictEqual([{ theField: 'a' }, { theField: 'b' }, { theField: 'c' }]);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
type TestResourceValue = {
|
|
66
|
+
someField: number;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
test('cfg test with pl, simple', async () => {
|
|
70
|
+
const input = {
|
|
71
|
+
theC: 'c'
|
|
72
|
+
};
|
|
73
|
+
const theCValue = getJsonField(Args, 'theC');
|
|
74
|
+
|
|
75
|
+
const cfg = (
|
|
76
|
+
BlockModel.create<typeof input>('Heavy')
|
|
77
|
+
.initialArgs(input)
|
|
78
|
+
.output(
|
|
79
|
+
'out1',
|
|
80
|
+
getJsonField(
|
|
81
|
+
getResourceValueAsJson<TestResourceValue>()(getResourceField(MainOutputs, theCValue)),
|
|
82
|
+
'someField'
|
|
83
|
+
)
|
|
84
|
+
)
|
|
85
|
+
.done() as any
|
|
86
|
+
).config as BlockConfig;
|
|
87
|
+
|
|
88
|
+
await TestHelpers.withTempRoot(async (pl) => {
|
|
89
|
+
const tree = await SynchronizedTreeState.init(pl, pl.clientRoot, {
|
|
90
|
+
pollingInterval: 250,
|
|
91
|
+
stopPollingDelay: 500
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const ctx = {
|
|
95
|
+
$args: input,
|
|
96
|
+
$prod: tree.entry() as any as PlResourceEntry
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const computable: Computable<unknown> = computableFromCfgUnsafe(
|
|
100
|
+
{} as MiddleLayerDriverKit,
|
|
101
|
+
ctx,
|
|
102
|
+
cfg.outputs['out1'] as TypedConfig
|
|
103
|
+
) as any;
|
|
104
|
+
|
|
105
|
+
expect(await computable.getValue()).toBeUndefined();
|
|
106
|
+
|
|
107
|
+
await pl.withWriteTx('addingTestResource', async (tx) => {
|
|
108
|
+
tx.createField(
|
|
109
|
+
field(pl.clientRoot, 'c'),
|
|
110
|
+
'Dynamic',
|
|
111
|
+
tx.createValue(Pl.JsonObject, JSON.stringify({ someField: 42 } as TestResourceValue))
|
|
112
|
+
);
|
|
113
|
+
await tx.commit();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
await computable.refreshState();
|
|
117
|
+
|
|
118
|
+
expect(await computable.getValue()).toEqual(42);
|
|
119
|
+
});
|
|
120
|
+
});
|