azul-sync 1.3.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.
Files changed (133) hide show
  1. package/.gitattributes +1 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. package/README.md +142 -0
  5. package/dist/build.d.ts +19 -0
  6. package/dist/build.d.ts.map +1 -0
  7. package/dist/build.js +92 -0
  8. package/dist/build.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +397 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/config.d.ts +26 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +105 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/fs/fileWriter.d.ts +100 -0
  18. package/dist/fs/fileWriter.d.ts.map +1 -0
  19. package/dist/fs/fileWriter.js +342 -0
  20. package/dist/fs/fileWriter.js.map +1 -0
  21. package/dist/fs/treeManager.d.ts +84 -0
  22. package/dist/fs/treeManager.d.ts.map +1 -0
  23. package/dist/fs/treeManager.js +365 -0
  24. package/dist/fs/treeManager.js.map +1 -0
  25. package/dist/fs/watcher.d.ts +39 -0
  26. package/dist/fs/watcher.d.ts.map +1 -0
  27. package/dist/fs/watcher.js +120 -0
  28. package/dist/fs/watcher.js.map +1 -0
  29. package/dist/index.d.ts +61 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +349 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/ipc/httpPolling.d.ts +56 -0
  34. package/dist/ipc/httpPolling.d.ts.map +1 -0
  35. package/dist/ipc/httpPolling.js +171 -0
  36. package/dist/ipc/httpPolling.js.map +1 -0
  37. package/dist/ipc/messages.d.ts +112 -0
  38. package/dist/ipc/messages.d.ts.map +1 -0
  39. package/dist/ipc/messages.js +5 -0
  40. package/dist/ipc/messages.js.map +1 -0
  41. package/dist/ipc/server.d.ts +50 -0
  42. package/dist/ipc/server.d.ts.map +1 -0
  43. package/dist/ipc/server.js +168 -0
  44. package/dist/ipc/server.js.map +1 -0
  45. package/dist/pack.d.ts +19 -0
  46. package/dist/pack.d.ts.map +1 -0
  47. package/dist/pack.js +225 -0
  48. package/dist/pack.js.map +1 -0
  49. package/dist/push.d.ts +43 -0
  50. package/dist/push.d.ts.map +1 -0
  51. package/dist/push.js +532 -0
  52. package/dist/push.js.map +1 -0
  53. package/dist/rojo.d.ts +9 -0
  54. package/dist/rojo.d.ts.map +1 -0
  55. package/dist/rojo.js +114 -0
  56. package/dist/rojo.js.map +1 -0
  57. package/dist/snapshot/rojo.d.ts +39 -0
  58. package/dist/snapshot/rojo.d.ts.map +1 -0
  59. package/dist/snapshot/rojo.js +364 -0
  60. package/dist/snapshot/rojo.js.map +1 -0
  61. package/dist/snapshot.d.ts +23 -0
  62. package/dist/snapshot.d.ts.map +1 -0
  63. package/dist/snapshot.js +132 -0
  64. package/dist/snapshot.js.map +1 -0
  65. package/dist/sourcemap/generator.d.ts +78 -0
  66. package/dist/sourcemap/generator.d.ts.map +1 -0
  67. package/dist/sourcemap/generator.js +351 -0
  68. package/dist/sourcemap/generator.js.map +1 -0
  69. package/dist/sourcemap/propertyLoader.d.ts +19 -0
  70. package/dist/sourcemap/propertyLoader.d.ts.map +1 -0
  71. package/dist/sourcemap/propertyLoader.js +131 -0
  72. package/dist/sourcemap/propertyLoader.js.map +1 -0
  73. package/dist/util/id.d.ts +9 -0
  74. package/dist/util/id.d.ts.map +1 -0
  75. package/dist/util/id.js +14 -0
  76. package/dist/util/id.js.map +1 -0
  77. package/dist/util/log.d.ts +13 -0
  78. package/dist/util/log.d.ts.map +1 -0
  79. package/dist/util/log.js +51 -0
  80. package/dist/util/log.js.map +1 -0
  81. package/docs/assets/azul-logo.pdn +0 -0
  82. package/docs/assets/logo-200px.png +0 -0
  83. package/docs/assets/logo.png +0 -0
  84. package/docs/assets/plugin/toolbox.png +0 -0
  85. package/docs/assets/synced.png +0 -0
  86. package/package.json +41 -0
  87. package/plugin/README.md +54 -0
  88. package/plugin/sourcemap.json +264 -0
  89. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/Actor/AzulSync.server.luau +905 -0
  90. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/AzulService.luau +1010 -0
  91. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/Config.luau +29 -0
  92. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/Enums.luau +11 -0
  93. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/CollapsibleTitledSection.luau +214 -0
  94. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/ColorPicker.luau +360 -0
  95. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/CustomTextButton.luau +170 -0
  96. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/DropdownMenu.luau +363 -0
  97. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/HorizontalLine.luau +43 -0
  98. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/ImageButtonWithText.luau +181 -0
  99. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledCheckbox.luau +295 -0
  100. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledColorInputPicker.luau +294 -0
  101. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledMultiChoice.luau +163 -0
  102. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledNumberInput.luau +312 -0
  103. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledRadioButton.luau +55 -0
  104. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledSlider.luau +151 -0
  105. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledTextInput.luau +222 -0
  106. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledToggleButton.luau +73 -0
  107. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/StatefulImageButton.luau +125 -0
  108. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/VerticalScrollingFrame.luau +100 -0
  109. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/VerticalSpacer.luau +35 -0
  110. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/VerticallyScalingListFrame.luau +107 -0
  111. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/GuiUtilities.luau +429 -0
  112. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/RbxGui.luau +4363 -0
  113. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/UI.luau +425 -0
  114. package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/WebSocketClient.luau +161 -0
  115. package/src/build.ts +120 -0
  116. package/src/cli.ts +496 -0
  117. package/src/config.ts +170 -0
  118. package/src/fs/fileWriter.ts +414 -0
  119. package/src/fs/treeManager.ts +458 -0
  120. package/src/fs/watcher.ts +142 -0
  121. package/src/index.ts +450 -0
  122. package/src/ipc/httpPolling.ts +214 -0
  123. package/src/ipc/messages.ts +159 -0
  124. package/src/ipc/server.ts +196 -0
  125. package/src/pack.ts +309 -0
  126. package/src/push.ts +726 -0
  127. package/src/snapshot/rojo.ts +467 -0
  128. package/src/snapshot.ts +161 -0
  129. package/src/sourcemap/generator.ts +504 -0
  130. package/src/sourcemap/propertyLoader.ts +195 -0
  131. package/src/util/id.ts +15 -0
  132. package/src/util/log.ts +94 -0
  133. package/tsconfig.json +24 -0
