@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.
Files changed (179) hide show
  1. package/dist/block_registry/index.d.ts +4 -0
  2. package/dist/block_registry/index.d.ts.map +1 -0
  3. package/dist/block_registry/registry.d.ts +37 -0
  4. package/dist/block_registry/registry.d.ts.map +1 -0
  5. package/dist/block_registry/registry_spec.d.ts +12 -0
  6. package/dist/block_registry/registry_spec.d.ts.map +1 -0
  7. package/dist/block_registry/watcher.d.ts +15 -0
  8. package/dist/block_registry/watcher.d.ts.map +1 -0
  9. package/dist/block_registry/well_known_registries.d.ts +4 -0
  10. package/dist/block_registry/well_known_registries.d.ts.map +1 -0
  11. package/dist/cfg_render/executor.d.ts +8 -0
  12. package/dist/cfg_render/executor.d.ts.map +1 -0
  13. package/dist/cfg_render/operation.d.ts +29 -0
  14. package/dist/cfg_render/operation.d.ts.map +1 -0
  15. package/dist/cfg_render/renderer.d.ts +6 -0
  16. package/dist/cfg_render/renderer.d.ts.map +1 -0
  17. package/dist/cfg_render/traverse.d.ts +3 -0
  18. package/dist/cfg_render/traverse.d.ts.map +1 -0
  19. package/dist/cfg_render/util.d.ts +5 -0
  20. package/dist/cfg_render/util.d.ts.map +1 -0
  21. package/dist/dev/index.d.ts +21 -0
  22. package/dist/dev/index.d.ts.map +1 -0
  23. package/dist/dev/util.d.ts +3 -0
  24. package/dist/dev/util.d.ts.map +1 -0
  25. package/dist/index.d.ts +13 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/index.mjs +3587 -0
  30. package/dist/index.mjs.map +1 -0
  31. package/dist/js_render/context.d.ts +68 -0
  32. package/dist/js_render/context.d.ts.map +1 -0
  33. package/dist/js_render/index.d.ts +6 -0
  34. package/dist/js_render/index.d.ts.map +1 -0
  35. package/dist/middle_layer/active_cfg.d.ts +6 -0
  36. package/dist/middle_layer/active_cfg.d.ts.map +1 -0
  37. package/dist/middle_layer/block.d.ts +9 -0
  38. package/dist/middle_layer/block.d.ts.map +1 -0
  39. package/dist/middle_layer/block_ctx.d.ts +20 -0
  40. package/dist/middle_layer/block_ctx.d.ts.map +1 -0
  41. package/dist/middle_layer/block_ctx_unsafe.d.ts +16 -0
  42. package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -0
  43. package/dist/middle_layer/driver_kit.d.ts +31 -0
  44. package/dist/middle_layer/driver_kit.d.ts.map +1 -0
  45. package/dist/middle_layer/frontend_path.d.ts +6 -0
  46. package/dist/middle_layer/frontend_path.d.ts.map +1 -0
  47. package/dist/middle_layer/index.d.ts +5 -0
  48. package/dist/middle_layer/index.d.ts.map +1 -0
  49. package/dist/middle_layer/middle_layer.d.ts +78 -0
  50. package/dist/middle_layer/middle_layer.d.ts.map +1 -0
  51. package/dist/middle_layer/navigation_states.d.ts +10 -0
  52. package/dist/middle_layer/navigation_states.d.ts.map +1 -0
  53. package/dist/middle_layer/ops.d.ts +64 -0
  54. package/dist/middle_layer/ops.d.ts.map +1 -0
  55. package/dist/middle_layer/project.d.ts +110 -0
  56. package/dist/middle_layer/project.d.ts.map +1 -0
  57. package/dist/middle_layer/project_list.d.ts +11 -0
  58. package/dist/middle_layer/project_list.d.ts.map +1 -0
  59. package/dist/middle_layer/project_overview.d.ts +8 -0
  60. package/dist/middle_layer/project_overview.d.ts.map +1 -0
  61. package/dist/middle_layer/render.d.ts +6 -0
  62. package/dist/middle_layer/render.d.ts.map +1 -0
  63. package/dist/middle_layer/types.d.ts +11 -0
  64. package/dist/middle_layer/types.d.ts.map +1 -0
  65. package/dist/middle_layer/util.d.ts +3 -0
  66. package/dist/middle_layer/util.d.ts.map +1 -0
  67. package/dist/model/args.d.ts +12 -0
  68. package/dist/model/args.d.ts.map +1 -0
  69. package/dist/model/block_pack.d.ts +8 -0
  70. package/dist/model/block_pack.d.ts.map +1 -0
  71. package/dist/model/block_pack_spec.d.ts +40 -0
  72. package/dist/model/block_pack_spec.d.ts.map +1 -0
  73. package/dist/model/frontend.d.ts +10 -0
  74. package/dist/model/frontend.d.ts.map +1 -0
  75. package/dist/model/index.d.ts +3 -0
  76. package/dist/model/index.d.ts.map +1 -0
  77. package/dist/model/project_model.d.ts +67 -0
  78. package/dist/model/project_model.d.ts.map +1 -0
  79. package/dist/model/project_model_util.d.ts +29 -0
  80. package/dist/model/project_model_util.d.ts.map +1 -0
  81. package/dist/model/template_spec.d.ts +16 -0
  82. package/dist/model/template_spec.d.ts.map +1 -0
  83. package/dist/mutator/block-pack/block_pack.d.ts +17 -0
  84. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
  85. package/dist/mutator/block-pack/frontend.d.ts +4 -0
  86. package/dist/mutator/block-pack/frontend.d.ts.map +1 -0
  87. package/dist/mutator/context_export.d.ts +9 -0
  88. package/dist/mutator/context_export.d.ts.map +1 -0
  89. package/dist/mutator/project.d.ts +121 -0
  90. package/dist/mutator/project.d.ts.map +1 -0
  91. package/dist/mutator/template/render_block.d.ts +32 -0
  92. package/dist/mutator/template/render_block.d.ts.map +1 -0
  93. package/dist/mutator/template/render_template.d.ts +12 -0
  94. package/dist/mutator/template/render_template.d.ts.map +1 -0
  95. package/dist/mutator/template/template_loading.d.ts +13 -0
  96. package/dist/mutator/template/template_loading.d.ts.map +1 -0
  97. package/dist/pool/data.d.ts +24 -0
  98. package/dist/pool/data.d.ts.map +1 -0
  99. package/dist/pool/driver.d.ts +22 -0
  100. package/dist/pool/driver.d.ts.map +1 -0
  101. package/dist/pool/index.d.ts +3 -0
  102. package/dist/pool/index.d.ts.map +1 -0
  103. package/dist/pool/p_object_collection.d.ts +29 -0
  104. package/dist/pool/p_object_collection.d.ts.map +1 -0
  105. package/dist/pool/ref_count_pool.d.ts +25 -0
  106. package/dist/pool/ref_count_pool.d.ts.map +1 -0
  107. package/dist/pool/result_pool.d.ts +25 -0
  108. package/dist/pool/result_pool.d.ts.map +1 -0
  109. package/dist/test/block_packs.d.ts +6 -0
  110. package/dist/test/block_packs.d.ts.map +1 -0
  111. package/dist/test/explicit_templates.d.ts +3 -0
  112. package/dist/test/explicit_templates.d.ts.map +1 -0
  113. package/dist/test/known_templates.d.ts +6 -0
  114. package/dist/test/known_templates.d.ts.map +1 -0
  115. package/package.json +55 -0
  116. package/src/block_registry/index.ts +3 -0
  117. package/src/block_registry/registry.test.ts +35 -0
  118. package/src/block_registry/registry.ts +180 -0
  119. package/src/block_registry/registry_spec.ts +13 -0
  120. package/src/block_registry/watcher.ts +72 -0
  121. package/src/block_registry/well_known_registries.ts +13 -0
  122. package/src/cfg_render/executor.test.ts +120 -0
  123. package/src/cfg_render/executor.ts +253 -0
  124. package/src/cfg_render/operation.ts +38 -0
  125. package/src/cfg_render/renderer.ts +540 -0
  126. package/src/cfg_render/traverse.ts +58 -0
  127. package/src/cfg_render/util.ts +29 -0
  128. package/src/dev/index.ts +89 -0
  129. package/src/dev/util.ts +13 -0
  130. package/src/index.ts +21 -0
  131. package/src/js_render/context.ts +768 -0
  132. package/src/js_render/index.ts +41 -0
  133. package/src/middle_layer/active_cfg.ts +56 -0
  134. package/src/middle_layer/block.ts +70 -0
  135. package/src/middle_layer/block_ctx.ts +90 -0
  136. package/src/middle_layer/block_ctx_unsafe.ts +29 -0
  137. package/src/middle_layer/driver_kit.ts +107 -0
  138. package/src/middle_layer/frontend_path.ts +83 -0
  139. package/src/middle_layer/index.ts +4 -0
  140. package/src/middle_layer/middle_layer.test.ts +720 -0
  141. package/src/middle_layer/middle_layer.ts +235 -0
  142. package/src/middle_layer/navigation_states.ts +48 -0
  143. package/src/middle_layer/ops.ts +147 -0
  144. package/src/middle_layer/project.ts +380 -0
  145. package/src/middle_layer/project_list.ts +59 -0
  146. package/src/middle_layer/project_overview.ts +220 -0
  147. package/src/middle_layer/render.test.ts +129 -0
  148. package/src/middle_layer/render.ts +19 -0
  149. package/src/middle_layer/types.ts +16 -0
  150. package/src/middle_layer/util.ts +22 -0
  151. package/src/model/args.ts +62 -0
  152. package/src/model/block_pack.ts +8 -0
  153. package/src/model/block_pack_spec.ts +52 -0
  154. package/src/model/frontend.ts +10 -0
  155. package/src/model/index.ts +2 -0
  156. package/src/model/project_model.test.ts +26 -0
  157. package/src/model/project_model.ts +142 -0
  158. package/src/model/project_model_util.test.ts +88 -0
  159. package/src/model/project_model_util.ts +169 -0
  160. package/src/model/template_spec.ts +18 -0
  161. package/src/mutator/block-pack/block_pack.test.ts +53 -0
  162. package/src/mutator/block-pack/block_pack.ts +187 -0
  163. package/src/mutator/block-pack/frontend.ts +29 -0
  164. package/src/mutator/context_export.ts +25 -0
  165. package/src/mutator/project.test.ts +272 -0
  166. package/src/mutator/project.ts +1112 -0
  167. package/src/mutator/template/render_block.ts +91 -0
  168. package/src/mutator/template/render_template.ts +40 -0
  169. package/src/mutator/template/template_loading.ts +77 -0
  170. package/src/mutator/template/template_render.test.ts +272 -0
  171. package/src/pool/data.ts +239 -0
  172. package/src/pool/driver.ts +325 -0
  173. package/src/pool/index.ts +2 -0
  174. package/src/pool/p_object_collection.ts +122 -0
  175. package/src/pool/ref_count_pool.ts +76 -0
  176. package/src/pool/result_pool.ts +284 -0
  177. package/src/test/block_packs.ts +23 -0
  178. package/src/test/explicit_templates.ts +8 -0
  179. 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,3 @@
1
+ export declare const ExplicitTemplateSumNumbers: Buffer;
2
+ export declare const ExplicitTemplateEnterNumbers: Buffer;
3
+ //# sourceMappingURL=explicit_templates.d.ts.map
@@ -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,3 @@
1
+ export * from './registry_spec';
2
+ export * from './registry';
3
+ export * from './well_known_registries';
@@ -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
+ });