@pixi-ui-editor/schema 0.12.0 → 0.14.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.
@@ -0,0 +1,18 @@
1
+ import type { PrefabInstanceNode } from "./prefabs.js";
2
+ import type { UINode } from "./index.js";
3
+ /** A reference can be rewritten, or removed when its target no longer belongs to the operation. */
4
+ export type NodeReferenceRewriter = (address: string) => string | undefined;
5
+ /**
6
+ * The sole inventory of semantic node-to-node reference fields.
7
+ *
8
+ * Structural hierarchy links (`parentId` and `children`) intentionally do not participate: their
9
+ * remapping has different ownership rules. Every operation which copies, deletes, materializes or
10
+ * unpacks semantic node references must call this helper instead of switching on node types itself.
11
+ */
12
+ export declare function rewriteNodeReferences(node: UINode, rewrite: NodeReferenceRewriter): void;
13
+ /**
14
+ * Applies the same inventory to sparse prefab patches. Patches are intentionally untyped records,
15
+ * so this is the only permitted place to inspect their reference-shaped fields.
16
+ */
17
+ export declare function rewritePrefabInstanceReferencePatches(instance: PrefabInstanceNode, rewrite: NodeReferenceRewriter): void;
18
+ //# sourceMappingURL=nodeReferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeReferences.d.ts","sourceRoot":"","sources":["../src/nodeReferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAkB,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzD,mGAAmG;AACnG,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAe5E;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAiCxF;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CA6BxH"}
@@ -0,0 +1,109 @@
1
+ function rewriteAddress(value, rewrite) {
2
+ return value === undefined ? undefined : rewrite(value);
3
+ }
4
+ function rewriteConnectorArray(value, rewrite) {
5
+ if (value === undefined)
6
+ return undefined;
7
+ const connectors = value.flatMap((connector) => {
8
+ const targetNodeId = rewrite(connector.targetNodeId);
9
+ return targetNodeId === undefined ? [] : [{ ...connector, targetNodeId }];
10
+ });
11
+ return connectors.length === 0 ? undefined : connectors;
12
+ }
13
+ /**
14
+ * The sole inventory of semantic node-to-node reference fields.
15
+ *
16
+ * Structural hierarchy links (`parentId` and `children`) intentionally do not participate: their
17
+ * remapping has different ownership rules. Every operation which copies, deletes, materializes or
18
+ * unpacks semantic node references must call this helper instead of switching on node types itself.
19
+ */
20
+ export function rewriteNodeReferences(node, rewrite) {
21
+ if (node.type === "spine") {
22
+ const connectors = rewriteConnectorArray(node.connectors, rewrite);
23
+ if (connectors === undefined)
24
+ delete node.connectors;
25
+ else
26
+ node.connectors = connectors;
27
+ return;
28
+ }
29
+ if (node.type === "pagination") {
30
+ const prevButtonNodeId = rewriteAddress(node.prevButtonNodeId, rewrite);
31
+ const nextButtonNodeId = rewriteAddress(node.nextButtonNodeId, rewrite);
32
+ if (prevButtonNodeId === undefined)
33
+ delete node.prevButtonNodeId;
34
+ else
35
+ node.prevButtonNodeId = prevButtonNodeId;
36
+ if (nextButtonNodeId === undefined)
37
+ delete node.nextButtonNodeId;
38
+ else
39
+ node.nextButtonNodeId = nextButtonNodeId;
40
+ return;
41
+ }
42
+ if (node.type === "page-group") {
43
+ const pageUpButtonNodeId = rewriteAddress(node.pageUpButtonNodeId, rewrite);
44
+ const pageDownButtonNodeId = rewriteAddress(node.pageDownButtonNodeId, rewrite);
45
+ if (pageUpButtonNodeId === undefined)
46
+ delete node.pageUpButtonNodeId;
47
+ else
48
+ node.pageUpButtonNodeId = pageUpButtonNodeId;
49
+ if (pageDownButtonNodeId === undefined)
50
+ delete node.pageDownButtonNodeId;
51
+ else
52
+ node.pageDownButtonNodeId = pageDownButtonNodeId;
53
+ return;
54
+ }
55
+ if (node.type === "item-table" && node.items !== undefined) {
56
+ const items = node.items.flatMap((itemId) => {
57
+ const mapped = rewrite(itemId);
58
+ return mapped === undefined ? [] : [mapped];
59
+ });
60
+ if (items.length === 0)
61
+ delete node.items;
62
+ else
63
+ node.items = items;
64
+ }
65
+ }
66
+ /**
67
+ * Applies the same inventory to sparse prefab patches. Patches are intentionally untyped records,
68
+ * so this is the only permitted place to inspect their reference-shaped fields.
69
+ */
70
+ export function rewritePrefabInstanceReferencePatches(instance, rewrite) {
71
+ for (const override of instance.propertyOverrides ?? []) {
72
+ const patch = override.patch;
73
+ if (Array.isArray(patch.connectors)) {
74
+ const connectors = patch.connectors.flatMap((value) => {
75
+ if (typeof value !== "object" || value === null)
76
+ return [];
77
+ const connector = value;
78
+ if ((connector.partType !== "bone" && connector.partType !== "slot") || typeof connector.partName !== "string" || typeof connector.targetNodeId !== "string")
79
+ return [];
80
+ const targetNodeId = rewrite(connector.targetNodeId);
81
+ return targetNodeId === undefined ? [] : [{ ...connector, targetNodeId }];
82
+ });
83
+ if (connectors.length === 0)
84
+ delete patch.connectors;
85
+ else
86
+ patch.connectors = connectors;
87
+ }
88
+ for (const field of ["prevButtonNodeId", "nextButtonNodeId", "pageUpButtonNodeId", "pageDownButtonNodeId"]) {
89
+ if (typeof patch[field] !== "string")
90
+ continue;
91
+ const mapped = rewrite(patch[field]);
92
+ if (mapped === undefined)
93
+ delete patch[field];
94
+ else
95
+ patch[field] = mapped;
96
+ }
97
+ if (Array.isArray(patch.items)) {
98
+ const items = patch.items.flatMap((item) => typeof item === "string" ? (() => {
99
+ const mapped = rewrite(item);
100
+ return mapped === undefined ? [] : [mapped];
101
+ })() : []);
102
+ if (items.length === 0)
103
+ delete patch.items;
104
+ else
105
+ patch.items = items;
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=nodeReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeReferences.js","sourceRoot":"","sources":["../src/nodeReferences.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabInstanceNode } from \"./prefabs.js\";\r\nimport type { SpineConnector, UINode } from \"./index.js\";\r\n\r\n/** A reference can be rewritten, or removed when its target no longer belongs to the operation. */\r\nexport type NodeReferenceRewriter = (address: string) => string | undefined;\r\n\r\nfunction rewriteAddress(value: string | undefined, rewrite: NodeReferenceRewriter): string | undefined {\r\n return value === undefined ? undefined : rewrite(value);\r\n}\r\n\r\nfunction rewriteConnectorArray(value: SpineConnector[] | undefined, rewrite: NodeReferenceRewriter): SpineConnector[] | undefined {\r\n if (value === undefined) return undefined;\r\n const connectors = value.flatMap((connector) => {\r\n const targetNodeId = rewrite(connector.targetNodeId);\r\n return targetNodeId === undefined ? [] : [{ ...connector, targetNodeId }];\r\n });\r\n return connectors.length === 0 ? undefined : connectors;\r\n}\r\n\r\n/**\r\n * The sole inventory of semantic node-to-node reference fields.\r\n *\r\n * Structural hierarchy links (`parentId` and `children`) intentionally do not participate: their\r\n * remapping has different ownership rules. Every operation which copies, deletes, materializes or\r\n * unpacks semantic node references must call this helper instead of switching on node types itself.\r\n */\r\nexport function rewriteNodeReferences(node: UINode, rewrite: NodeReferenceRewriter): void {\r\n if (node.type === \"spine\") {\r\n const connectors = rewriteConnectorArray(node.connectors, rewrite);\r\n if (connectors === undefined) delete node.connectors;\r\n else node.connectors = connectors;\r\n return;\r\n }\r\n if (node.type === \"pagination\") {\r\n const prevButtonNodeId = rewriteAddress(node.prevButtonNodeId, rewrite);\r\n const nextButtonNodeId = rewriteAddress(node.nextButtonNodeId, rewrite);\r\n if (prevButtonNodeId === undefined) delete node.prevButtonNodeId;\r\n else node.prevButtonNodeId = prevButtonNodeId;\r\n if (nextButtonNodeId === undefined) delete node.nextButtonNodeId;\r\n else node.nextButtonNodeId = nextButtonNodeId;\r\n return;\r\n }\r\n if (node.type === \"page-group\") {\r\n const pageUpButtonNodeId = rewriteAddress(node.pageUpButtonNodeId, rewrite);\r\n const pageDownButtonNodeId = rewriteAddress(node.pageDownButtonNodeId, rewrite);\r\n if (pageUpButtonNodeId === undefined) delete node.pageUpButtonNodeId;\r\n else node.pageUpButtonNodeId = pageUpButtonNodeId;\r\n if (pageDownButtonNodeId === undefined) delete node.pageDownButtonNodeId;\r\n else node.pageDownButtonNodeId = pageDownButtonNodeId;\r\n return;\r\n }\r\n if (node.type === \"item-table\" && node.items !== undefined) {\r\n const items = node.items.flatMap((itemId) => {\r\n const mapped = rewrite(itemId);\r\n return mapped === undefined ? [] : [mapped];\r\n });\r\n if (items.length === 0) delete node.items;\r\n else node.items = items;\r\n }\r\n}\r\n\r\n/**\r\n * Applies the same inventory to sparse prefab patches. Patches are intentionally untyped records,\r\n * so this is the only permitted place to inspect their reference-shaped fields.\r\n */\r\nexport function rewritePrefabInstanceReferencePatches(instance: PrefabInstanceNode, rewrite: NodeReferenceRewriter): void {\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const patch = override.patch as Record<string, unknown>;\r\n if (Array.isArray(patch.connectors)) {\r\n const connectors = patch.connectors.flatMap((value) => {\r\n if (typeof value !== \"object\" || value === null) return [];\r\n const connector = value as Partial<SpineConnector>;\r\n if ((connector.partType !== \"bone\" && connector.partType !== \"slot\") || typeof connector.partName !== \"string\" || typeof connector.targetNodeId !== \"string\") return [];\r\n const targetNodeId = rewrite(connector.targetNodeId);\r\n return targetNodeId === undefined ? [] : [{ ...connector, targetNodeId }];\r\n });\r\n if (connectors.length === 0) delete patch.connectors;\r\n else patch.connectors = connectors;\r\n }\r\n for (const field of [\"prevButtonNodeId\", \"nextButtonNodeId\", \"pageUpButtonNodeId\", \"pageDownButtonNodeId\"] as const) {\r\n if (typeof patch[field] !== \"string\") continue;\r\n const mapped = rewrite(patch[field]);\r\n if (mapped === undefined) delete patch[field];\r\n else patch[field] = mapped;\r\n }\r\n if (Array.isArray(patch.items)) {\r\n const items = patch.items.flatMap((item) => typeof item === \"string\" ? (() => {\r\n const mapped = rewrite(item);\r\n return mapped === undefined ? [] : [mapped];\r\n })() : []);\r\n if (items.length === 0) delete patch.items;\r\n else patch.items = items;\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"prefabs.d.ts","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKhG;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,MAAM,4BAA4B,GACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;CACpD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,oFAAoF;AACpF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI9G;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7E;AAMD,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAYnG;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiB9F;AA6JD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,SAAS,CAEjI;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAS3H;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAe1G;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAsEjH;AAED,kFAAkF;AAClF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAS9I;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAEpH;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAM1I;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAMhH;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAarH;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMxF;AA6HD,MAAM,MAAM,kBAAkB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAczI;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACpF;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAA;CAAE,CAoBhG"}
1
+ {"version":3,"file":"prefabs.d.ts","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMhG;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,MAAM,4BAA4B,GACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;CACpD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,oFAAoF;AACpF,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI9G;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7E;AAMD,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAYnG;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiB9F;AA0JD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,SAAS,CAEjI;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAS3H;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAe1G;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAsEjH;AAED,kFAAkF;AAClF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAS9I;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAEpH;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAM1I;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAMhH;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAarH;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMxF;AAkHD,MAAM,MAAM,kBAAkB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAczI;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACpF;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAA;CAAE,CAoBhG"}
package/dist/prefabs.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { collectBindingKeys, collectBindingKeyScopes } from "./bindingKeys.js";
2
+ import { rewriteNodeReferences, rewritePrefabInstanceReferencePatches } from "./nodeReferences.js";
2
3
  const STRUCTURAL_OVERRIDE_KEYS = new Set(["id", "type", "parentId", "children", "editorOnly", "locked", "prefabId", "propertyOverrides", "locallyAddedNodes"]);
3
4
  /**
4
5
  * Разделитель сегментов адреса внутри инстанса пресета.
@@ -188,26 +189,21 @@ function materializeInstance(document, instance, expandingPrefabIds, applyInstan
188
189
  if (parent !== undefined && !parent.children.includes(node.id))
189
190
  parent.children.push(node.id);
190
191
  }
191
- // Connector references authored inside a reusable definition are relative to that definition.
192
- // Materialization gives their targets the same instance-scoped IDs as the hierarchy itself.
192
+ // Semantic references authored inside a reusable definition are relative to that definition.
193
+ // Materialization gives all their targets the same instance-scoped IDs as the hierarchy itself.
193
194
  const idByAddress = new Map();
194
195
  origins.forEach((origin, id) => {
195
196
  if (origin.kind === "inherited" && origin.instanceId === ownerId)
196
197
  idByAddress.set(origin.nodePath, id);
197
198
  });
198
199
  for (const node of nodes) {
199
- if (node.type !== "spine" || node.connectors === undefined)
200
- continue;
201
200
  const origin = origins.get(node.id);
202
201
  const ownPath = origin?.kind === "inherited" ? origin.nodePath : "";
203
202
  const ownSegments = ownPath === "" ? [] : splitNodePath(ownPath);
204
203
  const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);
205
- node.connectors = node.connectors.map((connector) => {
206
- if (nodesById.has(connector.targetNodeId))
207
- return connector;
208
- const relative = composePrefabNodePath(prefix, connector.targetNodeId);
209
- return { ...connector, targetNodeId: idByAddress.get(relative) ?? idByAddress.get(connector.targetNodeId) ?? connector.targetNodeId };
210
- });
204
+ rewriteNodeReferences(node, (targetNodeId) => nodesById.has(targetNodeId)
205
+ ? targetNodeId
206
+ : idByAddress.get(composePrefabNodePath(prefix, targetNodeId)) ?? idByAddress.get(targetNodeId) ?? targetNodeId);
211
207
  }
212
208
  return {
213
209
  rootNodeIds: [
@@ -482,9 +478,7 @@ function unpackInstance(document, location, createId) {
482
478
  node.id = remap(node.id);
483
479
  node.children = node.children.map(remap);
484
480
  node.parentId = node.parentId === null ? instance.id : remap(node.parentId);
485
- if (node.type === "spine" && node.connectors !== undefined) {
486
- node.connectors = node.connectors.map((connector) => ({ ...connector, targetNodeId: remap(connector.targetNodeId) }));
487
- }
481
+ rewriteNodeReferences(node, remap);
488
482
  }
489
483
  const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;
490
484
  const container = { ...structuredClone(base), type: "container", children: draftPrefab.rootNodeIds.map(remap) };
@@ -509,23 +503,14 @@ function rewriteUnpackedAddresses(document, instanceId, idByAddress) {
509
503
  return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);
510
504
  };
511
505
  forEachPrefabInstance(document, (instance) => {
512
- for (const override of instance.propertyOverrides ?? []) {
506
+ for (const override of instance.propertyOverrides ?? [])
513
507
  override.nodeId = rewrite(override.nodeId);
514
- if (Array.isArray(override.patch.connectors)) {
515
- override.patch.connectors = override.patch.connectors.map((value) => {
516
- if (typeof value !== "object" || value === null || !("targetNodeId" in value) || typeof value.targetNodeId !== "string")
517
- return value;
518
- return { ...value, targetNodeId: rewrite(value.targetNodeId) };
519
- });
520
- }
521
- }
508
+ rewritePrefabInstanceReferencePatches(instance, rewrite);
522
509
  for (const local of instance.locallyAddedNodes ?? [])
523
510
  if (local.parentId !== null)
524
511
  local.parentId = rewrite(local.parentId);
525
- for (const local of instance.locallyAddedNodes ?? []) {
526
- if (local.type === "spine" && local.connectors !== undefined)
527
- local.connectors = local.connectors.map((connector) => ({ ...connector, targetNodeId: rewrite(connector.targetNodeId) }));
528
- }
512
+ for (const local of instance.locallyAddedNodes ?? [])
513
+ rewriteNodeReferences(local, rewrite);
529
514
  });
530
515
  }
531
516
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"prefabs.js","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabDefinition, PrefabNodeOverride, ProjectDocument, UINode } from \"./index.js\";\r\nimport { collectBindingKeys, collectBindingKeyScopes } from \"./bindingKeys.js\";\r\n\r\nconst STRUCTURAL_OVERRIDE_KEYS = new Set([\"id\", \"type\", \"parentId\", \"children\", \"editorOnly\", \"locked\", \"prefabId\", \"propertyOverrides\", \"locallyAddedNodes\"]);\r\n\r\n/**\r\n * Разделитель сегментов адреса внутри инстанса пресета.\r\n *\r\n * Адрес — это путь по вложенным пресетам: `defA` — узел определения самого инстанса,\r\n * `defA::prefab-node::defB` — узел `defB` внутри инстанса `defA`, вложенного в определение. Документ\r\n * до вложенных пресетов хранил ровно один сегмент, поэтому старые адреса остаются валидными путями.\r\n */\r\nexport const PREFAB_NODE_PATH_SEPARATOR = \"::prefab-node::\";\r\n\r\nexport type PrefabInstanceNode = Extract<UINode, { type: \"prefab-instance\" }>;\r\n\r\n/**\r\n * Откуда взялся узел развёрнутого инстанса.\r\n *\r\n * `instanceId` всегда указывает на **персистентный** узел-инстанс: сцену/пресет-владельца или\r\n * локально добавленный инстанс. Именно в нём хранятся `propertyOverrides` и `locallyAddedNodes` для\r\n * этого узла. `inherited` — часть структуры пресета: её можно переопределить по свойствам (patch\r\n * адресуется `nodePath`), но нельзя удалить или перенести. `local` — обычный редактируемый узел.\r\n */\r\nexport type MaterializedPrefabNodeOrigin =\r\n | { kind: \"inherited\"; instanceId: string; nodePath: string }\r\n | { kind: \"local\"; instanceId: string; localNodeId: string };\r\n\r\nexport type MaterializedPrefab = {\r\n rootNodeIds: string[];\r\n nodes: UINode[];\r\n origins: Map<string, MaterializedPrefabNodeOrigin>;\r\n};\r\n\r\nexport function materializedPrefabNodeId(instanceId: string, nodePath: string): string {\r\n return `${instanceId}${PREFAB_NODE_PATH_SEPARATOR}${nodePath}`;\r\n}\r\n\r\n/** Первый разделитель отделяет персистентный инстанс от адреса узла внутри него. */\r\nexport function parseMaterializedPrefabNodeId(id: string): { instanceId: string; nodePath: string } | undefined {\r\n const separator = id.indexOf(PREFAB_NODE_PATH_SEPARATOR);\r\n if (separator < 0) return undefined;\r\n return { instanceId: id.slice(0, separator), nodePath: id.slice(separator + PREFAB_NODE_PATH_SEPARATOR.length) };\r\n}\r\n\r\n/** Склеивает адрес узла с адресом инстанса, внутри которого он объявлен. */\r\nexport function composePrefabNodePath(prefix: string, address: string): string {\r\n return prefix === \"\" ? address : `${prefix}${PREFAB_NODE_PATH_SEPARATOR}${address}`;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/** Applies a persisted sparse patch without allowing prefab hierarchy identity to change. */\r\nexport function applyPrefabNodePatch(base: UINode, patch: Readonly<Record<string, unknown>>): UINode {\r\n const merge = (current: unknown, next: unknown, root = false): unknown => {\r\n if (!isRecord(next)) return structuredClone(next);\r\n const result: Record<string, unknown> = isRecord(current) ? structuredClone(current) : {};\r\n for (const [key, value] of Object.entries(next)) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (value === null) delete result[key];\r\n else result[key] = isRecord(value) ? merge(result[key], value) : structuredClone(value);\r\n }\r\n return result;\r\n };\r\n return merge(base, patch, true) as UINode;\r\n}\r\n\r\n/** Produces the smallest deterministic merge patch used by instance property overrides. */\r\nexport function createPrefabNodePatch(base: UINode, effective: UINode): Record<string, unknown> {\r\n const diff = (before: unknown, after: unknown, root = false): unknown => {\r\n if (Object.is(before, after)) return undefined;\r\n if (!isRecord(before) || !isRecord(after)) return structuredClone(after);\r\n const patch: Record<string, unknown> = {};\r\n const keys = new Set([...Object.keys(before), ...Object.keys(after)]);\r\n for (const key of [...keys].sort()) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (!Object.hasOwn(after, key)) patch[key] = null;\r\n else {\r\n const value = diff(before[key], after[key]);\r\n if (value !== undefined) patch[key] = value;\r\n }\r\n }\r\n return Object.keys(patch).length === 0 ? undefined : patch;\r\n };\r\n return (diff(base, effective, true) as Record<string, unknown> | undefined) ?? {};\r\n}\r\n\r\n/** Один слой property overrides, адресованный в пространстве адресов персистентного инстанса. */\r\ntype PatchLayer = ReadonlyMap<string, Readonly<Record<string, unknown>>>;\r\n\r\n/**\r\n * Разворачивает один персистентный инстанс во все его узлы, включая вложенные пресеты.\r\n *\r\n * Приоритет патчей — как у Unity: чем ближе инстанс к сцене, тем он старше. Слои идут от владельца\r\n * (индекс 0) к самым глубоким определениям, поэтому применяются в обратном порядке.\r\n */\r\nfunction materializeInstance(\r\n document: ProjectDocument,\r\n instance: PrefabInstanceNode,\r\n expandingPrefabIds: ReadonlySet<string>,\r\n applyInstanceOverrides: boolean,\r\n): MaterializedPrefab | undefined {\r\n const rootPrefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (rootPrefab === undefined) return undefined;\r\n\r\n const ownerId = instance.id;\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const editableLocalIds = new Set(localNodes.map((node) => node.id));\r\n // Локальный узел персистентен сам по себе, поэтому сохраняет собственный stable ID; всё\r\n // унаследованное получает ID, привязанный к инстансу, чтобы два инстанса не конфликтовали.\r\n const idOf = (address: string): string => (editableLocalIds.has(address) ? address : materializedPrefabNodeId(ownerId, address));\r\n\r\n const nodes: UINode[] = [];\r\n const nodesById = new Map<string, UINode>();\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n const emit = (source: UINode, effective: UINode, prefix: string, address: string, origin: MaterializedPrefabNodeOrigin): void => {\r\n const id = idOf(address);\r\n const node = {\r\n ...structuredClone(effective),\r\n id,\r\n parentId: source.parentId === null\r\n ? (prefix === \"\" ? null : idOf(prefix))\r\n : idOf(composePrefabNodePath(prefix, source.parentId)),\r\n children: source.children.map((childId) => idOf(composePrefabNodePath(prefix, childId))),\r\n } as UINode;\r\n nodes.push(node);\r\n nodesById.set(id, node);\r\n origins.set(id, origin);\r\n };\r\n\r\n const patched = (base: UINode, address: string, layers: readonly PatchLayer[]): UINode => {\r\n let effective = base;\r\n for (let index = layers.length - 1; index >= 0; index -= 1) {\r\n const patch = layers[index]!.get(address);\r\n if (patch !== undefined) effective = applyPrefabNodePatch(effective, patch);\r\n }\r\n return effective;\r\n };\r\n\r\n const layerOf = (node: PrefabInstanceNode, prefix: string): PatchLayer =>\r\n new Map((node.propertyOverrides ?? []).map((override) => [composePrefabNodePath(prefix, override.nodeId), override.patch] as const));\r\n\r\n /**\r\n * Разворачивает локально добавленный инстанс: он персистентен и владеет собственной конфигурацией.\r\n *\r\n * Развёртка начинается с чистого набора: бесконечной иерархия становится только если определение\r\n * пресета содержит само себя, а локальное добавление — конечные данные документа. Инстанс пресета\r\n * внутри развёртки того же пресета поэтому допустим, как и в Unity.\r\n */\r\n const mergeOwnedInstance = (local: PrefabInstanceNode): void => {\r\n const sub = materializeInstance(document, local, new Set(), true);\r\n if (sub === undefined) return;\r\n const host = nodesById.get(local.id);\r\n for (const subNode of sub.nodes) {\r\n if (subNode.parentId === null) subNode.parentId = local.id;\r\n nodes.push(subNode);\r\n nodesById.set(subNode.id, subNode);\r\n }\r\n sub.origins.forEach((origin, id) => origins.set(id, origin));\r\n if (host === undefined) return;\r\n for (const rootId of sub.rootNodeIds) if (!host.children.includes(rootId)) host.children.push(rootId);\r\n };\r\n\r\n const expandContent = (host: PrefabInstanceNode, prefix: string, layers: readonly PatchLayer[], expanding: ReadonlySet<string>): void => {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === host.prefabId);\r\n const expandable = prefab !== undefined && !expanding.has(prefab.id);\r\n const nextExpanding = prefab === undefined ? expanding : new Set([...expanding, prefab.id]);\r\n const nested: { node: PrefabInstanceNode; address: string }[] = [];\r\n\r\n if (expandable) {\r\n for (const definitionNode of prefab.nodes) {\r\n const address = composePrefabNodePath(prefix, definitionNode.id);\r\n emit(definitionNode, patched(definitionNode, address, layers), prefix, address, { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (definitionNode.type === \"prefab-instance\") nested.push({ node: definitionNode, address });\r\n }\r\n // Корни определения становятся детьми самого узла-инстанса; на верхнем уровне их забирает владелец.\r\n const hostNode = prefix === \"\" ? undefined : nodesById.get(idOf(prefix));\r\n if (hostNode !== undefined) {\r\n for (const rootId of prefab.rootNodeIds) {\r\n const childId = idOf(composePrefabNodePath(prefix, rootId));\r\n if (nodesById.has(childId) && !hostNode.children.includes(childId)) hostNode.children.push(childId);\r\n }\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n nested.length = 0;\r\n }\r\n\r\n // Локальные добавления владельца редактируемы; те, что пришли из определения, унаследованы.\r\n const editable = prefix === \"\";\r\n for (const local of host.locallyAddedNodes ?? []) {\r\n const address = composePrefabNodePath(prefix, local.id);\r\n emit(local, editable ? local : patched(local, address, layers), prefix, address, editable\r\n ? { kind: \"local\", instanceId: ownerId, localNodeId: local.id }\r\n : { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (local.type !== \"prefab-instance\") continue;\r\n if (editable) mergeOwnedInstance(local);\r\n else nested.push({ node: local, address });\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n };\r\n\r\n expandContent(instance, \"\", [applyInstanceOverrides ? layerOf(instance, \"\") : new Map()], expandingPrefabIds);\r\n\r\n // Единая до-привязка: локальные узлы и корни вложенных развёрток попадают в children родителя,\r\n // если тот их ещё не перечисляет. Порядок повторяет порядок выпуска узлов: сначала структура\r\n // определения, затем локальные добавления от самого глубокого пресета к сцене.\r\n for (const node of nodes) {\n if (node.parentId === null) continue;\n const parent = nodesById.get(node.parentId);\n if (parent !== undefined && !parent.children.includes(node.id)) parent.children.push(node.id);\n }\n\n // Connector references authored inside a reusable definition are relative to that definition.\n // Materialization gives their targets the same instance-scoped IDs as the hierarchy itself.\n const idByAddress = new Map<string, string>();\n origins.forEach((origin, id) => {\n if (origin.kind === \"inherited\" && origin.instanceId === ownerId) idByAddress.set(origin.nodePath, id);\n });\n for (const node of nodes) {\n if (node.type !== \"spine\" || node.connectors === undefined) continue;\n const origin = origins.get(node.id);\n const ownPath = origin?.kind === \"inherited\" ? origin.nodePath : \"\";\n const ownSegments = ownPath === \"\" ? [] : splitNodePath(ownPath);\n const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);\n node.connectors = node.connectors.map((connector) => {\n if (nodesById.has(connector.targetNodeId)) return connector;\n const relative = composePrefabNodePath(prefix, connector.targetNodeId);\n return { ...connector, targetNodeId: idByAddress.get(relative) ?? idByAddress.get(connector.targetNodeId) ?? connector.targetNodeId };\n });\n }\n\r\n return {\r\n rootNodeIds: [\r\n ...rootPrefab.rootNodeIds.map((id) => idOf(id)).filter((id) => nodesById.has(id)),\r\n ...localNodes.filter((node) => node.parentId === null).map((node) => node.id),\r\n ],\r\n nodes,\r\n origins,\r\n };\r\n}\r\n\r\nexport function materializePrefabInstance(document: ProjectDocument, instance: PrefabInstanceNode): MaterializedPrefab | undefined {\r\n return materializeInstance(document, instance, new Set(), true);\r\n}\r\n\r\n/**\r\n * Узлы инстанса до применения его собственных property overrides, по адресам.\r\n *\r\n * Это «база» для нормализации и валидации: она уже включает конфигурацию вложенных инстансов,\r\n * записанную в определениях пресетов, поэтому override, повторяющий её значение, схлопывается.\r\n */\r\nexport function resolvePrefabInstanceBaseNodes(document: ProjectDocument, instance: PrefabInstanceNode): Map<string, UINode> {\r\n const base = new Map<string, UINode>();\r\n const materialized = materializeInstance(document, instance, new Set(), false);\r\n if (materialized === undefined) return base;\r\n for (const node of materialized.nodes) {\r\n const origin = materialized.origins.get(node.id);\r\n if (origin?.kind === \"inherited\" && origin.instanceId === instance.id) base.set(origin.nodePath, node);\r\n }\r\n return base;\r\n}\r\n\r\nexport function normalizePrefabNodeOverrides(document: ProjectDocument, instance: PrefabInstanceNode): void {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance);\r\n const normalized: PrefabNodeOverride[] = [];\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const baseNode = base.get(override.nodeId);\r\n if (baseNode === undefined) {\r\n normalized.push(override);\r\n continue;\r\n }\r\n const patch = createPrefabNodePatch(baseNode, applyPrefabNodePatch(baseNode, override.patch));\r\n if (Object.keys(patch).length > 0) normalized.push({ nodeId: override.nodeId, patch });\r\n }\r\n if (normalized.length === 0) delete instance.propertyOverrides;\r\n else instance.propertyOverrides = normalized;\r\n if (instance.locallyAddedNodes?.length === 0) delete instance.locallyAddedNodes;\r\n}\r\n\r\nfunction splitNodePath(path: string): string[] {\r\n return path.split(PREFAB_NODE_PATH_SEPARATOR);\r\n}\r\n\r\nfunction storeNestedOverride(document: ProjectDocument, instance: PrefabInstanceNode, nodePath: string, patch: Readonly<Record<string, unknown>>): boolean {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance).get(nodePath);\r\n if (base === undefined) return false;\r\n const overrides = instance.propertyOverrides ??= [];\r\n const existing = overrides.find((candidate) => candidate.nodeId === nodePath);\r\n const effective = applyPrefabNodePatch(existing === undefined ? base : applyPrefabNodePatch(base, existing.patch), patch);\r\n const mergedPatch = createPrefabNodePatch(base, effective);\r\n if (Object.keys(mergedPatch).length === 0) {\r\n if (existing !== undefined) overrides.splice(overrides.indexOf(existing), 1);\r\n } else if (existing === undefined) overrides.push({ nodeId: nodePath, patch: mergedPatch });\r\n else existing.patch = mergedPatch;\r\n if (overrides.length === 0) delete instance.propertyOverrides;\r\n return true;\r\n}\r\n\r\ntype LocalDestination = { prefab: PrefabDefinition } | { instance: PrefabInstanceNode; prefix: string };\r\n\r\n/**\r\n * Переносит конфигурацию инстанса (overrides и локально добавленные узлы) в его определение.\r\n *\r\n * Прямые overrides переписывают узлы определения, вложенные — становятся конфигурацией того\r\n * persisted-инстанса, к которому относятся, а локальные поддеревья переезжают целиком, сохраняя\r\n * stable ID. Сам инстанс после успешного переноса теряет конфигурацию: она уже в определении.\r\n *\r\n * Это же преобразование лежит в основе распаковки инстанса (`unpackPrefabInstances`): там оно\r\n * применяется к одноразовой копии определения, которая потом встраивается в сцену как обычные узлы.\r\n */\r\nexport function applyPrefabInstanceConfiguration(document: ProjectDocument, instance: PrefabInstanceNode): boolean {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return false;\r\n const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));\r\n\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return false;\r\n if (nestedPath.length === 0) {\r\n const patched = applyPrefabNodePatch(definitionNode, override.patch);\r\n const mutableDefinitionNode = definitionNode as unknown as Record<string, unknown>;\r\n for (const key of Object.keys(mutableDefinitionNode)) delete mutableDefinitionNode[key];\r\n Object.assign(mutableDefinitionNode, patched);\r\n continue;\r\n }\r\n if (definitionNode.type !== \"prefab-instance\" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), override.patch)) return false;\r\n }\r\n\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const localsById = new Map(localNodes.map((node) => [node.id, node]));\r\n const destinations = new Map<string, LocalDestination>();\r\n const destinationOf = (node: UINode): LocalDestination | undefined => {\r\n const cached = destinations.get(node.id);\r\n if (cached !== undefined) return cached;\r\n const localParent = node.parentId === null ? undefined : localsById.get(node.parentId);\r\n if (localParent !== undefined) {\r\n const destination = destinationOf(localParent);\r\n if (destination !== undefined) destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n if (node.parentId !== null) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(node.parentId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return undefined;\r\n if (definitionNode.type === \"prefab-instance\") {\r\n const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR) };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n }\r\n const destination = { prefab };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n };\r\n\r\n for (const local of localNodes) {\r\n const destination = destinationOf(local);\r\n if (destination === undefined) return false;\r\n const copy = structuredClone(local);\r\n const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);\r\n if (\"instance\" in destination) {\r\n if (!parentIsLocal) copy.parentId = destination.prefix === \"\" ? null : destination.prefix;\r\n (destination.instance.locallyAddedNodes ??= []).push(copy);\r\n continue;\r\n }\r\n destination.prefab.nodes.push(copy);\r\n definitionNodes.set(copy.id, copy);\r\n if (parentIsLocal) continue;\r\n if (copy.parentId === null) destination.prefab.rootNodeIds.push(copy.id);\r\n else {\r\n const parent = definitionNodes.get(copy.parentId);\r\n if (parent === undefined) return false;\r\n if (!parent.children.includes(copy.id)) parent.children.push(copy.id);\r\n }\r\n }\r\n\r\n delete instance.propertyOverrides;\r\n delete instance.locallyAddedNodes;\r\n return true;\r\n}\r\n\r\n/** Обходит все персистентные инстансы владельца, включая локально добавленные. */\r\nexport function forEachPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, visit: (instance: PrefabInstanceNode) => void): void {\r\n const walk = (nodes: readonly UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n visit(node);\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n walk(owner.nodes);\r\n}\r\n\r\nexport function forEachPrefabInstance(document: ProjectDocument, visit: (instance: PrefabInstanceNode) => void): void {\r\n for (const owner of [...document.scenes, ...document.prefabs]) forEachPrefabInstanceInOwner(owner, visit);\r\n}\r\n\r\nexport function findPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, instanceId: string): PrefabInstanceNode | undefined {\r\n let found: PrefabInstanceNode | undefined;\r\n forEachPrefabInstanceInOwner(owner, (instance) => {\r\n if (found === undefined && instance.id === instanceId) found = instance;\r\n });\r\n return found;\r\n}\r\n\r\nexport function findPrefabInstance(document: ProjectDocument, instanceId: string): PrefabInstanceNode | undefined {\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const instance = findPrefabInstanceInOwner(owner, instanceId);\r\n if (instance !== undefined) return instance;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ссылается ли пресет на другой — сам собой или через любую цепочку вложенных инстансов.\r\n *\r\n * Так проверяется рекурсия: вставлять инстанс пресета туда, где он уже раскрывается, нельзя, иначе\r\n * иерархия стала бы бесконечной.\r\n */\r\nexport function prefabReferencesPrefab(document: ProjectDocument, prefabId: string, searchedPrefabId: string): boolean {\r\n const visited = new Set<string>();\r\n const visit = (id: string): boolean => {\r\n if (id === searchedPrefabId) return true;\r\n if (visited.has(id)) return false;\r\n visited.add(id);\r\n const prefab = document.prefabs.find((candidate) => candidate.id === id);\r\n if (prefab === undefined) return false;\r\n let found = false;\r\n forEachPrefabInstanceInOwner(prefab, (instance) => { found ||= visit(instance.prefabId); });\r\n return found;\r\n };\r\n return visit(prefabId);\r\n}\r\n\r\n/** Сколько раз пресет используется в документе, включая вложенные и локально добавленные инстансы. */\r\nexport function countPrefabInstances(document: ProjectDocument, prefabId: string): number {\r\n let count = 0;\r\n forEachPrefabInstance(document, (instance) => {\r\n if (instance.prefabId === prefabId) count += 1;\r\n });\r\n return count;\r\n}\r\n\r\n/**\r\n * Плоский граф авторинга владельца: его собственные узлы плюс развёрнутые поддеревья всех инстансов.\r\n *\r\n * Единственный резолвер иерархии: им пользуются и редактор (иерархия, selection, gizmos), и runtime\r\n * (сборка Pixi-дерева, сбор ассетов), поэтому расхождений между ними быть не может.\r\n */\r\ntype InstanceLocation = { nodes: UINode[]; instance: PrefabInstanceNode };\r\n\r\n/** Все персистентные инстансы пресета вместе с массивом узлов, в котором каждый из них лежит. */\r\nfunction locatePrefabInstances(document: ProjectDocument, prefabId: string): InstanceLocation[] {\r\n const found: InstanceLocation[] = [];\r\n const walk = (nodes: UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n if (node.prefabId === prefabId) found.push({ nodes, instance: node });\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n for (const owner of [...document.scenes, ...document.prefabs]) walk(owner.nodes);\r\n return found;\r\n}\r\n\r\n/**\r\n * Заменяет один инстанс обычным контейнером с тем же id, transform и содержимым.\r\n *\r\n * Развёртка идёт через одноразовую копию определения: конфигурация инстанса переносится в неё тем же\r\n * `applyPrefabInstanceConfiguration`, что и «Apply to preset», после чего узлы копии получают свежие\r\n * stable ID и встают на место инстанса. Вложенные инстансы других пресетов остаются инстансами и\r\n * сохраняют свою конфигурацию — распаковывается ровно один слой.\r\n *\r\n * Возвращает соответствие «адрес узла внутри инстанса → новый id узла»: по нему переписываются\r\n * адреса, которыми на это содержимое ссылались инстансы пресета-владельца.\r\n */\r\nfunction unpackInstance(document: ProjectDocument, location: InstanceLocation, createId: () => string): { idByAddress: Map<string, string>; inserted: UINode[] } | undefined {\r\n const { nodes, instance } = location;\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return undefined;\r\n\r\n const draftPrefab: PrefabDefinition = { ...structuredClone(prefab), id: createId() };\r\n const draftInstance = structuredClone(instance);\r\n draftInstance.prefabId = draftPrefab.id;\r\n document.prefabs.push(draftPrefab);\r\n const applied = applyPrefabInstanceConfiguration(document, draftInstance);\r\n document.prefabs.splice(document.prefabs.indexOf(draftPrefab), 1);\r\n if (!applied) return undefined;\r\n\r\n const idByAddress = new Map(draftPrefab.nodes.map((node) => [node.id, createId()] as const));\r\n const remap = (address: string): string => idByAddress.get(address) ?? address;\r\n for (const node of draftPrefab.nodes) {\n node.id = remap(node.id);\n node.children = node.children.map(remap);\n node.parentId = node.parentId === null ? instance.id : remap(node.parentId);\n if (node.type === \"spine\" && node.connectors !== undefined) {\n node.connectors = node.connectors.map((connector) => ({ ...connector, targetNodeId: remap(connector.targetNodeId) }));\n }\n }\n\r\n const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;\r\n const container = { ...structuredClone(base), type: \"container\", children: draftPrefab.rootNodeIds.map(remap) } as UINode;\r\n nodes.splice(nodes.indexOf(instance), 1, container, ...draftPrefab.nodes);\r\n return { idByAddress, inserted: draftPrefab.nodes };\r\n}\r\n\r\n/**\r\n * Переписывает адреса, которые вели внутрь распакованного инстанса.\r\n *\r\n * Инстанс мог лежать в определении пресета, и тогда его содержимое было адресуемо снаружи как\r\n * `…::instanceId::prefab-node::address`. После распаковки этот узел — обычная нода владельца, поэтому\r\n * оба сегмента схлопываются в её новый id. Адрес самого инстанса не меняется: контейнер сохранил id.\r\n */\r\nfunction rewriteUnpackedAddresses(document: ProjectDocument, instanceId: string, idByAddress: ReadonlyMap<string, string>): void {\n const rewrite = (path: string): string => {\r\n const segments = splitNodePath(path);\r\n const index = segments.indexOf(instanceId);\r\n const inner = index < 0 ? undefined : segments[index + 1];\r\n const mapped = inner === undefined ? undefined : idByAddress.get(inner);\r\n if (mapped === undefined) return path;\r\n return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);\r\n };\n forEachPrefabInstance(document, (instance) => {\n for (const override of instance.propertyOverrides ?? []) {\n override.nodeId = rewrite(override.nodeId);\n if (Array.isArray(override.patch.connectors)) {\n override.patch.connectors = override.patch.connectors.map((value) => {\n if (typeof value !== \"object\" || value === null || !(\"targetNodeId\" in value) || typeof value.targetNodeId !== \"string\") return value;\n return { ...value, targetNodeId: rewrite(value.targetNodeId) };\n });\n }\n }\n for (const local of instance.locallyAddedNodes ?? []) if (local.parentId !== null) local.parentId = rewrite(local.parentId);\n for (const local of instance.locallyAddedNodes ?? []) {\n if (local.type === \"spine\" && local.connectors !== undefined) local.connectors = local.connectors.map((connector) => ({ ...connector, targetNodeId: rewrite(connector.targetNodeId) }));\n }\n });\n}\r\n\r\n/**\r\n * Снимает binding-ключи, которые распаковка размножила в одной области разрешения.\r\n *\r\n * Внутри инстанса ключ принадлежал области этого инстанса, поэтому один и тот же пресет мог стоять на\r\n * сцене сколько угодно раз. Распакованные узлы попадают в область владельца, где ключ обязан быть\r\n * уникальным, поэтому конфликт разрешается в пользу узла, который существовал до распаковки, а среди\r\n * одних только новых узлов — в пользу первого.\r\n */\r\nfunction dropDuplicateBindingKeys(document: ProjectDocument, unpackedNodes: ReadonlyMap<string, UINode>): string[] {\r\n const dropped: string[] = [];\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const graph = resolveOwnerNodeGraph(document, owner);\r\n for (const scopeNodes of collectBindingKeyScopes(graph).values()) {\r\n for (const [key, nodeIds] of collectBindingKeys(scopeNodes)) {\r\n if (key === \"\" || nodeIds.length <= 1) continue;\r\n const unpacked = nodeIds.filter((id) => unpackedNodes.has(id));\r\n const victims = unpacked.length === nodeIds.length ? unpacked.slice(1) : unpacked;\r\n for (const id of victims) {\r\n delete unpackedNodes.get(id)!.bindingKey;\r\n if (!dropped.includes(key)) dropped.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return dropped;\r\n}\r\n\r\nexport type PrefabUnpackResult = { instances: number; droppedBindingKeys: string[] };\r\n\r\n/**\r\n * Разворачивает все инстансы пресета обратно в обычные узлы своих владельцев.\r\n *\r\n * Так удаление пресета перестаёт зависеть от того, используется он или нет: сцена сохраняет ровно то\r\n * же изображение, но её узлы больше не ссылаются на определение. Операция идёт по документу целиком —\r\n * сцены, определения других пресетов и локально добавленные поддеревья внутри инстансов.\r\n *\r\n * `undefined` означает, что конфигурация одного из инстансов не разложилась на узлы; вызывающий\r\n * должен отбросить весь кандидат-документ, а не применять его частично.\r\n */\r\nexport function unpackPrefabInstances(document: ProjectDocument, prefabId: string, createId: () => string): PrefabUnpackResult | undefined {\r\n const unpackedNodes = new Map<string, UINode>();\r\n let instances = 0;\r\n // Локация ищется заново на каждом шаге: распаковка внешнего инстанса переносит вложенные в новые\r\n // массивы узлов, поэтому собранные заранее ссылки протухли бы.\r\n for (let location = locatePrefabInstances(document, prefabId)[0]; location !== undefined; location = locatePrefabInstances(document, prefabId)[0]) {\r\n const instanceId = location.instance.id;\r\n const unpacked = unpackInstance(document, location, createId);\r\n if (unpacked === undefined) return undefined;\r\n rewriteUnpackedAddresses(document, instanceId, unpacked.idByAddress);\r\n for (const node of unpacked.inserted) unpackedNodes.set(node.id, node);\r\n instances += 1;\r\n }\r\n return { instances, droppedBindingKeys: dropDuplicateBindingKeys(document, unpackedNodes) };\r\n}\r\n\r\nexport function resolveOwnerNodeGraph(\r\n document: ProjectDocument,\r\n owner: { readonly rootNodeIds: readonly string[]; readonly nodes: readonly UINode[] },\r\n): { rootNodeIds: string[]; nodes: UINode[]; origins: Map<string, MaterializedPrefabNodeOrigin> } {\r\n const nodes = structuredClone(owner.nodes) as UINode[];\r\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n for (const ownerNode of owner.nodes) {\r\n if (ownerNode.type !== \"prefab-instance\") continue;\r\n const instanceCopy = nodesById.get(ownerNode.id);\r\n const materialized = materializePrefabInstance(document, ownerNode);\r\n if (materialized === undefined || instanceCopy === undefined) continue;\r\n instanceCopy.children = [...materialized.rootNodeIds];\r\n for (const materializedNode of materialized.nodes) {\r\n if (materializedNode.parentId === null) materializedNode.parentId = ownerNode.id;\r\n nodes.push(materializedNode);\r\n nodesById.set(materializedNode.id, materializedNode);\r\n }\r\n materialized.origins.forEach((origin, id) => origins.set(id, origin));\r\n }\r\n\r\n return { rootNodeIds: [...owner.rootNodeIds], nodes, origins };\r\n}\r\n"]}
1
+ {"version":3,"file":"prefabs.js","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabDefinition, PrefabNodeOverride, ProjectDocument, UINode } from \"./index.js\";\r\nimport { collectBindingKeys, collectBindingKeyScopes } from \"./bindingKeys.js\";\r\nimport { rewriteNodeReferences, rewritePrefabInstanceReferencePatches } from \"./nodeReferences.js\";\r\n\r\nconst STRUCTURAL_OVERRIDE_KEYS = new Set([\"id\", \"type\", \"parentId\", \"children\", \"editorOnly\", \"locked\", \"prefabId\", \"propertyOverrides\", \"locallyAddedNodes\"]);\r\n\r\n/**\r\n * Разделитель сегментов адреса внутри инстанса пресета.\r\n *\r\n * Адрес — это путь по вложенным пресетам: `defA` — узел определения самого инстанса,\r\n * `defA::prefab-node::defB` — узел `defB` внутри инстанса `defA`, вложенного в определение. Документ\r\n * до вложенных пресетов хранил ровно один сегмент, поэтому старые адреса остаются валидными путями.\r\n */\r\nexport const PREFAB_NODE_PATH_SEPARATOR = \"::prefab-node::\";\r\n\r\nexport type PrefabInstanceNode = Extract<UINode, { type: \"prefab-instance\" }>;\r\n\r\n/**\r\n * Откуда взялся узел развёрнутого инстанса.\r\n *\r\n * `instanceId` всегда указывает на **персистентный** узел-инстанс: сцену/пресет-владельца или\r\n * локально добавленный инстанс. Именно в нём хранятся `propertyOverrides` и `locallyAddedNodes` для\r\n * этого узла. `inherited` — часть структуры пресета: её можно переопределить по свойствам (patch\r\n * адресуется `nodePath`), но нельзя удалить или перенести. `local` — обычный редактируемый узел.\r\n */\r\nexport type MaterializedPrefabNodeOrigin =\r\n | { kind: \"inherited\"; instanceId: string; nodePath: string }\r\n | { kind: \"local\"; instanceId: string; localNodeId: string };\r\n\r\nexport type MaterializedPrefab = {\r\n rootNodeIds: string[];\r\n nodes: UINode[];\r\n origins: Map<string, MaterializedPrefabNodeOrigin>;\r\n};\r\n\r\nexport function materializedPrefabNodeId(instanceId: string, nodePath: string): string {\r\n return `${instanceId}${PREFAB_NODE_PATH_SEPARATOR}${nodePath}`;\r\n}\r\n\r\n/** Первый разделитель отделяет персистентный инстанс от адреса узла внутри него. */\r\nexport function parseMaterializedPrefabNodeId(id: string): { instanceId: string; nodePath: string } | undefined {\r\n const separator = id.indexOf(PREFAB_NODE_PATH_SEPARATOR);\r\n if (separator < 0) return undefined;\r\n return { instanceId: id.slice(0, separator), nodePath: id.slice(separator + PREFAB_NODE_PATH_SEPARATOR.length) };\r\n}\r\n\r\n/** Склеивает адрес узла с адресом инстанса, внутри которого он объявлен. */\r\nexport function composePrefabNodePath(prefix: string, address: string): string {\r\n return prefix === \"\" ? address : `${prefix}${PREFAB_NODE_PATH_SEPARATOR}${address}`;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/** Applies a persisted sparse patch without allowing prefab hierarchy identity to change. */\r\nexport function applyPrefabNodePatch(base: UINode, patch: Readonly<Record<string, unknown>>): UINode {\r\n const merge = (current: unknown, next: unknown, root = false): unknown => {\r\n if (!isRecord(next)) return structuredClone(next);\r\n const result: Record<string, unknown> = isRecord(current) ? structuredClone(current) : {};\r\n for (const [key, value] of Object.entries(next)) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (value === null) delete result[key];\r\n else result[key] = isRecord(value) ? merge(result[key], value) : structuredClone(value);\r\n }\r\n return result;\r\n };\r\n return merge(base, patch, true) as UINode;\r\n}\r\n\r\n/** Produces the smallest deterministic merge patch used by instance property overrides. */\r\nexport function createPrefabNodePatch(base: UINode, effective: UINode): Record<string, unknown> {\r\n const diff = (before: unknown, after: unknown, root = false): unknown => {\r\n if (Object.is(before, after)) return undefined;\r\n if (!isRecord(before) || !isRecord(after)) return structuredClone(after);\r\n const patch: Record<string, unknown> = {};\r\n const keys = new Set([...Object.keys(before), ...Object.keys(after)]);\r\n for (const key of [...keys].sort()) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (!Object.hasOwn(after, key)) patch[key] = null;\r\n else {\r\n const value = diff(before[key], after[key]);\r\n if (value !== undefined) patch[key] = value;\r\n }\r\n }\r\n return Object.keys(patch).length === 0 ? undefined : patch;\r\n };\r\n return (diff(base, effective, true) as Record<string, unknown> | undefined) ?? {};\r\n}\r\n\r\n/** Один слой property overrides, адресованный в пространстве адресов персистентного инстанса. */\r\ntype PatchLayer = ReadonlyMap<string, Readonly<Record<string, unknown>>>;\r\n\r\n/**\r\n * Разворачивает один персистентный инстанс во все его узлы, включая вложенные пресеты.\r\n *\r\n * Приоритет патчей — как у Unity: чем ближе инстанс к сцене, тем он старше. Слои идут от владельца\r\n * (индекс 0) к самым глубоким определениям, поэтому применяются в обратном порядке.\r\n */\r\nfunction materializeInstance(\r\n document: ProjectDocument,\r\n instance: PrefabInstanceNode,\r\n expandingPrefabIds: ReadonlySet<string>,\r\n applyInstanceOverrides: boolean,\r\n): MaterializedPrefab | undefined {\r\n const rootPrefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (rootPrefab === undefined) return undefined;\r\n\r\n const ownerId = instance.id;\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const editableLocalIds = new Set(localNodes.map((node) => node.id));\r\n // Локальный узел персистентен сам по себе, поэтому сохраняет собственный stable ID; всё\r\n // унаследованное получает ID, привязанный к инстансу, чтобы два инстанса не конфликтовали.\r\n const idOf = (address: string): string => (editableLocalIds.has(address) ? address : materializedPrefabNodeId(ownerId, address));\r\n\r\n const nodes: UINode[] = [];\r\n const nodesById = new Map<string, UINode>();\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n const emit = (source: UINode, effective: UINode, prefix: string, address: string, origin: MaterializedPrefabNodeOrigin): void => {\r\n const id = idOf(address);\r\n const node = {\r\n ...structuredClone(effective),\r\n id,\r\n parentId: source.parentId === null\r\n ? (prefix === \"\" ? null : idOf(prefix))\r\n : idOf(composePrefabNodePath(prefix, source.parentId)),\r\n children: source.children.map((childId) => idOf(composePrefabNodePath(prefix, childId))),\r\n } as UINode;\r\n nodes.push(node);\r\n nodesById.set(id, node);\r\n origins.set(id, origin);\r\n };\r\n\r\n const patched = (base: UINode, address: string, layers: readonly PatchLayer[]): UINode => {\r\n let effective = base;\r\n for (let index = layers.length - 1; index >= 0; index -= 1) {\r\n const patch = layers[index]!.get(address);\r\n if (patch !== undefined) effective = applyPrefabNodePatch(effective, patch);\r\n }\r\n return effective;\r\n };\r\n\r\n const layerOf = (node: PrefabInstanceNode, prefix: string): PatchLayer =>\r\n new Map((node.propertyOverrides ?? []).map((override) => [composePrefabNodePath(prefix, override.nodeId), override.patch] as const));\r\n\r\n /**\r\n * Разворачивает локально добавленный инстанс: он персистентен и владеет собственной конфигурацией.\r\n *\r\n * Развёртка начинается с чистого набора: бесконечной иерархия становится только если определение\r\n * пресета содержит само себя, а локальное добавление — конечные данные документа. Инстанс пресета\r\n * внутри развёртки того же пресета поэтому допустим, как и в Unity.\r\n */\r\n const mergeOwnedInstance = (local: PrefabInstanceNode): void => {\r\n const sub = materializeInstance(document, local, new Set(), true);\r\n if (sub === undefined) return;\r\n const host = nodesById.get(local.id);\r\n for (const subNode of sub.nodes) {\r\n if (subNode.parentId === null) subNode.parentId = local.id;\r\n nodes.push(subNode);\r\n nodesById.set(subNode.id, subNode);\r\n }\r\n sub.origins.forEach((origin, id) => origins.set(id, origin));\r\n if (host === undefined) return;\r\n for (const rootId of sub.rootNodeIds) if (!host.children.includes(rootId)) host.children.push(rootId);\r\n };\r\n\r\n const expandContent = (host: PrefabInstanceNode, prefix: string, layers: readonly PatchLayer[], expanding: ReadonlySet<string>): void => {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === host.prefabId);\r\n const expandable = prefab !== undefined && !expanding.has(prefab.id);\r\n const nextExpanding = prefab === undefined ? expanding : new Set([...expanding, prefab.id]);\r\n const nested: { node: PrefabInstanceNode; address: string }[] = [];\r\n\r\n if (expandable) {\r\n for (const definitionNode of prefab.nodes) {\r\n const address = composePrefabNodePath(prefix, definitionNode.id);\r\n emit(definitionNode, patched(definitionNode, address, layers), prefix, address, { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (definitionNode.type === \"prefab-instance\") nested.push({ node: definitionNode, address });\r\n }\r\n // Корни определения становятся детьми самого узла-инстанса; на верхнем уровне их забирает владелец.\r\n const hostNode = prefix === \"\" ? undefined : nodesById.get(idOf(prefix));\r\n if (hostNode !== undefined) {\r\n for (const rootId of prefab.rootNodeIds) {\r\n const childId = idOf(composePrefabNodePath(prefix, rootId));\r\n if (nodesById.has(childId) && !hostNode.children.includes(childId)) hostNode.children.push(childId);\r\n }\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n nested.length = 0;\r\n }\r\n\r\n // Локальные добавления владельца редактируемы; те, что пришли из определения, унаследованы.\r\n const editable = prefix === \"\";\r\n for (const local of host.locallyAddedNodes ?? []) {\r\n const address = composePrefabNodePath(prefix, local.id);\r\n emit(local, editable ? local : patched(local, address, layers), prefix, address, editable\r\n ? { kind: \"local\", instanceId: ownerId, localNodeId: local.id }\r\n : { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (local.type !== \"prefab-instance\") continue;\r\n if (editable) mergeOwnedInstance(local);\r\n else nested.push({ node: local, address });\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n };\r\n\r\n expandContent(instance, \"\", [applyInstanceOverrides ? layerOf(instance, \"\") : new Map()], expandingPrefabIds);\r\n\r\n // Единая до-привязка: локальные узлы и корни вложенных развёрток попадают в children родителя,\r\n // если тот их ещё не перечисляет. Порядок повторяет порядок выпуска узлов: сначала структура\r\n // определения, затем локальные добавления от самого глубокого пресета к сцене.\r\n for (const node of nodes) {\r\n if (node.parentId === null) continue;\r\n const parent = nodesById.get(node.parentId);\r\n if (parent !== undefined && !parent.children.includes(node.id)) parent.children.push(node.id);\r\n }\r\n\r\n // Semantic references authored inside a reusable definition are relative to that definition.\r\n // Materialization gives all their targets the same instance-scoped IDs as the hierarchy itself.\r\n const idByAddress = new Map<string, string>();\r\n origins.forEach((origin, id) => {\r\n if (origin.kind === \"inherited\" && origin.instanceId === ownerId) idByAddress.set(origin.nodePath, id);\r\n });\r\n for (const node of nodes) {\r\n const origin = origins.get(node.id);\r\n const ownPath = origin?.kind === \"inherited\" ? origin.nodePath : \"\";\r\n const ownSegments = ownPath === \"\" ? [] : splitNodePath(ownPath);\r\n const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);\r\n rewriteNodeReferences(node, (targetNodeId) => nodesById.has(targetNodeId)\r\n ? targetNodeId\r\n : idByAddress.get(composePrefabNodePath(prefix, targetNodeId)) ?? idByAddress.get(targetNodeId) ?? targetNodeId);\r\n }\r\n\r\n return {\r\n rootNodeIds: [\r\n ...rootPrefab.rootNodeIds.map((id) => idOf(id)).filter((id) => nodesById.has(id)),\r\n ...localNodes.filter((node) => node.parentId === null).map((node) => node.id),\r\n ],\r\n nodes,\r\n origins,\r\n };\r\n}\r\n\r\nexport function materializePrefabInstance(document: ProjectDocument, instance: PrefabInstanceNode): MaterializedPrefab | undefined {\r\n return materializeInstance(document, instance, new Set(), true);\r\n}\r\n\r\n/**\r\n * Узлы инстанса до применения его собственных property overrides, по адресам.\r\n *\r\n * Это «база» для нормализации и валидации: она уже включает конфигурацию вложенных инстансов,\r\n * записанную в определениях пресетов, поэтому override, повторяющий её значение, схлопывается.\r\n */\r\nexport function resolvePrefabInstanceBaseNodes(document: ProjectDocument, instance: PrefabInstanceNode): Map<string, UINode> {\r\n const base = new Map<string, UINode>();\r\n const materialized = materializeInstance(document, instance, new Set(), false);\r\n if (materialized === undefined) return base;\r\n for (const node of materialized.nodes) {\r\n const origin = materialized.origins.get(node.id);\r\n if (origin?.kind === \"inherited\" && origin.instanceId === instance.id) base.set(origin.nodePath, node);\r\n }\r\n return base;\r\n}\r\n\r\nexport function normalizePrefabNodeOverrides(document: ProjectDocument, instance: PrefabInstanceNode): void {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance);\r\n const normalized: PrefabNodeOverride[] = [];\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const baseNode = base.get(override.nodeId);\r\n if (baseNode === undefined) {\r\n normalized.push(override);\r\n continue;\r\n }\r\n const patch = createPrefabNodePatch(baseNode, applyPrefabNodePatch(baseNode, override.patch));\r\n if (Object.keys(patch).length > 0) normalized.push({ nodeId: override.nodeId, patch });\r\n }\r\n if (normalized.length === 0) delete instance.propertyOverrides;\r\n else instance.propertyOverrides = normalized;\r\n if (instance.locallyAddedNodes?.length === 0) delete instance.locallyAddedNodes;\r\n}\r\n\r\nfunction splitNodePath(path: string): string[] {\r\n return path.split(PREFAB_NODE_PATH_SEPARATOR);\r\n}\r\n\r\nfunction storeNestedOverride(document: ProjectDocument, instance: PrefabInstanceNode, nodePath: string, patch: Readonly<Record<string, unknown>>): boolean {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance).get(nodePath);\r\n if (base === undefined) return false;\r\n const overrides = instance.propertyOverrides ??= [];\r\n const existing = overrides.find((candidate) => candidate.nodeId === nodePath);\r\n const effective = applyPrefabNodePatch(existing === undefined ? base : applyPrefabNodePatch(base, existing.patch), patch);\r\n const mergedPatch = createPrefabNodePatch(base, effective);\r\n if (Object.keys(mergedPatch).length === 0) {\r\n if (existing !== undefined) overrides.splice(overrides.indexOf(existing), 1);\r\n } else if (existing === undefined) overrides.push({ nodeId: nodePath, patch: mergedPatch });\r\n else existing.patch = mergedPatch;\r\n if (overrides.length === 0) delete instance.propertyOverrides;\r\n return true;\r\n}\r\n\r\ntype LocalDestination = { prefab: PrefabDefinition } | { instance: PrefabInstanceNode; prefix: string };\r\n\r\n/**\r\n * Переносит конфигурацию инстанса (overrides и локально добавленные узлы) в его определение.\r\n *\r\n * Прямые overrides переписывают узлы определения, вложенные — становятся конфигурацией того\r\n * persisted-инстанса, к которому относятся, а локальные поддеревья переезжают целиком, сохраняя\r\n * stable ID. Сам инстанс после успешного переноса теряет конфигурацию: она уже в определении.\r\n *\r\n * Это же преобразование лежит в основе распаковки инстанса (`unpackPrefabInstances`): там оно\r\n * применяется к одноразовой копии определения, которая потом встраивается в сцену как обычные узлы.\r\n */\r\nexport function applyPrefabInstanceConfiguration(document: ProjectDocument, instance: PrefabInstanceNode): boolean {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return false;\r\n const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));\r\n\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return false;\r\n if (nestedPath.length === 0) {\r\n const patched = applyPrefabNodePatch(definitionNode, override.patch);\r\n const mutableDefinitionNode = definitionNode as unknown as Record<string, unknown>;\r\n for (const key of Object.keys(mutableDefinitionNode)) delete mutableDefinitionNode[key];\r\n Object.assign(mutableDefinitionNode, patched);\r\n continue;\r\n }\r\n if (definitionNode.type !== \"prefab-instance\" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), override.patch)) return false;\r\n }\r\n\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const localsById = new Map(localNodes.map((node) => [node.id, node]));\r\n const destinations = new Map<string, LocalDestination>();\r\n const destinationOf = (node: UINode): LocalDestination | undefined => {\r\n const cached = destinations.get(node.id);\r\n if (cached !== undefined) return cached;\r\n const localParent = node.parentId === null ? undefined : localsById.get(node.parentId);\r\n if (localParent !== undefined) {\r\n const destination = destinationOf(localParent);\r\n if (destination !== undefined) destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n if (node.parentId !== null) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(node.parentId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return undefined;\r\n if (definitionNode.type === \"prefab-instance\") {\r\n const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR) };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n }\r\n const destination = { prefab };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n };\r\n\r\n for (const local of localNodes) {\r\n const destination = destinationOf(local);\r\n if (destination === undefined) return false;\r\n const copy = structuredClone(local);\r\n const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);\r\n if (\"instance\" in destination) {\r\n if (!parentIsLocal) copy.parentId = destination.prefix === \"\" ? null : destination.prefix;\r\n (destination.instance.locallyAddedNodes ??= []).push(copy);\r\n continue;\r\n }\r\n destination.prefab.nodes.push(copy);\r\n definitionNodes.set(copy.id, copy);\r\n if (parentIsLocal) continue;\r\n if (copy.parentId === null) destination.prefab.rootNodeIds.push(copy.id);\r\n else {\r\n const parent = definitionNodes.get(copy.parentId);\r\n if (parent === undefined) return false;\r\n if (!parent.children.includes(copy.id)) parent.children.push(copy.id);\r\n }\r\n }\r\n\r\n delete instance.propertyOverrides;\r\n delete instance.locallyAddedNodes;\r\n return true;\r\n}\r\n\r\n/** Обходит все персистентные инстансы владельца, включая локально добавленные. */\r\nexport function forEachPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, visit: (instance: PrefabInstanceNode) => void): void {\r\n const walk = (nodes: readonly UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n visit(node);\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n walk(owner.nodes);\r\n}\r\n\r\nexport function forEachPrefabInstance(document: ProjectDocument, visit: (instance: PrefabInstanceNode) => void): void {\r\n for (const owner of [...document.scenes, ...document.prefabs]) forEachPrefabInstanceInOwner(owner, visit);\r\n}\r\n\r\nexport function findPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, instanceId: string): PrefabInstanceNode | undefined {\r\n let found: PrefabInstanceNode | undefined;\r\n forEachPrefabInstanceInOwner(owner, (instance) => {\r\n if (found === undefined && instance.id === instanceId) found = instance;\r\n });\r\n return found;\r\n}\r\n\r\nexport function findPrefabInstance(document: ProjectDocument, instanceId: string): PrefabInstanceNode | undefined {\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const instance = findPrefabInstanceInOwner(owner, instanceId);\r\n if (instance !== undefined) return instance;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ссылается ли пресет на другой — сам собой или через любую цепочку вложенных инстансов.\r\n *\r\n * Так проверяется рекурсия: вставлять инстанс пресета туда, где он уже раскрывается, нельзя, иначе\r\n * иерархия стала бы бесконечной.\r\n */\r\nexport function prefabReferencesPrefab(document: ProjectDocument, prefabId: string, searchedPrefabId: string): boolean {\r\n const visited = new Set<string>();\r\n const visit = (id: string): boolean => {\r\n if (id === searchedPrefabId) return true;\r\n if (visited.has(id)) return false;\r\n visited.add(id);\r\n const prefab = document.prefabs.find((candidate) => candidate.id === id);\r\n if (prefab === undefined) return false;\r\n let found = false;\r\n forEachPrefabInstanceInOwner(prefab, (instance) => { found ||= visit(instance.prefabId); });\r\n return found;\r\n };\r\n return visit(prefabId);\r\n}\r\n\r\n/** Сколько раз пресет используется в документе, включая вложенные и локально добавленные инстансы. */\r\nexport function countPrefabInstances(document: ProjectDocument, prefabId: string): number {\r\n let count = 0;\r\n forEachPrefabInstance(document, (instance) => {\r\n if (instance.prefabId === prefabId) count += 1;\r\n });\r\n return count;\r\n}\r\n\r\n/**\r\n * Плоский граф авторинга владельца: его собственные узлы плюс развёрнутые поддеревья всех инстансов.\r\n *\r\n * Единственный резолвер иерархии: им пользуются и редактор (иерархия, selection, gizmos), и runtime\r\n * (сборка Pixi-дерева, сбор ассетов), поэтому расхождений между ними быть не может.\r\n */\r\ntype InstanceLocation = { nodes: UINode[]; instance: PrefabInstanceNode };\r\n\r\n/** Все персистентные инстансы пресета вместе с массивом узлов, в котором каждый из них лежит. */\r\nfunction locatePrefabInstances(document: ProjectDocument, prefabId: string): InstanceLocation[] {\r\n const found: InstanceLocation[] = [];\r\n const walk = (nodes: UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n if (node.prefabId === prefabId) found.push({ nodes, instance: node });\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n for (const owner of [...document.scenes, ...document.prefabs]) walk(owner.nodes);\r\n return found;\r\n}\r\n\r\n/**\r\n * Заменяет один инстанс обычным контейнером с тем же id, transform и содержимым.\r\n *\r\n * Развёртка идёт через одноразовую копию определения: конфигурация инстанса переносится в неё тем же\r\n * `applyPrefabInstanceConfiguration`, что и «Apply to preset», после чего узлы копии получают свежие\r\n * stable ID и встают на место инстанса. Вложенные инстансы других пресетов остаются инстансами и\r\n * сохраняют свою конфигурацию — распаковывается ровно один слой.\r\n *\r\n * Возвращает соответствие «адрес узла внутри инстанса → новый id узла»: по нему переписываются\r\n * адреса, которыми на это содержимое ссылались инстансы пресета-владельца.\r\n */\r\nfunction unpackInstance(document: ProjectDocument, location: InstanceLocation, createId: () => string): { idByAddress: Map<string, string>; inserted: UINode[] } | undefined {\r\n const { nodes, instance } = location;\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return undefined;\r\n\r\n const draftPrefab: PrefabDefinition = { ...structuredClone(prefab), id: createId() };\r\n const draftInstance = structuredClone(instance);\r\n draftInstance.prefabId = draftPrefab.id;\r\n document.prefabs.push(draftPrefab);\r\n const applied = applyPrefabInstanceConfiguration(document, draftInstance);\r\n document.prefabs.splice(document.prefabs.indexOf(draftPrefab), 1);\r\n if (!applied) return undefined;\r\n\r\n const idByAddress = new Map(draftPrefab.nodes.map((node) => [node.id, createId()] as const));\r\n const remap = (address: string): string => idByAddress.get(address) ?? address;\r\n for (const node of draftPrefab.nodes) {\r\n node.id = remap(node.id);\r\n node.children = node.children.map(remap);\r\n node.parentId = node.parentId === null ? instance.id : remap(node.parentId);\r\n rewriteNodeReferences(node, remap);\r\n }\r\n\r\n const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;\r\n const container = { ...structuredClone(base), type: \"container\", children: draftPrefab.rootNodeIds.map(remap) } as UINode;\r\n nodes.splice(nodes.indexOf(instance), 1, container, ...draftPrefab.nodes);\r\n return { idByAddress, inserted: draftPrefab.nodes };\r\n}\r\n\r\n/**\r\n * Переписывает адреса, которые вели внутрь распакованного инстанса.\r\n *\r\n * Инстанс мог лежать в определении пресета, и тогда его содержимое было адресуемо снаружи как\r\n * `…::instanceId::prefab-node::address`. После распаковки этот узел — обычная нода владельца, поэтому\r\n * оба сегмента схлопываются в её новый id. Адрес самого инстанса не меняется: контейнер сохранил id.\r\n */\r\nfunction rewriteUnpackedAddresses(document: ProjectDocument, instanceId: string, idByAddress: ReadonlyMap<string, string>): void {\r\n const rewrite = (path: string): string => {\r\n const segments = splitNodePath(path);\r\n const index = segments.indexOf(instanceId);\r\n const inner = index < 0 ? undefined : segments[index + 1];\r\n const mapped = inner === undefined ? undefined : idByAddress.get(inner);\r\n if (mapped === undefined) return path;\r\n return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);\r\n };\r\n forEachPrefabInstance(document, (instance) => {\r\n for (const override of instance.propertyOverrides ?? []) override.nodeId = rewrite(override.nodeId);\r\n rewritePrefabInstanceReferencePatches(instance, rewrite);\r\n for (const local of instance.locallyAddedNodes ?? []) if (local.parentId !== null) local.parentId = rewrite(local.parentId);\r\n for (const local of instance.locallyAddedNodes ?? []) rewriteNodeReferences(local, rewrite);\r\n });\r\n}\r\n\r\n/**\r\n * Снимает binding-ключи, которые распаковка размножила в одной области разрешения.\r\n *\r\n * Внутри инстанса ключ принадлежал области этого инстанса, поэтому один и тот же пресет мог стоять на\r\n * сцене сколько угодно раз. Распакованные узлы попадают в область владельца, где ключ обязан быть\r\n * уникальным, поэтому конфликт разрешается в пользу узла, который существовал до распаковки, а среди\r\n * одних только новых узлов — в пользу первого.\r\n */\r\nfunction dropDuplicateBindingKeys(document: ProjectDocument, unpackedNodes: ReadonlyMap<string, UINode>): string[] {\r\n const dropped: string[] = [];\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const graph = resolveOwnerNodeGraph(document, owner);\r\n for (const scopeNodes of collectBindingKeyScopes(graph).values()) {\r\n for (const [key, nodeIds] of collectBindingKeys(scopeNodes)) {\r\n if (key === \"\" || nodeIds.length <= 1) continue;\r\n const unpacked = nodeIds.filter((id) => unpackedNodes.has(id));\r\n const victims = unpacked.length === nodeIds.length ? unpacked.slice(1) : unpacked;\r\n for (const id of victims) {\r\n delete unpackedNodes.get(id)!.bindingKey;\r\n if (!dropped.includes(key)) dropped.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return dropped;\r\n}\r\n\r\nexport type PrefabUnpackResult = { instances: number; droppedBindingKeys: string[] };\r\n\r\n/**\r\n * Разворачивает все инстансы пресета обратно в обычные узлы своих владельцев.\r\n *\r\n * Так удаление пресета перестаёт зависеть от того, используется он или нет: сцена сохраняет ровно то\r\n * же изображение, но её узлы больше не ссылаются на определение. Операция идёт по документу целиком —\r\n * сцены, определения других пресетов и локально добавленные поддеревья внутри инстансов.\r\n *\r\n * `undefined` означает, что конфигурация одного из инстансов не разложилась на узлы; вызывающий\r\n * должен отбросить весь кандидат-документ, а не применять его частично.\r\n */\r\nexport function unpackPrefabInstances(document: ProjectDocument, prefabId: string, createId: () => string): PrefabUnpackResult | undefined {\r\n const unpackedNodes = new Map<string, UINode>();\r\n let instances = 0;\r\n // Локация ищется заново на каждом шаге: распаковка внешнего инстанса переносит вложенные в новые\r\n // массивы узлов, поэтому собранные заранее ссылки протухли бы.\r\n for (let location = locatePrefabInstances(document, prefabId)[0]; location !== undefined; location = locatePrefabInstances(document, prefabId)[0]) {\r\n const instanceId = location.instance.id;\r\n const unpacked = unpackInstance(document, location, createId);\r\n if (unpacked === undefined) return undefined;\r\n rewriteUnpackedAddresses(document, instanceId, unpacked.idByAddress);\r\n for (const node of unpacked.inserted) unpackedNodes.set(node.id, node);\r\n instances += 1;\r\n }\r\n return { instances, droppedBindingKeys: dropDuplicateBindingKeys(document, unpackedNodes) };\r\n}\r\n\r\nexport function resolveOwnerNodeGraph(\r\n document: ProjectDocument,\r\n owner: { readonly rootNodeIds: readonly string[]; readonly nodes: readonly UINode[] },\r\n): { rootNodeIds: string[]; nodes: UINode[]; origins: Map<string, MaterializedPrefabNodeOrigin> } {\r\n const nodes = structuredClone(owner.nodes) as UINode[];\r\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n for (const ownerNode of owner.nodes) {\r\n if (ownerNode.type !== \"prefab-instance\") continue;\r\n const instanceCopy = nodesById.get(ownerNode.id);\r\n const materialized = materializePrefabInstance(document, ownerNode);\r\n if (materialized === undefined || instanceCopy === undefined) continue;\r\n instanceCopy.children = [...materialized.rootNodeIds];\r\n for (const materializedNode of materialized.nodes) {\r\n if (materializedNode.parentId === null) materializedNode.parentId = ownerNode.id;\r\n nodes.push(materializedNode);\r\n nodesById.set(materializedNode.id, materializedNode);\r\n }\r\n materialized.origins.forEach((origin, id) => origins.set(id, origin));\r\n }\r\n\r\n return { rootNodeIds: [...owner.rootNodeIds], nodes, origins };\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixi-ui-editor/schema",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Versioned document schema, validation and project-manifest format for Pixi UI Editor projects.",
5
5
  "type": "module",
6
6
  "repository": {