@@ -0,0 +1,132 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { log } from "./util/log.js";
5
+ export class SnapshotBuilder {
6
+ sourceDir;
7
+ destPrefix;
8
+ skipSymlinks;
9
+ folderMap = new Map();
10
+ results = [];
11
+ scriptPaths = new Set();
12
+ constructor(options) {
13
+ this.sourceDir = path.resolve(options.sourceDir);
14
+ this.destPrefix = options.destPrefix ?? [];
15
+ this.skipSymlinks = options.skipSymlinks !== false; // default: skip links
16
+ }
17
+ async build() {
18
+ this.results = [];
19
+ this.folderMap.clear();
20
+ this.scriptPaths.clear();
21
+ await this.walk(this.sourceDir);
22
+ this.results.sort((a, b) => a.path.length - b.path.length);
23
+ return this.results;
24
+ }
25
+ async walk(dir) {
26
+ const entries = await fs.readdir(dir, { withFileTypes: true });
27
+ const files = entries.filter((entry) => entry.isFile());
28
+ const directories = entries.filter((entry) => entry.isDirectory());
29
+ for (const entry of files) {
30
+ const fullPath = path.join(dir, entry.name);
31
+ if (entry.isSymbolicLink && entry.isSymbolicLink()) {
32
+ if (!this.skipSymlinks) {
33
+ continue;
34
+ }
35
+ log.debug(`Skipping symlinked file during snapshot: ${fullPath}`);
36
+ continue;
37
+ }
38
+ if (entry.name.endsWith(".luau") || entry.name.endsWith(".lua")) {
39
+ const relSegments = this.relativeSegments(fullPath);
40
+ const { className, scriptName } = this.classifyScript(entry.name);
41
+ const dirSegments = relSegments.slice(0, -1);
42
+ if (dirSegments.length > 0) {
43
+ this.ensureFolder(dirSegments);
44
+ }
45
+ const filePathSegments = [
46
+ ...this.destPrefix,
47
+ ...dirSegments,
48
+ scriptName,
49
+ ];
50
+ const source = await fs.readFile(fullPath, "utf-8");
51
+ this.scriptPaths.add(this.pathKey(filePathSegments));
52
+ const fileData = {
53
+ guid: this.makeGuid(),
54
+ className,
55
+ name: scriptName,
56
+ path: filePathSegments,
57
+ source,
58
+ };
59
+ this.results.push(fileData);
60
+ }
61
+ }
62
+ for (const entry of directories) {
63
+ const fullPath = path.join(dir, entry.name);
64
+ if (entry.isSymbolicLink && entry.isSymbolicLink()) {
65
+ if (!this.skipSymlinks) {
66
+ continue;
67
+ }
68
+ log.debug(`Skipping symlinked directory during snapshot: ${fullPath}`);
69
+ continue;
70
+ }
71
+ const relSegments = this.relativeSegments(fullPath);
72
+ if (relSegments.length > 0) {
73
+ this.ensureFolder(relSegments);
74
+ }
75
+ await this.walk(fullPath);
76
+ }
77
+ }
78
+ ensureFolder(segments) {
79
+ for (let i = 1; i <= segments.length; i++) {
80
+ const keySegments = segments.slice(0, i);
81
+ const full = [...this.destPrefix, ...keySegments];
82
+ const key = this.pathKey(full);
83
+ if (this.scriptPaths.has(key))
84
+ continue;
85
+ if (this.folderMap.has(key))
86
+ continue;
87
+ const data = {
88
+ guid: this.makeGuid(),
89
+ className: "Folder",
90
+ name: keySegments[i - 1],
91
+ path: full,
92
+ };
93
+ this.folderMap.set(key, data);
94
+ this.results.push(data);
95
+ }
96
+ }
97
+ relativeSegments(targetPath) {
98
+ const rel = path.relative(this.sourceDir, targetPath);
99
+ if (!rel || rel === "")
100
+ return [];
101
+ return rel.split(path.sep).filter(Boolean);
102
+ }
103
+ classifyScript(fileName) {
104
+ if (fileName.endsWith(".lua")) {
105
+ fileName = fileName.replace(/\.lua$/i, ".luau");
106
+ }
107
+ const base = fileName.replace(/\.luau$/i, "");
108
+ if (base.endsWith(".server")) {
109
+ return { className: "Script", scriptName: base.replace(/\.server$/, "") };
110
+ }
111
+ if (base.endsWith(".client")) {
112
+ return {
113
+ className: "LocalScript",
114
+ scriptName: base.replace(/\.client$/, ""),
115
+ };
116
+ }
117
+ if (base.endsWith(".module")) {
118
+ return {
119
+ className: "ModuleScript",
120
+ scriptName: base.replace(/\.module$/, ""),
121
+ };
122
+ }
123
+ return { className: "ModuleScript", scriptName: base };
124
+ }
125
+ makeGuid() {
126
+ return randomUUID().replace(/-/g, "");
127
+ }
128
+ pathKey(segments) {
129
+ return segments.join("/");
130
+ }
131
+ }
132
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { TreeNode } from "../fs/treeManager.js";
2
+ import { FileMapping } from "../fs/fileWriter.js";
3
+ /**
4
+ * Rojo-compatible sourcemap tree structure
5
+ */
6
+ interface SourcemapNode {
7
+ name: string;
8
+ className: string;
9
+ guid?: string;
10
+ filePaths?: string[];
11
+ children?: SourcemapNode[];
12
+ }
13
+ interface SourcemapRoot {
14
+ name: string;
15
+ className: string;
16
+ children: SourcemapNode[];
17
+ }
18
+ /**
19
+ * Generates Rojo-compatible sourcemap.json for luau-lsp
20
+ */
21
+ export declare class SourcemapGenerator {
22
+ constructor();
23
+ private sortTreeNodes;
24
+ private getDuplicatePaths;
25
+ private findRootNode;
26
+ /**
27
+ * Incrementally upsert a subtree into the sourcemap, optionally removing the old path first.
28
+ * Falls back to full regeneration if anything goes wrong.
29
+ */
30
+ upsertSubtree(node: TreeNode, allNodes: Map<string, TreeNode>, fileMappings: Map<string, FileMapping>, outputPath: string, oldPath?: string[], isNew?: boolean): void;
31
+ /**
32
+ * Generate complete sourcemap from tree and file mappings
33
+ */
34
+ generate(nodes: Map<string, TreeNode>, fileMappings: Map<string, FileMapping>): SourcemapRoot;
35
+ /**
36
+ * Write sourcemap to file
37
+ */
38
+ write(sourcemap: SourcemapRoot, outputPath?: string): void;
39
+ /**
40
+ * Check if two paths match
41
+ */
42
+ private pathsMatch;
43
+ /**
44
+ * Build a SourcemapNode from a TreeNode, recursively including children.
45
+ */
46
+ private buildNodeFromTree;
47
+ /**
48
+ * Read an existing sourcemap or create a new root.
49
+ */
50
+ private readOrCreateRoot;
51
+ /**
52
+ * Insert or replace a subtree at the given path, creating intermediate parents as needed.
53
+ */
54
+ private insertNodeAtPath;
55
+ private findNodeByPath;
56
+ /**
57
+ * Generate and write sourcemap in one call
58
+ */
59
+ generateAndWrite(nodes: Map<string, TreeNode>, fileMappings: Map<string, FileMapping>, outputPath?: string): void;
60
+ /**
61
+ * Remove a node (and now-empty ancestors) from an existing sourcemap file by path.
62
+ * Falls back to full regeneration if the file is missing or malformed.
63
+ */
64
+ prunePath(pathSegments: string[], outputPath: string, nodes: Map<string, TreeNode>, fileMappings: Map<string, FileMapping>, targetClassName?: string, targetGuid?: string): boolean;
65
+ /**
66
+ * Remove node matching path; prune empty parents.
67
+ */
68
+ private removePath;
69
+ /**
70
+ * Validate that all paths in sourcemap point to existing files
71
+ */
72
+ validate(sourcemap: SourcemapRoot): {
73
+ valid: boolean;
74
+ errors: string[];
75
+ };
76
+ }
77
+ export {};
78
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/sourcemap/generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;GAEG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,kBAAkB;;IAG7B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,YAAY;IAepB;;;OAGG;IACI,aAAa,CAClB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,KAAK,CAAC,EAAE,OAAO,GACd,IAAI;IAiCP;;OAEG;IACI,QAAQ,CACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACrC,aAAa;IAsChB;;OAEG;IACI,KAAK,CACV,SAAS,EAAE,aAAa,EACxB,UAAU,GAAE,MAAyB,GACpC,IAAI;IAgBP;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0ExB,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACI,gBAAgB,CACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,UAAU,GAAE,MAAyB,GACpC,IAAI;IAKP;;;OAGG;IACI,SAAS,CACd,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,eAAe,CAAC,EAAE,MAAM,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO;IA2BV;;OAEG;IACH,OAAO,CAAC,UAAU;IAiElB;;OAEG;IACI,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG;QACzC,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB;CA6BF"}
@@ -0,0 +1,351 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { log } from "../util/log.js";
4
+ /**
5
+ * Generates Rojo-compatible sourcemap.json for luau-lsp
6
+ */
7
+ export class SourcemapGenerator {
8
+ constructor() { }
9
+ sortTreeNodes(nodes) {
10
+ return Array.from(nodes).sort((a, b) => {
11
+ const nameCompare = a.name.localeCompare(b.name);
12
+ if (nameCompare !== 0)
13
+ return nameCompare;
14
+ const classCompare = a.className.localeCompare(b.className);
15
+ if (classCompare !== 0)
16
+ return classCompare;
17
+ return a.guid.localeCompare(b.guid);
18
+ });
19
+ }
20
+ getDuplicatePaths(nodes) {
21
+ const buckets = new Map();
22
+ for (const node of nodes.values()) {
23
+ const key = node.path.join("\u0001");
24
+ const bucket = buckets.get(key) ?? [];
25
+ bucket.push(node);
26
+ buckets.set(key, bucket);
27
+ }
28
+ const duplicates = [];
29
+ for (const [key, bucket] of buckets.entries()) {
30
+ if (bucket.length > 1) {
31
+ duplicates.push({ path: key.split("\u0001"), nodes: bucket });
32
+ }
33
+ }
34
+ return duplicates;
35
+ }
36
+ findRootNode(nodes) {
37
+ const root = nodes.get("root");
38
+ if (root) {
39
+ return root;
40
+ }
41
+ for (const node of nodes.values()) {
42
+ if (node.path.length === 0 && node.className === "DataModel") {
43
+ return node;
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ /**
49
+ * Incrementally upsert a subtree into the sourcemap, optionally removing the old path first.
50
+ * Falls back to full regeneration if anything goes wrong.
51
+ */
52
+ upsertSubtree(node, allNodes, fileMappings, outputPath, oldPath, isNew) {
53
+ const duplicates = this.getDuplicatePaths(allNodes);
54
+ if (duplicates.length > 0) {
55
+ log.debug(`Duplicate instance paths detected (${duplicates.length}); proceeding with GUID-based incremental update`);
56
+ }
57
+ try {
58
+ const sourcemap = this.readOrCreateRoot(outputPath);
59
+ // If the node moved/renamed, prune the previous location
60
+ if (oldPath && !this.pathsMatch(oldPath, node.path)) {
61
+ this.removePath(sourcemap, oldPath, node.className, node.guid);
62
+ }
63
+ const newSubtree = this.buildNodeFromTree(node, fileMappings);
64
+ if (newSubtree) {
65
+ this.insertNodeAtPath(sourcemap, newSubtree, node.path, allNodes, Boolean(isNew));
66
+ this.write(sourcemap, outputPath);
67
+ }
68
+ }
69
+ catch (error) {
70
+ log.warn("Incremental sourcemap update failed, regenerating:", error);
71
+ this.generateAndWrite(allNodes, fileMappings, outputPath);
72
+ }
73
+ }
74
+ /**
75
+ * Generate complete sourcemap from tree and file mappings
76
+ */
77
+ generate(nodes, fileMappings) {
78
+ log.info("Generating sourcemap...");
79
+ log.debug(`Total nodes: ${nodes.size}, File mappings: ${fileMappings.size}`);
80
+ const rootNode = this.findRootNode(nodes);
81
+ const serviceNodes = rootNode
82
+ ? this.sortTreeNodes(rootNode.children.values())
83
+ : this.sortTreeNodes(Array.from(nodes.values()).filter((node) => node.path.length === 1));
84
+ const visited = new Set();
85
+ const children = [];
86
+ for (const serviceNode of serviceNodes) {
87
+ const built = this.buildNodeFromTree(serviceNode, fileMappings, visited, process.cwd());
88
+ if (built) {
89
+ children.push(built);
90
+ }
91
+ }
92
+ const sourcemap = {
93
+ name: "Game",
94
+ className: "DataModel",
95
+ children,
96
+ };
97
+ log.success(`Sourcemap generated with ${children.length} root services`);
98
+ return sourcemap;
99
+ }
100
+ /**
101
+ * Write sourcemap to file
102
+ */
103
+ write(sourcemap, outputPath = "sourcemap.json") {
104
+ try {
105
+ // Ensure destination directory exists
106
+ const dir = path.dirname(outputPath);
107
+ if (dir && dir !== "." && !fs.existsSync(dir)) {
108
+ fs.mkdirSync(dir, { recursive: true });
109
+ }
110
+ const json = JSON.stringify(sourcemap, null, 2);
111
+ fs.writeFileSync(outputPath, json, "utf-8");
112
+ log.debug(`Sourcemap written to: ${outputPath}`);
113
+ }
114
+ catch (error) {
115
+ log.error("Failed to write sourcemap:", error);
116
+ }
117
+ }
118
+ /**
119
+ * Check if two paths match
120
+ */
121
+ pathsMatch(path1, path2) {
122
+ if (path1.length !== path2.length)
123
+ return false;
124
+ return path1.every((segment, i) => segment === path2[i]);
125
+ }
126
+ /**
127
+ * Build a SourcemapNode from a TreeNode, recursively including children.
128
+ */
129
+ buildNodeFromTree(node, fileMappings, visited = new Set(), cwd = process.cwd()) {
130
+ if (visited.has(node.guid)) {
131
+ log.debug(`Detected cyclic path in sourcemap generation: ${node.path.join("/")}`);
132
+ return null;
133
+ }
134
+ visited.add(node.guid);
135
+ const result = {
136
+ name: node.name,
137
+ className: node.className,
138
+ guid: node.guid,
139
+ };
140
+ const mapping = fileMappings.get(node.guid);
141
+ if (mapping) {
142
+ const relativePath = path.relative(cwd, mapping.filePath);
143
+ result.filePaths = [relativePath.replace(/\\/g, "/")];
144
+ }
145
+ const sortedChildren = this.sortTreeNodes(node.children.values());
146
+ const children = [];
147
+ for (const child of sortedChildren) {
148
+ const built = this.buildNodeFromTree(child, fileMappings, visited, cwd);
149
+ if (built) {
150
+ children.push(built);
151
+ }
152
+ }
153
+ if (children.length > 0) {
154
+ result.children = children;
155
+ }
156
+ return result;
157
+ }
158
+ /**
159
+ * Read an existing sourcemap or create a new root.
160
+ */
161
+ readOrCreateRoot(outputPath) {
162
+ if (fs.existsSync(outputPath)) {
163
+ try {
164
+ const raw = fs.readFileSync(outputPath, "utf-8");
165
+ return JSON.parse(raw);
166
+ }
167
+ catch (error) {
168
+ log.warn("Failed to read existing sourcemap, recreating:", error);
169
+ }
170
+ }
171
+ return {
172
+ name: "Game",
173
+ className: "DataModel",
174
+ children: [],
175
+ };
176
+ }
177
+ /**
178
+ * Insert or replace a subtree at the given path, creating intermediate parents as needed.
179
+ */
180
+ insertNodeAtPath(root, newNode, pathSegments, allNodes, isNewEntry) {
181
+ if (pathSegments.length === 0)
182
+ return;
183
+ let currentChildren = root.children;
184
+ for (let i = 0; i < pathSegments.length; i++) {
185
+ const segment = pathSegments[i];
186
+ const ancestorNode = this.findNodeByPath(allNodes, pathSegments.slice(0, i + 1));
187
+ const ancestorGuid = ancestorNode?.guid;
188
+ let existingIndex = ancestorGuid
189
+ ? currentChildren.findIndex((n) => n.guid === ancestorGuid)
190
+ : currentChildren.findIndex((n) => n.name === segment);
191
+ if (i === pathSegments.length - 1) {
192
+ const guidIndex = newNode.guid
193
+ ? currentChildren.findIndex((n) => n.guid === newNode.guid)
194
+ : -1;
195
+ if (guidIndex !== -1) {
196
+ currentChildren.splice(guidIndex, 1, newNode);
197
+ return;
198
+ }
199
+ if (isNewEntry) {
200
+ // Appending preserves siblings with identical names/classes from being merged
201
+ currentChildren.push(newNode);
202
+ return;
203
+ }
204
+ existingIndex = currentChildren.findIndex((n) => n.name === segment && n.className === newNode.className);
205
+ if (existingIndex !== -1) {
206
+ currentChildren.splice(existingIndex, 1, newNode);
207
+ }
208
+ else {
209
+ currentChildren.push(newNode);
210
+ }
211
+ return;
212
+ }
213
+ if (existingIndex === -1) {
214
+ const className = ancestorNode?.className ?? "Folder";
215
+ const placeholder = {
216
+ name: segment,
217
+ className,
218
+ guid: ancestorGuid,
219
+ children: [],
220
+ };
221
+ currentChildren.push(placeholder);
222
+ existingIndex = currentChildren.length - 1;
223
+ }
224
+ const holder = currentChildren[existingIndex];
225
+ if (!holder.children) {
226
+ holder.children = [];
227
+ }
228
+ currentChildren = holder.children;
229
+ }
230
+ }
231
+ findNodeByPath(nodes, pathSegments) {
232
+ for (const node of nodes.values()) {
233
+ if (this.pathsMatch(node.path, pathSegments)) {
234
+ return node;
235
+ }
236
+ }
237
+ return undefined;
238
+ }
239
+ /**
240
+ * Generate and write sourcemap in one call
241
+ */
242
+ generateAndWrite(nodes, fileMappings, outputPath = "sourcemap.json") {
243
+ const sourcemap = this.generate(nodes, fileMappings);
244
+ this.write(sourcemap, outputPath);
245
+ }
246
+ /**
247
+ * Remove a node (and now-empty ancestors) from an existing sourcemap file by path.
248
+ * Falls back to full regeneration if the file is missing or malformed.
249
+ */
250
+ prunePath(pathSegments, outputPath, nodes, fileMappings, targetClassName, targetGuid) {
251
+ try {
252
+ if (!fs.existsSync(outputPath)) {
253
+ this.generateAndWrite(nodes, fileMappings, outputPath);
254
+ return true;
255
+ }
256
+ const raw = fs.readFileSync(outputPath, "utf-8");
257
+ const json = JSON.parse(raw);
258
+ const removed = this.removePath(json, pathSegments, targetClassName, targetGuid);
259
+ if (removed) {
260
+ this.write(json, outputPath);
261
+ }
262
+ return removed;
263
+ }
264
+ catch (error) {
265
+ log.warn("Prune failed, regenerating sourcemap:", error);
266
+ this.generateAndWrite(nodes, fileMappings, outputPath);
267
+ return true;
268
+ }
269
+ }
270
+ /**
271
+ * Remove node matching path; prune empty parents.
272
+ */
273
+ removePath(root, pathSegments, targetClassName, targetGuid) {
274
+ if (pathSegments.length === 0)
275
+ return false;
276
+ const pruneRecursive = (nodes, idx) => {
277
+ if (!nodes)
278
+ return false;
279
+ const name = pathSegments[idx];
280
+ let nodeIndex = nodes.findIndex((n) => {
281
+ if (n.name !== name)
282
+ return false;
283
+ if (idx === pathSegments.length - 1) {
284
+ if (targetGuid && n.guid) {
285
+ return n.guid === targetGuid;
286
+ }
287
+ if (targetClassName) {
288
+ return n.className === targetClassName;
289
+ }
290
+ }
291
+ return true;
292
+ });
293
+ // Fallback to name-only match so we still prune even if class drifted
294
+ if (nodeIndex === -1 && idx === pathSegments.length - 1) {
295
+ if (targetGuid) {
296
+ nodeIndex = nodes.findIndex((n) => n.guid === targetGuid);
297
+ }
298
+ if (nodeIndex === -1) {
299
+ nodeIndex = nodes.findIndex((n) => n.name === name);
300
+ }
301
+ }
302
+ if (nodeIndex === -1)
303
+ return false;
304
+ const node = nodes[nodeIndex];
305
+ if (idx === pathSegments.length - 1) {
306
+ // Remove the entire subtree
307
+ nodes.splice(nodeIndex, 1);
308
+ return true;
309
+ }
310
+ const removed = pruneRecursive(node.children, idx + 1);
311
+ // Clean up empty child containers
312
+ if (removed &&
313
+ node.children &&
314
+ node.children.length === 0 &&
315
+ !node.filePaths) {
316
+ nodes.splice(nodeIndex, 1);
317
+ }
318
+ return removed;
319
+ };
320
+ return pruneRecursive(root.children, 0);
321
+ }
322
+ /**
323
+ * Validate that all paths in sourcemap point to existing files
324
+ */
325
+ validate(sourcemap) {
326
+ const errors = [];
327
+ const checkNode = (node) => {
328
+ if (node.filePaths) {
329
+ for (const filePath of node.filePaths) {
330
+ const fullPath = path.resolve(process.cwd(), filePath);
331
+ if (!fs.existsSync(fullPath)) {
332
+ errors.push(`Missing file: ${filePath}`);
333
+ }
334
+ }
335
+ }
336
+ if (node.children) {
337
+ for (const child of node.children) {
338
+ checkNode(child);
339
+ }
340
+ }
341
+ };
342
+ for (const child of sourcemap.children) {
343
+ checkNode(child);
344
+ }
345
+ return {
346
+ valid: errors.length === 0,
347
+ errors,
348
+ };
349
+ }
350
+ }
351
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/sourcemap/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { InstanceData } from "../ipc/messages.js";
2
+ interface SourcemapNode {
3
+ name: string;
4
+ className: string;
5
+ guid?: string;
6
+ properties?: Record<string, unknown>;
7
+ attributes?: Record<string, unknown>;
8
+ children?: SourcemapNode[];
9
+ filePaths?: string[];
10
+ }
11
+ export interface SourcemapPropertyIndex {
12
+ byGuid: Map<string, SourcemapNode>;
13
+ byPathClass: Map<string, SourcemapNode[]>;
14
+ }
15
+ export declare function loadSourcemapPropertyIndex(sourcemapPath: string): SourcemapPropertyIndex | null;
16
+ export declare function applySourcemapProperties(instances: InstanceData[], index: SourcemapPropertyIndex | null): number;
17
+ export declare function buildInstancesFromSourcemap(sourcemapPath: string): InstanceData[] | null;
18
+ export {};
19
+ //# sourceMappingURL=propertyLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propertyLoader.d.ts","sourceRoot":"","sources":["../../src/sourcemap/propertyLoader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAQD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CAC3C;AAKD,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,GACpB,sBAAsB,GAAG,IAAI,CAyC/B;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,YAAY,EAAE,EACzB,KAAK,EAAE,sBAAsB,GAAG,IAAI,GACnC,MAAM,CA2BR;AAED,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,GACpB,YAAY,EAAE,GAAG,IAAI,CAkEvB"}