@gtkx/cli 2.0.0-beta.3 → 2.0.0-beta.4

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 (68) hide show
  1. package/dist/cli.js +4 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/codegen/config-dependencies.d.ts +3 -0
  4. package/dist/codegen/config-dependencies.d.ts.map +1 -0
  5. package/dist/codegen/config-dependencies.js +355 -0
  6. package/dist/codegen/config-dependencies.js.map +1 -0
  7. package/dist/codegen/run-codegen.d.ts +3 -2
  8. package/dist/codegen/run-codegen.d.ts.map +1 -1
  9. package/dist/codegen/run-codegen.js +31 -6
  10. package/dist/codegen/run-codegen.js.map +1 -1
  11. package/dist/codegen/store-resolver.d.ts +1 -0
  12. package/dist/codegen/store-resolver.d.ts.map +1 -1
  13. package/dist/codegen/store-resolver.js +4 -2
  14. package/dist/codegen/store-resolver.js.map +1 -1
  15. package/dist/commands/cleanup.d.ts +9 -0
  16. package/dist/commands/cleanup.d.ts.map +1 -0
  17. package/dist/commands/cleanup.js +31 -0
  18. package/dist/commands/cleanup.js.map +1 -0
  19. package/dist/commands/dev.d.ts.map +1 -1
  20. package/dist/commands/dev.js +4 -2
  21. package/dist/commands/dev.js.map +1 -1
  22. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  23. package/dist/deploy/freedesktop/validate.js +1 -0
  24. package/dist/deploy/freedesktop/validate.js.map +1 -1
  25. package/dist/deploy/payload/stage.d.ts.map +1 -1
  26. package/dist/deploy/payload/stage.js +24 -3
  27. package/dist/deploy/payload/stage.js.map +1 -1
  28. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  29. package/dist/deploy/settings/extra-files.js +4 -3
  30. package/dist/deploy/settings/extra-files.js.map +1 -1
  31. package/dist/dev/supervisor.d.ts +2 -1
  32. package/dist/dev/supervisor.d.ts.map +1 -1
  33. package/dist/dev/supervisor.js +120 -24
  34. package/dist/dev/supervisor.js.map +1 -1
  35. package/dist/i18n/source-messages.d.ts +3 -1
  36. package/dist/i18n/source-messages.d.ts.map +1 -1
  37. package/dist/i18n/source-messages.js +14 -2
  38. package/dist/i18n/source-messages.js.map +1 -1
  39. package/dist/internal/build-output.d.ts.map +1 -1
  40. package/dist/internal/build-output.js +45 -8
  41. package/dist/internal/build-output.js.map +1 -1
  42. package/dist/internal/prepare-project.d.ts +1 -0
  43. package/dist/internal/prepare-project.d.ts.map +1 -1
  44. package/dist/internal/prepare-project.js +8 -2
  45. package/dist/internal/prepare-project.js.map +1 -1
  46. package/dist/vite-plugins/i18n.d.ts +1 -1
  47. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  48. package/dist/vite-plugins/i18n.js +18 -5
  49. package/dist/vite-plugins/i18n.js.map +1 -1
  50. package/dist/vite-plugins/index.d.ts.map +1 -1
  51. package/dist/vite-plugins/index.js +3 -1
  52. package/dist/vite-plugins/index.js.map +1 -1
  53. package/package.json +12 -10
  54. package/src/cli.ts +5 -0
  55. package/src/codegen/config-dependencies.ts +470 -0
  56. package/src/codegen/run-codegen.ts +37 -5
  57. package/src/codegen/store-resolver.ts +5 -2
  58. package/src/commands/cleanup.ts +36 -0
  59. package/src/commands/dev.ts +9 -2
  60. package/src/deploy/freedesktop/validate.ts +1 -0
  61. package/src/deploy/payload/stage.ts +42 -3
  62. package/src/deploy/settings/extra-files.ts +5 -3
  63. package/src/dev/supervisor.ts +158 -27
  64. package/src/i18n/source-messages.ts +19 -3
  65. package/src/internal/build-output.ts +67 -9
  66. package/src/internal/prepare-project.ts +9 -3
  67. package/src/vite-plugins/i18n.ts +22 -3
  68. package/src/vite-plugins/index.ts +8 -1
