@milaboratories/pl-middle-layer 1.39.5 → 1.39.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1164 -1055
- package/dist/index.mjs.map +1 -1
- package/dist/middle_layer/project.d.ts +13 -0
- package/dist/middle_layer/project.d.ts.map +1 -1
- package/dist/model/project_model.d.ts +1 -0
- package/dist/model/project_model.d.ts.map +1 -1
- package/dist/mutator/project.d.ts +15 -2
- package/dist/mutator/project.d.ts.map +1 -1
- package/package.json +10 -10
- package/src/middle_layer/project.ts +26 -0
- package/src/model/project_model.ts +11 -0
- package/src/mutator/project.ts +146 -32
|
@@ -36,6 +36,19 @@ export declare class Project {
|
|
|
36
36
|
* @return returns newly created block id
|
|
37
37
|
* */
|
|
38
38
|
addBlock(blockLabel: string, blockPackSpec: BlockPackSpecAny, before?: string, author?: AuthorMarker | undefined, blockId?: string): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Duplicates an existing block by copying all its fields and state.
|
|
41
|
+
* This method works at the mutator level for efficient block copying.
|
|
42
|
+
*
|
|
43
|
+
* @param originalBlockId id of the block to duplicate
|
|
44
|
+
* @param before id of the block to insert new block before
|
|
45
|
+
* @param author author marker for the duplication operation
|
|
46
|
+
* @param newBlockId internal id to be assigned for the duplicated block,
|
|
47
|
+
* if omitted, a randomly generated UUID will be assigned
|
|
48
|
+
*
|
|
49
|
+
* @return returns newly created block id
|
|
50
|
+
* */
|
|
51
|
+
duplicateBlock(originalBlockId: string, before?: string, author?: AuthorMarker | undefined, newBlockId?: string): Promise<string>;
|
|
39
52
|
/**
|
|
40
53
|
* Update block to new block pack, optionally resetting args and ui state to
|
|
41
54
|
* initial values
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,2BAA2B,CAAC;AASnC,OAAO,KAAK,EAAE,uBAAuB,EAA2B,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIjD,OAAO,EAAE,qBAAqB,EAAiB,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACd,MAAM,uCAAuC,CAAC;AAwC/C,iFAAiF;AACjF,qBAAa,OAAO;IAoBhB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IArB9B,gCAAgC;IAChC,SAAgB,GAAG,EAAE,UAAU,CAAC;IAEhC,6EAA6E;IAC7E,SAAgB,QAAQ,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IAEjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAE3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;IAEpF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4D;IAC3F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAElD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,SAAS,CAAS;gBAGP,GAAG,EAAE,sBAAsB,EAC5C,GAAG,EAAE,UAAU,EACE,WAAW,EAAE,qBAAqB;YAcvC,WAAW;IAgCzB;;;;;;;;;;SAUK;IACQ,QAAQ,CACnB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,gBAAgB,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,GAAE,YAAY,GAAG,SAAqB,EAC5C,OAAO,GAAE,MAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC;IAwBlB;;;SAGK;IACQ,eAAe,CAC1B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,gBAAgB,EAC/B,SAAS,GAAE,OAAe,EAC1B,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAahB,gDAAgD;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/E;;;;;OAKG;IACU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BlF;;;;SAIK;IACQ,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD;;;;SAIK;IACQ,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD;;;;;SAKK;IACQ,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAO/E;;;;;SAKK;IACQ,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAOhF;;SAEK;IAEQ,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvF;;;;;SAKK;IACQ,sBAAsB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,YAAY;IAQvB,4BAA4B;IACf,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAOtE,kEAAkE;IACrD,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5F,OAAO,CAAC,mBAAmB;IA2C3B;;;SAGK;IACE,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC;IAIrE;;;SAGK;IACE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAAC,YAAY,CAAC;IAc/E,sCAAsC;IACzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrC,kBAAkB;IACL,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;WAIpC,IAAI,CAAC,GAAG,EAAE,sBAAsB,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;CA4BzF"}
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,6 +60,7 @@ export interface ProjectField {
|
|
|
60
60
|
blockId: string;
|
|
61
61
|
fieldName: 'blockPack' | 'blockSettings' | 'uiState' | 'prodArgs' | 'currentArgs' | 'prodCtx' | 'prodUiCtx' | 'prodOutput' | 'prodCtxPrevious' | 'prodUiCtxPrevious' | 'prodOutputPrevious' | 'stagingCtx' | 'stagingUiCtx' | 'stagingOutput' | 'stagingCtxPrevious' | 'stagingUiCtxPrevious' | 'stagingOutputPrevious';
|
|
62
62
|
}
|
|
63
|
+
export declare const FieldsToDuplicate: Set<ProjectField['fieldName']>;
|
|
63
64
|
export declare function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string;
|
|
64
65
|
export declare function parseProjectField(name: string): ProjectField | undefined;
|
|
65
66
|
//# sourceMappingURL=project_model.d.ts.map
|
|
@@ -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,SAAS,GACT,UAAU,GACV,aAAa,GACb,SAAS,GACT,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,CAAC;CAC7B;AAED,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"}
|
|
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,SAAS,GACT,UAAU,GACV,aAAa,GACb,SAAS,GACT,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,CAAC;CAC7B;AAED,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,CAS3D,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"}
|
|
@@ -88,7 +88,8 @@ export declare class ProjectMutator {
|
|
|
88
88
|
private resetStaging;
|
|
89
89
|
private resetProduction;
|
|
90
90
|
/** Running blocks are reset, already computed moved to limbo. Returns if
|
|
91
|
-
* either of the actions were actually performed.
|
|
91
|
+
* either of the actions were actually performed.
|
|
92
|
+
* This method ensures the block is left in a consistent state that passes check() constraints. */
|
|
92
93
|
private resetOrLimboProduction;
|
|
93
94
|
/** Optimally sets inputs for multiple blocks in one go */
|
|
94
95
|
setStates(requests: SetStatesRequest[]): void;
|
|
@@ -98,9 +99,21 @@ export declare class ProjectMutator {
|
|
|
98
99
|
private exportCtx;
|
|
99
100
|
private renderStagingFor;
|
|
100
101
|
private renderProductionFor;
|
|
102
|
+
private initializeNewBlock;
|
|
103
|
+
private getFieldNamesToDuplicate;
|
|
104
|
+
private initializeBlockDuplicate;
|
|
101
105
|
/** Very generic method, better check for more specialized case-specific methods first. */
|
|
102
|
-
updateStructure(newStructure: ProjectStructure,
|
|
106
|
+
updateStructure(newStructure: ProjectStructure, newBlockInitializer?: (blockId: string) => void): void;
|
|
103
107
|
addBlock(block: Block, spec: NewBlockSpec, before?: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Duplicates an existing block by copying all its fields and structure.
|
|
110
|
+
* This method creates a deep copy of the block at the mutator level.
|
|
111
|
+
*
|
|
112
|
+
* @param originalBlockId id of the block to duplicate
|
|
113
|
+
* @param newBlockId id for the new duplicated block
|
|
114
|
+
* @param after id of the block to insert new block after
|
|
115
|
+
*/
|
|
116
|
+
duplicateBlock(originalBlockId: string, newBlockId: string, after?: string): void;
|
|
104
117
|
deleteBlock(blockId: string): void;
|
|
105
118
|
migrateBlockPack(blockId: string, spec: BlockPackSpecPrepared, newArgsAndUiState?: ArgsAndUiState): void;
|
|
106
119
|
renderProduction(blockIds: string[], addUpstreams?: boolean): Set<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/mutator/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EAEd,aAAa,EAEb,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EASL,QAAQ,EACT,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EACV,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/mutator/project.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pl-middle-layer",
|
|
3
|
-
"version": "1.39.
|
|
3
|
+
"version": "1.39.6",
|
|
4
4
|
"description": "Pl Middle Layer",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.16.0"
|
|
@@ -33,21 +33,21 @@
|
|
|
33
33
|
"zod": "~3.23.8",
|
|
34
34
|
"remeda": "^2.22.6",
|
|
35
35
|
"@milaboratories/pl-http": "^1.1.4",
|
|
36
|
-
"@milaboratories/computable": "^2.6.0",
|
|
37
|
-
"@milaboratories/pl-client": "^2.11.2",
|
|
38
36
|
"@milaboratories/resolve-helper": "^1.1.0",
|
|
37
|
+
"@milaboratories/computable": "^2.6.0",
|
|
39
38
|
"@platforma-sdk/block-tools": "^2.5.67",
|
|
40
|
-
"@milaboratories/pl-
|
|
41
|
-
"@milaboratories/pl-model-middle-layer": "~1.7.49",
|
|
39
|
+
"@milaboratories/pl-client": "^2.11.2",
|
|
42
40
|
"@milaboratories/pl-drivers": "^1.6.3",
|
|
41
|
+
"@milaboratories/pl-model-middle-layer": "~1.7.49",
|
|
42
|
+
"@milaboratories/pl-model-common": "~1.16.3",
|
|
43
|
+
"@milaboratories/pl-model-backend": "~1.1.2",
|
|
43
44
|
"@milaboratories/pl-tree": "~1.7.0",
|
|
44
45
|
"@platforma-sdk/model": "~1.39.8",
|
|
45
46
|
"@milaboratories/ts-helpers": "^1.4.1",
|
|
46
|
-
"@milaboratories/pl-model-backend": "~1.1.2",
|
|
47
47
|
"@platforma-sdk/workflow-tengo": "4.9.3",
|
|
48
48
|
"@milaboratories/pl-config": "^1.6.1",
|
|
49
|
-
"@milaboratories/pl-
|
|
50
|
-
"@milaboratories/pl-
|
|
49
|
+
"@milaboratories/pl-deployments": "^2.4.3",
|
|
50
|
+
"@milaboratories/pl-errors": "^1.1.9"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"semver": "^7.7.2",
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"jest": "^29.7.0",
|
|
61
61
|
"@jest/globals": "^29.7.0",
|
|
62
62
|
"ts-jest": "^29.2.6",
|
|
63
|
-
"@milaboratories/
|
|
64
|
-
"@milaboratories/
|
|
63
|
+
"@milaboratories/build-configs": "1.0.4",
|
|
64
|
+
"@milaboratories/eslint-config": "^1.0.4"
|
|
65
65
|
},
|
|
66
66
|
"scripts": {
|
|
67
67
|
"type-check": "tsc --noEmit --composite false",
|
|
@@ -184,6 +184,32 @@ export class Project {
|
|
|
184
184
|
return blockId;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
+
/**
|
|
188
|
+
* Duplicates an existing block by copying all its fields and state.
|
|
189
|
+
* This method works at the mutator level for efficient block copying.
|
|
190
|
+
*
|
|
191
|
+
* @param originalBlockId id of the block to duplicate
|
|
192
|
+
* @param before id of the block to insert new block before
|
|
193
|
+
* @param author author marker for the duplication operation
|
|
194
|
+
* @param newBlockId internal id to be assigned for the duplicated block,
|
|
195
|
+
* if omitted, a randomly generated UUID will be assigned
|
|
196
|
+
*
|
|
197
|
+
* @return returns newly created block id
|
|
198
|
+
* */
|
|
199
|
+
public async duplicateBlock(
|
|
200
|
+
originalBlockId: string,
|
|
201
|
+
before?: string,
|
|
202
|
+
author: AuthorMarker | undefined = undefined,
|
|
203
|
+
newBlockId: string = randomUUID(),
|
|
204
|
+
): Promise<string> {
|
|
205
|
+
await withProjectAuthored(this.env.projectHelper, this.env.pl, this.rid, author, (mut) =>
|
|
206
|
+
mut.duplicateBlock(originalBlockId, newBlockId, before),
|
|
207
|
+
);
|
|
208
|
+
await this.projectTree.refreshState();
|
|
209
|
+
|
|
210
|
+
return newBlockId;
|
|
211
|
+
}
|
|
212
|
+
|
|
187
213
|
/**
|
|
188
214
|
* Update block to new block pack, optionally resetting args and ui state to
|
|
189
215
|
* initial values
|
|
@@ -118,6 +118,17 @@ export interface ProjectField {
|
|
|
118
118
|
| 'stagingOutputPrevious';
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
export const FieldsToDuplicate: Set<ProjectField['fieldName']> = new Set([
|
|
122
|
+
'blockPack',
|
|
123
|
+
'blockSettings',
|
|
124
|
+
'uiState',
|
|
125
|
+
'prodArgs',
|
|
126
|
+
'currentArgs',
|
|
127
|
+
'prodCtx',
|
|
128
|
+
'prodUiCtx',
|
|
129
|
+
'prodOutput',
|
|
130
|
+
]);
|
|
131
|
+
|
|
121
132
|
export function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {
|
|
122
133
|
return `${blockId}-${fieldName}`;
|
|
123
134
|
}
|
package/src/mutator/project.ts
CHANGED
|
@@ -39,6 +39,7 @@ import {
|
|
|
39
39
|
ProjectCreatedTimestamp,
|
|
40
40
|
ProjectStructureAuthorKey,
|
|
41
41
|
getServiceTemplateField,
|
|
42
|
+
FieldsToDuplicate,
|
|
42
43
|
} from '../model/project_model';
|
|
43
44
|
import { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';
|
|
44
45
|
import type {
|
|
@@ -472,25 +473,37 @@ export class ProjectMutator {
|
|
|
472
473
|
}
|
|
473
474
|
|
|
474
475
|
/** Running blocks are reset, already computed moved to limbo. Returns if
|
|
475
|
-
* either of the actions were actually performed.
|
|
476
|
+
* either of the actions were actually performed.
|
|
477
|
+
* This method ensures the block is left in a consistent state that passes check() constraints. */
|
|
476
478
|
private resetOrLimboProduction(blockId: string): boolean {
|
|
477
479
|
const fields = this.getBlockInfo(blockId).fields;
|
|
480
|
+
|
|
481
|
+
// Check if we can safely move to limbo (both core production fields are ready)
|
|
478
482
|
if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {
|
|
479
483
|
if (this.blocksInLimbo.has(blockId))
|
|
480
484
|
// we are already in limbo
|
|
481
485
|
return false;
|
|
482
486
|
|
|
483
|
-
// limbo
|
|
487
|
+
// limbo - keep the ready production results but clean up cache
|
|
484
488
|
this.blocksInLimbo.add(blockId);
|
|
485
489
|
this.renderingStateChanged = true;
|
|
486
490
|
|
|
487
|
-
// doing some gc
|
|
491
|
+
// doing some gc - clean up previous cache fields
|
|
488
492
|
this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');
|
|
489
493
|
|
|
490
494
|
return true;
|
|
491
495
|
} else {
|
|
492
|
-
// reset
|
|
493
|
-
return this.deleteBlockFields(
|
|
496
|
+
// reset - clean up any partial/inconsistent production stat
|
|
497
|
+
return this.deleteBlockFields(
|
|
498
|
+
blockId,
|
|
499
|
+
'prodOutput',
|
|
500
|
+
'prodCtx',
|
|
501
|
+
'prodUiCtx',
|
|
502
|
+
'prodArgs',
|
|
503
|
+
'prodOutputPrevious',
|
|
504
|
+
'prodCtxPrevious',
|
|
505
|
+
'prodUiCtxPrevious',
|
|
506
|
+
);
|
|
494
507
|
}
|
|
495
508
|
}
|
|
496
509
|
|
|
@@ -643,10 +656,92 @@ export class ProjectMutator {
|
|
|
643
656
|
// Structure changes
|
|
644
657
|
//
|
|
645
658
|
|
|
659
|
+
private initializeNewBlock(blockId: string, spec: NewBlockSpec): void {
|
|
660
|
+
const info = new BlockInfo(blockId, {}, extractConfig(spec.blockPack.config), spec.blockPack.source);
|
|
661
|
+
this.blockInfos.set(blockId, info);
|
|
662
|
+
|
|
663
|
+
// block pack
|
|
664
|
+
const bp = createBlockPack(this.tx, spec.blockPack);
|
|
665
|
+
this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');
|
|
666
|
+
|
|
667
|
+
// settings
|
|
668
|
+
this.setBlockFieldObj(
|
|
669
|
+
blockId,
|
|
670
|
+
'blockSettings',
|
|
671
|
+
this.createJsonFieldValue(InitialBlockSettings),
|
|
672
|
+
);
|
|
673
|
+
|
|
674
|
+
// args
|
|
675
|
+
this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));
|
|
676
|
+
|
|
677
|
+
// uiState
|
|
678
|
+
this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));
|
|
679
|
+
|
|
680
|
+
// checking structure
|
|
681
|
+
info.check();
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
private getFieldNamesToDuplicate(blockId: string): Set<ProjectField['fieldName']> {
|
|
685
|
+
const fields = this.getBlockInfo(blockId).fields;
|
|
686
|
+
|
|
687
|
+
const diff = <T>(setA: Set<T>, setB: Set<T>): Set<T> => new Set([...setA].filter((x) => !setB.has(x)));
|
|
688
|
+
|
|
689
|
+
// Check if we can safely move to limbo (both core production fields are ready)
|
|
690
|
+
if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {
|
|
691
|
+
if (this.blocksInLimbo.has(blockId))
|
|
692
|
+
// we are already in limbo
|
|
693
|
+
return FieldsToDuplicate;
|
|
694
|
+
|
|
695
|
+
return diff(FieldsToDuplicate, new Set([
|
|
696
|
+
'prodOutputPrevious',
|
|
697
|
+
'prodCtxPrevious',
|
|
698
|
+
'prodUiCtxPrevious',
|
|
699
|
+
]));
|
|
700
|
+
} else {
|
|
701
|
+
return diff(FieldsToDuplicate, new Set([
|
|
702
|
+
'prodOutput',
|
|
703
|
+
'prodCtx',
|
|
704
|
+
'prodUiCtx',
|
|
705
|
+
'prodArgs',
|
|
706
|
+
'prodOutputPrevious',
|
|
707
|
+
'prodCtxPrevious',
|
|
708
|
+
'prodUiCtxPrevious',
|
|
709
|
+
]));
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
private initializeBlockDuplicate(blockId: string, originalBlockInfo: BlockInfo) {
|
|
714
|
+
const info = new BlockInfo(
|
|
715
|
+
blockId,
|
|
716
|
+
{},
|
|
717
|
+
originalBlockInfo.config,
|
|
718
|
+
originalBlockInfo.source,
|
|
719
|
+
);
|
|
720
|
+
|
|
721
|
+
this.blockInfos.set(blockId, info);
|
|
722
|
+
|
|
723
|
+
const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);
|
|
724
|
+
|
|
725
|
+
// Copy all fields from original block to new block by sharing references
|
|
726
|
+
for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) {
|
|
727
|
+
if (fieldNamesToDuplicate.has(fieldName as ProjectField['fieldName']) && fieldState && fieldState.ref) {
|
|
728
|
+
this.setBlockFieldObj(blockId, fieldName as keyof BlockFieldStates, {
|
|
729
|
+
ref: fieldState.ref,
|
|
730
|
+
status: fieldState.status,
|
|
731
|
+
value: fieldState.value,
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
this.resetOrLimboProduction(blockId);
|
|
737
|
+
|
|
738
|
+
info.check();
|
|
739
|
+
}
|
|
740
|
+
|
|
646
741
|
/** Very generic method, better check for more specialized case-specific methods first. */
|
|
647
742
|
public updateStructure(
|
|
648
743
|
newStructure: ProjectStructure,
|
|
649
|
-
|
|
744
|
+
newBlockInitializer: (blockId: string) => void = NoNewBlocks,
|
|
650
745
|
): void {
|
|
651
746
|
const currentStagingGraph = this.getStagingGraph();
|
|
652
747
|
const currentActualProductionGraph = this.getActualProductionGraph();
|
|
@@ -665,31 +760,7 @@ export class ProjectMutator {
|
|
|
665
760
|
|
|
666
761
|
// creating new blocks
|
|
667
762
|
for (const blockId of stagingDiff.onlyInB) {
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
// adding new block info
|
|
671
|
-
const info = new BlockInfo(blockId, {}, extractConfig(spec.blockPack.config), spec.blockPack.source);
|
|
672
|
-
this.blockInfos.set(blockId, info);
|
|
673
|
-
|
|
674
|
-
// block pack
|
|
675
|
-
const bp = createBlockPack(this.tx, spec.blockPack);
|
|
676
|
-
this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');
|
|
677
|
-
|
|
678
|
-
// settings
|
|
679
|
-
this.setBlockFieldObj(
|
|
680
|
-
blockId,
|
|
681
|
-
'blockSettings',
|
|
682
|
-
this.createJsonFieldValue(InitialBlockSettings),
|
|
683
|
-
);
|
|
684
|
-
|
|
685
|
-
// args
|
|
686
|
-
this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));
|
|
687
|
-
|
|
688
|
-
// uiState
|
|
689
|
-
this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));
|
|
690
|
-
|
|
691
|
-
// checking structure
|
|
692
|
-
info.check();
|
|
763
|
+
newBlockInitializer(blockId);
|
|
693
764
|
}
|
|
694
765
|
|
|
695
766
|
// resetting stagings affected by topology change
|
|
@@ -747,7 +818,50 @@ export class ProjectMutator {
|
|
|
747
818
|
}
|
|
748
819
|
this.updateStructure(newStruct, (blockId) => {
|
|
749
820
|
if (blockId !== block.id) throw new Error('Unexpected');
|
|
750
|
-
|
|
821
|
+
this.initializeNewBlock(blockId, spec);
|
|
822
|
+
});
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* Duplicates an existing block by copying all its fields and structure.
|
|
827
|
+
* This method creates a deep copy of the block at the mutator level.
|
|
828
|
+
*
|
|
829
|
+
* @param originalBlockId id of the block to duplicate
|
|
830
|
+
* @param newBlockId id for the new duplicated block
|
|
831
|
+
* @param after id of the block to insert new block after
|
|
832
|
+
*/
|
|
833
|
+
public duplicateBlock(originalBlockId: string, newBlockId: string, after?: string): void {
|
|
834
|
+
// Get the original block from structure
|
|
835
|
+
const originalBlock = this.getBlock(originalBlockId);
|
|
836
|
+
const originalBlockInfo = this.getBlockInfo(originalBlockId);
|
|
837
|
+
|
|
838
|
+
// Create new block in structure
|
|
839
|
+
const newBlock: Block = {
|
|
840
|
+
id: newBlockId,
|
|
841
|
+
label: originalBlock.label,
|
|
842
|
+
renderingMode: originalBlock.renderingMode,
|
|
843
|
+
};
|
|
844
|
+
|
|
845
|
+
// Add the new block to structure
|
|
846
|
+
const newStruct = this.structure; // copy current structure
|
|
847
|
+
if (after === undefined) {
|
|
848
|
+
// adding as a very last block
|
|
849
|
+
newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);
|
|
850
|
+
} else {
|
|
851
|
+
let done = false;
|
|
852
|
+
for (const group of newStruct.groups) {
|
|
853
|
+
const idx = group.blocks.findIndex((b) => b.id === after);
|
|
854
|
+
if (idx < 0) continue;
|
|
855
|
+
group.blocks.splice(idx + 1, 0, newBlock);
|
|
856
|
+
done = true;
|
|
857
|
+
break;
|
|
858
|
+
}
|
|
859
|
+
if (!done) throw new Error(`Can't find element with id: ${after}`);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
this.updateStructure(newStruct, (blockId) => {
|
|
863
|
+
if (blockId !== newBlockId) throw new Error('Unexpected');
|
|
864
|
+
this.initializeBlockDuplicate(blockId, originalBlockInfo);
|
|
751
865
|
});
|
|
752
866
|
}
|
|
753
867
|
|