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.
- package/.gitattributes +1 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/README.md +142 -0
- package/dist/build.d.ts +19 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +92 -0
- package/dist/build.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +397 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +105 -0
- package/dist/config.js.map +1 -0
- package/dist/fs/fileWriter.d.ts +100 -0
- package/dist/fs/fileWriter.d.ts.map +1 -0
- package/dist/fs/fileWriter.js +342 -0
- package/dist/fs/fileWriter.js.map +1 -0
- package/dist/fs/treeManager.d.ts +84 -0
- package/dist/fs/treeManager.d.ts.map +1 -0
- package/dist/fs/treeManager.js +365 -0
- package/dist/fs/treeManager.js.map +1 -0
- package/dist/fs/watcher.d.ts +39 -0
- package/dist/fs/watcher.d.ts.map +1 -0
- package/dist/fs/watcher.js +120 -0
- package/dist/fs/watcher.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +349 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/httpPolling.d.ts +56 -0
- package/dist/ipc/httpPolling.d.ts.map +1 -0
- package/dist/ipc/httpPolling.js +171 -0
- package/dist/ipc/httpPolling.js.map +1 -0
- package/dist/ipc/messages.d.ts +112 -0
- package/dist/ipc/messages.d.ts.map +1 -0
- package/dist/ipc/messages.js +5 -0
- package/dist/ipc/messages.js.map +1 -0
- package/dist/ipc/server.d.ts +50 -0
- package/dist/ipc/server.d.ts.map +1 -0
- package/dist/ipc/server.js +168 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/pack.d.ts +19 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +225 -0
- package/dist/pack.js.map +1 -0
- package/dist/push.d.ts +43 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +532 -0
- package/dist/push.js.map +1 -0
- package/dist/rojo.d.ts +9 -0
- package/dist/rojo.d.ts.map +1 -0
- package/dist/rojo.js +114 -0
- package/dist/rojo.js.map +1 -0
- package/dist/snapshot/rojo.d.ts +39 -0
- package/dist/snapshot/rojo.d.ts.map +1 -0
- package/dist/snapshot/rojo.js +364 -0
- package/dist/snapshot/rojo.js.map +1 -0
- package/dist/snapshot.d.ts +23 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +132 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/sourcemap/generator.d.ts +78 -0
- package/dist/sourcemap/generator.d.ts.map +1 -0
- package/dist/sourcemap/generator.js +351 -0
- package/dist/sourcemap/generator.js.map +1 -0
- package/dist/sourcemap/propertyLoader.d.ts +19 -0
- package/dist/sourcemap/propertyLoader.d.ts.map +1 -0
- package/dist/sourcemap/propertyLoader.js +131 -0
- package/dist/sourcemap/propertyLoader.js.map +1 -0
- package/dist/util/id.d.ts +9 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +14 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/log.d.ts +13 -0
- package/dist/util/log.d.ts.map +1 -0
- package/dist/util/log.js +51 -0
- package/dist/util/log.js.map +1 -0
- package/docs/assets/azul-logo.pdn +0 -0
- package/docs/assets/logo-200px.png +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/assets/plugin/toolbox.png +0 -0
- package/docs/assets/synced.png +0 -0
- package/package.json +41 -0
- package/plugin/README.md +54 -0
- package/plugin/sourcemap.json +264 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/Actor/AzulSync.server.luau +905 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/AzulService.luau +1010 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/Config.luau +29 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/Enums.luau +11 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/CollapsibleTitledSection.luau +214 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/ColorPicker.luau +360 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/CustomTextButton.luau +170 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/DropdownMenu.luau +363 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/HorizontalLine.luau +43 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/ImageButtonWithText.luau +181 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledCheckbox.luau +295 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledColorInputPicker.luau +294 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledMultiChoice.luau +163 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledNumberInput.luau +312 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledRadioButton.luau +55 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledSlider.luau +151 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledTextInput.luau +222 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/LabeledToggleButton.luau +73 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/StatefulImageButton.luau +125 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/VerticalScrollingFrame.luau +100 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/VerticalSpacer.luau +35 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/Components/VerticallyScalingListFrame.luau +107 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/GuiUtilities.luau +429 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/StudioWidgets/RbxGui.luau +4363 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/UI.luau +425 -0
- package/plugin/sync/ReplicatedFirst/AzulCompanionPlugin/WebSocketClient.luau +161 -0
- package/src/build.ts +120 -0
- package/src/cli.ts +496 -0
- package/src/config.ts +170 -0
- package/src/fs/fileWriter.ts +414 -0
- package/src/fs/treeManager.ts +458 -0
- package/src/fs/watcher.ts +142 -0
- package/src/index.ts +450 -0
- package/src/ipc/httpPolling.ts +214 -0
- package/src/ipc/messages.ts +159 -0
- package/src/ipc/server.ts +196 -0
- package/src/pack.ts +309 -0
- package/src/push.ts +726 -0
- package/src/snapshot/rojo.ts +467 -0
- package/src/snapshot.ts +161 -0
- package/src/sourcemap/generator.ts +504 -0
- package/src/sourcemap/propertyLoader.ts +195 -0
- package/src/util/id.ts +15 -0
- package/src/util/log.ts +94 -0
- package/tsconfig.json +24 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { SyncDaemon } from "./index.js"; // or refactor to export the class
|
|
6
|
+
import { config, getUserConfigPath, initializeConfig } from "./config.js";
|
|
7
|
+
import { log } from "./util/log.js";
|
|
8
|
+
import * as ReadLine from "readline";
|
|
9
|
+
import { BuildCommand } from "./build.js";
|
|
10
|
+
import { PushCommand } from "./push.js";
|
|
11
|
+
import { PackCommand } from "./pack.js";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const pkg = JSON.parse(fs.readFileSync(resolve(__dirname, "../package.json"), "utf8"));
|
|
15
|
+
const { version } = pkg;
|
|
16
|
+
const args = process.argv.slice(2);
|
|
17
|
+
const commandIndex = args.findIndex((a) => !a.startsWith("--"));
|
|
18
|
+
const command = commandIndex >= 0 ? args[commandIndex] : null;
|
|
19
|
+
const syncDirFlag = args.find((a) => a.startsWith("--sync-dir="));
|
|
20
|
+
const portFlag = args.find((a) => a.startsWith("--port="));
|
|
21
|
+
const debugFlag = args.find((a) => a === "--debug");
|
|
22
|
+
const noWarnFlag = args.find((a) => a === "--no-warn");
|
|
23
|
+
const rojoFlag = args.includes("--rojo");
|
|
24
|
+
const rojoProjectFlag = getFlagValue(["--rojo-project"], args);
|
|
25
|
+
const fromSourcemapValue = getFlagValue(["--from-sourcemap"], args);
|
|
26
|
+
const fromSourcemapFlag = args.includes("--from-sourcemap") || fromSourcemapValue !== null;
|
|
27
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
28
|
+
console.log(`
|
|
29
|
+
Usage:
|
|
30
|
+
azul <command> [options]
|
|
31
|
+
azul build [--from-sourcemap <file>] [--rojo] [--rojo-project <file>]
|
|
32
|
+
azul push [options] [--rojo] [--rojo-project <file>] [--from-sourcemap <file>]
|
|
33
|
+
azul pack [-o <file>] [--scripts-only]
|
|
34
|
+
azul config [--path]
|
|
35
|
+
|
|
36
|
+
Commands:
|
|
37
|
+
(no command) Start live sync daemon
|
|
38
|
+
build One-time push from filesystem into Studio
|
|
39
|
+
push Selective push using mappings (place config or -s/-d)
|
|
40
|
+
pack Serialize Studio instance properties into sourcemap.json
|
|
41
|
+
config Open the Azul config file in your default editor
|
|
42
|
+
|
|
43
|
+
Global Options:
|
|
44
|
+
-h, --help Show this help message
|
|
45
|
+
--version Show Azul version
|
|
46
|
+
--debug Print verbose debug output
|
|
47
|
+
--no-warn Disable confirmation prompts for dangerous operations
|
|
48
|
+
--sync-dir [PATH] Directory to sync (default: current directory)
|
|
49
|
+
--port [NUMBER] Studio connection port
|
|
50
|
+
|
|
51
|
+
Build Options:
|
|
52
|
+
--from-sourcemap [FILE] Build from sourcemap
|
|
53
|
+
--rojo Enable Rojo-compatible parsing
|
|
54
|
+
--rojo-project [FILE] Use a Rojo project file
|
|
55
|
+
|
|
56
|
+
Push Options:
|
|
57
|
+
-s, --source [DIR] Source folder to push
|
|
58
|
+
-d, --destination [PATH] Studio destination path (i.e "ReplicatedStorage.Packages")
|
|
59
|
+
--from-sourcemap [FILE] Push from sourcemap
|
|
60
|
+
--no-place-config Ignore push mappings from place ModuleScript
|
|
61
|
+
--destructive Wipe destination children before pushing
|
|
62
|
+
--rojo Enable Rojo-compatible parsing
|
|
63
|
+
--rojo-project [FILE] Use a Rojo project file
|
|
64
|
+
|
|
65
|
+
Pack Options:
|
|
66
|
+
-o, --output Sourcemap path to write (default: config.sourcemapPath)
|
|
67
|
+
--scripts-only Serialize only scripts and their descendants
|
|
68
|
+
|
|
69
|
+
Config Options:
|
|
70
|
+
--path Print config file path
|
|
71
|
+
`);
|
|
72
|
+
process.exit(0);
|
|
73
|
+
}
|
|
74
|
+
if (args.includes("--version")) {
|
|
75
|
+
log.info(`Azul version: ${version}`);
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
initializeConfig();
|
|
79
|
+
log.debug(`Loaded user config from: ${getUserConfigPath()}`);
|
|
80
|
+
if (command === "config") {
|
|
81
|
+
const userConfigPath = getUserConfigPath();
|
|
82
|
+
if (args.includes("--path")) {
|
|
83
|
+
console.log(userConfigPath);
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
await openWithDefaultEditor(userConfigPath);
|
|
88
|
+
log.info(`Opened Azul config: ${userConfigPath}`);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
log.error(`Failed to open config file: ${error}`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
// get current running path
|
|
97
|
+
const currentPath = process.cwd();
|
|
98
|
+
if ((currentPath.includes(`\\${config.syncDir}`) ||
|
|
99
|
+
currentPath.includes(`/${config.syncDir}`)) &&
|
|
100
|
+
!noWarnFlag) {
|
|
101
|
+
log.warn(`Looks like you're trying to run Azul from within a '${config.syncDir}' directory. Continuing to run Azul will create a directory like "/${config.syncDir}/${config.syncDir}/".`);
|
|
102
|
+
log.userInput("Continue? (Y/N)");
|
|
103
|
+
await new Promise((resolve) => {
|
|
104
|
+
process.stdin.setEncoding("utf-8");
|
|
105
|
+
const rl = ReadLine.createInterface({
|
|
106
|
+
input: process.stdin,
|
|
107
|
+
output: process.stdout,
|
|
108
|
+
});
|
|
109
|
+
rl.on("line", (input) => {
|
|
110
|
+
const answer = input.trim().toLowerCase();
|
|
111
|
+
if (answer === "y" || answer === "yes") {
|
|
112
|
+
rl.close();
|
|
113
|
+
resolve();
|
|
114
|
+
}
|
|
115
|
+
else if (answer === "n" || answer === "no") {
|
|
116
|
+
log.info("Exiting. Please run azul from your project root.");
|
|
117
|
+
process.exit(0);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
log.userInput("Please answer Y (yes) or N (no). Are you sure? (Y/N)");
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
log.info(`Running azul from: ${currentPath}`);
|
|
126
|
+
if (syncDirFlag)
|
|
127
|
+
config.syncDir = resolve(syncDirFlag.split("=")[1]);
|
|
128
|
+
if (portFlag)
|
|
129
|
+
config.port = Number(portFlag.split("=")[1]);
|
|
130
|
+
if (debugFlag)
|
|
131
|
+
config.debugMode = true;
|
|
132
|
+
log.debug(`Debug mode is on!`);
|
|
133
|
+
if (command === "build") {
|
|
134
|
+
if (!rojoFlag && fs.existsSync("default.project.json")) {
|
|
135
|
+
log.warn('Detected default.project.json! You can enable Rojo compatibility mode by passing the "--rojo" flag.');
|
|
136
|
+
}
|
|
137
|
+
const hasBuildSpecificOptions = rojoFlag || Boolean(rojoProjectFlag) || fromSourcemapFlag;
|
|
138
|
+
let applySourcemap = !fromSourcemapFlag;
|
|
139
|
+
let fromSourcemap = fromSourcemapFlag;
|
|
140
|
+
if (!hasBuildSpecificOptions) {
|
|
141
|
+
const sourcemapExists = fs.existsSync(config.sourcemapPath);
|
|
142
|
+
if (sourcemapExists) {
|
|
143
|
+
log.userInput(`Build directly from ${config.sourcemapPath} (includes non-script instances)? (Y/N)`);
|
|
144
|
+
const useFull = await promptYesNo();
|
|
145
|
+
if (useFull) {
|
|
146
|
+
fromSourcemap = true;
|
|
147
|
+
applySourcemap = false;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
log.userInput(`Use packed properties/attributes from ${config.sourcemapPath}? (Y/N)`);
|
|
151
|
+
applySourcemap = await promptYesNo();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
applySourcemap = false;
|
|
156
|
+
log.info(`No sourcemap found at ${config.sourcemapPath}. Build will recreate instances as scripts/folders.`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!noWarnFlag) {
|
|
160
|
+
log.warn("WARNING: Building will overwrite matching Studio scripts and create new ones from your local environment. Existing Studio instances will not be deleted. Proceed with caution!");
|
|
161
|
+
log.userInput("Continue with build? (Y/N)");
|
|
162
|
+
await new Promise((resolve) => {
|
|
163
|
+
process.stdin.setEncoding("utf-8");
|
|
164
|
+
const rl = ReadLine.createInterface({
|
|
165
|
+
input: process.stdin,
|
|
166
|
+
output: process.stdout,
|
|
167
|
+
});
|
|
168
|
+
rl.on("line", (input) => {
|
|
169
|
+
const answer = input.trim().toLowerCase();
|
|
170
|
+
if (answer === "y" || answer === "yes") {
|
|
171
|
+
rl.close();
|
|
172
|
+
resolve();
|
|
173
|
+
}
|
|
174
|
+
else if (answer === "n" || answer === "no") {
|
|
175
|
+
log.info("Exiting build command...");
|
|
176
|
+
process.exit(0);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
log.userInput("Please answer Y (yes) or N (no). Continue with build? (Y/N)");
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
await new BuildCommand({
|
|
185
|
+
syncDir: config.syncDir,
|
|
186
|
+
rojoMode: rojoFlag,
|
|
187
|
+
rojoProjectFile: rojoProjectFlag ?? undefined,
|
|
188
|
+
applySourcemap,
|
|
189
|
+
fromSourcemap,
|
|
190
|
+
}).run();
|
|
191
|
+
log.info("Build command completed.");
|
|
192
|
+
log.info("Run 'azul' to resume live sync if needed.");
|
|
193
|
+
log.info("Exiting...");
|
|
194
|
+
process.exit(0);
|
|
195
|
+
}
|
|
196
|
+
if (command === "push") {
|
|
197
|
+
const sourceValue = getFlagValue(["-s", "--source"], args);
|
|
198
|
+
const destValue = getFlagValue(["-d", "--destination"], args);
|
|
199
|
+
const destructive = args.includes("--destructive");
|
|
200
|
+
const usePlaceConfig = !args.includes("--no-place-config");
|
|
201
|
+
const hasPushSpecificOptions = Boolean(sourceValue ||
|
|
202
|
+
destValue ||
|
|
203
|
+
destructive ||
|
|
204
|
+
!usePlaceConfig ||
|
|
205
|
+
rojoFlag ||
|
|
206
|
+
rojoProjectFlag ||
|
|
207
|
+
fromSourcemapFlag);
|
|
208
|
+
let interactiveSource = sourceValue ?? undefined;
|
|
209
|
+
let interactiveDest = destValue ?? undefined;
|
|
210
|
+
let interactiveDestructive = destructive;
|
|
211
|
+
let interactiveUsePlaceConfig = usePlaceConfig;
|
|
212
|
+
let applySourcemap = !rojoFlag && !fromSourcemapFlag;
|
|
213
|
+
let fromSourcemap = !rojoFlag && fromSourcemapFlag;
|
|
214
|
+
if (!hasPushSpecificOptions && !rojoFlag) {
|
|
215
|
+
log.userInput("Use place config from Studio (ServerStorage.Azul.Config)? (Y/N)");
|
|
216
|
+
const useConfig = await promptYesNo();
|
|
217
|
+
interactiveUsePlaceConfig = useConfig;
|
|
218
|
+
if (!useConfig) {
|
|
219
|
+
log.userInput("Source folder to push (e.g., src)?");
|
|
220
|
+
interactiveSource = (await promptLine()).trim() || undefined;
|
|
221
|
+
log.userInput("Destination path (dot or slash separated, e.g., ReplicatedStorage.Packages)?");
|
|
222
|
+
interactiveDest = (await promptLine()).trim() || undefined;
|
|
223
|
+
log.userInput("Destructive push (wipe destination children)? (Y/N)");
|
|
224
|
+
interactiveDestructive = await promptYesNo();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (!rojoFlag && !fromSourcemapFlag) {
|
|
228
|
+
log.userInput(`Build push snapshot directly from ${config.sourcemapPath} (includes non-script descendants and ancestors)? (Y/N)`);
|
|
229
|
+
fromSourcemap = await promptYesNo();
|
|
230
|
+
if (fromSourcemap) {
|
|
231
|
+
if (fs.existsSync(config.sourcemapPath)) {
|
|
232
|
+
log.userInput(`Apply packed properties/attributes from ${config.sourcemapPath}? (Y/N)`);
|
|
233
|
+
applySourcemap = await promptYesNo();
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
fromSourcemap = false;
|
|
237
|
+
applySourcemap = false;
|
|
238
|
+
log.warn(`No sourcemap found at "${config.sourcemapPath}"! Please create one or provide it using the "--from-sourcemap" flag.`);
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
fromSourcemap = false;
|
|
244
|
+
applySourcemap = false;
|
|
245
|
+
log.info(`Not using sourcemap. Azul will recreate instances as scripts/folders based on your local filesystem structure with default Properties/Attributes.`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!rojoFlag && fs.existsSync("default.project.json")) {
|
|
249
|
+
log.info("Detected default.project.json. Azul stays in native mode unless you pass --rojo.");
|
|
250
|
+
}
|
|
251
|
+
if (destructive && !noWarnFlag) {
|
|
252
|
+
log.warn("WARNING: Destructive push will wipe destination children before applying snapshot. Proceed? (Y/N)");
|
|
253
|
+
await new Promise((resolve) => {
|
|
254
|
+
process.stdin.setEncoding("utf-8");
|
|
255
|
+
const rl = ReadLine.createInterface({
|
|
256
|
+
input: process.stdin,
|
|
257
|
+
output: process.stdout,
|
|
258
|
+
});
|
|
259
|
+
rl.on("line", (input) => {
|
|
260
|
+
const answer = input.trim().toLowerCase();
|
|
261
|
+
if (answer === "y" || answer === "yes") {
|
|
262
|
+
rl.close();
|
|
263
|
+
resolve();
|
|
264
|
+
}
|
|
265
|
+
else if (answer === "n" || answer === "no") {
|
|
266
|
+
log.info("Exiting push command...");
|
|
267
|
+
process.exit(0);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
log.userInput("Please answer Y (yes) or N (no). Continue with destructive push? (Y/N)");
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
await new PushCommand({
|
|
276
|
+
source: interactiveSource ?? undefined,
|
|
277
|
+
destination: interactiveDest ?? undefined,
|
|
278
|
+
destructive: interactiveDestructive,
|
|
279
|
+
usePlaceConfig: rojoFlag ? false : interactiveUsePlaceConfig,
|
|
280
|
+
rojoMode: rojoFlag,
|
|
281
|
+
rojoProjectFile: rojoProjectFlag ?? undefined,
|
|
282
|
+
applySourcemap,
|
|
283
|
+
fromSourcemap,
|
|
284
|
+
sourcemapPath: fromSourcemapValue && !fromSourcemapValue.startsWith("--")
|
|
285
|
+
? fromSourcemapValue
|
|
286
|
+
: undefined,
|
|
287
|
+
}).run();
|
|
288
|
+
log.info("Push command completed.");
|
|
289
|
+
log.info("Run 'azul' to resume live sync if needed.");
|
|
290
|
+
process.exit(0);
|
|
291
|
+
}
|
|
292
|
+
if (command === "pack") {
|
|
293
|
+
const outputValue = getFlagValue(["-o", "--output"], args);
|
|
294
|
+
let scriptsOnly = args.includes("--scripts-only");
|
|
295
|
+
const hasPackSpecificOptions = outputValue !== null || args.includes("--scripts-only");
|
|
296
|
+
let finalOutputPath = outputValue ?? config.sourcemapPath;
|
|
297
|
+
if (!hasPackSpecificOptions) {
|
|
298
|
+
const interactive = await promptPackInteractive(config.sourcemapPath);
|
|
299
|
+
finalOutputPath = interactive.outputPath;
|
|
300
|
+
scriptsOnly = interactive.scriptsOnly;
|
|
301
|
+
}
|
|
302
|
+
await new PackCommand({
|
|
303
|
+
outputPath: finalOutputPath,
|
|
304
|
+
scriptsAndDescendantsOnly: scriptsOnly,
|
|
305
|
+
}).run();
|
|
306
|
+
log.info("Pack command completed.");
|
|
307
|
+
process.exit(0);
|
|
308
|
+
}
|
|
309
|
+
new SyncDaemon().start();
|
|
310
|
+
function getFlagValue(flags, argv) {
|
|
311
|
+
for (let i = 0; i < argv.length; i++) {
|
|
312
|
+
const arg = argv[i];
|
|
313
|
+
for (const flag of flags) {
|
|
314
|
+
if (arg === flag) {
|
|
315
|
+
return argv[i + 1] ?? null;
|
|
316
|
+
}
|
|
317
|
+
if (arg.startsWith(`${flag}=`)) {
|
|
318
|
+
return arg.split("=")[1] ?? null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
function openWithDefaultEditor(targetPath) {
|
|
325
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
326
|
+
const currentPlatform = process.platform;
|
|
327
|
+
const argsByPlatform = {
|
|
328
|
+
win32: ["/c", "start", "", targetPath],
|
|
329
|
+
darwin: [targetPath],
|
|
330
|
+
linux: [targetPath],
|
|
331
|
+
};
|
|
332
|
+
const commandByPlatform = {
|
|
333
|
+
win32: "cmd",
|
|
334
|
+
darwin: "open",
|
|
335
|
+
linux: "xdg-open",
|
|
336
|
+
};
|
|
337
|
+
const commandName = commandByPlatform[currentPlatform];
|
|
338
|
+
const commandArgs = argsByPlatform[currentPlatform];
|
|
339
|
+
if (!commandName || !commandArgs) {
|
|
340
|
+
rejectPromise(new Error(`Unsupported platform: ${currentPlatform}`));
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
const child = spawn(commandName, commandArgs, {
|
|
344
|
+
detached: true,
|
|
345
|
+
stdio: "ignore",
|
|
346
|
+
});
|
|
347
|
+
child.on("error", (error) => {
|
|
348
|
+
if (currentPlatform === "linux" && error.code === "ENOENT") {
|
|
349
|
+
rejectPromise(new Error("Could not open config file because 'xdg-open' is not installed. Install it (i.e: 'sudo apt install xdg-utils' or 'sudo dnf install xdg-utils') and try again."));
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
rejectPromise(error);
|
|
353
|
+
});
|
|
354
|
+
child.unref();
|
|
355
|
+
resolvePromise();
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
async function promptPackInteractive(defaultOutputPath) {
|
|
359
|
+
log.info("Interactive mode: configuring 'azul pack'.");
|
|
360
|
+
log.userInput("Serialize everything? (Y/N)");
|
|
361
|
+
const scriptsOnly = !(await promptYesNo());
|
|
362
|
+
if (scriptsOnly) {
|
|
363
|
+
log.info("Scripts-only mode will only serialize Script, LocalScript, and ModuleScript instances and their descendants.");
|
|
364
|
+
}
|
|
365
|
+
log.userInput(`Output sourcemap path? (press Enter for '${defaultOutputPath}')`);
|
|
366
|
+
const outputInput = await promptLine();
|
|
367
|
+
const outputPath = outputInput.trim() === "" ? defaultOutputPath : outputInput.trim();
|
|
368
|
+
return {
|
|
369
|
+
outputPath,
|
|
370
|
+
scriptsOnly,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function promptLine() {
|
|
374
|
+
return new Promise((resolve) => {
|
|
375
|
+
const rl = ReadLine.createInterface({
|
|
376
|
+
input: process.stdin,
|
|
377
|
+
output: process.stdout,
|
|
378
|
+
});
|
|
379
|
+
rl.once("line", (input) => {
|
|
380
|
+
rl.close();
|
|
381
|
+
resolve(input);
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
async function promptYesNo() {
|
|
386
|
+
while (true) {
|
|
387
|
+
const input = (await promptLine()).trim().toLowerCase();
|
|
388
|
+
if (input === "y" || input === "yes") {
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
if (input === "n" || input === "no") {
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
log.userInput("Please answer Y (yes) or N (no).");
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for the sync daemon
|
|
3
|
+
*/
|
|
4
|
+
export interface AzulConfig {
|
|
5
|
+
/** WebSocket server port */
|
|
6
|
+
port: number;
|
|
7
|
+
/** Enable debug mode */
|
|
8
|
+
debugMode: boolean;
|
|
9
|
+
/** Directory where synced files will be stored (relative to project root) */
|
|
10
|
+
syncDir: string;
|
|
11
|
+
/** Path where sourcemap.json is written (relative to project root) */
|
|
12
|
+
sourcemapPath: string;
|
|
13
|
+
/** File extension for scripts */
|
|
14
|
+
scriptExtension: string;
|
|
15
|
+
/** Debounce delay for file watching (ms) */
|
|
16
|
+
fileWatchDebounce: number;
|
|
17
|
+
/** Delete unmapped files in syncDir after a new connection/full snapshot */
|
|
18
|
+
deleteOrphansOnConnect: boolean;
|
|
19
|
+
/** Suffix ModuleScript names with ".module"? */
|
|
20
|
+
suffixModuleScripts: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare const defaultConfig: Readonly<AzulConfig>;
|
|
23
|
+
export declare const config: AzulConfig;
|
|
24
|
+
export declare function getUserConfigPath(): string;
|
|
25
|
+
export declare function initializeConfig(): void;
|
|
26
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,MAAM,WAAW,UAAU;IAGzB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,SAAS,EAAE,OAAO,CAAC;IAInB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAEhB,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IAEtB,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IAExB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAE1B,4EAA4E;IAC5E,sBAAsB,EAAE,OAAO,CAAC;IAEhC,gDAAgD;IAChD,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,UAAU,CAS9C,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,UAAiC,CAAC;AAIvD,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAgBvC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export const defaultConfig = {
|
|
5
|
+
port: 8080,
|
|
6
|
+
debugMode: false,
|
|
7
|
+
syncDir: "./sync",
|
|
8
|
+
sourcemapPath: "./sourcemap.json",
|
|
9
|
+
scriptExtension: ".luau",
|
|
10
|
+
fileWatchDebounce: 100,
|
|
11
|
+
deleteOrphansOnConnect: true,
|
|
12
|
+
suffixModuleScripts: false,
|
|
13
|
+
};
|
|
14
|
+
export const config = { ...defaultConfig };
|
|
15
|
+
let initialized = false;
|
|
16
|
+
export function getUserConfigPath() {
|
|
17
|
+
const configRoot = getPlatformConfigRoot();
|
|
18
|
+
return path.join(configRoot, "azul", "config.json");
|
|
19
|
+
}
|
|
20
|
+
export function initializeConfig() {
|
|
21
|
+
if (initialized) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
initialized = true;
|
|
25
|
+
const configPath = getUserConfigPath();
|
|
26
|
+
ensureUserConfigExists(configPath);
|
|
27
|
+
const userConfig = readUserConfig(configPath);
|
|
28
|
+
if (!userConfig) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
Object.assign(config, userConfig);
|
|
32
|
+
}
|
|
33
|
+
function getPlatformConfigRoot() {
|
|
34
|
+
if (process.platform === "win32") {
|
|
35
|
+
return process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming");
|
|
36
|
+
}
|
|
37
|
+
if (process.platform === "darwin") {
|
|
38
|
+
return path.join(os.homedir(), "Library", "Application Support");
|
|
39
|
+
}
|
|
40
|
+
return process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config");
|
|
41
|
+
}
|
|
42
|
+
function ensureUserConfigExists(configPath) {
|
|
43
|
+
try {
|
|
44
|
+
const configDir = path.dirname(configPath);
|
|
45
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
46
|
+
if (!fs.existsSync(configPath)) {
|
|
47
|
+
fs.writeFileSync(configPath, `${JSON.stringify(defaultConfig, null, 2)}\n`, "utf8");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.warn("Failed to initialize Azul user config file:", error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function readUserConfig(configPath) {
|
|
55
|
+
try {
|
|
56
|
+
const raw = fs.readFileSync(configPath, "utf8");
|
|
57
|
+
const parsed = JSON.parse(raw);
|
|
58
|
+
if (!isRecord(parsed)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return sanitizeConfig(parsed);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.warn("Failed to read Azul user config file:", error);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function sanitizeConfig(input) {
|
|
69
|
+
const sanitized = {};
|
|
70
|
+
if (isPositiveInteger(input.port)) {
|
|
71
|
+
sanitized.port = input.port;
|
|
72
|
+
}
|
|
73
|
+
if (typeof input.debugMode === "boolean") {
|
|
74
|
+
sanitized.debugMode = input.debugMode;
|
|
75
|
+
}
|
|
76
|
+
if (isNonEmptyString(input.syncDir)) {
|
|
77
|
+
sanitized.syncDir = input.syncDir;
|
|
78
|
+
}
|
|
79
|
+
if (isNonEmptyString(input.sourcemapPath)) {
|
|
80
|
+
sanitized.sourcemapPath = input.sourcemapPath;
|
|
81
|
+
}
|
|
82
|
+
if (isNonEmptyString(input.scriptExtension)) {
|
|
83
|
+
sanitized.scriptExtension = input.scriptExtension;
|
|
84
|
+
}
|
|
85
|
+
if (isPositiveInteger(input.fileWatchDebounce)) {
|
|
86
|
+
sanitized.fileWatchDebounce = input.fileWatchDebounce;
|
|
87
|
+
}
|
|
88
|
+
if (typeof input.deleteOrphansOnConnect === "boolean") {
|
|
89
|
+
sanitized.deleteOrphansOnConnect = input.deleteOrphansOnConnect;
|
|
90
|
+
}
|
|
91
|
+
if (typeof input.suffixModuleScripts === "boolean") {
|
|
92
|
+
sanitized.suffixModuleScripts = input.suffixModuleScripts;
|
|
93
|
+
}
|
|
94
|
+
return sanitized;
|
|
95
|
+
}
|
|
96
|
+
function isRecord(value) {
|
|
97
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
98
|
+
}
|
|
99
|
+
function isPositiveInteger(value) {
|
|
100
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0;
|
|
101
|
+
}
|
|
102
|
+
function isNonEmptyString(value) {
|
|
103
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { TreeNode } from "./treeManager.js";
|
|
2
|
+
/**
|
|
3
|
+
* Mapping of GUID to file path
|
|
4
|
+
*/
|
|
5
|
+
export interface FileMapping {
|
|
6
|
+
guid: string;
|
|
7
|
+
filePath: string;
|
|
8
|
+
className: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Handles writing the virtual tree to the filesystem
|
|
12
|
+
*/
|
|
13
|
+
export declare class FileWriter {
|
|
14
|
+
private baseDir;
|
|
15
|
+
private fileMappings;
|
|
16
|
+
private pathToGuid;
|
|
17
|
+
constructor(baseDir?: string);
|
|
18
|
+
/**
|
|
19
|
+
* Write all script nodes to the filesystem
|
|
20
|
+
*/
|
|
21
|
+
writeTree(nodes: Map<string, TreeNode>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Write multiple scripts in a batch for improved I/O efficiency
|
|
24
|
+
*/
|
|
25
|
+
writeBatch(nodes: TreeNode[]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Write or update a single script
|
|
28
|
+
*/
|
|
29
|
+
writeScript(node: TreeNode): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Delete a script file
|
|
32
|
+
*/
|
|
33
|
+
deleteScript(guid: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Delete a script file by path even if the mapping is missing
|
|
36
|
+
*/
|
|
37
|
+
deleteFilePath(filePath: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get the filesystem path for a node
|
|
40
|
+
*/
|
|
41
|
+
getFilePath(node: TreeNode): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get the filesystem path for a node, with optional collision map for batch operations
|
|
44
|
+
*/
|
|
45
|
+
private getFilePathWithCollisionMap;
|
|
46
|
+
/**
|
|
47
|
+
* Get the appropriate filename for a script node
|
|
48
|
+
*/
|
|
49
|
+
private getScriptFileName;
|
|
50
|
+
/**
|
|
51
|
+
* Sanitize a name for use in filesystem
|
|
52
|
+
*/
|
|
53
|
+
private sanitizeName;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a node is a script
|
|
56
|
+
*/
|
|
57
|
+
private isScriptNode;
|
|
58
|
+
/**
|
|
59
|
+
* Ensure a directory exists
|
|
60
|
+
*/
|
|
61
|
+
private ensureDirectory;
|
|
62
|
+
/**
|
|
63
|
+
* Internal helper to remove a file and clean mapping
|
|
64
|
+
*/
|
|
65
|
+
private deleteFilePathInternal;
|
|
66
|
+
/**
|
|
67
|
+
* Find the GUID that currently owns a file path, if any
|
|
68
|
+
*/
|
|
69
|
+
private findGuidByFilePath;
|
|
70
|
+
/**
|
|
71
|
+
* Get path relative to base directory
|
|
72
|
+
*/
|
|
73
|
+
private getRelativePath;
|
|
74
|
+
/**
|
|
75
|
+
* Get file mapping by GUID
|
|
76
|
+
*/
|
|
77
|
+
getMapping(guid: string): FileMapping | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Get GUID by file path
|
|
80
|
+
*/
|
|
81
|
+
getGuidByPath(filePath: string): string | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Get all file mappings
|
|
84
|
+
*/
|
|
85
|
+
getAllMappings(): Map<string, FileMapping>;
|
|
86
|
+
/**
|
|
87
|
+
* Get the base directory
|
|
88
|
+
*/
|
|
89
|
+
getBaseDir(): string;
|
|
90
|
+
/**
|
|
91
|
+
* Clean up empty directories
|
|
92
|
+
*/
|
|
93
|
+
cleanupEmptyDirectories(): void;
|
|
94
|
+
private cleanupEmptyDirsRecursive;
|
|
95
|
+
/**
|
|
96
|
+
* Walk up from a directory and remove empty parents until baseDir is reached.
|
|
97
|
+
*/
|
|
98
|
+
private cleanupParentsIfEmpty;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=fileWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileWriter.d.ts","sourceRoot":"","sources":["../../src/fs/fileWriter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAAkC;gBAExC,OAAO,GAAE,MAAuB;IAK5C;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI;IAoBpD;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAyC1C;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IA8CjD;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAiB1C;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAShD;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;IAI1C;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA6CnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIxD;;OAEG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1D;;OAEG;IACI,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAIjD;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,uBAAuB,IAAI,IAAI;IAItC,OAAO,CAAC,yBAAyB;IAyBjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAqB9B"}
|