@kubuild/core 0.0.1
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/binding-resolver.d.ts +16 -0
- package/dist/binding-resolver.d.ts.map +1 -0
- package/dist/command-tree-utils.d.ts +60 -0
- package/dist/command-tree-utils.d.ts.map +1 -0
- package/dist/commands.d.ts +99 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/document-utils.d.ts +51 -0
- package/dist/document-utils.d.ts.map +1 -0
- package/dist/exporter.d.ts +89 -0
- package/dist/exporter.d.ts.map +1 -0
- package/dist/history.d.ts +107 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/importer.d.ts +243 -0
- package/dist/importer.d.ts.map +1 -0
- package/dist/index.cjs +3686 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3614 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +71 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/migration.d.ts +86 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/round-trip-comparator.d.ts +38 -0
- package/dist/round-trip-comparator.d.ts.map +1 -0
- package/dist/security.d.ts +99 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/template-utils.d.ts +124 -0
- package/dist/template-utils.d.ts.map +1 -0
- package/dist/validator.d.ts +43 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/variable-catalog.d.ts +9 -0
- package/dist/variable-catalog.d.ts.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { VariableBinding } from '@kubuild/schema';
|
|
2
|
+
import type { RuntimeContext } from './interfaces';
|
|
3
|
+
export type ResolveOutcome = {
|
|
4
|
+
status: 'resolved';
|
|
5
|
+
value: unknown;
|
|
6
|
+
} | {
|
|
7
|
+
status: 'fallback';
|
|
8
|
+
value: unknown;
|
|
9
|
+
} | {
|
|
10
|
+
status: 'empty';
|
|
11
|
+
value: '';
|
|
12
|
+
};
|
|
13
|
+
export declare function resolveBinding(binding: Pick<VariableBinding, 'key' | 'fallback'>, context: RuntimeContext | undefined): ResolveOutcome;
|
|
14
|
+
/** Convenience wrapper returning just the resolved/fallback/empty value. */
|
|
15
|
+
export declare function resolveBindingValue(binding: Pick<VariableBinding, 'key' | 'fallback'>, context: RuntimeContext | undefined): unknown;
|
|
16
|
+
//# sourceMappingURL=binding-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding-resolver.d.ts","sourceRoot":"","sources":["../src/binding-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQnD,MAAM,MAAM,cAAc,GACtB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,EAAE,CAAA;CAAE,CAAC;AAInC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,UAAU,CAAC,EAClD,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC,cAAc,CAsBhB;AASD,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,UAAU,CAAC,EAClD,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC,OAAO,CAET"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Node } from '@kubuild/schema';
|
|
2
|
+
/**
|
|
3
|
+
* Deep clone an object immutably (JSON-safe).
|
|
4
|
+
*/
|
|
5
|
+
export declare function deepClone<T>(val: T): T;
|
|
6
|
+
export interface NodeLocation {
|
|
7
|
+
node: Node;
|
|
8
|
+
parent: Node | null;
|
|
9
|
+
index: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Find a node, its parent, and index within the parent's children array.
|
|
13
|
+
*/
|
|
14
|
+
export declare function findNodeLocation(root: Node, targetId: string): NodeLocation | null;
|
|
15
|
+
export type NavigationDirection = 'parent' | 'child' | 'previous-sibling' | 'next-sibling';
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the node id reached by moving from `nodeId` in a tree-navigation direction.
|
|
18
|
+
* Returns null when there is nowhere to go (e.g. root has no parent, a leaf has no child,
|
|
19
|
+
* or the node sits at the start/end of its sibling list).
|
|
20
|
+
*/
|
|
21
|
+
export declare function getNavigationTarget(root: Node, nodeId: string, direction: NavigationDirection): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the chain of ancestor node ids from the root down to (but excluding)
|
|
24
|
+
* `targetId`, root first. Returns [] if targetId is the root or is not found.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAncestorChain(root: Node, targetId: string): string[];
|
|
27
|
+
/**
|
|
28
|
+
* STORA-232: Find the direct parent node of `targetId` in a single O(N) traversal.
|
|
29
|
+
* Returns null when the target is the root or is not found in the tree.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getParentNodeId(root: Node, targetId: string): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* STORA-232: Return the full ancestor path of `targetId` as an array of nodes,
|
|
34
|
+
* ordered from the root down to (and including) the target node itself.
|
|
35
|
+
* Single O(N) traversal: the path is tracked during descent, so no re-walks.
|
|
36
|
+
* Returns [] when the target is not found.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getNodeAncestors(root: Node, targetId: string): Node[];
|
|
39
|
+
/**
|
|
40
|
+
* Check whether `targetId` is a descendant of `ancestorNode` (or equal to ancestorNode.id).
|
|
41
|
+
*/
|
|
42
|
+
export declare function isDescendantOf(ancestorNode: Node, targetId: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Collect all node IDs present in a node subtree as a Set.
|
|
45
|
+
*/
|
|
46
|
+
export declare function collectNodeIdSet(root: Node): Set<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Default unique ID generator function for node duplication.
|
|
49
|
+
*/
|
|
50
|
+
export declare function defaultIdGenerator(oldId: string, existingIds?: Set<string>): string;
|
|
51
|
+
export interface ClonedSubtreeResult {
|
|
52
|
+
clonedNode: Node;
|
|
53
|
+
idMap: Map<string, string>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Recursively clone a node and its entire subtree, generating fresh unique IDs
|
|
57
|
+
* for every node while preserving types, props, and responsive styles.
|
|
58
|
+
*/
|
|
59
|
+
export declare function cloneTreeWithNewIds(root: Node, idGenerator?: (oldId: string) => string, existingIds?: Set<string>): ClonedSubtreeResult;
|
|
60
|
+
//# sourceMappingURL=command-tree-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-tree-utils.d.ts","sourceRoot":"","sources":["../src/command-tree-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,iBAAiB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEtC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUlF;AA0BD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,OAAO,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE3F;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,mBAAmB,GAC7B,MAAM,GAAG,IAAI,CAkBf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAcvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc3E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAgBrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgB5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAExD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAenF;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,IAAI,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACvC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,mBAAmB,CAyBrB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { PageDocument, Node, ResponsiveStyles, StyleDefinition } from '@kubuild/schema';
|
|
2
|
+
export type DocumentChangeType = 'NODE_INSERTED' | 'NODE_MOVED' | 'PROPS_UPDATED' | 'STYLE_UPDATED' | 'NODE_REMOVED' | 'NODE_DUPLICATED';
|
|
3
|
+
export interface DocumentChangeEvent {
|
|
4
|
+
type: DocumentChangeType;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
nodeId: string;
|
|
7
|
+
parentId?: string;
|
|
8
|
+
previousParentId?: string;
|
|
9
|
+
index?: number;
|
|
10
|
+
previousIndex?: number;
|
|
11
|
+
payload?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface CommandResult {
|
|
14
|
+
document: PageDocument;
|
|
15
|
+
event: DocumentChangeEvent;
|
|
16
|
+
}
|
|
17
|
+
export interface InsertNodeParams {
|
|
18
|
+
parentId: string;
|
|
19
|
+
node: Node;
|
|
20
|
+
index?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface MoveNodeParams {
|
|
23
|
+
nodeId: string;
|
|
24
|
+
targetParentId: string;
|
|
25
|
+
index?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface UpdatePropsParams {
|
|
28
|
+
nodeId: string;
|
|
29
|
+
props: Record<string, unknown>;
|
|
30
|
+
/**
|
|
31
|
+
* If true (default), shallow merges new props with existing props.
|
|
32
|
+
* If false, replaces the entire props object.
|
|
33
|
+
*/
|
|
34
|
+
merge?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface UpdateStyleParams {
|
|
37
|
+
nodeId: string;
|
|
38
|
+
styles: ResponsiveStyles | StyleDefinition;
|
|
39
|
+
/**
|
|
40
|
+
* Target breakpoint to update directly, or if omitted, applies to whole ResponsiveStyles structure.
|
|
41
|
+
*/
|
|
42
|
+
breakpoint?: 'base' | 'desktop' | 'tablet' | 'mobile';
|
|
43
|
+
/**
|
|
44
|
+
* Target pseudo-state layer (e.g. ':hover', ':active', ':focus') — STORA-221.
|
|
45
|
+
* When set, `styles` is written to `node.styles.states[state]` instead of a
|
|
46
|
+
* breakpoint layer, leaving default (breakpoint) values untouched.
|
|
47
|
+
*/
|
|
48
|
+
state?: string;
|
|
49
|
+
/**
|
|
50
|
+
* If true (default), shallow merges style definitions at target breakpoint.
|
|
51
|
+
* If false, replaces the style definition object.
|
|
52
|
+
*/
|
|
53
|
+
merge?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface RemoveNodeParams {
|
|
56
|
+
nodeId: string;
|
|
57
|
+
}
|
|
58
|
+
export interface DuplicateNodeParams {
|
|
59
|
+
nodeId: string;
|
|
60
|
+
targetParentId?: string;
|
|
61
|
+
index?: number;
|
|
62
|
+
idGenerator?: (oldId: string) => string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 1. Insert a node into a target parent node.
|
|
66
|
+
* Returns a new PageDocument and a NODE_INSERTED event.
|
|
67
|
+
*/
|
|
68
|
+
export declare function insertNode(document: PageDocument, params: InsertNodeParams): CommandResult;
|
|
69
|
+
/**
|
|
70
|
+
* 2. Move a node from its current location to a new parent location.
|
|
71
|
+
* Prevents moving the root node or moving a node into its own descendant tree.
|
|
72
|
+
* Returns a new PageDocument and a NODE_MOVED event.
|
|
73
|
+
*/
|
|
74
|
+
export declare function moveNode(document: PageDocument, params: MoveNodeParams): CommandResult;
|
|
75
|
+
/**
|
|
76
|
+
* 3. Update the props of an existing node.
|
|
77
|
+
* Returns a new PageDocument and a PROPS_UPDATED event.
|
|
78
|
+
*/
|
|
79
|
+
export declare function updateProps(document: PageDocument, params: UpdatePropsParams): CommandResult;
|
|
80
|
+
/**
|
|
81
|
+
* 4. Update the responsive styles of an existing node.
|
|
82
|
+
* Supports updating a specific breakpoint ('base', 'desktop', etc.) or the whole ResponsiveStyles object.
|
|
83
|
+
* Returns a new PageDocument and a STYLE_UPDATED event.
|
|
84
|
+
*/
|
|
85
|
+
export declare function updateStyle(document: PageDocument, params: UpdateStyleParams): CommandResult;
|
|
86
|
+
/**
|
|
87
|
+
* 5. Remove a node from the document tree.
|
|
88
|
+
* Prevents removing the root page node.
|
|
89
|
+
* Returns a new PageDocument and a NODE_REMOVED event.
|
|
90
|
+
*/
|
|
91
|
+
export declare function removeNode(document: PageDocument, params: RemoveNodeParams): CommandResult;
|
|
92
|
+
/**
|
|
93
|
+
* 6. Duplicate a node and its entire subtree.
|
|
94
|
+
* Generates fresh unique IDs for all cloned nodes in the subtree, preserves props/styles,
|
|
95
|
+
* and inserts the duplicate right after the original node (or at specified targetParentId/index).
|
|
96
|
+
* Returns a new PageDocument and a NODE_DUPLICATED event.
|
|
97
|
+
*/
|
|
98
|
+
export declare function duplicateNode(document: PageDocument, params: DuplicateNodeParams): CommandResult;
|
|
99
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,gBAAgB,EAChB,eAAe,EAGhB,MAAM,iBAAiB,CAAC;AASzB,MAAM,MAAM,kBAAkB,GAC1B,eAAe,GACf,YAAY,GACZ,eAAe,GACf,eAAe,GACf,cAAc,GACd,iBAAiB,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAAC;IAC3C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,gBAAgB,GACvB,aAAa,CAgDf;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,cAAc,GACrB,aAAa,CAyDf;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,iBAAiB,GACxB,aAAa,CAsCf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,iBAAiB,GACxB,aAAa,CAgHf;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,gBAAgB,GACvB,aAAa,CA+Bf;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,mBAAmB,GAC1B,aAAa,CAqDf"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { PageDocument, Node } from '@kubuild/schema';
|
|
2
|
+
import type { ComponentRegistryLike } from './validator';
|
|
3
|
+
export { validateDocument } from './validator';
|
|
4
|
+
export type { DocumentValidationResult, DocumentValidationError, DocumentValidationErrorCode, ValidationOptions, ComponentDefinitionLike, ComponentRegistryLike, } from './validator';
|
|
5
|
+
export declare function createBlankDocument(title?: string): PageDocument;
|
|
6
|
+
export declare function findNodeById(rootNode: Node, targetId: string): Node | null;
|
|
7
|
+
export interface CollectedAssetReference {
|
|
8
|
+
assetId: string;
|
|
9
|
+
reference: {
|
|
10
|
+
type: 'asset';
|
|
11
|
+
assetId: string;
|
|
12
|
+
filename?: string;
|
|
13
|
+
mimeType?: string;
|
|
14
|
+
fallbackUrl?: string;
|
|
15
|
+
};
|
|
16
|
+
nodeId: string;
|
|
17
|
+
propPath: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Collect all AssetReference objects throughout a document tree.
|
|
21
|
+
*/
|
|
22
|
+
export declare function collectAssetReferences(rootNode: Node): CollectedAssetReference[];
|
|
23
|
+
export interface TreeRequirements {
|
|
24
|
+
requiredComponents: string[];
|
|
25
|
+
requiredCapabilities: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Extracts custom component types and capabilities required by a node tree.
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractRequirementsFromTree(rootNode: Node, registry?: ComponentRegistryLike): TreeRequirements;
|
|
31
|
+
/**
|
|
32
|
+
* Remap asset references in a node tree based on an ID mapping dictionary.
|
|
33
|
+
* Mutates the node props in place and returns the number of references updated.
|
|
34
|
+
*/
|
|
35
|
+
export declare function remapAssetReferences(rootNode: Node, idMap: Record<string, string> | Map<string, string>): number;
|
|
36
|
+
/**
|
|
37
|
+
* Remaps all asset references throughout a PageDocument.
|
|
38
|
+
*/
|
|
39
|
+
export declare function remapDocumentAssetReferences(doc: PageDocument, idMap: Record<string, string> | Map<string, string>): PageDocument;
|
|
40
|
+
export interface MissingComponentNodeInfo {
|
|
41
|
+
nodeId: string;
|
|
42
|
+
componentType: string;
|
|
43
|
+
props: Record<string, unknown>;
|
|
44
|
+
node: Node;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Finds all nodes in a node tree that reference component types not registered in the host.
|
|
48
|
+
* This is useful in placeholder mode to inspect missing nodes and their preserved props.
|
|
49
|
+
*/
|
|
50
|
+
export declare function findMissingComponentNodes(rootNode: Node, registry?: ComponentRegistryLike, knownTypes?: string[] | Set<string>): MissingComponentNodeInfo[];
|
|
51
|
+
//# sourceMappingURL=document-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-utils.d.ts","sourceRoot":"","sources":["../src/document-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAe,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,mBAAmB,CAAC,KAAK,SAAkB,GAAG,YAAY,CAsBzE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQ1E;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,IAAI,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,IAAI,GAAG,uBAAuB,EAAE,CAkDhF;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,IAAI,EACd,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,gBAAgB,CA8BlB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,IAAI,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAClD,MAAM,CA+CR;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAClD,YAAY,CAKd;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,IAAI,EACd,QAAQ,CAAC,EAAE,qBAAqB,EAChC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAClC,wBAAwB,EAAE,CA6C5B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { PageDocument, DocumentMetadata, Manifest } from '@kubuild/schema';
|
|
2
|
+
import { DocumentValidationError, ValidationOptions, ComponentRegistryLike } from './validator';
|
|
3
|
+
import { CollectedAssetReference } from './document-utils';
|
|
4
|
+
import type { AssetProvider } from './interfaces';
|
|
5
|
+
export interface ExportAssetData {
|
|
6
|
+
data: Uint8Array | ArrayBuffer | Blob | string;
|
|
7
|
+
mimeType?: string;
|
|
8
|
+
filename?: string;
|
|
9
|
+
}
|
|
10
|
+
export type AssetBytesProvider = (assetId: string, assetRef: CollectedAssetReference) => Promise<Uint8Array | ArrayBuffer | Blob | string | ExportAssetData | null | undefined> | Uint8Array | ArrayBuffer | Blob | string | ExportAssetData | null | undefined;
|
|
11
|
+
export interface ExportPackageOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Component registry to validate document components and extract requirements.
|
|
14
|
+
*/
|
|
15
|
+
componentRegistry?: ComponentRegistryLike;
|
|
16
|
+
/**
|
|
17
|
+
* Known component types if registry is not passed.
|
|
18
|
+
*/
|
|
19
|
+
knownComponentTypes?: string[] | Set<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Directly supplied asset binary map (keyed by assetId).
|
|
22
|
+
*/
|
|
23
|
+
assets?: Record<string, Uint8Array | ArrayBuffer | Blob | string | ExportAssetData> | Map<string, Uint8Array | ArrayBuffer | Blob | string | ExportAssetData>;
|
|
24
|
+
/**
|
|
25
|
+
* Host function to retrieve asset binary data dynamically.
|
|
26
|
+
*/
|
|
27
|
+
getAssetBytes?: AssetBytesProvider;
|
|
28
|
+
/**
|
|
29
|
+
* Host AssetProvider instance to resolve assets if bytes provider is not present.
|
|
30
|
+
*/
|
|
31
|
+
assetProvider?: AssetProvider;
|
|
32
|
+
/**
|
|
33
|
+
* Package version to write in manifest (defaults to "1.0.0").
|
|
34
|
+
*/
|
|
35
|
+
packageVersion?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Builder compatibility semver range (defaults to ">=0.1.0").
|
|
38
|
+
*/
|
|
39
|
+
builderCompatibility?: string;
|
|
40
|
+
/**
|
|
41
|
+
* If true, assets that have a fallbackUrl or are externally hosted will not cause export failure if local bytes are missing.
|
|
42
|
+
* If false and a referenced asset has no bytes available, export fails.
|
|
43
|
+
*/
|
|
44
|
+
allowExternalFallback?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Additional validation options passed to validateDocument.
|
|
47
|
+
*/
|
|
48
|
+
validationOptions?: ValidationOptions;
|
|
49
|
+
/**
|
|
50
|
+
* Optional metadata overrides (e.g. author, tags).
|
|
51
|
+
*/
|
|
52
|
+
metadata?: Partial<DocumentMetadata>;
|
|
53
|
+
}
|
|
54
|
+
export interface ExportPackageSuccess {
|
|
55
|
+
success: true;
|
|
56
|
+
archive: Uint8Array;
|
|
57
|
+
manifest: Manifest;
|
|
58
|
+
page: PageDocument;
|
|
59
|
+
metadata: DocumentMetadata;
|
|
60
|
+
assetCount: number;
|
|
61
|
+
}
|
|
62
|
+
export interface ExportPackageFailure {
|
|
63
|
+
success: false;
|
|
64
|
+
errors: DocumentValidationError[];
|
|
65
|
+
diagnosticMessage: string;
|
|
66
|
+
}
|
|
67
|
+
export type ExportPackageResult = ExportPackageSuccess | ExportPackageFailure;
|
|
68
|
+
/**
|
|
69
|
+
* Pure TypeScript SHA-256 implementation (zero native dependencies, deterministic).
|
|
70
|
+
*/
|
|
71
|
+
export declare function sha256Sync(data: Uint8Array): string;
|
|
72
|
+
/**
|
|
73
|
+
* Compute SHA-256 checksum with "sha256:" prefix.
|
|
74
|
+
*/
|
|
75
|
+
export declare function calculateChecksum(data: Uint8Array): Promise<string>;
|
|
76
|
+
/**
|
|
77
|
+
* Sanitize asset file names to prevent zip-slip or directory traversal vulnerabilities.
|
|
78
|
+
*/
|
|
79
|
+
export declare function sanitizeFilename(filename: string | undefined, assetId: string, mimeType?: string): string;
|
|
80
|
+
/**
|
|
81
|
+
* Validates document, collects asset references, resolves local asset bytes,
|
|
82
|
+
* writes manifest.json, page.json, metadata.json, and packages everything into a .stora archive.
|
|
83
|
+
*/
|
|
84
|
+
export declare function exportPackage(document: unknown, options?: ExportPackageOptions): Promise<ExportPackageResult>;
|
|
85
|
+
/**
|
|
86
|
+
* Alias for exportPackage.
|
|
87
|
+
*/
|
|
88
|
+
export declare const exportStoraPackage: typeof exportPackage;
|
|
89
|
+
//# sourceMappingURL=exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { PageDocument } from '@kubuild/schema';
|
|
2
|
+
import { DocumentChangeEvent, CommandResult } from './commands';
|
|
3
|
+
export interface HistoryOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Maximum number of historical states stored in the undo stack.
|
|
6
|
+
* Defaults to 50.
|
|
7
|
+
*/
|
|
8
|
+
maxHistory?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface HistoryEntry<T> {
|
|
11
|
+
state: T;
|
|
12
|
+
event?: DocumentChangeEvent;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
}
|
|
15
|
+
export interface HistoryState<T> {
|
|
16
|
+
canUndo: boolean;
|
|
17
|
+
canRedo: boolean;
|
|
18
|
+
undoCount: number;
|
|
19
|
+
redoCount: number;
|
|
20
|
+
present: T;
|
|
21
|
+
}
|
|
22
|
+
export declare const DEFAULT_MAX_HISTORY = 50;
|
|
23
|
+
/**
|
|
24
|
+
* Generic History Engine for immutable state transitions.
|
|
25
|
+
* Maintains undo/redo stacks, enforces maximum history limit,
|
|
26
|
+
* clears redo stack on new actions, and supports resetting state.
|
|
27
|
+
*/
|
|
28
|
+
export declare class HistoryEngine<T = PageDocument> {
|
|
29
|
+
private past;
|
|
30
|
+
private current;
|
|
31
|
+
private future;
|
|
32
|
+
private readonly maxHistory;
|
|
33
|
+
constructor(initialState: T, options?: HistoryOptions);
|
|
34
|
+
/**
|
|
35
|
+
* Get the current active state (returns an immutable clone).
|
|
36
|
+
*/
|
|
37
|
+
get present(): T;
|
|
38
|
+
/**
|
|
39
|
+
* Check if undo is available.
|
|
40
|
+
*/
|
|
41
|
+
canUndo(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Check if redo is available.
|
|
44
|
+
*/
|
|
45
|
+
canRedo(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Get total number of states in undo stack.
|
|
48
|
+
*/
|
|
49
|
+
get undoCount(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Get total number of states in redo stack.
|
|
52
|
+
*/
|
|
53
|
+
get redoCount(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Get max history limit.
|
|
56
|
+
*/
|
|
57
|
+
get limit(): number;
|
|
58
|
+
/**
|
|
59
|
+
* Push a new state.
|
|
60
|
+
* Clears the redo stack and shifts oldest past entries if maxHistory is exceeded.
|
|
61
|
+
*/
|
|
62
|
+
push(nextState: T, event?: DocumentChangeEvent): void;
|
|
63
|
+
/**
|
|
64
|
+
* Undo to the previous state.
|
|
65
|
+
* Returns the restored state, or undefined if undo is not possible.
|
|
66
|
+
*/
|
|
67
|
+
undo(): T | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Redo to the next state in future stack.
|
|
70
|
+
* Returns the restored state, or undefined if redo is not possible.
|
|
71
|
+
*/
|
|
72
|
+
redo(): T | undefined;
|
|
73
|
+
/**
|
|
74
|
+
* Reset the history engine with a new initial state.
|
|
75
|
+
* Clears both undo and redo stacks (e.g. when loading a new document).
|
|
76
|
+
*/
|
|
77
|
+
reset(newState: T): void;
|
|
78
|
+
/**
|
|
79
|
+
* Clear both past and future stacks without changing the current state.
|
|
80
|
+
*/
|
|
81
|
+
clear(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get a snapshot of current history status.
|
|
84
|
+
*/
|
|
85
|
+
getState(): HistoryState<T>;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Document History Manager for PageDocument.
|
|
89
|
+
* Connects HistoryEngine with core command execution.
|
|
90
|
+
*/
|
|
91
|
+
export declare class DocumentHistoryManager {
|
|
92
|
+
private history;
|
|
93
|
+
constructor(initialDocument: PageDocument, options?: HistoryOptions);
|
|
94
|
+
get document(): PageDocument;
|
|
95
|
+
get canUndo(): boolean;
|
|
96
|
+
get canRedo(): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Execute a mutation command immutably and record the resulting state and change event in history.
|
|
99
|
+
*/
|
|
100
|
+
execute(executor: (currentDoc: PageDocument) => CommandResult): CommandResult;
|
|
101
|
+
undo(): PageDocument | undefined;
|
|
102
|
+
redo(): PageDocument | undefined;
|
|
103
|
+
reset(newDocument: PageDocument): void;
|
|
104
|
+
clear(): void;
|
|
105
|
+
getState(): HistoryState<PageDocument>;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;;;GAIG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,YAAY;IACzC,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,YAAY,EAAE,CAAC,EAAE,OAAO,GAAE,cAAmB;IAiBzD;;OAEG;IACH,IAAI,OAAO,IAAI,CAAC,CAEf;IAED;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAwBrD;;;OAGG;IACH,IAAI,IAAI,CAAC,GAAG,SAAS;IAYrB;;;OAGG;IACH,IAAI,IAAI,CAAC,GAAG,SAAS;IAYrB;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI;IAaxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC;CAS5B;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAA8B;gBAEjC,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc;IAInE,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,YAAY,KAAK,aAAa,GAAG,aAAa;IAO7E,IAAI,IAAI,YAAY,GAAG,SAAS;IAIhC,IAAI,IAAI,YAAY,GAAG,SAAS;IAIhC,KAAK,CAAC,WAAW,EAAE,YAAY,GAAG,IAAI;IAItC,KAAK,IAAI,IAAI;IAIb,QAAQ,IAAI,YAAY,CAAC,YAAY,CAAC;CAGvC"}
|