@milaboratories/pl-middle-layer 1.45.4 → 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +58 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/js_render/computable_context.cjs +37 -7
- package/dist/js_render/computable_context.cjs.map +1 -1
- package/dist/js_render/computable_context.d.ts.map +1 -1
- package/dist/js_render/computable_context.js +37 -7
- package/dist/js_render/computable_context.js.map +1 -1
- package/dist/js_render/context.cjs +12 -4
- package/dist/js_render/context.cjs.map +1 -1
- package/dist/js_render/context.d.ts +9 -0
- package/dist/js_render/context.d.ts.map +1 -1
- package/dist/js_render/context.js +12 -4
- package/dist/js_render/context.js.map +1 -1
- package/dist/js_render/index.cjs +1 -1
- package/dist/js_render/index.cjs.map +1 -1
- package/dist/js_render/index.js +1 -1
- package/dist/js_render/index.js.map +1 -1
- package/dist/middle_layer/block.cjs +7 -8
- package/dist/middle_layer/block.cjs.map +1 -1
- package/dist/middle_layer/block.d.ts +4 -4
- package/dist/middle_layer/block.d.ts.map +1 -1
- package/dist/middle_layer/block.js +7 -8
- package/dist/middle_layer/block.js.map +1 -1
- package/dist/middle_layer/block_ctx.cjs +67 -13
- package/dist/middle_layer/block_ctx.cjs.map +1 -1
- package/dist/middle_layer/block_ctx.d.ts +4 -7
- package/dist/middle_layer/block_ctx.d.ts.map +1 -1
- package/dist/middle_layer/block_ctx.js +68 -14
- package/dist/middle_layer/block_ctx.js.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.cjs +10 -3
- package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.d.ts +1 -1
- package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.js +10 -3
- package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
- package/dist/middle_layer/frontend_path.cjs +1 -0
- package/dist/middle_layer/frontend_path.cjs.map +1 -1
- package/dist/middle_layer/frontend_path.js +1 -0
- package/dist/middle_layer/frontend_path.js.map +1 -1
- package/dist/middle_layer/middle_layer.cjs +1 -0
- package/dist/middle_layer/middle_layer.cjs.map +1 -1
- package/dist/middle_layer/middle_layer.d.ts +1 -1
- package/dist/middle_layer/middle_layer.d.ts.map +1 -1
- package/dist/middle_layer/middle_layer.js +1 -0
- package/dist/middle_layer/middle_layer.js.map +1 -1
- package/dist/middle_layer/project.cjs +75 -28
- package/dist/middle_layer/project.cjs.map +1 -1
- package/dist/middle_layer/project.d.ts +34 -7
- package/dist/middle_layer/project.d.ts.map +1 -1
- package/dist/middle_layer/project.js +76 -29
- package/dist/middle_layer/project.js.map +1 -1
- package/dist/middle_layer/project_overview.cjs +32 -11
- package/dist/middle_layer/project_overview.cjs.map +1 -1
- package/dist/middle_layer/project_overview.d.ts.map +1 -1
- package/dist/middle_layer/project_overview.js +32 -11
- package/dist/middle_layer/project_overview.js.map +1 -1
- package/dist/middle_layer/render.cjs +1 -1
- package/dist/middle_layer/render.cjs.map +1 -1
- package/dist/middle_layer/render.js +1 -1
- package/dist/middle_layer/render.js.map +1 -1
- package/dist/middle_layer/render.test.d.ts.map +1 -1
- package/dist/model/block_storage_helper.cjs +210 -0
- package/dist/model/block_storage_helper.cjs.map +1 -0
- package/dist/model/block_storage_helper.d.ts +98 -0
- package/dist/model/block_storage_helper.d.ts.map +1 -0
- package/dist/model/block_storage_helper.js +153 -0
- package/dist/model/block_storage_helper.js.map +1 -0
- package/dist/model/index.d.ts +2 -1
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/project_helper.cjs +177 -0
- package/dist/model/project_helper.cjs.map +1 -1
- package/dist/model/project_helper.d.ts +110 -1
- package/dist/model/project_helper.d.ts.map +1 -1
- package/dist/model/project_helper.js +178 -1
- package/dist/model/project_helper.js.map +1 -1
- package/dist/model/project_model.cjs +6 -3
- package/dist/model/project_model.cjs.map +1 -1
- package/dist/model/project_model.d.ts +3 -2
- package/dist/model/project_model.d.ts.map +1 -1
- package/dist/model/project_model.js +6 -4
- package/dist/model/project_model.js.map +1 -1
- package/dist/mutator/block-pack/block_pack.cjs +1 -2
- package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
- package/dist/mutator/block-pack/block_pack.js +1 -2
- package/dist/mutator/block-pack/block_pack.js.map +1 -1
- package/dist/mutator/block-pack/frontend.cjs +1 -0
- package/dist/mutator/block-pack/frontend.cjs.map +1 -1
- package/dist/mutator/block-pack/frontend.js +1 -0
- package/dist/mutator/block-pack/frontend.js.map +1 -1
- package/dist/mutator/migration.cjs +64 -3
- package/dist/mutator/migration.cjs.map +1 -1
- package/dist/mutator/migration.d.ts.map +1 -1
- package/dist/mutator/migration.js +66 -5
- package/dist/mutator/migration.js.map +1 -1
- package/dist/mutator/project-v3.test.d.ts +2 -0
- package/dist/mutator/project-v3.test.d.ts.map +1 -0
- package/dist/mutator/project.cjs +282 -41
- package/dist/mutator/project.cjs.map +1 -1
- package/dist/mutator/project.d.ts +77 -12
- package/dist/mutator/project.d.ts.map +1 -1
- package/dist/mutator/project.js +283 -42
- package/dist/mutator/project.js.map +1 -1
- package/dist/pool/result_pool.cjs +9 -6
- package/dist/pool/result_pool.cjs.map +1 -1
- package/dist/pool/result_pool.d.ts.map +1 -1
- package/dist/pool/result_pool.js +9 -6
- package/dist/pool/result_pool.js.map +1 -1
- package/package.json +16 -16
- package/src/js_render/computable_context.ts +37 -7
- package/src/js_render/context.ts +12 -5
- package/src/js_render/index.ts +1 -1
- package/src/middle_layer/block.ts +13 -14
- package/src/middle_layer/block_ctx.ts +70 -23
- package/src/middle_layer/block_ctx_unsafe.ts +11 -4
- package/src/middle_layer/middle_layer.ts +2 -1
- package/src/middle_layer/project.ts +86 -40
- package/src/middle_layer/project_overview.ts +44 -20
- package/src/middle_layer/render.test.ts +1 -1
- package/src/middle_layer/render.ts +1 -1
- package/src/model/block_storage_helper.ts +213 -0
- package/src/model/index.ts +2 -1
- package/src/model/project_helper.ts +249 -1
- package/src/model/project_model.ts +9 -5
- package/src/mutator/block-pack/block_pack.ts +1 -2
- package/src/mutator/migration.ts +79 -6
- package/src/mutator/project-v3.test.ts +280 -0
- package/src/mutator/project.test.ts +27 -27
- package/src/mutator/project.ts +351 -68
- package/src/pool/result_pool.ts +11 -4
|
@@ -15,7 +15,8 @@ const InitialBlockMeta = {
|
|
|
15
15
|
//
|
|
16
16
|
const ProjectResourceType = { name: 'UserProject', version: '2' };
|
|
17
17
|
const SchemaVersionKey = 'SchemaVersion';
|
|
18
|
-
const
|
|
18
|
+
const SchemaVersionV2 = '2';
|
|
19
|
+
const SchemaVersionCurrent = '3';
|
|
19
20
|
const ProjectCreatedTimestamp = 'ProjectCreated';
|
|
20
21
|
const ProjectLastModifiedTimestamp = 'ProjectLastModified';
|
|
21
22
|
const ProjectMetaKey = 'ProjectMeta';
|
|
@@ -33,9 +34,10 @@ function getServiceTemplateField(hash) {
|
|
|
33
34
|
const FieldsToDuplicate = new Set([
|
|
34
35
|
'blockPack',
|
|
35
36
|
'blockSettings',
|
|
36
|
-
'
|
|
37
|
+
'blockStorage',
|
|
37
38
|
'prodArgs',
|
|
38
39
|
'currentArgs',
|
|
40
|
+
'currentPrerunArgs',
|
|
39
41
|
'prodCtx',
|
|
40
42
|
'prodUiCtx',
|
|
41
43
|
'prodOutput',
|
|
@@ -43,7 +45,7 @@ const FieldsToDuplicate = new Set([
|
|
|
43
45
|
function projectFieldName(blockId, fieldName) {
|
|
44
46
|
return `${blockId}-${fieldName}`;
|
|
45
47
|
}
|
|
46
|
-
const projectFieldPattern = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|
|
|
48
|
+
const projectFieldPattern = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|blockStorage|inputsValid|prodArgs|currentArgs|currentPrerunArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;
|
|
47
49
|
function parseProjectField(name) {
|
|
48
50
|
const match = name.match(projectFieldPattern);
|
|
49
51
|
if (match === null)
|
|
@@ -66,6 +68,7 @@ exports.ProjectStructureAuthorKey = ProjectStructureAuthorKey;
|
|
|
66
68
|
exports.ProjectStructureKey = ProjectStructureKey;
|
|
67
69
|
exports.SchemaVersionCurrent = SchemaVersionCurrent;
|
|
68
70
|
exports.SchemaVersionKey = SchemaVersionKey;
|
|
71
|
+
exports.SchemaVersionV2 = SchemaVersionV2;
|
|
69
72
|
exports.ServiceTemplateCacheFieldPrefix = ServiceTemplateCacheFieldPrefix;
|
|
70
73
|
exports.blockArgsAuthorKey = blockArgsAuthorKey;
|
|
71
74
|
exports.getServiceTemplateField = getServiceTemplateField;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project_model.cjs","sources":["../../src/model/project_model.ts"],"sourcesContent":["import type { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project',\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const
|
|
1
|
+
{"version":3,"file":"project_model.cjs","sources":["../../src/model/project_model.ts"],"sourcesContent":["import type { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project',\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const SchemaVersionV2 = '2';\nexport const SchemaVersionCurrent = '3';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockArgsAuthorKeyPrefix = 'BlockArgsAuthor/';\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = 'ProjectStructureAuthor';\n\nexport const ServiceTemplateCacheFieldPrefix = '__serviceTemplate_';\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | 'blockPack'\n | 'blockSettings'\n | 'blockStorage' // Persistent storage for v3 blocks (state, plugins data, etc.)\n | 'prodArgs'\n | 'currentArgs'\n | 'currentPrerunArgs' // Derived args for staging/prerun rendering (from prerunArgs() or args())\n | 'prodCtx'\n | 'prodUiCtx'\n | 'prodOutput'\n | 'prodCtxPrevious'\n | 'prodUiCtxPrevious'\n | 'prodOutputPrevious'\n | 'stagingCtx'\n | 'stagingUiCtx'\n | 'stagingOutput'\n | 'stagingCtxPrevious'\n | 'stagingUiCtxPrevious'\n | 'stagingOutputPrevious'\n ;\n}\n\nexport const FieldsToDuplicate: Set<ProjectField['fieldName']> = new Set([\n 'blockPack',\n 'blockSettings',\n 'blockStorage',\n 'prodArgs',\n 'currentArgs',\n 'currentPrerunArgs',\n 'prodCtx',\n 'prodUiCtx',\n 'prodOutput',\n]);\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern\n = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|blockStorage|inputsValid|prodArgs|currentArgs|currentPrerunArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n"],"names":[],"mappings":";;AA6CO,MAAM,qBAAqB,GAAqB;AACrD,IAAA,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;AAapD,MAAM,4BAA4B,GAA0B;AACjE,IAAA,uBAAuB,EAAE,CAAC;AAC1B,IAAA,aAAa,EAAE,EAAE;;AAGZ,MAAM,gBAAgB,GAAgB;AAC3C,IAAA,KAAK,EAAE,aAAa;;AAGtB;AACA;AACA;AAEO,MAAM,mBAAmB,GAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG;AAE7E,MAAM,gBAAgB,GAAG;AACzB,MAAM,eAAe,GAAG;AACxB,MAAM,oBAAoB,GAAG;AAE7B,MAAM,uBAAuB,GAAG;AAChC,MAAM,4BAA4B,GAAG;AACrC,MAAM,cAAc,GAAG;AACvB,MAAM,mBAAmB,GAAG;AAC5B,MAAM,sBAAsB,GAAG;AAE/B,MAAM,wBAAwB,GAAG;AAGlC,SAAU,kBAAkB,CAAC,OAAe,EAAA;AAChD,IAAA,OAAO,CAAA,EAAG,wBAAwB,CAAA,EAAG,OAAO,EAAE;AAChD;AAEO,MAAM,yBAAyB,GAAG;AAElC,MAAM,+BAA+B,GAAG;AAEzC,SAAU,uBAAuB,CAAC,IAAY,EAAA;AAClD,IAAA,OAAO,CAAA,EAAG,+BAA+B,CAAA,EAAG,IAAI,EAAE;AACpD;AA0BO,MAAM,iBAAiB,GAAmC,IAAI,GAAG,CAAC;IACvE,WAAW;IACX,eAAe;IACf,cAAc;IACd,UAAU;IACV,aAAa;IACb,mBAAmB;IACnB,SAAS;IACT,WAAW;IACX,YAAY;AACb,CAAA;AAEK,SAAU,gBAAgB,CAAC,OAAe,EAAE,SAAoC,EAAA;AACpF,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,EAAE;AAClC;AAEA,MAAM,mBAAmB,GACrB,8SAA8S;AAE5S,SAAU,iBAAiB,CAAC,IAAY,EAAA;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC7C,IAAI,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,SAAS;IACpC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,MAAO;AAC5C,IAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAkB;AAC/C;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -44,7 +44,8 @@ export declare const InitialProjectRenderingState: ProjectRenderingState;
|
|
|
44
44
|
export declare const InitialBlockMeta: ProjectMeta;
|
|
45
45
|
export declare const ProjectResourceType: ResourceType;
|
|
46
46
|
export declare const SchemaVersionKey = "SchemaVersion";
|
|
47
|
-
export declare const
|
|
47
|
+
export declare const SchemaVersionV2 = "2";
|
|
48
|
+
export declare const SchemaVersionCurrent = "3";
|
|
48
49
|
export declare const ProjectCreatedTimestamp = "ProjectCreated";
|
|
49
50
|
export declare const ProjectLastModifiedTimestamp = "ProjectLastModified";
|
|
50
51
|
export declare const ProjectMetaKey = "ProjectMeta";
|
|
@@ -58,7 +59,7 @@ export declare const ServiceTemplateCacheFieldPrefix = "__serviceTemplate_";
|
|
|
58
59
|
export declare function getServiceTemplateField(hash: string): string;
|
|
59
60
|
export interface ProjectField {
|
|
60
61
|
blockId: string;
|
|
61
|
-
fieldName: 'blockPack' | 'blockSettings' | '
|
|
62
|
+
fieldName: 'blockPack' | 'blockSettings' | 'blockStorage' | 'prodArgs' | 'currentArgs' | 'currentPrerunArgs' | 'prodCtx' | 'prodUiCtx' | 'prodOutput' | 'prodCtxPrevious' | 'prodUiCtxPrevious' | 'prodOutputPrevious' | 'stagingCtx' | 'stagingUiCtx' | 'stagingOutput' | 'stagingCtxPrevious' | 'stagingUiCtxPrevious' | 'stagingOutputPrevious';
|
|
62
63
|
}
|
|
63
64
|
export declare const FieldsToDuplicate: Set<ProjectField['fieldName']>;
|
|
64
65
|
export declare function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project_model.d.ts","sourceRoot":"","sources":["../../src/model/project_model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EACV,gBAAgB,IAAI,yBAAyB,EAC7C,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,yBAAyB;IACjE,2BAA2B;IAC3B,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;SAGK;IACL,KAAK,EAAE,MAAM,CAAC;IAEd,sCAAsC;IACtC,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,qBAAqB,EAAE,gBAEnC,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,uBAAuB,EAAE,MAAM,CAAC;IAEhC;yEACqE;IACrE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,4BAA4B,EAAE,qBAG1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,YAAoD,CAAC;AAEvF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AACxD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAE7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAElE,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EACL,WAAW,GACX,eAAe,GACf,
|
|
1
|
+
{"version":3,"file":"project_model.d.ts","sourceRoot":"","sources":["../../src/model/project_model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EACV,gBAAgB,IAAI,yBAAyB,EAC7C,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,yBAAyB;IACjE,2BAA2B;IAC3B,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;SAGK;IACL,KAAK,EAAE,MAAM,CAAC;IAEd,sCAAsC;IACtC,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,qBAAqB,EAAE,gBAEnC,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,uBAAuB,EAAE,MAAM,CAAC;IAEhC;yEACqE;IACrE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,4BAA4B,EAAE,qBAG1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,YAAoD,CAAC;AAEvF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAChD,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AACxD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAE7E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAElE,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EACL,WAAW,GACX,eAAe,GACf,cAAc,GACd,UAAU,GACV,aAAa,GACb,mBAAmB,GACnB,SAAS,GACT,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,CAC1B;CACF;AAED,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,CAU3D,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,MAAM,CAE9F;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAKxE"}
|
|
@@ -13,7 +13,8 @@ const InitialBlockMeta = {
|
|
|
13
13
|
//
|
|
14
14
|
const ProjectResourceType = { name: 'UserProject', version: '2' };
|
|
15
15
|
const SchemaVersionKey = 'SchemaVersion';
|
|
16
|
-
const
|
|
16
|
+
const SchemaVersionV2 = '2';
|
|
17
|
+
const SchemaVersionCurrent = '3';
|
|
17
18
|
const ProjectCreatedTimestamp = 'ProjectCreated';
|
|
18
19
|
const ProjectLastModifiedTimestamp = 'ProjectLastModified';
|
|
19
20
|
const ProjectMetaKey = 'ProjectMeta';
|
|
@@ -31,9 +32,10 @@ function getServiceTemplateField(hash) {
|
|
|
31
32
|
const FieldsToDuplicate = new Set([
|
|
32
33
|
'blockPack',
|
|
33
34
|
'blockSettings',
|
|
34
|
-
'
|
|
35
|
+
'blockStorage',
|
|
35
36
|
'prodArgs',
|
|
36
37
|
'currentArgs',
|
|
38
|
+
'currentPrerunArgs',
|
|
37
39
|
'prodCtx',
|
|
38
40
|
'prodUiCtx',
|
|
39
41
|
'prodOutput',
|
|
@@ -41,7 +43,7 @@ const FieldsToDuplicate = new Set([
|
|
|
41
43
|
function projectFieldName(blockId, fieldName) {
|
|
42
44
|
return `${blockId}-${fieldName}`;
|
|
43
45
|
}
|
|
44
|
-
const projectFieldPattern = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|
|
|
46
|
+
const projectFieldPattern = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|blockStorage|inputsValid|prodArgs|currentArgs|currentPrerunArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;
|
|
45
47
|
function parseProjectField(name) {
|
|
46
48
|
const match = name.match(projectFieldPattern);
|
|
47
49
|
if (match === null)
|
|
@@ -50,5 +52,5 @@ function parseProjectField(name) {
|
|
|
50
52
|
return { blockId, fieldName };
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
export { BlockArgsAuthorKeyPrefix, BlockRenderingStateKey, FieldsToDuplicate, InitialBlockMeta, InitialBlockStructure, InitialProjectRenderingState, ProjectCreatedTimestamp, ProjectLastModifiedTimestamp, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey, ServiceTemplateCacheFieldPrefix, blockArgsAuthorKey, getServiceTemplateField, parseProjectField, projectFieldName };
|
|
55
|
+
export { BlockArgsAuthorKeyPrefix, BlockRenderingStateKey, FieldsToDuplicate, InitialBlockMeta, InitialBlockStructure, InitialProjectRenderingState, ProjectCreatedTimestamp, ProjectLastModifiedTimestamp, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey, SchemaVersionV2, ServiceTemplateCacheFieldPrefix, blockArgsAuthorKey, getServiceTemplateField, parseProjectField, projectFieldName };
|
|
54
56
|
//# sourceMappingURL=project_model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project_model.js","sources":["../../src/model/project_model.ts"],"sourcesContent":["import type { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project',\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const
|
|
1
|
+
{"version":3,"file":"project_model.js","sources":["../../src/model/project_model.ts"],"sourcesContent":["import type { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport type {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta,\n} from '@milaboratories/pl-model-middle-layer';\nimport type { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }],\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: [],\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project',\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const SchemaVersionV2 = '2';\nexport const SchemaVersionCurrent = '3';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockArgsAuthorKeyPrefix = 'BlockArgsAuthor/';\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = 'ProjectStructureAuthor';\n\nexport const ServiceTemplateCacheFieldPrefix = '__serviceTemplate_';\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | 'blockPack'\n | 'blockSettings'\n | 'blockStorage' // Persistent storage for v3 blocks (state, plugins data, etc.)\n | 'prodArgs'\n | 'currentArgs'\n | 'currentPrerunArgs' // Derived args for staging/prerun rendering (from prerunArgs() or args())\n | 'prodCtx'\n | 'prodUiCtx'\n | 'prodOutput'\n | 'prodCtxPrevious'\n | 'prodUiCtxPrevious'\n | 'prodOutputPrevious'\n | 'stagingCtx'\n | 'stagingUiCtx'\n | 'stagingOutput'\n | 'stagingCtxPrevious'\n | 'stagingUiCtxPrevious'\n | 'stagingOutputPrevious'\n ;\n}\n\nexport const FieldsToDuplicate: Set<ProjectField['fieldName']> = new Set([\n 'blockPack',\n 'blockSettings',\n 'blockStorage',\n 'prodArgs',\n 'currentArgs',\n 'currentPrerunArgs',\n 'prodCtx',\n 'prodUiCtx',\n 'prodOutput',\n]);\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern\n = /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|blockStorage|inputsValid|prodArgs|currentArgs|currentPrerunArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n"],"names":[],"mappings":"AA6CO,MAAM,qBAAqB,GAAqB;AACrD,IAAA,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;AAapD,MAAM,4BAA4B,GAA0B;AACjE,IAAA,uBAAuB,EAAE,CAAC;AAC1B,IAAA,aAAa,EAAE,EAAE;;AAGZ,MAAM,gBAAgB,GAAgB;AAC3C,IAAA,KAAK,EAAE,aAAa;;AAGtB;AACA;AACA;AAEO,MAAM,mBAAmB,GAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG;AAE7E,MAAM,gBAAgB,GAAG;AACzB,MAAM,eAAe,GAAG;AACxB,MAAM,oBAAoB,GAAG;AAE7B,MAAM,uBAAuB,GAAG;AAChC,MAAM,4BAA4B,GAAG;AACrC,MAAM,cAAc,GAAG;AACvB,MAAM,mBAAmB,GAAG;AAC5B,MAAM,sBAAsB,GAAG;AAE/B,MAAM,wBAAwB,GAAG;AAGlC,SAAU,kBAAkB,CAAC,OAAe,EAAA;AAChD,IAAA,OAAO,CAAA,EAAG,wBAAwB,CAAA,EAAG,OAAO,EAAE;AAChD;AAEO,MAAM,yBAAyB,GAAG;AAElC,MAAM,+BAA+B,GAAG;AAEzC,SAAU,uBAAuB,CAAC,IAAY,EAAA;AAClD,IAAA,OAAO,CAAA,EAAG,+BAA+B,CAAA,EAAG,IAAI,EAAE;AACpD;AA0BO,MAAM,iBAAiB,GAAmC,IAAI,GAAG,CAAC;IACvE,WAAW;IACX,eAAe;IACf,cAAc;IACd,UAAU;IACV,aAAa;IACb,mBAAmB;IACnB,SAAS;IACT,WAAW;IACX,YAAY;AACb,CAAA;AAEK,SAAU,gBAAgB,CAAC,OAAe,EAAE,SAAoC,EAAA;AACpF,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,EAAE;AAClC;AAEA,MAAM,mBAAmB,GACrB,8SAA8S;AAE5S,SAAU,iBAAiB,CAAC,IAAY,EAAA;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC7C,IAAI,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,SAAS;IACpC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,MAAO;AAC5C,IAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAkB;AAC/C;;;;"}
|
|
@@ -31,7 +31,7 @@ function parseStringConfig(configContent) {
|
|
|
31
31
|
throw new Error('Invalid config content');
|
|
32
32
|
}
|
|
33
33
|
if (!model.Code.safeParse(res.data.code).success) {
|
|
34
|
-
throw new Error('No code bundle');
|
|
34
|
+
throw new Error('parseStringConfig:No code bundle');
|
|
35
35
|
}
|
|
36
36
|
return res.data;
|
|
37
37
|
}
|
|
@@ -64,7 +64,6 @@ class BlockPackPreparer {
|
|
|
64
64
|
return spec.config;
|
|
65
65
|
case 'dev-v1': {
|
|
66
66
|
const devPaths = await index.resolveDevPacket(spec.folder);
|
|
67
|
-
console.log('devPaths', devPaths);
|
|
68
67
|
const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });
|
|
69
68
|
return JSON.parse(configContent);
|
|
70
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_pack.cjs","sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport { createFrontend } from './frontend';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport { Code } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport type { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport type { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\nimport { LRUCache } from 'lru-cache';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { WorkerManager } from '../../worker/WorkerManager';\nimport { z } from 'zod';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error('Invalid config content');\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error('No code bundle');\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString('utf8'));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'prepared':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n console.log('devPaths', devPaths);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent);\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n });\n return parseStringConfig(configContent);\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString('utf8'));\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === 'prepared') {\n return spec;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n return {\n ...explicit,\n type: 'prepared',\n template: {\n type: 'prepared',\n data: await workerManager.process('parseTemplate', explicit.template.content),\n },\n };\n }\n\n private async prepareWithoutUnpacking(spec: BlockPackExplicit | BlockPackSpec): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8'),\n );\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(Buffer.from(configResponse).toString('utf8')) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'prepared':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"names":["z","Code","LRUCache","request","resolveDevPacket","loadPackDescription","RegistryV1","assertNever","__addDisposableResource","WorkerManager","getDevV2PacketMtime","field","loadTemplate","createFrontend"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"block_pack.cjs","sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport { createFrontend } from './frontend';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport { Code } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport type { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport type { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\nimport { LRUCache } from 'lru-cache';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { WorkerManager } from '../../worker/WorkerManager';\nimport { z } from 'zod';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error('Invalid config content');\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error('parseStringConfig:No code bundle');\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString('utf8'));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'prepared':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent);\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n });\n return parseStringConfig(configContent);\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString('utf8'));\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === 'prepared') {\n return spec;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n return {\n ...explicit,\n type: 'prepared',\n template: {\n type: 'prepared',\n data: await workerManager.process('parseTemplate', explicit.template.content),\n },\n };\n }\n\n private async prepareWithoutUnpacking(spec: BlockPackExplicit | BlockPackSpec): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8'),\n );\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(Buffer.from(configResponse).toString('utf8')) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'prepared':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"names":["z","Code","LRUCache","request","resolveDevPacket","loadPackDescription","RegistryV1","assertNever","__addDisposableResource","WorkerManager","getDevV2PacketMtime","field","loadTemplate","createFrontend"],"mappings":";;;;;;;;;;;;;;;;;AAsBO,MAAM,mBAAmB,GAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG;AACjF,MAAM,sBAAsB,GAAG;AAC/B,MAAM,sBAAsB,GAAG;AAEtC;AACA,SAAS,MAAM,CAAC,GAAW,EAAA;AACzB,IAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,GAAG;;QAC5B,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG;AACvB;AAEA,SAAS,iBAAiB,CAAC,aAAqB,EAAA;IAC9C,MAAM,GAAG,GAAGA,KAAC,CAAC,MAAM,CAACA,KAAC,CAAC,MAAM,EAAE,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAElF,IAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;IAC3C;AAEA,IAAA,IAAI,CAACC,UAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;AAC1C,QAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;IACrD;IAEA,OAAO,GAAG,CAAC,IAA4B;AACzC;AAEA,SAAS,iBAAiB,CAAC,MAAmB,EAAA;AAC5C,IAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChE;MAEa,iBAAiB,CAAA;AAET,IAAA,kBAAA;AACA,IAAA,MAAA;AACA,IAAA,IAAA;AAHnB,IAAA,WAAA,CACmB,kBAAsC,EACtC,MAAc,EACd,IAAiB,EAAA;QAFjB,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;QAClB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,IAAI,GAAJ,IAAI;IACpB;IAEc,kBAAkB,GAAG,IAAIC,iBAAQ,CAAsB;AACtE,QAAA,GAAG,EAAE,GAAG;AACR,QAAA,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;AAC1B,QAAA,WAAW,EAAE,OAAO,GAAG,KAAI;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;AAC5E,YAAA,OAAO,MAAM,CAAC,MAAMC,cAAO,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE;QACnE,CAAC;QACD,eAAe,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU;AAC7C,KAAA,CAAC;IAEK,MAAM,uBAAuB,CAAC,IAAsB,EAAA;AACzD,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,MAAM;AAEpB,YAAA,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,MAAM;YAEpB,KAAK,QAAQ,EAAE;gBACb,MAAM,QAAQ,GAAG,MAAMC,sBAAgB,CAAC,IAAI,CAAC,MAAa,CAAC;AAC3D,gBAAA,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACxF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YAClC;YAEA,KAAK,QAAQ,EAAE;gBACb,MAAM,WAAW,GAAG,MAAMC,8BAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1D,gBAAA,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;AAClF,oBAAA,QAAQ,EAAE,OAAO;AAClB,iBAAA,CAAC;AACF,gBAAA,OAAO,iBAAiB,CAAC,aAAa,CAAC;YACzC;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,EAAGC,qBAAU,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAE1K,gBAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA,EAAG,SAAS,CAAA,YAAA,CAAc,CAAC;AAC3F,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjE;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AACxD,gBAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;AACrF,gBAAA,OAAO,iBAAiB,CAAC,cAAc,CAAC;YAC1C;AAEA,YAAA;AACE,gBAAA,OAAOC,qBAAW,CAAC,IAAI,CAAC;;IAE9B;IAEO,MAAM,OAAO,CAAC,IAAsB,EAAA;;;AACzC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;AAC5B,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAEzD,YAAA,MAAY,aAAa,GAAAC,iCAAA,CAAA,KAAA,EAAG,IAAIC,2BAAa,EAAE,OAAA;YAE/C,OAAO;AACL,gBAAA,GAAG,QAAQ;AACX,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE;AACR,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,IAAI,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9E,iBAAA;aACF;;;;;;;;;;;AACF,IAAA;IAEO,MAAM,uBAAuB,CAAC,IAAuC,EAAA;AAC3E,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,IAAI;YAEb,KAAK,QAAQ,EAAE;gBACb,MAAM,QAAQ,GAAG,MAAML,sBAAgB,CAAC,IAAI,CAAC,MAAa,CAAC;;AAG3D,gBAAA,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;;gBAGrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CACrD;;AAGD,gBAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE;gBAEhC,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;oBACD,MAAM;AACN,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1C,qBAAA;AACD,oBAAA,MAAM,EAAE,IAAI;iBACb;YACH;YAEA,KAAK,QAAQ,EAAE;gBACb,MAAM,WAAW,GAAG,MAAMC,8BAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1D,gBAAA,MAAM,MAAM,GAAG,iBAAiB,CAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;AAC5D,oBAAA,QAAQ,EAAE,OAAO;AAClB,iBAAA,CAAC,CACH;AACD,gBAAA,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAChD,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAC1C;gBACD,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM;AACrD,gBAAA,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE;AAC1B,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;;oBAE1B,MAAM,CAAC,KAAK,GAAG,MAAMK,4BAAmB,CAAC,WAAW,CAAC;gBACvD,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;oBACD,MAAM;AACN,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1C,qBAAA;oBACD,MAAM;iBACP;YACH;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,EAAGJ,qBAAU,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAE1K,gBAAA,MAAM,WAAW,GAAG,CAAA,EAAG,SAAS,kBAAkB;;gBAElD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC9E,gBAAA,MAAM,eAAe,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC;;AAGxD,gBAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA,EAAG,SAAS,CAAA,YAAA,CAAc,CAAC;AAC3F,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAyB;gBAE/F,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;oBACD,MAAM;AACN,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,KAAK;wBACX,GAAG,EAAE,CAAA,EAAG,SAAS,CAAA,aAAA,CAAe;AACjC,qBAAA;AACD,oBAAA,MAAM,EAAE,IAAI;iBACb;YACH;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,YACf,iBAAiB,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnF,MAAM,WAAW,GAAG,YAClB,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AAExE,gBAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAExE,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC/B,qBAAA;AACD,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG;AACvB,qBAAA;AACD,oBAAA,MAAM,EAAE,IAAI;iBACb;YACH;AAEA,YAAA;AACE,gBAAA,OAAOC,qBAAW,CAAC,IAAI,CAAC;;IAE9B;AACD;AAED,SAAS,qBAAqB,CAAC,EAAiB,EAAE,IAA2B,EAAA;AAC3E,IAAA,MAAM,aAAa,GAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACjF,IAAA,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9E,EAAE,CAAC,WAAW,CAACI,cAAK,CAAC,EAAE,EAAE,sBAAsB,CAAC,EAAE,OAAO,EAAEC,6BAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3F,EAAE,CAAC,WAAW,CAACD,cAAK,CAAC,EAAE,EAAE,sBAAsB,CAAC,EAAE,OAAO,EAAEE,uBAAc,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7F,IAAA,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AAEX,IAAA,OAAO,EAAE;AACX;AAEM,SAAU,eAAe,CAAC,EAAiB,EAAE,IAA2B,EAAA;AAC5E,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC;AACxC,QAAA;AACE,YAAA,OAAON,qBAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEnC;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_pack.d.ts","sourceRoot":"","sources":["../../../src/mutator/block-pack/block_pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7F,OAAO,KAAK,EAAqB,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAMjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAMpF,eAAO,MAAM,mBAAmB,EAAE,YAAwD,CAAC;AAC3F,eAAO,MAAM,sBAAsB,aAAa,CAAC;AACjD,eAAO,MAAM,sBAAsB,aAAa,CAAC;AA0BjD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAFL,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,YAAA;IAGpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAQhC;IAEU,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"block_pack.d.ts","sourceRoot":"","sources":["../../../src/mutator/block-pack/block_pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7F,OAAO,KAAK,EAAqB,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAMjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAMpF,eAAO,MAAM,mBAAmB,EAAE,YAAwD,CAAC;AAC3F,eAAO,MAAM,sBAAsB,aAAa,CAAC;AACjD,eAAO,MAAM,sBAAsB,aAAa,CAAC;AA0BjD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAFL,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,YAAA;IAGpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAQhC;IAEU,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyC9E,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAmB9D,uBAAuB;CA0HtC;AAYD,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,GAAG,cAAc,CAO9F"}
|
|
@@ -29,7 +29,7 @@ function parseStringConfig(configContent) {
|
|
|
29
29
|
throw new Error('Invalid config content');
|
|
30
30
|
}
|
|
31
31
|
if (!Code.safeParse(res.data.code).success) {
|
|
32
|
-
throw new Error('No code bundle');
|
|
32
|
+
throw new Error('parseStringConfig:No code bundle');
|
|
33
33
|
}
|
|
34
34
|
return res.data;
|
|
35
35
|
}
|
|
@@ -62,7 +62,6 @@ class BlockPackPreparer {
|
|
|
62
62
|
return spec.config;
|
|
63
63
|
case 'dev-v1': {
|
|
64
64
|
const devPaths = await resolveDevPacket(spec.folder);
|
|
65
|
-
console.log('devPaths', devPaths);
|
|
66
65
|
const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });
|
|
67
66
|
return JSON.parse(configContent);
|
|
68
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_pack.js","sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport { createFrontend } from './frontend';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport { Code } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport type { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport type { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\nimport { LRUCache } from 'lru-cache';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { WorkerManager } from '../../worker/WorkerManager';\nimport { z } from 'zod';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error('Invalid config content');\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error('No code bundle');\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString('utf8'));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'prepared':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n console.log('devPaths', devPaths);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent);\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n });\n return parseStringConfig(configContent);\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString('utf8'));\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === 'prepared') {\n return spec;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n return {\n ...explicit,\n type: 'prepared',\n template: {\n type: 'prepared',\n data: await workerManager.process('parseTemplate', explicit.template.content),\n },\n };\n }\n\n private async prepareWithoutUnpacking(spec: BlockPackExplicit | BlockPackSpec): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8'),\n );\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(Buffer.from(configResponse).toString('utf8')) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'prepared':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"block_pack.js","sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport type { Signer } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport { createFrontend } from './frontend';\nimport type { BlockConfigContainer } from '@platforma-sdk/model';\nimport { Code } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport type { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport type { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\nimport { LRUCache } from 'lru-cache';\nimport type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\nimport { WorkerManager } from '../../worker/WorkerManager';\nimport { z } from 'zod';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error('Invalid config content');\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error('parseStringConfig:No code bundle');\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString('utf8'));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'prepared':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent);\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n });\n return parseStringConfig(configContent);\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString('utf8'));\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === 'prepared') {\n return spec;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n return {\n ...explicit,\n type: 'prepared',\n template: {\n type: 'prepared',\n data: await workerManager.process('parseTemplate', explicit.template.content),\n },\n };\n }\n\n private async prepareWithoutUnpacking(spec: BlockPackExplicit | BlockPackSpec): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8'),\n );\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8',\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent,\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case 'from-registry-v1': {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(Buffer.from(configResponse).toString('utf8')) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent,\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case 'from-registry-v2': {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'prepared':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAsBO,MAAM,mBAAmB,GAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG;AACjF,MAAM,sBAAsB,GAAG;AAC/B,MAAM,sBAAsB,GAAG;AAEtC;AACA,SAAS,MAAM,CAAC,GAAW,EAAA;AACzB,IAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,GAAG;;QAC5B,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG;AACvB;AAEA,SAAS,iBAAiB,CAAC,aAAqB,EAAA;IAC9C,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAElF,IAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;IAC3C;AAEA,IAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;AAC1C,QAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;IACrD;IAEA,OAAO,GAAG,CAAC,IAA4B;AACzC;AAEA,SAAS,iBAAiB,CAAC,MAAmB,EAAA;AAC5C,IAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChE;MAEa,iBAAiB,CAAA;AAET,IAAA,kBAAA;AACA,IAAA,MAAA;AACA,IAAA,IAAA;AAHnB,IAAA,WAAA,CACmB,kBAAsC,EACtC,MAAc,EACd,IAAiB,EAAA;QAFjB,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;QAClB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,IAAI,GAAJ,IAAI;IACpB;IAEc,kBAAkB,GAAG,IAAI,QAAQ,CAAsB;AACtE,QAAA,GAAG,EAAE,GAAG;AACR,QAAA,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;AAC1B,QAAA,WAAW,EAAE,OAAO,GAAG,KAAI;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;AAC5E,YAAA,OAAO,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE;QACnE,CAAC;QACD,eAAe,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU;AAC7C,KAAA,CAAC;IAEK,MAAM,uBAAuB,CAAC,IAAsB,EAAA;AACzD,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,MAAM;AAEpB,YAAA,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,MAAM;YAEpB,KAAK,QAAQ,EAAE;gBACb,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAa,CAAC;AAC3D,gBAAA,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACxF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YAClC;YAEA,KAAK,QAAQ,EAAE;gBACb,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1D,gBAAA,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;AAClF,oBAAA,QAAQ,EAAE,OAAO;AAClB,iBAAA,CAAC;AACF,gBAAA,OAAO,iBAAiB,CAAC,aAAa,CAAC;YACzC;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,EAAG,UAAU,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAE1K,gBAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA,EAAG,SAAS,CAAA,YAAA,CAAc,CAAC;AAC3F,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjE;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AACxD,gBAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;AACrF,gBAAA,OAAO,iBAAiB,CAAC,cAAc,CAAC;YAC1C;AAEA,YAAA;AACE,gBAAA,OAAO,WAAW,CAAC,IAAI,CAAC;;IAE9B;IAEO,MAAM,OAAO,CAAC,IAAsB,EAAA;;;AACzC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;AAC5B,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAEzD,YAAA,MAAY,aAAa,GAAA,uBAAA,CAAA,KAAA,EAAG,IAAI,aAAa,EAAE,OAAA;YAE/C,OAAO;AACL,gBAAA,GAAG,QAAQ;AACX,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE;AACR,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,IAAI,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9E,iBAAA;aACF;;;;;;;;;;;AACF,IAAA;IAEO,MAAM,uBAAuB,CAAC,IAAuC,EAAA;AAC3E,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,IAAI;YAEb,KAAK,QAAQ,EAAE;gBACb,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAa,CAAC;;AAG3D,gBAAA,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;;gBAGrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CACrD;;AAGD,gBAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE;gBAEhC,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;oBACD,MAAM;AACN,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1C,qBAAA;AACD,oBAAA,MAAM,EAAE,IAAI;iBACb;YACH;YAEA,KAAK,QAAQ,EAAE;gBACb,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1D,gBAAA,MAAM,MAAM,GAAG,iBAAiB,CAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;AAC5D,oBAAA,QAAQ,EAAE,OAAO;AAClB,iBAAA,CAAC,CACH;AACD,gBAAA,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAChD,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAC1C;gBACD,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM;AACrD,gBAAA,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE;AAC1B,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;;oBAE1B,MAAM,CAAC,KAAK,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC;gBACvD,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;oBACD,MAAM;AACN,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1C,qBAAA;oBACD,MAAM;iBACP;YACH;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,EAAG,UAAU,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAE1K,gBAAA,MAAM,WAAW,GAAG,CAAA,EAAG,SAAS,kBAAkB;;gBAElD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC9E,gBAAA,MAAM,eAAe,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC;;AAGxD,gBAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA,EAAG,SAAS,CAAA,YAAA,CAAc,CAAC;AAC3F,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAyB;gBAE/F,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,eAAe;AACzB,qBAAA;oBACD,MAAM;AACN,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,KAAK;wBACX,GAAG,EAAE,CAAA,EAAG,SAAS,CAAA,aAAA,CAAe;AACjC,qBAAA;AACD,oBAAA,MAAM,EAAE,IAAI;iBACb;YACH;YAEA,KAAK,kBAAkB,EAAE;AACvB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,YACf,iBAAiB,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnF,MAAM,WAAW,GAAG,YAClB,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AAExE,gBAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAExE,OAAO;AACL,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC/B,qBAAA;AACD,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,QAAQ,EAAE;AACR,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG;AACvB,qBAAA;AACD,oBAAA,MAAM,EAAE,IAAI;iBACb;YACH;AAEA,YAAA;AACE,gBAAA,OAAO,WAAW,CAAC,IAAI,CAAC;;IAE9B;AACD;AAED,SAAS,qBAAqB,CAAC,EAAiB,EAAE,IAA2B,EAAA;AAC3E,IAAA,MAAM,aAAa,GAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACjF,IAAA,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9E,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,sBAAsB,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3F,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,sBAAsB,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7F,IAAA,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AAEX,IAAA,OAAO,EAAE;AACX;AAEM,SAAU,eAAe,CAAC,EAAiB,EAAE,IAA2B,EAAA;AAC5E,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC;AACxC,QAAA;AACE,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEnC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend.cjs","sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData,\n FrontendSpec,\n} from '../../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"names":["FrontendFromUrlResourceType","FrontendFromFolderResourceType","assertNever"],"mappings":"
|
|
1
|
+
{"version":3,"file":"frontend.cjs","sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData,\n FrontendSpec,\n} from '../../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"names":["FrontendFromUrlResourceType","FrontendFromFolderResourceType","assertNever"],"mappings":";;;;;;AAYM,SAAU,cAAc,CAAC,EAAiB,EAAE,IAAkB,EAAA;AAClE,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,EAAE,CAAC,WAAW,CACnBA,2CAA2B,EAC3B,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAyB,CAAC,CACzD;AACH,QAAA,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,WAAW,CACnBC,8CAA8B,EAC9B,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;AACA,aAAA,CAAC,CAC7B;AACH,QAAA;AACE,YAAA,OAAOC,qBAAW,CAAC,IAAI,CAAC;;AAE9B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend.js","sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData,\n FrontendSpec,\n} from '../../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frontend.js","sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport type {\n FrontendFromFolderData,\n FrontendFromUrlData,\n FrontendSpec,\n} from '../../model';\nimport {\n FrontendFromFolderResourceType,\n FrontendFromUrlResourceType,\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"names":[],"mappings":";;;;AAYM,SAAU,cAAc,CAAC,EAAiB,EAAE,IAAkB,EAAA;AAClE,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,EAAE,CAAC,WAAW,CACnB,2BAA2B,EAC3B,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAyB,CAAC,CACzD;AACH,QAAA,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,WAAW,CACnB,8BAA8B,EAC9B,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;AACA,aAAA,CAAC,CAC7B;AACH,QAAA;AACE,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC;;AAE9B;;;;"}
|
|
@@ -14,13 +14,19 @@ var project_model_util = require('../model/project_model_util.cjs');
|
|
|
14
14
|
*/
|
|
15
15
|
async function applyProjectMigrations(pl, rid) {
|
|
16
16
|
await pl.withWriteTx('ProjectMigration', async (tx) => {
|
|
17
|
-
|
|
17
|
+
let schemaVersion = await tx.getKValueJson(rid, project_model.SchemaVersionKey);
|
|
18
18
|
if (schemaVersion === project_model.SchemaVersionCurrent)
|
|
19
19
|
return;
|
|
20
|
+
// Apply migrations in sequence
|
|
20
21
|
if (schemaVersion === project_model_v1.SchemaVersionV1) {
|
|
21
22
|
await migrateV1ToV2(tx, rid);
|
|
23
|
+
schemaVersion = project_model.SchemaVersionV2;
|
|
22
24
|
}
|
|
23
|
-
|
|
25
|
+
if (schemaVersion === project_model.SchemaVersionV2) {
|
|
26
|
+
await migrateV2ToV3(tx, rid);
|
|
27
|
+
}
|
|
28
|
+
else if (schemaVersion !== project_model_v1.SchemaVersionV1) {
|
|
29
|
+
// If we got here and it's not v1 (which was handled above), it's unknown
|
|
24
30
|
throw new Error(`Unknown project schema version: ${schemaVersion}`);
|
|
25
31
|
}
|
|
26
32
|
tx.setKValue(rid, project_model.SchemaVersionKey, JSON.stringify(project_model.SchemaVersionCurrent));
|
|
@@ -47,11 +53,66 @@ async function migrateV1ToV2(tx, rid) {
|
|
|
47
53
|
const uiState = kvMap.get(kvKey);
|
|
48
54
|
const valueJson = uiState ? tsHelpers.cachedDeserialize(uiState) : {};
|
|
49
55
|
const uiStateR = tx.createJsonGzValue(valueJson);
|
|
50
|
-
const uiStateF = plClient.field(rid, project_model.projectFieldName(block.id, '
|
|
56
|
+
const uiStateF = plClient.field(rid, project_model.projectFieldName(block.id, 'blockStorage'));
|
|
51
57
|
tx.createField(uiStateF, 'Dynamic', uiStateR);
|
|
52
58
|
tx.deleteKValue(rid, kvKey);
|
|
53
59
|
}
|
|
54
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Migrates the project from schema version 2 to 3.
|
|
63
|
+
*
|
|
64
|
+
* Summary of changes:
|
|
65
|
+
* - Introduces unified 'blockStorage' field containing { args, uiState }
|
|
66
|
+
* - Adds 'currentPrerunArgs' field for staging/prerun rendering
|
|
67
|
+
* - For each block:
|
|
68
|
+
* 1. Read existing 'blockStorage' field (contains uiState in v2)
|
|
69
|
+
* 2. Read existing 'currentArgs' field (contains args)
|
|
70
|
+
* 3. Create unified state = { args: currentArgs, uiState: oldState }
|
|
71
|
+
* 4. Write to new {blockId}-blockStorage field (overwrites)
|
|
72
|
+
* 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)
|
|
73
|
+
* - Note: currentArgs and prodArgs fields remain for compatibility layer
|
|
74
|
+
*
|
|
75
|
+
* @param tx - The transaction to use.
|
|
76
|
+
* @param rid - The resource id of the project.
|
|
77
|
+
*/
|
|
78
|
+
async function migrateV2ToV3(tx, rid) {
|
|
79
|
+
const [structure, fullResourceState] = await Promise.all([
|
|
80
|
+
tx.getKValueJson(rid, project_model.ProjectStructureKey),
|
|
81
|
+
tx.getResourceData(rid, true),
|
|
82
|
+
]);
|
|
83
|
+
// Build a map of field name -> resource id for quick lookup
|
|
84
|
+
const fieldMap = new Map();
|
|
85
|
+
for (const f of fullResourceState.fields) {
|
|
86
|
+
if (!plClient.isNullResourceId(f.value)) {
|
|
87
|
+
fieldMap.set(f.name, f.value);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const block of project_model_util.allBlocks(structure)) {
|
|
91
|
+
// Read existing field values
|
|
92
|
+
const uiStateFieldName = project_model.projectFieldName(block.id, 'uiState');
|
|
93
|
+
const currentArgsFieldName = project_model.projectFieldName(block.id, 'currentArgs');
|
|
94
|
+
const uiStateRid = fieldMap.get(uiStateFieldName);
|
|
95
|
+
const currentArgsRid = fieldMap.get(currentArgsFieldName);
|
|
96
|
+
// Read field data in parallel where available
|
|
97
|
+
const [uiStateData, currentArgsData] = await Promise.all([
|
|
98
|
+
uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),
|
|
99
|
+
currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),
|
|
100
|
+
]);
|
|
101
|
+
// Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped
|
|
102
|
+
const uiState = uiStateData?.data ? tsHelpers.cachedDeserialize(uiStateData.data) : {};
|
|
103
|
+
const args = currentArgsData?.data ? tsHelpers.cachedDeserialize(currentArgsData.data) : {};
|
|
104
|
+
// Create unified state: { args, uiState }
|
|
105
|
+
const unifiedState = {
|
|
106
|
+
args,
|
|
107
|
+
uiState,
|
|
108
|
+
};
|
|
109
|
+
const blockStorageFieldName = project_model.projectFieldName(block.id, 'blockStorage');
|
|
110
|
+
// Write new unified blockStorage field (overwrite existing)
|
|
111
|
+
const stateR = tx.createJsonGzValue(unifiedState);
|
|
112
|
+
const stateF = plClient.field(rid, blockStorageFieldName);
|
|
113
|
+
tx.createField(stateF, 'Dynamic', stateR);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
55
116
|
|
|
56
117
|
exports.applyProjectMigrations = applyProjectMigrations;
|
|
57
118
|
//# sourceMappingURL=migration.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.cjs","sources":["../../src/mutator/migration.ts"],"sourcesContent":["import type { PlClient, PlTransaction, ResourceId } from '@milaboratories/pl-client';\nimport type { ProjectStructure } from '../model/project_model';\nimport { projectFieldName, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey } from '../model/project_model';\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from '../model/project_model_v1';\nimport { field } from '@milaboratories/pl-client';\nimport { cachedDeserialize } from '@milaboratories/ts-helpers';\nimport { allBlocks } from '../model/project_model_util';\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx('ProjectMigration', async (tx) => {\n
|
|
1
|
+
{"version":3,"file":"migration.cjs","sources":["../../src/mutator/migration.ts"],"sourcesContent":["import type { PlClient, PlTransaction, ResourceId } from '@milaboratories/pl-client';\nimport type { ProjectField, ProjectStructure } from '../model/project_model';\nimport { projectFieldName, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey, SchemaVersionV2 } from '../model/project_model';\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from '../model/project_model_v1';\nimport { field, isNullResourceId } from '@milaboratories/pl-client';\nimport { cachedDeserialize } from '@milaboratories/ts-helpers';\nimport { allBlocks } from '../model/project_model_util';\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx('ProjectMigration', async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n } else if (schemaVersion !== SchemaVersionV1) {\n // If we got here and it's not v1 (which was handled above), it's unknown\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, 'blockStorage'));\n tx.createField(uiStateF, 'Dynamic', uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, 'uiState' as ProjectField['fieldName']);\n const currentArgsFieldName = projectFieldName(block.id, 'currentArgs');\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, 'blockStorage');\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, 'Dynamic', stateR);\n }\n}\n"],"names":["SchemaVersionKey","SchemaVersionCurrent","SchemaVersionV1","SchemaVersionV2","ProjectStructureKey","allBlocks","BlockFrontendStateKeyPrefixV1","cachedDeserialize","field","projectFieldName","isNullResourceId"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/mutator/migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAQrF;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/mutator/migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAQrF;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,iBAqBzE"}
|