@gtkx/cli 2.0.0-beta.4 → 2.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +28 -8
- package/dist/builder.js.map +1 -1
- package/dist/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
- package/dist/deploy/freedesktop/validate.js +50 -13
- package/dist/deploy/freedesktop/validate.js.map +1 -1
- package/dist/dev/catalog-writes.d.ts +8 -0
- package/dist/dev/catalog-writes.d.ts.map +1 -0
- package/dist/dev/catalog-writes.js +26 -0
- package/dist/dev/catalog-writes.js.map +1 -0
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +10 -6
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner.d.ts +1 -0
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +8 -2
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/supervisor.d.ts.map +1 -1
- package/dist/dev/supervisor.js +26 -20
- package/dist/dev/supervisor.js.map +1 -1
- package/dist/i18n/catalogs.d.ts +6 -2
- package/dist/i18n/catalogs.d.ts.map +1 -1
- package/dist/i18n/catalogs.js +9 -7
- package/dist/i18n/catalogs.js.map +1 -1
- package/dist/internal/agent-rules.d.ts.map +1 -1
- package/dist/internal/agent-rules.js +1 -0
- package/dist/internal/agent-rules.js.map +1 -1
- package/dist/internal/banner.d.ts +4 -2
- package/dist/internal/banner.d.ts.map +1 -1
- package/dist/internal/banner.js +16 -5
- package/dist/internal/banner.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts +11 -2
- package/dist/vite-plugins/i18n.d.ts.map +1 -1
- package/dist/vite-plugins/i18n.js +3 -2
- package/dist/vite-plugins/i18n.js.map +1 -1
- package/dist/vite-plugins/icons.d.ts.map +1 -1
- package/dist/vite-plugins/icons.js +6 -6
- package/dist/vite-plugins/icons.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +2 -0
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +8 -2
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +6 -6
- package/dist/vite-plugins/settings.js.map +1 -1
- package/package.json +10 -10
- package/src/builder.ts +28 -8
- package/src/commands/dev.ts +2 -2
- package/src/deploy/freedesktop/validate.ts +70 -14
- package/src/dev/catalog-writes.ts +35 -0
- package/src/dev/runner-deps.ts +14 -6
- package/src/dev/runner.ts +11 -2
- package/src/dev/supervisor.ts +38 -21
- package/src/i18n/catalogs.ts +20 -8
- package/src/internal/agent-rules.ts +1 -0
- package/src/internal/banner.ts +23 -6
- package/src/vite-plugins/i18n.ts +20 -6
- package/src/vite-plugins/icons.ts +7 -7
- package/src/vite-plugins/index.ts +15 -6
- package/src/vite-plugins/settings.ts +7 -7
package/dist/dev/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApplicationInstance } from \"@gtkx/runtime/internal\";\nimport type { InlineConfig, Plugin } from \"vite\";\nimport { error, warn } from \"@gtkx/utils\";\nimport { isCatalogSource } from \"../i18n/catalogs.js\";\nimport { loadModuleExclusively, withExclusiveLoad } from \"../internal/module-loads.js\";\nimport { createChangeQueue, type WatchedChange } from \"./change-queue.js\";\nimport { createFailureTracker, type FailureTracker } from \"./failure-tracker.js\";\nimport { isMissingImport, missingImportName } from \"./missing-import.js\";\nimport { createRefreshTracker, type RefreshTracker } from \"./refresh-tracker.js\";\nimport { RESTART_EXIT_CODE } from \"./supervisor.js\";\nimport {\n createDevServerConfig,\n type DevServer,\n type DevServerChangedModule,\n type DevServerWatchEvent,\n isServerConfigFile,\n} from \"./vite-dev-server.js\";\n\ntype LoadAppModule = (id: string) => Promise<Record<string, unknown>>;\n\ntype DevRunnerDeps = {\n createServer(config: InlineConfig): Promise<DevServer>;\n waitForApplicationId(timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null>;\n getConfiguredApplicationId(root: string): Promise<string | undefined>;\n startMcpClient(applicationId: string, loadAppModule: LoadAppModule): Promise<unknown>;\n stopMcpClient(): void;\n watchApplicationShutdown(onShutdown: () => void): void;\n watchUncaughtErrors(onUncaughtError: (cause: unknown) => void): void;\n getApplicationInstance(): ApplicationInstance;\n installShutdownHandlers(onSignal: () => void | Promise<void>): void;\n quitDefaultApplication(): void;\n performRefresh: () => void;\n isRefreshBoundary(module: Record<string, unknown>): boolean;\n staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;\n readFileRevision(path: string): Promise<string>;\n plugins(entryPath: string): Plugin[];\n log(message: string): void;\n exit(code: number): never;\n};\n\ntype DevRunner = {\n run(entryPath: string): Promise<void>;\n};\n\ntype ShutdownController = {\n isShuttingDown: () => boolean;\n shutdown: (quitApplication: () => void) => Promise<void>;\n};\n\ntype DevSession = {\n server: DevServer;\n deps: DevRunnerDeps;\n controller: ShutdownController;\n refreshTracker: RefreshTracker;\n failure: FailureTracker;\n pendingSaves: Map<string, string>;\n};\n\ntype SettledLoad = {\n loadedExports: Record<string, unknown>;\n isSettled: boolean;\n};\n\ntype SettleAttempt = {\n loadedExports: Record<string, unknown> | null;\n module: DevServerChangedModule;\n};\n\nconst APPLICATION_MOUNT_TIMEOUT_MS = 10_000;\nconst OWNED_ID_EXIT_CODE = 1;\nconst LOAD_ATTEMPT_LIMIT = 5;\nconst WATCH_EVENTS: DevServerWatchEvent[] = [\"add\", \"change\", \"unlink\"];\nconst SKIP_REASON = `did not settle in ${String(LOAD_ATTEMPT_LIMIT)} attempts; save it again to patch the window.`;\nconst DROPPED_REFRESH = \"Fast Refresh dropped\";\nconst SAVE_ACTION = \"File changed\";\nconst RETRY_ACTION = \"Retrying pending save\";\n\nconst announceFailure = (server: DevServer, cause: unknown): void => {\n if (cause instanceof Error) {\n server.ssrFixStacktrace(cause);\n }\n\n error(\"Application error; keeping the dev server up. Fix the error and save again.\", cause);\n};\n\nconst parkSession = (session: DevSession): void => {\n session.deps.log(\"Waiting for a change to restart the application...\");\n};\n\nconst requestRestart = async (session: DevSession): Promise<never> => {\n session.deps.log(\"Full restart (process restart)\");\n\n try {\n await session.server.close();\n } catch (error_) {\n error(\"Error closing server before the restart:\", error_);\n }\n\n return session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst requiresRestart = (session: DevSession, module: DevServerChangedModule): boolean => {\n if (session.failure.isDown()) {\n return true;\n }\n\n const loadedExports = module.ssrModule;\n\n if (!loadedExports) {\n return false;\n }\n\n return !session.deps.isRefreshBoundary(loadedExports);\n};\n\nconst invalidateChangedModule = (session: DevSession, module: DevServerChangedModule): void => {\n session.server.moduleGraph.invalidateModule(module);\n\n for (const importer of module.importers) {\n session.server.moduleGraph.invalidateModule(importer);\n }\n};\n\nconst isEvaluationCurrent = (\n session: DevSession,\n changedPath: string,\n loadedExports: Record<string, unknown>,\n): boolean => {\n const evaluated = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!evaluated?.ssrTransformResult) {\n return false;\n }\n\n return evaluated.ssrModule === loadedExports;\n};\n\nconst loadInvalidatedModule = (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettledLoad> =>\n withExclusiveLoad(session.server, async () => {\n const revision = await session.deps.readFileRevision(changedPath);\n invalidateChangedModule(session, module);\n const loadedExports = await session.server.ssrLoadModule(changedPath);\n const settledRevision = await session.deps.readFileRevision(changedPath);\n\n return {\n loadedExports,\n isSettled: settledRevision === revision && isEvaluationCurrent(session, changedPath, loadedExports),\n };\n });\n\nconst settleAttempt = async (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettleAttempt> => {\n const { loadedExports, isSettled } = await loadInvalidatedModule(session, changedPath, module);\n\n if (isSettled) {\n return { loadedExports, module };\n }\n\n return { loadedExports: null, module: session.server.moduleGraph.getModuleById(changedPath) ?? module };\n};\n\nconst loadSettledExports = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n): Promise<Record<string, unknown> | null> => {\n let module = changedModule;\n\n for (let round = 0; round < LOAD_ATTEMPT_LIMIT && !session.controller.isShuttingDown(); round++) {\n const attempt = await settleAttempt(session, changedPath, module);\n\n if (attempt.loadedExports) {\n return attempt.loadedExports;\n }\n\n module = attempt.module;\n }\n\n return null;\n};\n\nconst droppedExportName = (previous: Record<string, unknown>, current: Record<string, unknown>): string | null => {\n const kept = new Set(Object.keys(current));\n\n for (const name of Object.keys(previous)) {\n if (!kept.has(name)) {\n return name;\n }\n }\n\n return null;\n};\n\nconst unpatchedExportReason = (\n session: DevSession,\n previous: Record<string, unknown> | null,\n current: Record<string, unknown>,\n): string | null => {\n if (!previous) {\n return null;\n }\n\n const dropped = droppedExportName(previous, current);\n\n if (dropped !== null) {\n return `no longer exports ${dropped}, which its importers still hold`;\n }\n\n const stale = session.deps.staleExportName(previous, current);\n\n if (stale === null) {\n return null;\n }\n\n return `renamed the component it exports as ${stale}, which the window is still rendering`;\n};\n\nconst refreshChangedModule = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n previous: Record<string, unknown> | null,\n): Promise<void> => {\n const loadedExports = await loadSettledExports(session, changedPath, changedModule);\n\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (!loadedExports) {\n warn(`Fast Refresh skipped: ${changedPath} ${SKIP_REASON}`);\n\n return;\n }\n\n if (!session.deps.isRefreshBoundary(loadedExports)) {\n await requestRestart(session);\n\n return;\n }\n\n const unpatched = unpatchedExportReason(session, previous, loadedExports);\n\n if (unpatched !== null) {\n warn(`${DROPPED_REFRESH}: ${changedPath} ${unpatched}`);\n await requestRestart(session);\n\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n session.deps.log(\"Running Fast Refresh...\");\n session.deps.performRefresh();\n session.deps.log(\"Fast Refresh complete\");\n};\n\nconst applyModuleChange = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n const module = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!module) {\n return;\n }\n\n session.deps.log(`${action}: ${changedPath}`);\n\n if (requiresRestart(session, module)) {\n await requestRestart(session);\n\n return;\n }\n\n await refreshChangedModule(session, changedPath, module, module.ssrModule ?? null);\n};\n\nconst awaitMissingImport = (session: DevSession, changedPath: string, cause: unknown): void => {\n const missingName = missingImportName(cause);\n\n if (missingName === null) {\n session.pendingSaves.delete(changedPath);\n\n return;\n }\n\n session.pendingSaves.set(changedPath, missingName);\n};\n\nconst applySave = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n try {\n await applyModuleChange(session, changedPath, action);\n } catch (error_) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n awaitMissingImport(session, changedPath, error_);\n error(\"Hot reload failed:\", error_);\n }\n};\n\nconst savesAwaiting = (session: DevSession, createdPath: string): string[] =>\n [...session.pendingSaves]\n .filter(([, missingName]) => isMissingImport(createdPath, missingName))\n .map(([changedPath]) => changedPath);\n\nconst retryPendingSaves = async (session: DevSession, waiting: string[]): Promise<void> => {\n for (const changedPath of waiting) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n await applySave(session, changedPath, RETRY_ACTION);\n }\n};\n\nconst handleFileCreate = async (session: DevSession, createdPath: string): Promise<void> => {\n const waiting = savesAwaiting(session, createdPath);\n\n if (waiting.length === 0) {\n return;\n }\n\n session.deps.log(`File created: ${createdPath}`);\n\n if (session.failure.isDown()) {\n await requestRestart(session);\n\n return;\n }\n\n await retryPendingSaves(session, waiting);\n};\n\nconst handleFileRemove = async (session: DevSession, removedPath: string): Promise<void> => {\n if (!session.server.moduleGraph.getModuleById(removedPath)) {\n return;\n }\n\n session.deps.log(`File removed: ${removedPath}`);\n await requestRestart(session);\n};\n\nconst createShutdownController = (server: DevServer, deps: DevRunnerDeps): ShutdownController => {\n let isShuttingDown = false;\n\n return {\n isShuttingDown: () => isShuttingDown,\n shutdown: async (quitApplication: () => void): Promise<void> => {\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n quitApplication();\n deps.stopMcpClient();\n await server.close();\n },\n };\n};\n\nconst restartForServerConfig = async (session: DevSession, changedPath: string): Promise<void> => {\n session.deps.log(`Server config changed: ${changedPath}`);\n await requestRestart(session);\n};\n\nconst applyChange = async (session: DevSession, change: WatchedChange): Promise<void> => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (isCatalogSource(session.server.config.root, change.path)) {\n session.deps.log(`Translation catalog changed: ${change.path}`);\n await requestRestart(session);\n\n return;\n }\n\n if (isServerConfigFile(session.server.config, change.path)) {\n await restartForServerConfig(session, change.path);\n\n return;\n }\n\n if (change.event === \"add\") {\n await handleFileCreate(session, change.path);\n\n return;\n }\n\n if (change.event === \"unlink\") {\n await handleFileRemove(session, change.path);\n\n return;\n }\n\n await applySave(session, change.path, SAVE_ACTION);\n};\n\nconst watchProjectFiles = (session: DevSession): void => {\n const queue = createChangeQueue((change) => applyChange(session, change));\n\n for (const event of WATCH_EVENTS) {\n session.server.watcher.on(event, (path) => {\n queue.enqueue({ event, path });\n });\n }\n};\n\nconst onShutdownSignal = (session: DevSession): (() => Promise<void>) => async () => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.deps.log(\"Received shutdown signal - stopping dev runner...\");\n\n await session.controller.shutdown(() => {\n session.deps.quitDefaultApplication();\n });\n};\n\nconst closeAndExit = async (session: DevSession, code = 0): Promise<never> => {\n try {\n await session.controller.shutdown((): void => undefined);\n } catch (error_) {\n error(\"Error closing server:\", error_);\n\n return session.deps.exit(1);\n }\n\n return session.deps.exit(code);\n};\n\nconst isSessionInactive = (session: DevSession): boolean => {\n if (session.controller.isShuttingDown()) {\n return true;\n }\n\n if (!session.failure.isDown()) {\n return false;\n }\n\n parkSession(session);\n\n return true;\n};\n\nconst stopForApplicationQuit = (session: DevSession): Promise<never> => {\n session.deps.log(\"Application quit - stopping dev runner...\");\n\n return closeAndExit(session);\n};\n\nconst settleUnmount = (session: DevSession, wasRefreshing: boolean): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n if (!wasRefreshing) {\n void stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application unmounted during Fast Refresh - restarting dev runner...\");\n session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst handleApplicationShutdown = (session: DevSession): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n const wasRefreshing = session.refreshTracker.isRefreshing();\n\n session.failure.settleUnmount(() => {\n settleUnmount(session, wasRefreshing);\n });\n};\n\nconst onApplicationShutdown = (session: DevSession): (() => void) => () => {\n handleApplicationShutdown(session);\n};\n\nconst refusedExitCode = (): number => (process.exitCode === undefined ? 1 : Number(process.exitCode));\n\nconst connectApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const { deps, server } = session;\n deps.watchApplicationShutdown(onApplicationShutdown(session));\n const applicationId = (await deps.getConfiguredApplicationId(process.cwd())) ?? liveApplicationId;\n deps.log(`Connected application ID: ${applicationId}`);\n await deps.startMcpClient(applicationId, (id) => loadModuleExclusively(server, id));\n};\n\nconst stopForOwnedApplicationId = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n session.deps.log(\n `Another process already owns ${liveApplicationId}, so this session can never show a window - ` +\n \"stopping dev runner. Quit that instance or change applicationId, then start gtkx dev again.\",\n );\n\n await closeAndExit(session, OWNED_ID_EXIT_CODE);\n};\n\nconst stopForStoppedApplication = async (session: DevSession, instance: ApplicationInstance): Promise<void> => {\n if (session.failure.hasReported()) {\n session.deps.log(\"Application stopped before the dev runner attached.\");\n session.failure.fail();\n\n return;\n }\n\n if (instance === \"shutDown\") {\n await stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application refused its command line - stopping dev runner...\");\n await closeAndExit(session, refusedExitCode());\n};\n\nconst connectLiveApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const instance = session.deps.getApplicationInstance();\n\n if (instance === \"primary\") {\n await connectApplication(session, liveApplicationId);\n\n return;\n }\n\n if (instance === \"remote\") {\n await stopForOwnedApplicationId(session, liveApplicationId);\n\n return;\n }\n\n await stopForStoppedApplication(session, instance);\n};\n\nconst attachApplication = async (session: DevSession): Promise<void> => {\n const { deps, failure } = session;\n\n const liveApplicationId = await deps.waitForApplicationId(\n APPLICATION_MOUNT_TIMEOUT_MS,\n () => !failure.isDown(),\n );\n\n if (failure.isDown()) {\n return;\n }\n\n if (liveApplicationId === null) {\n deps.log(\"Entry did not mount an application - MCP client not started.\");\n\n return;\n }\n\n await connectLiveApplication(session, liveApplicationId);\n};\n\nconst loadEntry = async (session: DevSession, entryPath: string): Promise<void> => {\n session.deps.log(`Loading entry: ${entryPath}`);\n\n try {\n await loadModuleExclusively(session.server, entryPath);\n } catch (error_) {\n awaitMissingImport(session, entryPath, error_);\n session.failure.fail(error_);\n }\n};\n\nconst hasApplicationStopped = (instance: ApplicationInstance): boolean =>\n instance === \"shutDown\" || instance === \"unregistered\";\n\nconst isApplicationLost = (session: DevSession): boolean =>\n session.failure.hasReported() && hasApplicationStopped(session.deps.getApplicationInstance());\n\nconst announceReady = (session: DevSession): void => {\n if (isApplicationLost(session)) {\n session.failure.fail();\n }\n\n if (isSessionInactive(session)) {\n return;\n }\n\n session.deps.log(\"HMR enabled - watching for changes...\");\n};\n\nconst createSession = (server: DevServer, deps: DevRunnerDeps): DevSession => {\n const refreshTracker = createRefreshTracker(deps.performRefresh);\n\n return {\n server,\n deps: { ...deps, performRefresh: refreshTracker.performRefresh },\n controller: createShutdownController(server, deps),\n refreshTracker,\n failure: createFailureTracker((cause) => {\n announceFailure(server, cause);\n }, refreshTracker.isRefreshing),\n pendingSaves: new Map(),\n };\n};\n\nconst createDevRunner = (deps: DevRunnerDeps): DevRunner => ({\n async run(entryPath: string): Promise<void> {\n const server = await deps.createServer(createDevServerConfig(process.cwd(), deps.plugins(entryPath)));\n const session = createSession(server, deps);\n deps.installShutdownHandlers(onShutdownSignal(session));\n\n deps.watchUncaughtErrors((cause) => {\n session.failure.report(cause);\n });\n\n watchProjectFiles(session);\n await loadEntry(session, entryPath);\n await attachApplication(session);\n announceReady(session);\n },\n});\n\nexport { createDevRunner, type DevRunnerDeps };\n"]}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAsB,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACH,qBAAqB,EAIrB,kBAAkB,GACrB,MAAM,sBAAsB,CAAC;AAqD9B,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAC5C,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,YAAY,GAA0B,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACxE,MAAM,WAAW,GAAG,qBAAqB,MAAM,CAAC,kBAAkB,CAAC,+CAA+C,CAAC;AACnH,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,MAAM,eAAe,GAAG,CAAC,MAAiB,EAAE,KAAc,EAAQ,EAAE;IAChE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,6EAA6E,EAAE,KAAK,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,OAAmB,EAAQ,EAAE;IAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,OAAmB,EAAkB,EAAE;IACjE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,0CAA0C,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAmB,EAAE,MAA8B,EAAW,EAAE;IACrF,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;IAEvC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,OAAmB,EAAE,MAA8B,EAAQ,EAAE;IAC1F,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEpD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CACxB,OAAmB,EACnB,WAAmB,EACnB,aAAsC,EAC/B,EAAE;IACT,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAExE,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,SAAS,CAAC,SAAS,KAAK,aAAa,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC1B,OAAmB,EACnB,WAAmB,EACnB,MAA8B,EACV,EAAE,CACtB,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;IACzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAClE,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEzE,OAAO;QACH,aAAa;QACb,SAAS,EAAE,eAAe,KAAK,QAAQ,IAAI,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC;KACtG,CAAC;AACN,CAAC,CAAC,CAAC;AAEP,MAAM,aAAa,GAAG,KAAK,EACvB,OAAmB,EACnB,WAAmB,EACnB,MAA8B,EACR,EAAE;IACxB,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAE/F,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;AAC5G,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,KAAK,EAC5B,OAAmB,EACnB,WAAmB,EACnB,aAAqC,EACE,EAAE;IACzC,IAAI,MAAM,GAAG,aAAa,CAAC;IAE3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,aAAa,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAiC,EAAE,OAAgC,EAAiB,EAAE;IAC7G,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC1B,OAAmB,EACnB,QAAwC,EACxC,OAAgC,EACnB,EAAE;IACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,qBAAqB,OAAO,kCAAkC,CAAC;IAC1E,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE9D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,uCAAuC,KAAK,uCAAuC,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAC9B,OAAmB,EACnB,WAAmB,EACnB,aAAqC,EACrC,QAAwC,EAC3B,EAAE;IACf,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAEpF,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;QACtC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,IAAI,CAAC,yBAAyB,WAAW,IAAI,WAAW,EAAE,CAAC,CAAC;QAE5D,OAAO;IACX,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE1E,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,eAAe,KAAK,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;QACxD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,EAAE,MAAc,EAAiB,EAAE;IACxG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAErE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,WAAW,EAAE,CAAC,CAAC;IAE9C,IAAI,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,MAAM,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAmB,EAAE,WAAmB,EAAE,KAAc,EAAQ,EAAE;IAC1F,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEzC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,EAAE,MAAc,EAAiB,EAAE;IAChG,IAAI,CAAC;QACD,MAAM,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QAED,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACjD,KAAK,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,WAAmB,EAAY,EAAE,CACzE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;KACpB,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;KACtE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;AAE7C,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAAE,OAAiB,EAAiB,EAAE;IACtF,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QAED,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,EAAiB,EAAE;IACvF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3B,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,EAAiB,EAAE;IACvF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,MAAiB,EAAE,IAAmB,EAAsB,EAAE;IAC5F,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,OAAO;QACH,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc;QACpC,QAAQ,EAAE,KAAK,EAAE,eAA2B,EAAiB,EAAE;YAC3D,IAAI,cAAc,EAAE,CAAC;gBACjB,OAAO;YACX,CAAC;YAED,cAAc,GAAG,IAAI,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,EAAiB,EAAE;IAC7F,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAC1D,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,EAAiB,EAAE;IACxF,IAAI,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;IAChE,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAAmB,EAAE,MAAqB,EAAiB,EAAE;IACpF,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;QACtC,OAAO;IACX,CAAC;IAED,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO;IACX,CAAC;IAED,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEnD,OAAO;IACX,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO;IACX,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO;IACX,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAQ,EAAE;IACpD,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1E,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACtC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAmB,EAAyB,EAAE,CAAC,KAAK,IAAI,EAAE;IAChF,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;QACtC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEtE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE;QACnC,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAmB,EAAE,IAAI,GAAG,CAAC,EAAkB,EAAE;IACzE,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAS,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAW,EAAE;IACvD,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,OAAmB,EAAkB,EAAE;IACnE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAE9D,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,aAAsB,EAAQ,EAAE;IACxE,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO;IACX,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,KAAK,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAErC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACzF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,OAAmB,EAAQ,EAAE;IAC5D,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO;IACX,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;IAE5D,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE;QAC/B,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAmB,EAAgB,EAAE,CAAC,GAAG,EAAE;IACtE,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,GAAW,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEtG,MAAM,kBAAkB,GAAG,KAAK,EAAE,OAAmB,EAAE,iBAAyB,EAAiB,EAAE;IAC/F,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjC,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC;IAClG,IAAI,CAAC,GAAG,CAAC,6BAA6B,aAAa,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,KAAK,EAAE,OAAmB,EAAE,iBAAyB,EAAiB,EAAE;IACtG,OAAO,CAAC,IAAI,CAAC,GAAG,CACZ,gCAAgC,iBAAiB,8CAA8C;QAC/F,6FAA6F,CAChG,CAAC;IAEF,MAAM,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,KAAK,EAAE,OAAmB,EAAE,QAA6B,EAAiB,EAAE;IAC1G,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACxE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEvB,OAAO;IACX,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEtC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAClF,MAAM,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAmB,EAAE,iBAAyB,EAAiB,EAAE;IACnG,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAErD,OAAO;IACX,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAE5D,OAAO;IACX,CAAC;IAED,MAAM,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAAiB,EAAE;IACnE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAElC,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CACrD,4BAA4B,EAC5B,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAC1B,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IAED,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAEzE,OAAO;IACX,CAAC;IAED,MAAM,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,OAAmB,EAAE,SAAiB,EAAiB,EAAE;IAC9E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAEhD,IAAI,CAAC;QACD,MAAM,qBAAqB,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,QAA6B,EAAW,EAAE,CACrE,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,cAAc,CAAC;AAE3D,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAW,EAAE,CACvD,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAElG,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAQ,EAAE;IAChD,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,MAAiB,EAAE,IAAmB,EAAc,EAAE;IACzE,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEjE,OAAO;QACH,MAAM;QACN,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,cAAc,EAAE;QAChE,UAAU,EAAE,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC;QAClD,cAAc;QACd,OAAO,EAAE,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE;YACpC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC;QAC/B,YAAY,EAAE,IAAI,GAAG,EAAE;KAC1B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAa,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,GAAG,CAAC,SAAiB;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpC,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACjC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;CACJ,CAAC,CAAC;AAEH,OAAO,EAAE,eAAe,EAAsB,CAAC","sourcesContent":["import type { ApplicationInstance } from \"@gtkx/runtime/internal\";\nimport type { InlineConfig, Plugin } from \"vite\";\nimport { error, warn } from \"@gtkx/utils\";\nimport { isCatalogSource } from \"../i18n/catalogs.js\";\nimport { loadModuleExclusively, withExclusiveLoad } from \"../internal/module-loads.js\";\nimport { createChangeQueue, type WatchedChange } from \"./change-queue.js\";\nimport { createFailureTracker, type FailureTracker } from \"./failure-tracker.js\";\nimport { isMissingImport, missingImportName } from \"./missing-import.js\";\nimport { createRefreshTracker, type RefreshTracker } from \"./refresh-tracker.js\";\nimport { RESTART_EXIT_CODE } from \"./supervisor.js\";\nimport {\n createDevServerConfig,\n type DevServer,\n type DevServerChangedModule,\n type DevServerWatchEvent,\n isServerConfigFile,\n} from \"./vite-dev-server.js\";\n\ntype LoadAppModule = (id: string) => Promise<Record<string, unknown>>;\n\ntype DevRunnerDeps = {\n createServer(config: InlineConfig): Promise<DevServer>;\n waitForApplicationId(timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null>;\n getConfiguredApplicationId(root: string): Promise<string | undefined>;\n startMcpClient(applicationId: string, loadAppModule: LoadAppModule): Promise<unknown>;\n stopMcpClient(): void;\n watchApplicationShutdown(onShutdown: () => void): void;\n watchUncaughtErrors(onUncaughtError: (cause: unknown) => void): void;\n getApplicationInstance(): ApplicationInstance;\n installShutdownHandlers(onSignal: () => void | Promise<void>): void;\n quitDefaultApplication(): void;\n performRefresh: () => void;\n isRefreshBoundary(module: Record<string, unknown>): boolean;\n staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;\n readFileRevision(path: string): Promise<string>;\n hasWrittenCatalog(path: string): boolean;\n plugins(entryPath: string): Plugin[];\n log(message: string): void;\n exit(code: number): never;\n};\n\ntype DevRunner = {\n run(entryPath: string): Promise<void>;\n};\n\ntype ShutdownController = {\n isShuttingDown: () => boolean;\n shutdown: (quitApplication: () => void) => Promise<void>;\n};\n\ntype DevSession = {\n server: DevServer;\n deps: DevRunnerDeps;\n controller: ShutdownController;\n refreshTracker: RefreshTracker;\n failure: FailureTracker;\n pendingSaves: Map<string, string>;\n};\n\ntype SettledLoad = {\n loadedExports: Record<string, unknown>;\n isSettled: boolean;\n};\n\ntype SettleAttempt = {\n loadedExports: Record<string, unknown> | null;\n module: DevServerChangedModule;\n};\n\nconst APPLICATION_MOUNT_TIMEOUT_MS = 10_000;\nconst OWNED_ID_EXIT_CODE = 1;\nconst LOAD_ATTEMPT_LIMIT = 5;\nconst WATCH_EVENTS: DevServerWatchEvent[] = [\"add\", \"change\", \"unlink\"];\nconst SKIP_REASON = `did not settle in ${String(LOAD_ATTEMPT_LIMIT)} attempts; save it again to patch the window.`;\nconst DROPPED_REFRESH = \"Fast Refresh dropped\";\nconst SAVE_ACTION = \"File changed\";\nconst RETRY_ACTION = \"Retrying pending save\";\n\nconst announceFailure = (server: DevServer, cause: unknown): void => {\n if (cause instanceof Error) {\n server.ssrFixStacktrace(cause);\n }\n\n error(\"Application error; keeping the dev server up. Fix the error and save again.\", cause);\n};\n\nconst parkSession = (session: DevSession): void => {\n session.deps.log(\"Waiting for a change to restart the application...\");\n};\n\nconst requestRestart = async (session: DevSession): Promise<never> => {\n session.deps.log(\"Full restart (process restart)\");\n\n try {\n await session.server.close();\n } catch (error_) {\n error(\"Error closing server before the restart:\", error_);\n }\n\n return session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst requiresRestart = (session: DevSession, module: DevServerChangedModule): boolean => {\n if (session.failure.isDown()) {\n return true;\n }\n\n const loadedExports = module.ssrModule;\n\n if (!loadedExports) {\n return false;\n }\n\n return !session.deps.isRefreshBoundary(loadedExports);\n};\n\nconst invalidateChangedModule = (session: DevSession, module: DevServerChangedModule): void => {\n session.server.moduleGraph.invalidateModule(module);\n\n for (const importer of module.importers) {\n session.server.moduleGraph.invalidateModule(importer);\n }\n};\n\nconst isEvaluationCurrent = (\n session: DevSession,\n changedPath: string,\n loadedExports: Record<string, unknown>,\n): boolean => {\n const evaluated = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!evaluated?.ssrTransformResult) {\n return false;\n }\n\n return evaluated.ssrModule === loadedExports;\n};\n\nconst loadInvalidatedModule = (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettledLoad> =>\n withExclusiveLoad(session.server, async () => {\n const revision = await session.deps.readFileRevision(changedPath);\n invalidateChangedModule(session, module);\n const loadedExports = await session.server.ssrLoadModule(changedPath);\n const settledRevision = await session.deps.readFileRevision(changedPath);\n\n return {\n loadedExports,\n isSettled: settledRevision === revision && isEvaluationCurrent(session, changedPath, loadedExports),\n };\n });\n\nconst settleAttempt = async (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettleAttempt> => {\n const { loadedExports, isSettled } = await loadInvalidatedModule(session, changedPath, module);\n\n if (isSettled) {\n return { loadedExports, module };\n }\n\n return { loadedExports: null, module: session.server.moduleGraph.getModuleById(changedPath) ?? module };\n};\n\nconst loadSettledExports = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n): Promise<Record<string, unknown> | null> => {\n let module = changedModule;\n\n for (let round = 0; round < LOAD_ATTEMPT_LIMIT && !session.controller.isShuttingDown(); round++) {\n const attempt = await settleAttempt(session, changedPath, module);\n\n if (attempt.loadedExports) {\n return attempt.loadedExports;\n }\n\n module = attempt.module;\n }\n\n return null;\n};\n\nconst droppedExportName = (previous: Record<string, unknown>, current: Record<string, unknown>): string | null => {\n const kept = new Set(Object.keys(current));\n\n for (const name of Object.keys(previous)) {\n if (!kept.has(name)) {\n return name;\n }\n }\n\n return null;\n};\n\nconst unpatchedExportReason = (\n session: DevSession,\n previous: Record<string, unknown> | null,\n current: Record<string, unknown>,\n): string | null => {\n if (!previous) {\n return null;\n }\n\n const dropped = droppedExportName(previous, current);\n\n if (dropped !== null) {\n return `no longer exports ${dropped}, which its importers still hold`;\n }\n\n const stale = session.deps.staleExportName(previous, current);\n\n if (stale === null) {\n return null;\n }\n\n return `renamed the component it exports as ${stale}, which the window is still rendering`;\n};\n\nconst refreshChangedModule = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n previous: Record<string, unknown> | null,\n): Promise<void> => {\n const loadedExports = await loadSettledExports(session, changedPath, changedModule);\n\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (!loadedExports) {\n warn(`Fast Refresh skipped: ${changedPath} ${SKIP_REASON}`);\n\n return;\n }\n\n if (!session.deps.isRefreshBoundary(loadedExports)) {\n await requestRestart(session);\n\n return;\n }\n\n const unpatched = unpatchedExportReason(session, previous, loadedExports);\n\n if (unpatched !== null) {\n warn(`${DROPPED_REFRESH}: ${changedPath} ${unpatched}`);\n await requestRestart(session);\n\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n session.deps.log(\"Running Fast Refresh...\");\n session.deps.performRefresh();\n session.deps.log(\"Fast Refresh complete\");\n};\n\nconst applyModuleChange = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n const module = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!module) {\n return;\n }\n\n session.deps.log(`${action}: ${changedPath}`);\n\n if (requiresRestart(session, module)) {\n await requestRestart(session);\n\n return;\n }\n\n await refreshChangedModule(session, changedPath, module, module.ssrModule ?? null);\n};\n\nconst awaitMissingImport = (session: DevSession, changedPath: string, cause: unknown): void => {\n const missingName = missingImportName(cause);\n\n if (missingName === null) {\n session.pendingSaves.delete(changedPath);\n\n return;\n }\n\n session.pendingSaves.set(changedPath, missingName);\n};\n\nconst applySave = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n try {\n await applyModuleChange(session, changedPath, action);\n } catch (error_) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n awaitMissingImport(session, changedPath, error_);\n error(\"Hot reload failed:\", error_);\n }\n};\n\nconst savesAwaiting = (session: DevSession, createdPath: string): string[] =>\n [...session.pendingSaves]\n .filter(([, missingName]) => isMissingImport(createdPath, missingName))\n .map(([changedPath]) => changedPath);\n\nconst retryPendingSaves = async (session: DevSession, waiting: string[]): Promise<void> => {\n for (const changedPath of waiting) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n await applySave(session, changedPath, RETRY_ACTION);\n }\n};\n\nconst handleFileCreate = async (session: DevSession, createdPath: string): Promise<void> => {\n const waiting = savesAwaiting(session, createdPath);\n\n if (waiting.length === 0) {\n return;\n }\n\n session.deps.log(`File created: ${createdPath}`);\n\n if (session.failure.isDown()) {\n await requestRestart(session);\n\n return;\n }\n\n await retryPendingSaves(session, waiting);\n};\n\nconst handleFileRemove = async (session: DevSession, removedPath: string): Promise<void> => {\n if (!session.server.moduleGraph.getModuleById(removedPath)) {\n return;\n }\n\n session.deps.log(`File removed: ${removedPath}`);\n await requestRestart(session);\n};\n\nconst createShutdownController = (server: DevServer, deps: DevRunnerDeps): ShutdownController => {\n let isShuttingDown = false;\n\n return {\n isShuttingDown: () => isShuttingDown,\n shutdown: async (quitApplication: () => void): Promise<void> => {\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n quitApplication();\n deps.stopMcpClient();\n await server.close();\n },\n };\n};\n\nconst restartForServerConfig = async (session: DevSession, changedPath: string): Promise<void> => {\n session.deps.log(`Server config changed: ${changedPath}`);\n await requestRestart(session);\n};\n\nconst restartForCatalog = async (session: DevSession, changedPath: string): Promise<void> => {\n if (session.deps.hasWrittenCatalog(changedPath)) {\n return;\n }\n\n session.deps.log(`Translation catalog changed: ${changedPath}`);\n await requestRestart(session);\n};\n\nconst applyChange = async (session: DevSession, change: WatchedChange): Promise<void> => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (isCatalogSource(session.server.config.root, change.path)) {\n await restartForCatalog(session, change.path);\n\n return;\n }\n\n if (isServerConfigFile(session.server.config, change.path)) {\n await restartForServerConfig(session, change.path);\n\n return;\n }\n\n if (change.event === \"add\") {\n await handleFileCreate(session, change.path);\n\n return;\n }\n\n if (change.event === \"unlink\") {\n await handleFileRemove(session, change.path);\n\n return;\n }\n\n await applySave(session, change.path, SAVE_ACTION);\n};\n\nconst watchProjectFiles = (session: DevSession): void => {\n const queue = createChangeQueue((change) => applyChange(session, change));\n\n for (const event of WATCH_EVENTS) {\n session.server.watcher.on(event, (path) => {\n queue.enqueue({ event, path });\n });\n }\n};\n\nconst onShutdownSignal = (session: DevSession): (() => Promise<void>) => async () => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.deps.log(\"Received shutdown signal - stopping dev runner...\");\n\n await session.controller.shutdown(() => {\n session.deps.quitDefaultApplication();\n });\n};\n\nconst closeAndExit = async (session: DevSession, code = 0): Promise<never> => {\n try {\n await session.controller.shutdown((): void => undefined);\n } catch (error_) {\n error(\"Error closing server:\", error_);\n\n return session.deps.exit(1);\n }\n\n return session.deps.exit(code);\n};\n\nconst isSessionInactive = (session: DevSession): boolean => {\n if (session.controller.isShuttingDown()) {\n return true;\n }\n\n if (!session.failure.isDown()) {\n return false;\n }\n\n parkSession(session);\n\n return true;\n};\n\nconst stopForApplicationQuit = (session: DevSession): Promise<never> => {\n session.deps.log(\"Application quit - stopping dev runner...\");\n\n return closeAndExit(session);\n};\n\nconst settleUnmount = (session: DevSession, wasRefreshing: boolean): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n if (!wasRefreshing) {\n void stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application unmounted during Fast Refresh - restarting dev runner...\");\n session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst handleApplicationShutdown = (session: DevSession): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n const wasRefreshing = session.refreshTracker.isRefreshing();\n\n session.failure.settleUnmount(() => {\n settleUnmount(session, wasRefreshing);\n });\n};\n\nconst onApplicationShutdown = (session: DevSession): (() => void) => () => {\n handleApplicationShutdown(session);\n};\n\nconst refusedExitCode = (): number => (process.exitCode === undefined ? 1 : Number(process.exitCode));\n\nconst connectApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const { deps, server } = session;\n deps.watchApplicationShutdown(onApplicationShutdown(session));\n const applicationId = (await deps.getConfiguredApplicationId(process.cwd())) ?? liveApplicationId;\n deps.log(`Connected application ID: ${applicationId}`);\n await deps.startMcpClient(applicationId, (id) => loadModuleExclusively(server, id));\n};\n\nconst stopForOwnedApplicationId = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n session.deps.log(\n `Another process already owns ${liveApplicationId}, so this session can never show a window - ` +\n \"stopping dev runner. Quit that instance or change applicationId, then start gtkx dev again.\",\n );\n\n await closeAndExit(session, OWNED_ID_EXIT_CODE);\n};\n\nconst stopForStoppedApplication = async (session: DevSession, instance: ApplicationInstance): Promise<void> => {\n if (session.failure.hasReported()) {\n session.deps.log(\"Application stopped before the dev runner attached.\");\n session.failure.fail();\n\n return;\n }\n\n if (instance === \"shutDown\") {\n await stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application refused its command line - stopping dev runner...\");\n await closeAndExit(session, refusedExitCode());\n};\n\nconst connectLiveApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const instance = session.deps.getApplicationInstance();\n\n if (instance === \"primary\") {\n await connectApplication(session, liveApplicationId);\n\n return;\n }\n\n if (instance === \"remote\") {\n await stopForOwnedApplicationId(session, liveApplicationId);\n\n return;\n }\n\n await stopForStoppedApplication(session, instance);\n};\n\nconst attachApplication = async (session: DevSession): Promise<void> => {\n const { deps, failure } = session;\n\n const liveApplicationId = await deps.waitForApplicationId(\n APPLICATION_MOUNT_TIMEOUT_MS,\n () => !failure.isDown(),\n );\n\n if (failure.isDown()) {\n return;\n }\n\n if (liveApplicationId === null) {\n deps.log(\"Entry did not mount an application - MCP client not started.\");\n\n return;\n }\n\n await connectLiveApplication(session, liveApplicationId);\n};\n\nconst loadEntry = async (session: DevSession, entryPath: string): Promise<void> => {\n session.deps.log(`Loading entry: ${entryPath}`);\n\n try {\n await loadModuleExclusively(session.server, entryPath);\n } catch (error_) {\n awaitMissingImport(session, entryPath, error_);\n session.failure.fail(error_);\n }\n};\n\nconst hasApplicationStopped = (instance: ApplicationInstance): boolean =>\n instance === \"shutDown\" || instance === \"unregistered\";\n\nconst isApplicationLost = (session: DevSession): boolean =>\n session.failure.hasReported() && hasApplicationStopped(session.deps.getApplicationInstance());\n\nconst announceReady = (session: DevSession): void => {\n if (isApplicationLost(session)) {\n session.failure.fail();\n }\n\n if (isSessionInactive(session)) {\n return;\n }\n\n session.deps.log(\"HMR enabled - watching for changes...\");\n};\n\nconst createSession = (server: DevServer, deps: DevRunnerDeps): DevSession => {\n const refreshTracker = createRefreshTracker(deps.performRefresh);\n\n return {\n server,\n deps: { ...deps, performRefresh: refreshTracker.performRefresh },\n controller: createShutdownController(server, deps),\n refreshTracker,\n failure: createFailureTracker((cause) => {\n announceFailure(server, cause);\n }, refreshTracker.isRefreshing),\n pendingSaves: new Map(),\n };\n};\n\nconst createDevRunner = (deps: DevRunnerDeps): DevRunner => ({\n async run(entryPath: string): Promise<void> {\n const server = await deps.createServer(createDevServerConfig(process.cwd(), deps.plugins(entryPath)));\n const session = createSession(server, deps);\n deps.installShutdownHandlers(onShutdownSignal(session));\n\n deps.watchUncaughtErrors((cause) => {\n session.failure.report(cause);\n });\n\n watchProjectFiles(session);\n await loadEntry(session, entryPath);\n await attachApplication(session);\n announceReady(session);\n },\n});\n\nexport { createDevRunner, type DevRunnerDeps };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAOA,KAAK,eAAe,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAChD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAChG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;CACrG,CAAC;AAEF,KAAK,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;AAE/G,KAAK,QAAQ,GAAG;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAOA,KAAK,eAAe,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAChD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAChG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;CACrG,CAAC;AAEF,KAAK,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;AAE/G,KAAK,QAAQ,GAAG;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACvC,CAAC;AAoBF,KAAK,oBAAoB,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC,CAAC;AAOF,QAAA,MAAM,iBAAiB,KAAK,CAAC;AA0X7B,QAAA,MAAM,gBAAgB,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,KAAK,CA0B5E,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,QAAQ,GAChB,CAAC"}
|
package/dist/dev/supervisor.js
CHANGED
|
@@ -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
3
|
import { statSync, watch as watchFs } from "node:fs";
|
|
4
|
-
import { basename, dirname, join } from "node:path";
|
|
4
|
+
import { basename, dirname, join, relative } 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);
|
|
@@ -91,7 +91,7 @@ const relaunchAfterExit = (state) => {
|
|
|
91
91
|
};
|
|
92
92
|
const isSupervisorShuttingDown = (state) => state.isShuttingDown;
|
|
93
93
|
const reconcileConfigWatchers = (state, paths, previous) => {
|
|
94
|
-
const
|
|
94
|
+
const changed = changedWatchPaths(previous, paths);
|
|
95
95
|
closeWatchers(state);
|
|
96
96
|
if (state.watch !== undefined) {
|
|
97
97
|
state.watch.paths = paths;
|
|
@@ -100,10 +100,15 @@ const reconcileConfigWatchers = (state, paths, previous) => {
|
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
102
|
installConfigWatchers(state);
|
|
103
|
-
if (
|
|
104
|
-
scheduleRestart(state);
|
|
103
|
+
if (changed.length > 0 && !state.isRestartPending) {
|
|
104
|
+
scheduleRestart(state, changed);
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
|
+
const consumeChangedPaths = (state) => {
|
|
108
|
+
const changed = [...state.changedPaths].map((path) => relative(state.cwd, path));
|
|
109
|
+
state.changedPaths.clear();
|
|
110
|
+
return changed.length === 0 ? basename(state.configFile) : changed.join(", ");
|
|
111
|
+
};
|
|
107
112
|
const restart = async (state) => {
|
|
108
113
|
const watch = state.watch;
|
|
109
114
|
if (watch === undefined || state.isShuttingDown) {
|
|
@@ -114,7 +119,7 @@ const restart = async (state) => {
|
|
|
114
119
|
return;
|
|
115
120
|
}
|
|
116
121
|
state.isRestarting = true;
|
|
117
|
-
info(`${
|
|
122
|
+
info(`${consumeChangedPaths(state)} changed; regenerating bindings...`);
|
|
118
123
|
closeWatchers(state);
|
|
119
124
|
watch.paths = watch.resolvePaths();
|
|
120
125
|
const previous = snapshotWatchPaths(watch.paths);
|
|
@@ -144,8 +149,11 @@ const restart = async (state) => {
|
|
|
144
149
|
});
|
|
145
150
|
forwardSignal(current, "SIGTERM");
|
|
146
151
|
};
|
|
147
|
-
const scheduleRestart = (state) => {
|
|
152
|
+
const scheduleRestart = (state, changedPaths = []) => {
|
|
148
153
|
const timer = state.restartTimer;
|
|
154
|
+
for (const path of changedPaths) {
|
|
155
|
+
state.changedPaths.add(path);
|
|
156
|
+
}
|
|
149
157
|
if (timer.handle !== null) {
|
|
150
158
|
clearTimeout(timer.handle);
|
|
151
159
|
}
|
|
@@ -154,11 +162,12 @@ const scheduleRestart = (state) => {
|
|
|
154
162
|
void restart(state);
|
|
155
163
|
}, CONFIG_DEBOUNCE_MS);
|
|
156
164
|
};
|
|
157
|
-
const
|
|
165
|
+
const watchedChangePath = (state, directory, names, filename) => {
|
|
158
166
|
if (filename === null || state.isShuttingDown) {
|
|
159
|
-
return
|
|
167
|
+
return undefined;
|
|
160
168
|
}
|
|
161
|
-
|
|
169
|
+
const name = basename(filename.toString());
|
|
170
|
+
return names.has(name) ? join(directory, name) : undefined;
|
|
162
171
|
};
|
|
163
172
|
const isDirectory = (path) => {
|
|
164
173
|
try {
|
|
@@ -197,15 +206,10 @@ const watchPathState = (path) => {
|
|
|
197
206
|
}
|
|
198
207
|
};
|
|
199
208
|
const snapshotWatchPaths = (paths) => new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return false;
|
|
208
|
-
};
|
|
209
|
+
const changedWatchPaths = (previous, paths) => [...watchTargets(paths)].filter((path) => {
|
|
210
|
+
const current = watchPathState(path);
|
|
211
|
+
return previous.has(path) ? previous.get(path) !== current : current !== null;
|
|
212
|
+
});
|
|
209
213
|
const groupWatchNamesByDirectory = (paths) => {
|
|
210
214
|
const namesByDirectory = new Map();
|
|
211
215
|
for (const path of paths) {
|
|
@@ -219,8 +223,9 @@ const groupWatchNamesByDirectory = (paths) => {
|
|
|
219
223
|
const watchConfigDirectory = (state, directory, names) => {
|
|
220
224
|
try {
|
|
221
225
|
const watcher = watchFs(directory, (_event, filename) => {
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
const changed = watchedChangePath(state, directory, names, filename);
|
|
227
|
+
if (changed !== undefined) {
|
|
228
|
+
scheduleRestart(state, [changed]);
|
|
224
229
|
}
|
|
225
230
|
});
|
|
226
231
|
watcher.on("error", (cause) => {
|
|
@@ -281,6 +286,7 @@ const runDevSupervisor = async (options) => {
|
|
|
281
286
|
args,
|
|
282
287
|
watch,
|
|
283
288
|
watchers: [],
|
|
289
|
+
changedPaths: new Set(),
|
|
284
290
|
restartTimer: { handle: null },
|
|
285
291
|
fork,
|
|
286
292
|
child: null,
|
|
@@ -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, 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
|
+
{"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, statSync, watch as watchFs } from \"node:fs\";\nimport { basename, dirname, join, relative } 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 changedPaths: Set<string>;\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 changed = changedWatchPaths(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 (changed.length > 0 && !state.isRestartPending) {\n scheduleRestart(state, changed);\n }\n};\n\nconst consumeChangedPaths = (state: SupervisorState): string => {\n const changed = [...state.changedPaths].map((path) => relative(state.cwd, path));\n state.changedPaths.clear();\n\n return changed.length === 0 ? basename(state.configFile) : changed.join(\", \");\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(`${consumeChangedPaths(state)} 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, changedPaths: string[] = []): void => {\n const timer = state.restartTimer;\n\n for (const path of changedPaths) {\n state.changedPaths.add(path);\n }\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 watchedChangePath = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n filename: string | Buffer | null,\n): string | undefined => {\n if (filename === null || state.isShuttingDown) {\n return undefined;\n }\n\n const name = basename(filename.toString());\n\n return names.has(name) ? join(directory, name) : undefined;\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 changedWatchPaths = (\n previous: ReadonlyMap<string, string | null>,\n paths: string[],\n): string[] =>\n [...watchTargets(paths)].filter((path) => {\n const current = watchPathState(path);\n\n return previous.has(path) ? previous.get(path) !== current : current !== null;\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 const changed = watchedChangePath(state, directory, names, filename);\n\n if (changed !== undefined) {\n scheduleRestart(state, [changed]);\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 changedPaths: new Set(),\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"]}
|
package/dist/i18n/catalogs.d.ts
CHANGED
|
@@ -11,11 +11,15 @@ type CatalogProject = {
|
|
|
11
11
|
poFiles: string[];
|
|
12
12
|
root: string;
|
|
13
13
|
};
|
|
14
|
+
type WrittenCatalog = {
|
|
15
|
+
content: Buffer;
|
|
16
|
+
path: string;
|
|
17
|
+
};
|
|
14
18
|
declare const LOCALE_DIRNAME = "locale";
|
|
15
19
|
declare const requiresCatalogInitialization: (project: CatalogProject) => boolean;
|
|
16
20
|
declare const resolveCatalogProject: (root: string, domain: string) => CatalogProject | null;
|
|
17
21
|
declare const compileCatalogs: (project: CatalogProject, outputDir: string) => string[];
|
|
18
|
-
declare const synchronizeCatalogs: (project: CatalogProject) =>
|
|
22
|
+
declare const synchronizeCatalogs: (project: CatalogProject) => WrittenCatalog[];
|
|
19
23
|
declare const isCatalogSource: (root: string, path: string) => boolean;
|
|
20
|
-
export { type CatalogProject, LOCALE_DIRNAME, compileCatalogs, isCatalogSource, requiresCatalogInitialization, resolveCatalogProject, synchronizeCatalogs, };
|
|
24
|
+
export { type CatalogProject, LOCALE_DIRNAME, compileCatalogs, isCatalogSource, requiresCatalogInitialization, resolveCatalogProject, synchronizeCatalogs, type WrittenCatalog, };
|
|
21
25
|
//# sourceMappingURL=catalogs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"AAcA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AASF,QAAA,MAAM,cAAc,WAAW,CAAC;AAiChC,QAAA,MAAM,6BAA6B,GAAI,SAAS,cAAc,KAAG,OACA,CAAC;AAElE,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,cAAc,GAAG,IA8B9E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAmB3E,CAAC;
|
|
1
|
+
{"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"AAcA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AASF,KAAK,cAAc,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,QAAA,MAAM,cAAc,WAAW,CAAC;AAiChC,QAAA,MAAM,6BAA6B,GAAI,SAAS,cAAc,KAAG,OACA,CAAC;AAElE,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,cAAc,GAAG,IA8B9E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAmB3E,CAAC;AA4DF,QAAA,MAAM,mBAAmB,GAAI,SAAS,cAAc,KAAG,cAAc,EAiBpE,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,OAUrD,CAAC;AAEF,OAAO,EACH,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,eAAe,EACf,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,GACtB,CAAC"}
|
package/dist/i18n/catalogs.js
CHANGED
|
@@ -103,26 +103,28 @@ const prepareCatalog = (catalog, index, template, stagingDir) => {
|
|
|
103
103
|
else {
|
|
104
104
|
initializeCatalog(catalog, template, output);
|
|
105
105
|
}
|
|
106
|
+
const content = readFileSync(output);
|
|
106
107
|
return {
|
|
107
|
-
|
|
108
|
+
content,
|
|
109
|
+
isChanged: !isExisting || !content.equals(readFileSync(catalog.path)),
|
|
108
110
|
output,
|
|
109
111
|
target: catalog.path,
|
|
110
112
|
};
|
|
111
113
|
};
|
|
114
|
+
const replaceCatalog = (catalog) => {
|
|
115
|
+
renameSync(catalog.output, catalog.target);
|
|
116
|
+
return { content: catalog.content, path: catalog.target };
|
|
117
|
+
};
|
|
112
118
|
const synchronizeCatalogs = (project) => {
|
|
113
119
|
if (project.catalogs.length === 0) {
|
|
114
|
-
return;
|
|
120
|
+
return [];
|
|
115
121
|
}
|
|
116
122
|
const template = join(project.poDir, `${project.domain}.pot`);
|
|
117
123
|
requireFile(template);
|
|
118
124
|
const stagingDir = mkdtempSync(join(project.poDir, ".gtkx-catalog-"));
|
|
119
125
|
try {
|
|
120
126
|
const merged = project.catalogs.map((catalog, index) => prepareCatalog(catalog, index, template, stagingDir));
|
|
121
|
-
|
|
122
|
-
if (catalog.isChanged) {
|
|
123
|
-
renameSync(catalog.output, catalog.target);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
127
|
+
return merged.filter((catalog) => catalog.isChanged).map((catalog) => replaceCatalog(catalog));
|
|
126
128
|
}
|
|
127
129
|
finally {
|
|
128
130
|
rmSync(stagingDir, { recursive: true, force: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\n\ntype Catalog = {\n locale: string;\n path: string;\n};\n\ntype CatalogProject = {\n catalogs: Catalog[];\n domain: string;\n linguasPath: string;\n locales: string[];\n poDir: string;\n poFiles: string[];\n root: string;\n};\n\ntype PreparedCatalog = {\n isChanged: boolean;\n output: string;\n target: string;\n};\n\nconst PO_DIRNAME = \"po\";\nconst LOCALE_DIRNAME = \"locale\";\nconst LINGUAS_FILENAME = \"LINGUAS\";\nconst LOCALE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.@+-]*$/;\nconst DOMAIN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst MODE_MASK = 0o7777;\n\nconst parseLocales = (linguasPath: string): string[] => {\n const source = readFileSync(linguasPath, \"utf8\");\n\n const tokens = source\n .split(/\\r?\\n/)\n .flatMap((line) => line.replace(/#.*/, \"\").trim().split(/\\s+/))\n .filter((token) => token.length > 0);\n\n const seen: Set<string> = new Set();\n\n for (const token of tokens) {\n if (!LOCALE_PATTERN.test(token) || seen.has(token)) {\n throw new Error(`Invalid locale in ${linguasPath}: ${token}`);\n }\n\n seen.add(token);\n }\n\n return tokens;\n};\n\nconst requireFile = (path: string): void => {\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`Missing translation catalog: ${path}`);\n }\n};\n\nconst requiresCatalogInitialization = (project: CatalogProject): boolean =>\n project.catalogs.some((catalog) => !existsSync(catalog.path));\n\nconst resolveCatalogProject = (root: string, domain: string): CatalogProject | null => {\n const projectRoot = resolve(root);\n const poDir = join(projectRoot, PO_DIRNAME);\n\n if (!existsSync(poDir)) {\n return null;\n }\n\n if (!statSync(poDir).isDirectory()) {\n throw new Error(`Translation source is not a directory: ${poDir}`);\n }\n\n if (!DOMAIN_PATTERN.test(domain)) {\n throw new Error(`Invalid translation domain: ${domain}`);\n }\n\n const linguasPath = join(poDir, LINGUAS_FILENAME);\n requireFile(linguasPath);\n const locales = parseLocales(linguasPath);\n const catalogs = locales.map((locale) => ({ locale, path: join(poDir, `${locale}.po`) }));\n\n return {\n catalogs,\n domain,\n linguasPath,\n locales,\n poDir,\n poFiles: catalogs.map((catalog) => catalog.path),\n root: projectRoot,\n };\n};\n\nconst compileCatalogs = (project: CatalogProject, outputDir: string): string[] => {\n const localeDir = resolve(outputDir);\n\n for (const catalog of project.catalogs) {\n requireFile(catalog.path);\n }\n\n return project.catalogs.map((catalog) => {\n const output = join(localeDir, catalog.locale, \"LC_MESSAGES\", `${project.domain}.mo`);\n mkdirSync(dirname(output), { recursive: true });\n\n runCliTool({\n tool: \"msgfmt\",\n args: [\"--check\", \"--output-file\", output, catalog.path],\n target: catalog.path,\n });\n\n return output;\n });\n};\n\nconst initializeCatalog = (catalog: Catalog, template: string, output: string): void => {\n runCliTool({\n tool: \"msginit\",\n args: [\n \"--no-translator\",\n \"--no-wrap\",\n `--locale=${catalog.locale}`,\n `--input=${template}`,\n `--output-file=${output}`,\n ],\n options: { stdio: \"pipe\" },\n target: catalog.path,\n });\n};\n\nconst mergeCatalog = (catalog: Catalog, template: string, output: string): void => {\n requireFile(catalog.path);\n\n runCliTool({\n tool: \"msgmerge\",\n args: [\"--quiet\", \"--no-wrap\", `--output-file=${output}`, catalog.path, template],\n target: catalog.path,\n });\n\n chmodSync(output, statSync(catalog.path).mode & MODE_MASK);\n};\n\nconst prepareCatalog = (\n catalog: Catalog,\n index: number,\n template: string,\n stagingDir: string,\n): PreparedCatalog => {\n const output = join(stagingDir, `${String(index)}.po`);\n const isExisting = existsSync(catalog.path);\n\n if (isExisting) {\n mergeCatalog(catalog, template, output);\n } else {\n initializeCatalog(catalog, template, output);\n }\n\n return {\n isChanged: !isExisting || !readFileSync(output).equals(readFileSync(catalog.path)),\n output,\n target: catalog.path,\n };\n};\n\nconst synchronizeCatalogs = (project: CatalogProject): void => {\n if (project.catalogs.length === 0) {\n return;\n }\n\n const template = join(project.poDir, `${project.domain}.pot`);\n requireFile(template);\n const stagingDir = mkdtempSync(join(project.poDir, \".gtkx-catalog-\"));\n\n try {\n const merged = project.catalogs.map((catalog, index) =>\n prepareCatalog(catalog, index, template, stagingDir));\n\n for (const catalog of merged) {\n if (catalog.isChanged) {\n renameSync(catalog.output, catalog.target);\n }\n }\n } finally {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n};\n\nconst isCatalogSource = (root: string, path: string): boolean => {\n const projectRoot = resolve(root);\n const sourcePath = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);\n const poPath = relative(join(projectRoot, PO_DIRNAME), sourcePath);\n\n if (!isPathInside(join(projectRoot, PO_DIRNAME), sourcePath)) {\n return false;\n }\n\n return !poPath.includes(sep) && (poPath === LINGUAS_FILENAME || poPath.endsWith(\".po\"));\n};\n\nexport {\n type CatalogProject,\n LOCALE_DIRNAME,\n compileCatalogs,\n isCatalogSource,\n requiresCatalogInitialization,\n resolveCatalogProject,\n synchronizeCatalogs,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\n\ntype Catalog = {\n locale: string;\n path: string;\n};\n\ntype CatalogProject = {\n catalogs: Catalog[];\n domain: string;\n linguasPath: string;\n locales: string[];\n poDir: string;\n poFiles: string[];\n root: string;\n};\n\ntype PreparedCatalog = {\n content: Buffer;\n isChanged: boolean;\n output: string;\n target: string;\n};\n\ntype WrittenCatalog = {\n content: Buffer;\n path: string;\n};\n\nconst PO_DIRNAME = \"po\";\nconst LOCALE_DIRNAME = \"locale\";\nconst LINGUAS_FILENAME = \"LINGUAS\";\nconst LOCALE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.@+-]*$/;\nconst DOMAIN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst MODE_MASK = 0o7777;\n\nconst parseLocales = (linguasPath: string): string[] => {\n const source = readFileSync(linguasPath, \"utf8\");\n\n const tokens = source\n .split(/\\r?\\n/)\n .flatMap((line) => line.replace(/#.*/, \"\").trim().split(/\\s+/))\n .filter((token) => token.length > 0);\n\n const seen: Set<string> = new Set();\n\n for (const token of tokens) {\n if (!LOCALE_PATTERN.test(token) || seen.has(token)) {\n throw new Error(`Invalid locale in ${linguasPath}: ${token}`);\n }\n\n seen.add(token);\n }\n\n return tokens;\n};\n\nconst requireFile = (path: string): void => {\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`Missing translation catalog: ${path}`);\n }\n};\n\nconst requiresCatalogInitialization = (project: CatalogProject): boolean =>\n project.catalogs.some((catalog) => !existsSync(catalog.path));\n\nconst resolveCatalogProject = (root: string, domain: string): CatalogProject | null => {\n const projectRoot = resolve(root);\n const poDir = join(projectRoot, PO_DIRNAME);\n\n if (!existsSync(poDir)) {\n return null;\n }\n\n if (!statSync(poDir).isDirectory()) {\n throw new Error(`Translation source is not a directory: ${poDir}`);\n }\n\n if (!DOMAIN_PATTERN.test(domain)) {\n throw new Error(`Invalid translation domain: ${domain}`);\n }\n\n const linguasPath = join(poDir, LINGUAS_FILENAME);\n requireFile(linguasPath);\n const locales = parseLocales(linguasPath);\n const catalogs = locales.map((locale) => ({ locale, path: join(poDir, `${locale}.po`) }));\n\n return {\n catalogs,\n domain,\n linguasPath,\n locales,\n poDir,\n poFiles: catalogs.map((catalog) => catalog.path),\n root: projectRoot,\n };\n};\n\nconst compileCatalogs = (project: CatalogProject, outputDir: string): string[] => {\n const localeDir = resolve(outputDir);\n\n for (const catalog of project.catalogs) {\n requireFile(catalog.path);\n }\n\n return project.catalogs.map((catalog) => {\n const output = join(localeDir, catalog.locale, \"LC_MESSAGES\", `${project.domain}.mo`);\n mkdirSync(dirname(output), { recursive: true });\n\n runCliTool({\n tool: \"msgfmt\",\n args: [\"--check\", \"--output-file\", output, catalog.path],\n target: catalog.path,\n });\n\n return output;\n });\n};\n\nconst initializeCatalog = (catalog: Catalog, template: string, output: string): void => {\n runCliTool({\n tool: \"msginit\",\n args: [\n \"--no-translator\",\n \"--no-wrap\",\n `--locale=${catalog.locale}`,\n `--input=${template}`,\n `--output-file=${output}`,\n ],\n options: { stdio: \"pipe\" },\n target: catalog.path,\n });\n};\n\nconst mergeCatalog = (catalog: Catalog, template: string, output: string): void => {\n requireFile(catalog.path);\n\n runCliTool({\n tool: \"msgmerge\",\n args: [\"--quiet\", \"--no-wrap\", `--output-file=${output}`, catalog.path, template],\n target: catalog.path,\n });\n\n chmodSync(output, statSync(catalog.path).mode & MODE_MASK);\n};\n\nconst prepareCatalog = (\n catalog: Catalog,\n index: number,\n template: string,\n stagingDir: string,\n): PreparedCatalog => {\n const output = join(stagingDir, `${String(index)}.po`);\n const isExisting = existsSync(catalog.path);\n\n if (isExisting) {\n mergeCatalog(catalog, template, output);\n } else {\n initializeCatalog(catalog, template, output);\n }\n\n const content = readFileSync(output);\n\n return {\n content,\n isChanged: !isExisting || !content.equals(readFileSync(catalog.path)),\n output,\n target: catalog.path,\n };\n};\n\nconst replaceCatalog = (catalog: PreparedCatalog): WrittenCatalog => {\n renameSync(catalog.output, catalog.target);\n\n return { content: catalog.content, path: catalog.target };\n};\n\nconst synchronizeCatalogs = (project: CatalogProject): WrittenCatalog[] => {\n if (project.catalogs.length === 0) {\n return [];\n }\n\n const template = join(project.poDir, `${project.domain}.pot`);\n requireFile(template);\n const stagingDir = mkdtempSync(join(project.poDir, \".gtkx-catalog-\"));\n\n try {\n const merged = project.catalogs.map((catalog, index) =>\n prepareCatalog(catalog, index, template, stagingDir));\n\n return merged.filter((catalog) => catalog.isChanged).map((catalog) => replaceCatalog(catalog));\n } finally {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n};\n\nconst isCatalogSource = (root: string, path: string): boolean => {\n const projectRoot = resolve(root);\n const sourcePath = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);\n const poPath = relative(join(projectRoot, PO_DIRNAME), sourcePath);\n\n if (!isPathInside(join(projectRoot, PO_DIRNAME), sourcePath)) {\n return false;\n }\n\n return !poPath.includes(sep) && (poPath === LINGUAS_FILENAME || poPath.endsWith(\".po\"));\n};\n\nexport {\n type CatalogProject,\n LOCALE_DIRNAME,\n compileCatalogs,\n isCatalogSource,\n requiresCatalogInitialization,\n resolveCatalogProject,\n synchronizeCatalogs,\n type WrittenCatalog,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-rules.d.ts","sourceRoot":"","sources":["../../src/internal/agent-rules.ts"],"names":[],"mappings":"AAIA,KAAK,gBAAgB,GAAG;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-rules.d.ts","sourceRoot":"","sources":["../../src/internal/agent-rules.ts"],"names":[],"mappings":"AAIA,KAAK,gBAAgB,GAAG;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAgHF,QAAA,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,gBAcxC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -30,6 +30,7 @@ const rulesBody = (heading) => [
|
|
|
30
30
|
"| --- | --- |",
|
|
31
31
|
"| `gtkx dev` | Run the app with fast refresh |",
|
|
32
32
|
"| `gtkx codegen` | Regenerate bindings and this reference |",
|
|
33
|
+
"| `gtkx cleanup` | Remove stale headless runtime directories |",
|
|
33
34
|
"| `tsc --noEmit` | Typecheck |",
|
|
34
35
|
"| `vitest run` | Run the tests |",
|
|
35
36
|
"",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-rules.js","sourceRoot":"","sources":["../../src/internal/agent-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAOzD,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,eAAe,GAAG,IAAI,eAAe,IAAI,CAAC;AAChD,MAAM,YAAY,GAAG,iCAAiC,CAAC;AACvD,MAAM,UAAU,GAAG,+BAA+B,CAAC;AACnD,MAAM,aAAa,GAAG,sEAAsE,CAAC;AAC7F,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAY,EAAE,CAAC;IAC7C,GAAG,OAAO,OAAO;IACjB,EAAE;IACF,yGAAyG;QACzG,sGAAsG;IACtG,EAAE;IACF,kFAAkF;IAClF,yEAAyE;IACzE,uEAAuE;IACvE,kGAAkG;IAClG,qFAAqF;QACrF,yGAAyG;QACzG,wDAAwD;IACxD,EAAE;IACF,UAAU,cAAc,kFAAkF;QAC1G,yGAAyG;QACzG,qEAAqE;IACrE,EAAE;IACF,4BAA4B;IAC5B,eAAe;IACf,gDAAgD;IAChD,6DAA6D;IAC7D,gCAAgC;IAChC,kCAAkC;IAClC,EAAE;IACF,sGAAsG;QACtG,uGAAuG;IACvG,EAAE;IACF,wGAAwG;QACxG,2DAA2D;CAC9D,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,OAAe,EAAU,EAAE,CAC5C,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEzE,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjG,MAAM,mBAAmB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;AAEjH,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAU,EAAE;IAC5D,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,IAAI,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAU,EAAE;IAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAU,EAAE;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC;IAEhE,OAAO,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAc,EAAsB,EAAE,CACrD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAE/E,MAAM,eAAe,GAAG,CAAC,IAAY,EAAsB,EAAE;IACzD,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAW,EAAE;IAC3D,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9B,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAW,EAAE;IACrD,IAAI,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAoB,EAAE;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { REFERENCE_PATH } from \"../codegen/reference.js\";\n\ntype AgentRulesResult = {\n isWritten: boolean;\n files: string[];\n};\n\nconst AGENTS_FILENAME = \"AGENTS.md\";\nconst CLAUDE_FILENAME = \"CLAUDE.md\";\nconst CLAUDE_CONTENTS = `@${AGENTS_FILENAME}\\n`;\nconst BEGIN_MARKER = \"<!-- BEGIN:gtkx-agent-rules -->\";\nconst END_MARKER = \"<!-- END:gtkx-agent-rules -->\";\nconst BLOCK_PATTERN = /<!-- BEGIN:gtkx-agent-rules -->[\\s\\S]*?<!-- END:gtkx-agent-rules -->/;\nconst TOP_LEVEL_HEADING = /^# /m;\n\nconst rulesBody = (heading: string): string[] => [\n `${heading} GTKX`,\n \"\",\n \"This is not the GTK you have seen before. Most GTK code in your training data is C, PyGObject, Vala or \" +\n \"GJS, and almost none of it is valid here. Check the rules below against what you are about to write.\",\n \"\",\n \"- Children are JSX, never `.append()`, `pack_start()`, `set_child()` or `add()`.\",\n '- Signals are props: `onClicked`, not `widget.connect(\"clicked\", ...)`.',\n \"- Props are camelCase: `marginTop`, not `margin-top` or `margin_top`.\",\n \"- There is no `Gtk.Template`, no `.ui` XML, and no `GtkBuilder`. The JSX tree is the definition.\",\n \"- Elements come from `@gtkx/jsx/<namespace>` and classes, enums and functions from \" +\n \"`@gtkx/gi/<namespace>`. Both are generated for this project by `gtkx codegen`, not installed from npm, \" +\n \"so they match the GIR libraries this project declares.\",\n \"\",\n `Read \\`${REFERENCE_PATH}/index.md\\` before writing widget code. It is generated from this project's own ` +\n \"GIR libraries and is the authority on which props, signals and methods exist. Do not infer a prop from \" +\n \"another toolkit, from a C function name, or from a similar element.\",\n \"\",\n \"| Command | What it does |\",\n \"| --- | --- |\",\n \"| `gtkx dev` | Run the app with fast refresh |\",\n \"| `gtkx codegen` | Regenerate bindings and this reference |\",\n \"| `tsc --noEmit` | Typecheck |\",\n \"| `vitest run` | Run the tests |\",\n \"\",\n \"Never call UI work done without looking at the running app. With `gtkx dev` up, the gtkx MCP server \" +\n \"exposes the live widget tree, queries, clicks and screenshots; use them to confirm the change landed.\",\n \"\",\n \"This block is written by `gtkx codegen`. Anything outside the markers is yours and is left alone, and \" +\n \"committing the block with your work keeps the tree clean.\",\n];\n\nconst renderBlock = (heading: string): string =>\n [BEGIN_MARKER, \"\", ...rulesBody(heading), \"\", END_MARKER].join(\"\\n\");\n\nconst headingFor = (contents: string): string => (TOP_LEVEL_HEADING.test(contents) ? \"##\" : \"#\");\nconst withTrailingNewline = (contents: string): string => (contents.endsWith(\"\\n\") ? contents : `${contents}\\n`);\n\nconst appendBlock = (contents: string, block: string): string => {\n if (contents.trim() === \"\") {\n return `${block}\\n`;\n }\n\n return `${withTrailingNewline(contents)}\\n${block}\\n`;\n};\n\nconst replaceBlock = (contents: string, block: string): string => {\n const match = BLOCK_PATTERN.exec(contents);\n\n if (match === null) {\n return appendBlock(contents, block);\n }\n\n return contents.slice(0, match.index) + block + contents.slice(match.index + match[0].length);\n};\n\nconst nextContents = (contents: string): string => {\n const heading = headingFor(contents.replace(BLOCK_PATTERN, \"\"));\n\n return replaceBlock(contents, renderBlock(heading));\n};\n\nconst errorCode = (error: unknown): string | undefined =>\n error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\nconst readOrUndefined = (path: string): string | undefined => {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n};\n\nconst hasWritten = (path: string, contents: string): boolean => {\n if (readOrUndefined(path) === contents) {\n return false;\n }\n\n writeFileSync(path, contents);\n\n return true;\n};\n\nconst hasWrittenClaudeImport = (root: string): boolean => {\n try {\n writeFileSync(join(root, CLAUDE_FILENAME), CLAUDE_CONTENTS, { flag: \"wx\" });\n\n return true;\n } catch (error) {\n if (errorCode(error) === \"EEXIST\") {\n return false;\n }\n\n throw error;\n }\n};\n\nconst upsertAgentRules = (root: string): AgentRulesResult => {\n const agentsPath = join(root, AGENTS_FILENAME);\n const existing = readOrUndefined(agentsPath) ?? \"\";\n const files: string[] = [];\n\n if (hasWritten(agentsPath, nextContents(existing))) {\n files.push(AGENTS_FILENAME);\n }\n\n if (hasWrittenClaudeImport(root)) {\n files.push(CLAUDE_FILENAME);\n }\n\n return { isWritten: files.length > 0, files };\n};\n\nexport { upsertAgentRules };\n"]}
|
|
1
|
+
{"version":3,"file":"agent-rules.js","sourceRoot":"","sources":["../../src/internal/agent-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { REFERENCE_PATH } from \"../codegen/reference.js\";\n\ntype AgentRulesResult = {\n isWritten: boolean;\n files: string[];\n};\n\nconst AGENTS_FILENAME = \"AGENTS.md\";\nconst CLAUDE_FILENAME = \"CLAUDE.md\";\nconst CLAUDE_CONTENTS = `@${AGENTS_FILENAME}\\n`;\nconst BEGIN_MARKER = \"<!-- BEGIN:gtkx-agent-rules -->\";\nconst END_MARKER = \"<!-- END:gtkx-agent-rules -->\";\nconst BLOCK_PATTERN = /<!-- BEGIN:gtkx-agent-rules -->[\\s\\S]*?<!-- END:gtkx-agent-rules -->/;\nconst TOP_LEVEL_HEADING = /^# /m;\n\nconst rulesBody = (heading: string): string[] => [\n `${heading} GTKX`,\n \"\",\n \"This is not the GTK you have seen before. Most GTK code in your training data is C, PyGObject, Vala or \" +\n \"GJS, and almost none of it is valid here. Check the rules below against what you are about to write.\",\n \"\",\n \"- Children are JSX, never `.append()`, `pack_start()`, `set_child()` or `add()`.\",\n '- Signals are props: `onClicked`, not `widget.connect(\"clicked\", ...)`.',\n \"- Props are camelCase: `marginTop`, not `margin-top` or `margin_top`.\",\n \"- There is no `Gtk.Template`, no `.ui` XML, and no `GtkBuilder`. The JSX tree is the definition.\",\n \"- Elements come from `@gtkx/jsx/<namespace>` and classes, enums and functions from \" +\n \"`@gtkx/gi/<namespace>`. Both are generated for this project by `gtkx codegen`, not installed from npm, \" +\n \"so they match the GIR libraries this project declares.\",\n \"\",\n `Read \\`${REFERENCE_PATH}/index.md\\` before writing widget code. It is generated from this project's own ` +\n \"GIR libraries and is the authority on which props, signals and methods exist. Do not infer a prop from \" +\n \"another toolkit, from a C function name, or from a similar element.\",\n \"\",\n \"| Command | What it does |\",\n \"| --- | --- |\",\n \"| `gtkx dev` | Run the app with fast refresh |\",\n \"| `gtkx codegen` | Regenerate bindings and this reference |\",\n \"| `gtkx cleanup` | Remove stale headless runtime directories |\",\n \"| `tsc --noEmit` | Typecheck |\",\n \"| `vitest run` | Run the tests |\",\n \"\",\n \"Never call UI work done without looking at the running app. With `gtkx dev` up, the gtkx MCP server \" +\n \"exposes the live widget tree, queries, clicks and screenshots; use them to confirm the change landed.\",\n \"\",\n \"This block is written by `gtkx codegen`. Anything outside the markers is yours and is left alone, and \" +\n \"committing the block with your work keeps the tree clean.\",\n];\n\nconst renderBlock = (heading: string): string =>\n [BEGIN_MARKER, \"\", ...rulesBody(heading), \"\", END_MARKER].join(\"\\n\");\n\nconst headingFor = (contents: string): string => (TOP_LEVEL_HEADING.test(contents) ? \"##\" : \"#\");\nconst withTrailingNewline = (contents: string): string => (contents.endsWith(\"\\n\") ? contents : `${contents}\\n`);\n\nconst appendBlock = (contents: string, block: string): string => {\n if (contents.trim() === \"\") {\n return `${block}\\n`;\n }\n\n return `${withTrailingNewline(contents)}\\n${block}\\n`;\n};\n\nconst replaceBlock = (contents: string, block: string): string => {\n const match = BLOCK_PATTERN.exec(contents);\n\n if (match === null) {\n return appendBlock(contents, block);\n }\n\n return contents.slice(0, match.index) + block + contents.slice(match.index + match[0].length);\n};\n\nconst nextContents = (contents: string): string => {\n const heading = headingFor(contents.replace(BLOCK_PATTERN, \"\"));\n\n return replaceBlock(contents, renderBlock(heading));\n};\n\nconst errorCode = (error: unknown): string | undefined =>\n error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\nconst readOrUndefined = (path: string): string | undefined => {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n};\n\nconst hasWritten = (path: string, contents: string): boolean => {\n if (readOrUndefined(path) === contents) {\n return false;\n }\n\n writeFileSync(path, contents);\n\n return true;\n};\n\nconst hasWrittenClaudeImport = (root: string): boolean => {\n try {\n writeFileSync(join(root, CLAUDE_FILENAME), CLAUDE_CONTENTS, { flag: \"wx\" });\n\n return true;\n } catch (error) {\n if (errorCode(error) === \"EEXIST\") {\n return false;\n }\n\n throw error;\n }\n};\n\nconst upsertAgentRules = (root: string): AgentRulesResult => {\n const agentsPath = join(root, AGENTS_FILENAME);\n const existing = readOrUndefined(agentsPath) ?? \"\";\n const files: string[] = [];\n\n if (hasWritten(agentsPath, nextContents(existing))) {\n files.push(AGENTS_FILENAME);\n }\n\n if (hasWrittenClaudeImport(root)) {\n files.push(CLAUDE_FILENAME);\n }\n\n return { isWritten: files.length > 0, files };\n};\n\nexport { upsertAgentRules };\n"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Rollup } from "vite";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
type Banner = string | Rollup.AddonFunction;
|
|
3
|
+
declare const prependBanner: (options: Rollup.OutputOptions, banner: Banner) => Rollup.OutputOptions;
|
|
4
|
+
declare const outputRootUrlExpression: (chunk: Rollup.RenderedChunk) => string;
|
|
5
|
+
export { outputRootUrlExpression, prependBanner };
|
|
4
6
|
//# sourceMappingURL=banner.d.ts.map
|