@@ -1,7 +1,7 @@
1
1
  import { error, exitCodeForSignal, info, installGracefulShutdown } from "@gtkx/utils";
2
2
  import { fork as nodeFork } from "node:child_process";
3
- import { watch as watchFs } from "node:fs";
4
- import { basename, dirname } from "node:path";
3
+ import { statSync, watch as watchFs } from "node:fs";
4
+ import { basename, dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from "./entry-env.js";
7
7
  const DEV_RUNNER_URL = new URL("../../bin/gtkx-dev-runner.js", import.meta.url);
@@ -72,38 +72,71 @@ const launch = (state) => {
72
72
  handleChildExit(state, code, signal);
73
73
  });
74
74
  };
75
- const isRestartBlocked = (state) => state.isRestarting || state.isShuttingDown;
76
- const relaunchAfterExit = (state) => {
75
+ const runPendingRestart = (state) => {
77
76
  state.isRestarting = false;
77
+ if (!state.isRestartPending || state.isShuttingDown) {
78
+ return;
79
+ }
80
+ state.isRestartPending = false;
81
+ void restart(state);
82
+ };
83
+ const relaunchAfterExit = (state) => {
78
84
  if (state.isShuttingDown) {
85
+ state.isRestarting = false;
79
86
  return;
80
87
  }
81
88
  info("Restarting dev runner...");
82
89
  launch(state);
90
+ runPendingRestart(state);
91
+ };
92
+ const isSupervisorShuttingDown = (state) => state.isShuttingDown;
93
+ const reconcileConfigWatchers = (state, paths, previous) => {
94
+ const didChange = didWatchPathsChange(previous, paths);
95
+ closeWatchers(state);
96
+ if (state.watch !== undefined) {
97
+ state.watch.paths = paths;
98
+ }
99
+ if (state.isShuttingDown) {
100
+ return;
101
+ }
102
+ installConfigWatchers(state);
103
+ if (didChange && !state.isRestartPending) {
104
+ scheduleRestart(state);
105
+ }
83
106
  };
84
107
  const restart = async (state) => {
85
108
  const watch = state.watch;
86
- if (watch === undefined || isRestartBlocked(state)) {
109
+ if (watch === undefined || state.isShuttingDown) {
110
+ return;
111
+ }
112
+ if (state.isRestarting) {
113
+ state.isRestartPending = true;
87
114
  return;
88
115
  }
89
116
  state.isRestarting = true;
90
- info("gtkx.config.ts changed; regenerating bindings...");
117
+ info(`${basename(state.configFile)} changed; regenerating bindings...`);
118
+ closeWatchers(state);
119
+ watch.paths = watch.resolvePaths();
120
+ const previous = snapshotWatchPaths(watch.paths);
121
+ installConfigWatchers(state);
91
122
  try {
92
- await watch.regenerate();
123
+ const paths = await watch.regenerate();
124
+ reconcileConfigWatchers(state, paths, previous);
93
125
  }
94
126
  catch (error_) {
127
+ reconcileConfigWatchers(state, watch.resolvePaths(), previous);
95
128
  error("Codegen failed; keeping the current dev runner. Fix the error and save again.", error_);
96
- state.isRestarting = false;
129
+ runPendingRestart(state);
97
130
  return;
98
131
  }
99
- if (state.isShuttingDown) {
132
+ if (isSupervisorShuttingDown(state)) {
100
133
  state.isRestarting = false;
101
134
  return;
102
135
  }
103
136
  const current = state.child;
104
137
  if (current === null) {
105
- state.isRestarting = false;
106
138
  launch(state);
139
+ runPendingRestart(state);
107
140
  return;
108
141
  }
109
142
  current.once("exit", () => {
@@ -111,11 +144,15 @@ const restart = async (state) => {
111
144
  });
112
145
  forwardSignal(current, "SIGTERM");
113
146
  };
114
- const scheduleRestart = (state, timer) => {
147
+ const scheduleRestart = (state) => {
148
+ const timer = state.restartTimer;
115
149
  if (timer.handle !== null) {
116
150
  clearTimeout(timer.handle);
117
151
  }
118
- timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);
152
+ timer.handle = setTimeout(() => {
153
+ timer.handle = null;
154
+ void restart(state);
155
+ }, CONFIG_DEBOUNCE_MS);
119
156
  };
120
157
  const isWatchedChange = (state, names, filename) => {
121
158
  if (filename === null || state.isShuttingDown) {
@@ -123,43 +160,100 @@ const isWatchedChange = (state, names, filename) => {
123
160
  }
124
161
  return names.has(basename(filename.toString()));
125
162
  };
163
+ const isDirectory = (path) => {
164
+ try {
165
+ return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;
166
+ }
167
+ catch {
168
+ return false;
169
+ }
170
+ };
171
+ const nearestWatchTarget = (path) => {
172
+ let directory = dirname(path);
173
+ let name = basename(path);
174
+ while (!isDirectory(directory)) {
175
+ const parent = dirname(directory);
176
+ if (parent === directory) {
177
+ break;
178
+ }
179
+ name = basename(directory);
180
+ directory = parent;
181
+ }
182
+ return { directory, name };
183
+ };
184
+ const watchTargets = (paths) => new Set(paths.flatMap((path) => {
185
+ const { directory, name } = nearestWatchTarget(path);
186
+ return [path, join(directory, name)];
187
+ }));
188
+ const watchPathState = (path) => {
189
+ try {
190
+ const stat = statSync(path, { bigint: true, throwIfNoEntry: false });
191
+ return stat === undefined
192
+ ? null
193
+ : [stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
194
+ }
195
+ catch {
196
+ return null;
197
+ }
198
+ };
199
+ const snapshotWatchPaths = (paths) => new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));
200
+ const didWatchPathsChange = (previous, paths) => {
201
+ for (const path of watchTargets(paths)) {
202
+ const current = watchPathState(path);
203
+ if (previous.has(path) ? previous.get(path) !== current : current !== null) {
204
+ return true;
205
+ }
206
+ }
207
+ return false;
208
+ };
126
209
  const groupWatchNamesByDirectory = (paths) => {
127
210
  const namesByDirectory = new Map();
128
211
  for (const path of paths) {
129
- const directory = dirname(path);
212
+ const { directory, name } = nearestWatchTarget(path);
130
213
  const names = namesByDirectory.get(directory) ?? new Set();
131
- names.add(basename(path));
214
+ names.add(name);
132
215
  namesByDirectory.set(directory, names);
133
216
  }
134
217
  return namesByDirectory;
135
218
  };
136
- const watchConfigDirectory = (state, directory, names, timer) => {
137
- const watcher = watchFs(directory, (_event, filename) => {
138
- if (isWatchedChange(state, names, filename)) {
139
- scheduleRestart(state, timer);
140
- }
141
- });
142
- watcher.on("error", () => undefined);
143
- state.watchers.push(watcher);
219
+ const watchConfigDirectory = (state, directory, names) => {
220
+ try {
221
+ const watcher = watchFs(directory, (_event, filename) => {
222
+ if (isWatchedChange(state, names, filename)) {
223
+ scheduleRestart(state);
224
+ }
225
+ });
226
+ watcher.on("error", (cause) => {
227
+ error(`Configuration watch failed for ${directory}`, cause);
228
+ });
229
+ state.watchers.push(watcher);
230
+ }
231
+ catch (error_) {
232
+ error(`Configuration watch failed for ${directory}`, error_);
233
+ }
144
234
  };
145
235
  const installConfigWatchers = (state) => {
146
236
  const watch = state.watch;
147
237
  if (watch === undefined || watch.paths.length === 0) {
148
238
  return;
149
239
  }
150
- const timer = { handle: null };
151
240
  for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {
152
- watchConfigDirectory(state, directory, names, timer);
241
+ watchConfigDirectory(state, directory, names);
153
242
  }
154
243
  };
155
244
  const closeWatchers = (state) => {
156
245
  for (const watcher of state.watchers) {
157
246
  watcher.close();
158
247
  }
248
+ state.watchers = [];
159
249
  };
160
250
  const shutdownOnSignal = (state, signal) => new Promise((resolve) => {
161
251
  state.isShuttingDown = true;
162
252
  closeWatchers(state);
253
+ if (state.restartTimer.handle !== null) {
254
+ clearTimeout(state.restartTimer.handle);
255
+ state.restartTimer.handle = null;
256
+ }
163
257
  if (!state.child) {
164
258
  resolve();
165
259
  return;
@@ -187,10 +281,12 @@ const runDevSupervisor = async (options) => {
187
281
  args,
188
282
  watch,
189
283
  watchers: [],
284
+ restartTimer: { handle: null },
190
285
  fork,
191
286
  child: null,
192
287
  isShuttingDown: false,
193
288
  isRestarting: false,
289
+ isRestartPending: false,
194
290
  capturedChildExit: undefined,
195
291
  };
196
292
  installConfigWatchers(state);
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"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","sourcesContent":["import { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, watch as watchFs } from \"node:fs\";\nimport { basename, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from \"./entry-env.js\";\n\ntype SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\ntype ForkRunner = (modulePath: string, args: string[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n regenerate: () => Promise<void>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n configFile: string;\n cwd: string;\n args: string[];\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n fork: ForkRunner;\n child: SupervisedChild | null;\n isShuttingDown: boolean;\n isRestarting: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DevSupervisorOptions = {\n entryPath: string;\n configFile: string;\n cwd: string;\n args?: string[] | undefined;\n watch?: DevWatch | undefined;\n fork?: ForkRunner | undefined;\n};\n\ntype DebounceTimer = { handle: NodeJS.Timeout | null };\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\nconst RESTART_EXIT_CODE = 75;\nconst CONDITION_FLAG = /^(?:--conditions|-C)(?:=.*)?$/;\nconst SPLIT_CONDITION_FLAG = /^(?:--conditions|-C)$/;\n\nconst withoutConditions = (argv: string[]): string[] =>\n argv.filter(\n (argument, index) => !CONDITION_FLAG.test(argument) && !SPLIT_CONDITION_FLAG.test(argv[index - 1] ?? \"\"),\n );\n\nconst getNodeOptions = (env: NodeJS.ProcessEnv): string | undefined => {\n const options = env.NODE_OPTIONS;\n\n return options === undefined ? undefined : withoutConditions(options.split(/\\s+/)).join(\" \");\n};\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, env, cwd) => {\n const nodeOptions = getNodeOptions(env);\n\n return nodeFork(modulePath, args, {\n cwd,\n env: { ...env, ...(nodeOptions !== undefined && { NODE_OPTIONS: nodeOptions }) },\n stdio: \"inherit\",\n detached: true,\n execArgv: withoutConditions(process.execArgv),\n });\n};\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst didForceKillChild = (child: SupervisedChild | null): boolean => {\n if (!child?.pid || child.exitCode !== null || child.killed) {\n return false;\n }\n\n try {\n return process.kill(child.pid, \"SIGKILL\");\n } catch {\n return false;\n }\n};\n\nconst captureShutdownExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n};\n\nconst handleChildExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n state.child = null;\n\n if (state.isRestarting) {\n return;\n }\n\n if (state.isShuttingDown) {\n captureShutdownExit(state, code, signal);\n\n return;\n }\n\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n\n return;\n }\n\n process.exit(code ?? exitCodeForSignal(signal));\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(\n state.runnerPath,\n state.args,\n { ...process.env, [DEV_CONFIG_ENV]: state.configFile, [DEV_ENTRY_ENV]: state.entryPath },\n state.cwd,\n );\n\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst isRestartBlocked = (state: SupervisorState): boolean => state.isRestarting || state.isShuttingDown;\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n state.isRestarting = false;\n\n if (state.isShuttingDown) {\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || isRestartBlocked(state)) {\n return;\n }\n\n state.isRestarting = true;\n info(\"gtkx.config.ts changed; regenerating bindings...\");\n\n try {\n await watch.regenerate();\n } catch (error_) {\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n state.isRestarting = false;\n\n return;\n }\n\n if (state.isShuttingDown) {\n state.isRestarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n state.isRestarting = false;\n launch(state);\n\n return;\n }\n\n current.once(\"exit\", () => {\n relaunchAfterExit(state);\n });\n\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst scheduleRestart = (state: SupervisorState, timer: DebounceTimer): void => {\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);\n};\n\nconst isWatchedChange = (state: SupervisorState, names: Set<string>, filename: string | Buffer | null): boolean => {\n if (filename === null || state.isShuttingDown) {\n return false;\n }\n\n return names.has(basename(filename.toString()));\n};\n\nconst groupWatchNamesByDirectory = (paths: string[]): Map<string, Set<string>> => {\n const namesByDirectory: Map<string, Set<string>> = new Map();\n\n for (const path of paths) {\n const directory = dirname(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(basename(path));\n namesByDirectory.set(directory, names);\n }\n\n return namesByDirectory;\n};\n\nconst watchConfigDirectory = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n timer: DebounceTimer,\n): void => {\n const watcher = watchFs(directory, (_event, filename) => {\n if (isWatchedChange(state, names, filename)) {\n scheduleRestart(state, timer);\n }\n });\n\n watcher.on(\"error\", (): void => undefined);\n state.watchers.push(watcher);\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n\n if (watch === undefined || watch.paths.length === 0) {\n return;\n }\n\n const timer: DebounceTimer = { handle: null };\n\n for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names, timer);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.isShuttingDown = true;\n closeWatchers(state);\n\n if (!state.child) {\n resolve();\n\n return;\n }\n\n state.child.once(\"exit\", () => {\n resolve();\n });\n\n forwardSignal(state.child, signal);\n });\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) => shutdownOnSignal(state, signal),\n onForce: () => didForceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nconst runDevSupervisor = async (options: DevSupervisorOptions): Promise<never> => {\n const { entryPath, configFile, cwd, args = [], watch, fork = defaultForkRunner } = options;\n\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n configFile,\n cwd,\n args,\n watch,\n watchers: [],\n fork,\n child: null,\n isShuttingDown: false,\n isRestarting: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>((): void => undefined);\n};\n\nexport {\n RESTART_EXIT_CODE,\n runDevSupervisor,\n type DevWatch,\n};\n"]}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAkB,QAAQ,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA+C/D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,cAAc,GAAG,+BAA+B,CAAC;AACvD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAErD,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAY,EAAE,CACnD,IAAI,CAAC,MAAM,CACP,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAC3G,CAAC;AAEN,MAAM,cAAc,GAAG,CAAC,GAAsB,EAAsB,EAAE;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;IAEjC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAe,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACjE,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE;QAC9B,GAAG;QACH,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE;QAChF,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;KAChD,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAE,MAAsB,EAAQ,EAAE;IAC3E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAW,EAAE;IACjE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAAsB,EAAE,IAAmB,EAAE,MAA6B,EAAQ,EAAE;IAC7G,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACnC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,IAAmB,EAAE,MAA6B,EAAQ,EAAE;IACzG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IAEnB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEzC,OAAO;IACX,CAAC;IAED,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC7B,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEd,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACpB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,IAAI,EACV,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EACxF,KAAK,CAAC,GAAG,CACZ,CAAC;IAEF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAEpB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACvD,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAE3B,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAClD,OAAO;IACX,CAAC;IAED,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAC/B,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACvD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;QAE3B,OAAO;IACX,CAAC;IAED,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,CAAC;IACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,KAAsB,EAAW,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;AAE3F,MAAM,uBAAuB,GAAG,CAC5B,KAAsB,EACtB,KAAe,EACf,QAA4C,EACxC,EAAE;IACN,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEvD,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACvC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,KAAK,EAAE,KAAsB,EAAiB,EAAE;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC9C,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,oCAAoC,CAAC,CAAC;IACxE,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC/D,KAAK,CAAC,+EAA+E,EAAE,MAAM,CAAC,CAAC;QAC/F,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,OAAO;IACX,CAAC;IAED,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;QAE3B,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;IAE5B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;IAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;QAC3B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,KAAkB,EAAE,QAAgC,EAAW,EAAE;IAC9G,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE;IAC1C,IAAI,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAuC,EAAE;IAC7E,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAElC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM;QACV,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3B,SAAS,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAe,EAAe,EAAE,CAClD,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;IAC3B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAErD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC,CAAC;AAER,MAAM,cAAc,GAAG,CAAC,IAAY,EAAiB,EAAE;IACnD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAErE,OAAO,IAAI,KAAK,SAAS;YACrB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAe,EAA8B,EAAE,CACvE,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAElF,MAAM,mBAAmB,GAAG,CACxB,QAA4C,EAC5C,KAAe,EACR,EAAE;IACT,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,KAAe,EAA4B,EAAE;IAC7E,MAAM,gBAAgB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACnE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CACzB,KAAsB,EACtB,SAAiB,EACjB,KAAkB,EACd,EAAE;IACN,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACpD,IAAI,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC1C,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,KAAK,CAAC,kCAAkC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,kCAAkC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;IACX,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,0BAA0B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACnD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAsB,EAAE,MAAsB,EAAiB,EAAE,CACvF,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;IAC1B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACrC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;QAEV,OAAO;IACX,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEP,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACrD,uBAAuB,CAAC;QACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC;QACrD,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,gBAAgB,EAAE,qBAAqB;QACvC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KACxG,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAA6B,EAAkB,EAAE;IAC7E,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAE3F,MAAM,KAAK,GAAoB;QAC3B,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC;QACzC,SAAS;QACT,UAAU;QACV,GAAG;QACH,IAAI;QACJ,KAAK;QACL,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9B,IAAI;QACJ,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,SAAS;KAC/B,CAAC;IAEF,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7B,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,CAAC;IAEd,OAAO,IAAI,OAAO,CAAQ,GAAS,EAAE,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,gBAAgB,GAEnB,CAAC","sourcesContent":["import { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, statSync, watch as watchFs } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from \"./entry-env.js\";\n\ntype SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\ntype ForkRunner = (modulePath: string, args: string[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n resolvePaths: () => string[];\n regenerate: () => Promise<string[]>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n configFile: string;\n cwd: string;\n args: string[];\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n restartTimer: DebounceTimer;\n fork: ForkRunner;\n child: SupervisedChild | null;\n isShuttingDown: boolean;\n isRestarting: boolean;\n isRestartPending: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DevSupervisorOptions = {\n entryPath: string;\n configFile: string;\n cwd: string;\n args?: string[] | undefined;\n watch?: DevWatch | undefined;\n fork?: ForkRunner | undefined;\n};\n\ntype DebounceTimer = { handle: NodeJS.Timeout | null };\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\nconst RESTART_EXIT_CODE = 75;\nconst CONDITION_FLAG = /^(?:--conditions|-C)(?:=.*)?$/;\nconst SPLIT_CONDITION_FLAG = /^(?:--conditions|-C)$/;\n\nconst withoutConditions = (argv: string[]): string[] =>\n argv.filter(\n (argument, index) => !CONDITION_FLAG.test(argument) && !SPLIT_CONDITION_FLAG.test(argv[index - 1] ?? \"\"),\n );\n\nconst getNodeOptions = (env: NodeJS.ProcessEnv): string | undefined => {\n const options = env.NODE_OPTIONS;\n\n return options === undefined ? undefined : withoutConditions(options.split(/\\s+/)).join(\" \");\n};\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, env, cwd) => {\n const nodeOptions = getNodeOptions(env);\n\n return nodeFork(modulePath, args, {\n cwd,\n env: { ...env, ...(nodeOptions !== undefined && { NODE_OPTIONS: nodeOptions }) },\n stdio: \"inherit\",\n detached: true,\n execArgv: withoutConditions(process.execArgv),\n });\n};\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst didForceKillChild = (child: SupervisedChild | null): boolean => {\n if (!child?.pid || child.exitCode !== null || child.killed) {\n return false;\n }\n\n try {\n return process.kill(child.pid, \"SIGKILL\");\n } catch {\n return false;\n }\n};\n\nconst captureShutdownExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n};\n\nconst handleChildExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n state.child = null;\n\n if (state.isRestarting) {\n return;\n }\n\n if (state.isShuttingDown) {\n captureShutdownExit(state, code, signal);\n\n return;\n }\n\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n\n return;\n }\n\n process.exit(code ?? exitCodeForSignal(signal));\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(\n state.runnerPath,\n state.args,\n { ...process.env, [DEV_CONFIG_ENV]: state.configFile, [DEV_ENTRY_ENV]: state.entryPath },\n state.cwd,\n );\n\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst runPendingRestart = (state: SupervisorState): void => {\n state.isRestarting = false;\n\n if (!state.isRestartPending || state.isShuttingDown) {\n return;\n }\n\n state.isRestartPending = false;\n void restart(state);\n};\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n if (state.isShuttingDown) {\n state.isRestarting = false;\n\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n runPendingRestart(state);\n};\n\nconst isSupervisorShuttingDown = (state: SupervisorState): boolean => state.isShuttingDown;\n\nconst reconcileConfigWatchers = (\n state: SupervisorState,\n paths: string[],\n previous: ReadonlyMap<string, string | null>,\n): void => {\n const didChange = didWatchPathsChange(previous, paths);\n\n closeWatchers(state);\n\n if (state.watch !== undefined) {\n state.watch.paths = paths;\n }\n\n if (state.isShuttingDown) {\n return;\n }\n\n installConfigWatchers(state);\n\n if (didChange && !state.isRestartPending) {\n scheduleRestart(state);\n }\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || state.isShuttingDown) {\n return;\n }\n\n if (state.isRestarting) {\n state.isRestartPending = true;\n\n return;\n }\n\n state.isRestarting = true;\n info(`${basename(state.configFile)} changed; regenerating bindings...`);\n closeWatchers(state);\n watch.paths = watch.resolvePaths();\n const previous = snapshotWatchPaths(watch.paths);\n installConfigWatchers(state);\n\n try {\n const paths = await watch.regenerate();\n reconcileConfigWatchers(state, paths, previous);\n } catch (error_) {\n reconcileConfigWatchers(state, watch.resolvePaths(), previous);\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n runPendingRestart(state);\n\n return;\n }\n\n if (isSupervisorShuttingDown(state)) {\n state.isRestarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n launch(state);\n runPendingRestart(state);\n\n return;\n }\n\n current.once(\"exit\", () => {\n relaunchAfterExit(state);\n });\n\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst scheduleRestart = (state: SupervisorState): void => {\n const timer = state.restartTimer;\n\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => {\n timer.handle = null;\n void restart(state);\n }, CONFIG_DEBOUNCE_MS);\n};\n\nconst isWatchedChange = (state: SupervisorState, names: Set<string>, filename: string | Buffer | null): boolean => {\n if (filename === null || state.isShuttingDown) {\n return false;\n }\n\n return names.has(basename(filename.toString()));\n};\n\nconst isDirectory = (path: string): boolean => {\n try {\n return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;\n } catch {\n return false;\n }\n};\n\nconst nearestWatchTarget = (path: string): { directory: string; name: string } => {\n let directory = dirname(path);\n let name = basename(path);\n\n while (!isDirectory(directory)) {\n const parent = dirname(directory);\n\n if (parent === directory) {\n break;\n }\n\n name = basename(directory);\n directory = parent;\n }\n\n return { directory, name };\n};\n\nconst watchTargets = (paths: string[]): Set<string> =>\n new Set(paths.flatMap((path) => {\n const { directory, name } = nearestWatchTarget(path);\n\n return [path, join(directory, name)];\n }));\n\nconst watchPathState = (path: string): string | null => {\n try {\n const stat = statSync(path, { bigint: true, throwIfNoEntry: false });\n\n return stat === undefined\n ? null\n : [stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeNs, stat.ctimeNs].join(\":\");\n } catch {\n return null;\n }\n};\n\nconst snapshotWatchPaths = (paths: string[]): Map<string, string | null> =>\n new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));\n\nconst didWatchPathsChange = (\n previous: ReadonlyMap<string, string | null>,\n paths: string[],\n): boolean => {\n for (const path of watchTargets(paths)) {\n const current = watchPathState(path);\n\n if (previous.has(path) ? previous.get(path) !== current : current !== null) {\n return true;\n }\n }\n\n return false;\n};\n\nconst groupWatchNamesByDirectory = (paths: string[]): Map<string, Set<string>> => {\n const namesByDirectory: Map<string, Set<string>> = new Map();\n\n for (const path of paths) {\n const { directory, name } = nearestWatchTarget(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(name);\n namesByDirectory.set(directory, names);\n }\n\n return namesByDirectory;\n};\n\nconst watchConfigDirectory = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n): void => {\n try {\n const watcher = watchFs(directory, (_event, filename) => {\n if (isWatchedChange(state, names, filename)) {\n scheduleRestart(state);\n }\n });\n\n watcher.on(\"error\", (cause) => {\n error(`Configuration watch failed for ${directory}`, cause);\n });\n state.watchers.push(watcher);\n } catch (error_) {\n error(`Configuration watch failed for ${directory}`, error_);\n }\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n\n if (watch === undefined || watch.paths.length === 0) {\n return;\n }\n\n for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n\n state.watchers = [];\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.isShuttingDown = true;\n closeWatchers(state);\n\n if (state.restartTimer.handle !== null) {\n clearTimeout(state.restartTimer.handle);\n state.restartTimer.handle = null;\n }\n\n if (!state.child) {\n resolve();\n\n return;\n }\n\n state.child.once(\"exit\", () => {\n resolve();\n });\n\n forwardSignal(state.child, signal);\n });\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) => shutdownOnSignal(state, signal),\n onForce: () => didForceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nconst runDevSupervisor = async (options: DevSupervisorOptions): Promise<never> => {\n const { entryPath, configFile, cwd, args = [], watch, fork = defaultForkRunner } = options;\n\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n configFile,\n cwd,\n args,\n watch,\n watchers: [],\n restartTimer: { handle: null },\n fork,\n child: null,\n isShuttingDown: false,\n isRestarting: false,\n isRestartPending: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>((): void => undefined);\n};\n\nexport {\n RESTART_EXIT_CODE,\n runDevSupervisor,\n type DevWatch,\n};\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { CatalogProject } from "./catalogs.js";
2
+ declare class SourceExtractionError extends Error {
3
+ }
2
4
  declare const extractSourceCatalogTo: (project: CatalogProject, paths: string[], output: string) => Promise<void>;
3
5
  declare const extractSourceCatalog: (project: CatalogProject, paths: string[], shouldPreserveMetadataMessages?: boolean) => Promise<void>;
4
- export { extractSourceCatalog, extractSourceCatalogTo };
6
+ export { extractSourceCatalog, extractSourceCatalogTo, SourceExtractionError };
5
7
  //# sourceMappingURL=source-messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"source-messages.d.ts","sourceRoot":"","sources":["../../src/i18n/source-messages.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA64DpD,QAAA,MAAM,sBAAsB,GACxB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,QAAQ,MAAM,KACf,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,QAAA,MAAM,oBAAoB,GACtB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,wCAAqC,KACtC,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"source-messages.d.ts","sourceRoot":"","sources":["../../src/i18n/source-messages.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAqGpD,cAAM,qBAAsB,SAAQ,KAAK;CAAG;AAwzD5C,QAAA,MAAM,sBAAsB,GACxB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,QAAQ,MAAM,KACf,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,QAAA,MAAM,oBAAoB,GACtB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,wCAAqC,KACtC,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,CAAC"}
@@ -35,7 +35,19 @@ const STATIC_KEY_WRAPPER_TYPES = new Set([
35
35
  ]);
36
36
  class SourceExtractionError extends Error {
37
37
  }
38
- const sourceErrorMessage = (error) => error instanceof Error ? error.message : String(error);
38
+ const sourceErrorMessage = (error) => {
39
+ if (!(error instanceof Error)) {
40
+ return String(error);
41
+ }
42
+ if ("code" in error &&
43
+ error.code === "BABEL_PARSE_ERROR") {
44
+ const separator = error.message.indexOf(": ");
45
+ if (separator !== -1) {
46
+ return error.message.slice(separator + 2);
47
+ }
48
+ }
49
+ return error.message;
50
+ };
39
51
  const projectSourcePath = (root, path) => {
40
52
  const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);
41
53
  return toPosixPath(isPathInside(root, absolute) ? relative(root, absolute) : path);
@@ -1332,5 +1344,5 @@ const extractSourceCatalog = async (project, paths, shouldPreserveMetadataMessag
1332
1344
  writePotfiles(project, sourceFiles);
1333
1345
  extractCatalogTemplate({ project, messages, shouldPreserveMetadataMessages });
1334
1346
  };
1335
- export { extractSourceCatalog, extractSourceCatalogTo };
1347
+ export { extractSourceCatalog, extractSourceCatalogTo, SourceExtractionError };
1336
1348
  //# sourceMappingURL=source-messages.js.map