@gtkx/cli 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/cli.js +4 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/codegen/freshness.d.ts.map +1 -1
  4. package/dist/codegen/freshness.js +2 -1
  5. package/dist/codegen/freshness.js.map +1 -1
  6. package/dist/codegen/reference.d.ts +17 -0
  7. package/dist/codegen/reference.d.ts.map +1 -0
  8. package/dist/codegen/reference.js +37 -0
  9. package/dist/codegen/reference.js.map +1 -0
  10. package/dist/codegen/report.d.ts.map +1 -1
  11. package/dist/codegen/report.js +17 -3
  12. package/dist/codegen/report.js.map +1 -1
  13. package/dist/codegen/run-codegen.d.ts +2 -0
  14. package/dist/codegen/run-codegen.d.ts.map +1 -1
  15. package/dist/codegen/run-codegen.js +63 -21
  16. package/dist/codegen/run-codegen.js.map +1 -1
  17. package/dist/commands/docs.d.ts.map +1 -1
  18. package/dist/commands/docs.js +10 -16
  19. package/dist/commands/docs.js.map +1 -1
  20. package/dist/commands/mcp.d.ts +13 -0
  21. package/dist/commands/mcp.d.ts.map +1 -0
  22. package/dist/commands/mcp.js +68 -0
  23. package/dist/commands/mcp.js.map +1 -0
  24. package/dist/deploy/notices/gtkx.js +1 -1
  25. package/dist/deploy/notices/gtkx.js.map +1 -1
  26. package/dist/deploy/notices/libraries.d.ts.map +1 -1
  27. package/dist/deploy/notices/libraries.js +2 -1
  28. package/dist/deploy/notices/libraries.js.map +1 -1
  29. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  30. package/dist/deploy/settings/libraries.js +7 -9
  31. package/dist/deploy/settings/libraries.js.map +1 -1
  32. package/dist/deploy/tools.d.ts.map +1 -1
  33. package/dist/deploy/tools.js +1 -3
  34. package/dist/deploy/tools.js.map +1 -1
  35. package/dist/dev/runner-main.d.ts.map +1 -1
  36. package/dist/dev/runner-main.js +2 -1
  37. package/dist/dev/runner-main.js.map +1 -1
  38. package/dist/internal/agent-rules.d.ts +7 -0
  39. package/dist/internal/agent-rules.d.ts.map +1 -0
  40. package/dist/internal/agent-rules.js +106 -0
  41. package/dist/internal/agent-rules.js.map +1 -0
  42. package/dist/internal/docs-elements.d.ts +8 -0
  43. package/dist/internal/docs-elements.d.ts.map +1 -0
  44. package/dist/internal/docs-elements.js +12 -0
  45. package/dist/internal/docs-elements.js.map +1 -0
  46. package/dist/internal/source-imports.d.ts.map +1 -1
  47. package/dist/internal/source-imports.js +2 -3
  48. package/dist/internal/source-imports.js.map +1 -1
  49. package/dist/mcp/client-config.d.ts +22 -0
  50. package/dist/mcp/client-config.d.ts.map +1 -0
  51. package/dist/mcp/client-config.js +94 -0
  52. package/dist/mcp/client-config.js.map +1 -0
  53. package/dist/vite-plugins/animated.d.ts +5 -0
  54. package/dist/vite-plugins/animated.d.ts.map +1 -0
  55. package/dist/vite-plugins/animated.js +325 -0
  56. package/dist/vite-plugins/animated.js.map +1 -0
  57. package/dist/vite-plugins/asset-imports.js +2 -2
  58. package/dist/vite-plugins/asset-imports.js.map +1 -1
  59. package/dist/vite-plugins/index.d.ts.map +1 -1
  60. package/dist/vite-plugins/index.js +2 -0
  61. package/dist/vite-plugins/index.js.map +1 -1
  62. package/dist/vite-plugins/resources.js +2 -2
  63. package/dist/vite-plugins/resources.js.map +1 -1
  64. package/dist/vite-plugins/settings-worker-env.js +2 -2
  65. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  66. package/dist/vite-plugins/settings.d.ts.map +1 -1
  67. package/dist/vite-plugins/settings.js +2 -1
  68. package/dist/vite-plugins/settings.js.map +1 -1
  69. package/package.json +10 -9
  70. package/src/cli.ts +5 -0
  71. package/src/codegen/freshness.ts +2 -1
  72. package/src/codegen/reference.ts +59 -0
  73. package/src/codegen/report.ts +18 -3
  74. package/src/codegen/run-codegen.ts +81 -24
  75. package/src/commands/docs.ts +10 -28
  76. package/src/commands/mcp.ts +81 -0
  77. package/src/deploy/notices/gtkx.ts +1 -1
  78. package/src/deploy/notices/libraries.ts +2 -1
  79. package/src/deploy/settings/libraries.ts +7 -10
  80. package/src/deploy/tools.ts +1 -3
  81. package/src/dev/runner-main.ts +2 -1
  82. package/src/internal/agent-rules.ts +135 -0
  83. package/src/internal/docs-elements.ts +21 -0
  84. package/src/internal/source-imports.ts +3 -3
  85. package/src/mcp/client-config.ts +130 -0
  86. package/src/vite-plugins/animated.ts +486 -0
  87. package/src/vite-plugins/asset-imports.ts +2 -2
  88. package/src/vite-plugins/index.ts +2 -0
  89. package/src/vite-plugins/resources.ts +2 -2
  90. package/src/vite-plugins/settings-worker-env.ts +2 -2
  91. package/src/vite-plugins/settings.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"source-imports.js","sourceRoot":"","sources":["../../src/internal/source-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ESTree, ParseResult, ParserOptions } from \"vite\";\nimport { sortStringsBy } from \"@gtkx/utils\";\nimport { type Dirent, readdirSync, readFileSync } from \"node:fs\";\nimport { extname, join } from \"node:path\";\nimport { parseSync, Visitor } from \"vite\";\n\ntype SourceImport = {\n importer: string;\n source: string;\n};\n\ntype SourceLanguage = NonNullable<ParserOptions[\"lang\"]>;\ntype ParsedModule = ParseResult[\"module\"];\n\nconst SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([\n [\".cjs\", \"jsx\"],\n [\".cts\", \"ts\"],\n [\".js\", \"jsx\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"jsx\"],\n [\".mts\", \"ts\"],\n [\".ts\", \"ts\"],\n [\".tsx\", \"tsx\"],\n]);\n\nconst EXCLUDED_DIRECTORIES: Set<string> = new Set([\n \".git\",\n \".gtkx\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n \"out-tsc\",\n]);\n\nconst sourceLanguage = (path: string): SourceLanguage | undefined => {\n if (path.endsWith(\".d.ts\") || path.endsWith(\".d.cts\") || path.endsWith(\".d.mts\")) {\n return undefined;\n }\n\n return SOURCE_LANGUAGES.get(extname(path).toLowerCase());\n};\n\nconst collectSourceEntry = (dir: string, entry: Dirent, found: string[]): void => {\n const path = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!EXCLUDED_DIRECTORIES.has(entry.name)) {\n sourceFilesIn(path, found);\n }\n\n return;\n }\n\n if (entry.isFile() && sourceLanguage(path) !== undefined) {\n found.push(path);\n }\n};\n\nconst sourceFilesIn = (dir: string, found: string[]): void => {\n let entries: Dirent[];\n\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n collectSourceEntry(dir, entry, found);\n }\n};\n\nconst discoverSourceFiles = (dir: string): string[] => {\n const files: string[] = [];\n sourceFilesIn(dir, files);\n\n return sortStringsBy(files, (path) => path);\n};\n\nconst staticImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports.map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst staticRuntimeImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports\n .filter((statement) => statement.entries.length === 0 || statement.entries.some((entry) => !entry.isType))\n .map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .filter((entry) => !entry.isType)\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst templateImportSource = (node: ESTree.TemplateLiteral): string | null => {\n const [quasi] = node.quasis;\n\n return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;\n};\n\nconst literalImportSource = (node: ESTree.Expression): string | null => {\n if (node.type === \"TemplateLiteral\") {\n return templateImportSource(node);\n }\n\n return node.type === \"Literal\" && typeof node.value === \"string\" ? node.value : null;\n};\n\nconst collectDynamicImportSources = (program: ESTree.Program, found: string[]): void => {\n new Visitor({\n ImportExpression: (node) => {\n const source = literalImportSource(node.source);\n\n if (source !== null) {\n found.push(source);\n }\n },\n }).visit(program);\n};\n\nconst parseImportsInWith = (\n path: string,\n staticSources: (module: ParsedModule) => string[],\n): SourceImport[] | null => {\n const lang = sourceLanguage(path);\n\n if (lang === undefined) {\n return [];\n }\n\n let parsed: ParseResult;\n\n try {\n parsed = parseSync(path, readFileSync(path, \"utf8\"), { lang });\n } catch {\n return null;\n }\n\n if (parsed.errors.length > 0) {\n return null;\n }\n\n const sources = staticSources(parsed.module);\n collectDynamicImportSources(parsed.program, sources);\n\n return [...new Set(sources)].map((source) => ({ importer: path, source }));\n};\n\nconst parseImportsIn = (path: string): SourceImport[] | null => parseImportsInWith(path, staticImportSources);\n\nconst parseRuntimeImportsIn = (path: string): SourceImport[] | null =>\n parseImportsInWith(path, staticRuntimeImportSources);\n\nconst importsIn = (path: string): SourceImport[] => parseImportsIn(path) ?? [];\nconst importKey = (entry: SourceImport): string => `${entry.importer}\\0${entry.source}`;\n\nconst discoverSourceImports = (dir: string): SourceImport[] => {\n const files = discoverSourceFiles(dir);\n const imports = files.flatMap((path) => importsIn(path));\n\n return sortStringsBy(imports, importKey);\n};\n\nexport { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, type SourceImport, sourceLanguage };\n"]}
1
+ {"version":3,"file":"source-imports.js","sourceRoot":"","sources":["../../src/internal/source-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ESTree, ParseResult, ParserOptions } from \"vite\";\nimport { sortStringsBy } from \"@gtkx/utils\";\nimport { type Dirent, readdirSync, readFileSync } from \"node:fs\";\nimport { extname, join } from \"node:path\";\nimport { parseSync, Visitor } from \"vite\";\n\ntype SourceImport = {\n importer: string;\n source: string;\n};\n\ntype SourceLanguage = NonNullable<ParserOptions[\"lang\"]>;\ntype ParsedModule = ParseResult[\"module\"];\n\nconst SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([\n [\".cjs\", \"jsx\"],\n [\".cts\", \"ts\"],\n [\".js\", \"jsx\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"jsx\"],\n [\".mts\", \"ts\"],\n [\".ts\", \"ts\"],\n [\".tsx\", \"tsx\"],\n]);\n\nconst EXCLUDED_DIRECTORIES: Set<string> = new Set([\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n \"out-tsc\",\n]);\n\nconst sourceLanguage = (path: string): SourceLanguage | undefined => {\n if (path.endsWith(\".d.ts\") || path.endsWith(\".d.cts\") || path.endsWith(\".d.mts\")) {\n return undefined;\n }\n\n return SOURCE_LANGUAGES.get(extname(path).toLowerCase());\n};\n\nconst isWalkableDirectory = (name: string): boolean => !name.startsWith(\".\") && !EXCLUDED_DIRECTORIES.has(name);\n\nconst collectSourceEntry = (dir: string, entry: Dirent, found: string[]): void => {\n const path = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (isWalkableDirectory(entry.name)) {\n sourceFilesIn(path, found);\n }\n\n return;\n }\n\n if (entry.isFile() && sourceLanguage(path) !== undefined) {\n found.push(path);\n }\n};\n\nconst sourceFilesIn = (dir: string, found: string[]): void => {\n let entries: Dirent[];\n\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n collectSourceEntry(dir, entry, found);\n }\n};\n\nconst discoverSourceFiles = (dir: string): string[] => {\n const files: string[] = [];\n sourceFilesIn(dir, files);\n\n return sortStringsBy(files, (path) => path);\n};\n\nconst staticImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports.map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst staticRuntimeImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports\n .filter((statement) => statement.entries.length === 0 || statement.entries.some((entry) => !entry.isType))\n .map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .filter((entry) => !entry.isType)\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst templateImportSource = (node: ESTree.TemplateLiteral): string | null => {\n const [quasi] = node.quasis;\n\n return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;\n};\n\nconst literalImportSource = (node: ESTree.Expression): string | null => {\n if (node.type === \"TemplateLiteral\") {\n return templateImportSource(node);\n }\n\n return node.type === \"Literal\" && typeof node.value === \"string\" ? node.value : null;\n};\n\nconst collectDynamicImportSources = (program: ESTree.Program, found: string[]): void => {\n new Visitor({\n ImportExpression: (node) => {\n const source = literalImportSource(node.source);\n\n if (source !== null) {\n found.push(source);\n }\n },\n }).visit(program);\n};\n\nconst parseImportsInWith = (\n path: string,\n staticSources: (module: ParsedModule) => string[],\n): SourceImport[] | null => {\n const lang = sourceLanguage(path);\n\n if (lang === undefined) {\n return [];\n }\n\n let parsed: ParseResult;\n\n try {\n parsed = parseSync(path, readFileSync(path, \"utf8\"), { lang });\n } catch {\n return null;\n }\n\n if (parsed.errors.length > 0) {\n return null;\n }\n\n const sources = staticSources(parsed.module);\n collectDynamicImportSources(parsed.program, sources);\n\n return [...new Set(sources)].map((source) => ({ importer: path, source }));\n};\n\nconst parseImportsIn = (path: string): SourceImport[] | null => parseImportsInWith(path, staticImportSources);\n\nconst parseRuntimeImportsIn = (path: string): SourceImport[] | null =>\n parseImportsInWith(path, staticRuntimeImportSources);\n\nconst importsIn = (path: string): SourceImport[] => parseImportsIn(path) ?? [];\nconst importKey = (entry: SourceImport): string => `${entry.importer}\\0${entry.source}`;\n\nconst discoverSourceImports = (dir: string): SourceImport[] => {\n const files = discoverSourceFiles(dir);\n const imports = files.flatMap((path) => importsIn(path));\n\n return sortStringsBy(imports, importKey);\n};\n\nexport { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, type SourceImport, sourceLanguage };\n"]}
@@ -0,0 +1,22 @@
1
+ type ClientName = "claude" | "cursor" | "vscode" | "opencode" | "codex";
2
+ type ServerEntry = Record<string, unknown>;
3
+ type Client = {
4
+ name: ClientName;
5
+ file: string;
6
+ key: string;
7
+ entry: ServerEntry;
8
+ };
9
+ type ClientResult = {
10
+ kind: "written";
11
+ path: string;
12
+ isCreated: boolean;
13
+ } | {
14
+ kind: "manual";
15
+ path: string;
16
+ snippet: string;
17
+ };
18
+ declare const CLIENTS: Client[];
19
+ declare const isClientName: (value: string) => value is ClientName;
20
+ declare const writeClientConfig: (root: string, name: ClientName) => ClientResult;
21
+ export { CLIENTS, isClientName, writeClientConfig, type ClientName, type ClientResult };
22
+ //# sourceMappingURL=client-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-config.d.ts","sourceRoot":"","sources":["../../src/mcp/client-config.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AACxE,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,KAAK,MAAM,GAAG;IACV,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,KAAK,YAAY,GACX;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAatD,QAAA,MAAM,OAAO,EAAE,MAAM,EA+BpB,CAAC;AAIF,QAAA,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,UAAqC,CAAC;AAiDrF,QAAA,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,MAAM,UAAU,KAAG,YAe3D,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ const SERVER_NAME = "gtkx";
4
+ const COMMAND = "npx";
5
+ const ARGS = ["gtkx", "mcp"];
6
+ const CODEX_PATH = "~/.codex/config.toml";
7
+ const CODEX_SNIPPET = [
8
+ `[mcp_servers.${SERVER_NAME}]`,
9
+ `command = ${JSON.stringify(COMMAND)}`,
10
+ `args = ${JSON.stringify(ARGS)}`,
11
+ ].join("\n");
12
+ const CLIENTS = [
13
+ {
14
+ name: "claude",
15
+ file: ".mcp.json",
16
+ key: "mcpServers",
17
+ entry: { command: COMMAND, args: ARGS },
18
+ },
19
+ {
20
+ name: "cursor",
21
+ file: join(".cursor", "mcp.json"),
22
+ key: "mcpServers",
23
+ entry: { command: COMMAND, args: ARGS },
24
+ },
25
+ {
26
+ name: "vscode",
27
+ file: join(".vscode", "mcp.json"),
28
+ key: "servers",
29
+ entry: { type: "stdio", command: COMMAND, args: ARGS },
30
+ },
31
+ {
32
+ name: "opencode",
33
+ file: "opencode.json",
34
+ key: "mcp",
35
+ entry: { type: "local", command: [COMMAND, ...ARGS], enabled: true },
36
+ },
37
+ {
38
+ name: "codex",
39
+ file: CODEX_PATH,
40
+ key: "mcp_servers",
41
+ entry: {},
42
+ },
43
+ ];
44
+ const CLIENT_NAMES = new Set(CLIENTS.map((client) => client.name));
45
+ const isClientName = (value) => CLIENT_NAMES.has(value);
46
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
47
+ const readOrUndefined = (path) => {
48
+ try {
49
+ return readFileSync(path, "utf8");
50
+ }
51
+ catch (error) {
52
+ if (error instanceof Error && error.code === "ENOENT") {
53
+ return undefined;
54
+ }
55
+ throw error;
56
+ }
57
+ };
58
+ const readJson = (path) => {
59
+ const source = readOrUndefined(path);
60
+ if (source === undefined) {
61
+ return undefined;
62
+ }
63
+ const parsed = JSON.parse(source);
64
+ if (!isRecord(parsed)) {
65
+ throw new Error(`Refusing to edit ${path}: its contents are not a JSON object.`);
66
+ }
67
+ return parsed;
68
+ };
69
+ const getSection = (document, key) => {
70
+ const section = document[key];
71
+ return isRecord(section) ? section : {};
72
+ };
73
+ const clientFor = (name) => {
74
+ const client = CLIENTS.find((candidate) => candidate.name === name);
75
+ if (client === undefined) {
76
+ throw new Error(`Unknown MCP client "${name}".`);
77
+ }
78
+ return client;
79
+ };
80
+ const writeClientConfig = (root, name) => {
81
+ const client = clientFor(name);
82
+ if (name === "codex") {
83
+ return { kind: "manual", path: CODEX_PATH, snippet: CODEX_SNIPPET };
84
+ }
85
+ const path = join(root, client.file);
86
+ const existing = readJson(path);
87
+ const document = existing ?? {};
88
+ const section = { ...getSection(document, client.key), [SERVER_NAME]: client.entry };
89
+ mkdirSync(dirname(path), { recursive: true });
90
+ writeFileSync(path, `${JSON.stringify({ ...document, [client.key]: section }, null, 4)}\n`);
91
+ return { kind: "written", path, isCreated: existing === undefined };
92
+ };
93
+ export { CLIENTS, isClientName, writeClientConfig };
94
+ //# sourceMappingURL=client-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-config.js","sourceRoot":"","sources":["../../src/mcp/client-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ntype ClientName = \"claude\" | \"cursor\" | \"vscode\" | \"opencode\" | \"codex\";\ntype ServerEntry = Record<string, unknown>;\n\ntype Client = {\n name: ClientName;\n file: string;\n key: string;\n entry: ServerEntry;\n};\n\ntype ClientResult =\n | { kind: \"written\"; path: string; isCreated: boolean } |\n { kind: \"manual\"; path: string; snippet: string };\n\nconst SERVER_NAME = \"gtkx\";\nconst COMMAND = \"npx\";\nconst ARGS = [\"gtkx\", \"mcp\"];\nconst CODEX_PATH = \"~/.codex/config.toml\";\n\nconst CODEX_SNIPPET = [\n `[mcp_servers.${SERVER_NAME}]`,\n `command = ${JSON.stringify(COMMAND)}`,\n `args = ${JSON.stringify(ARGS)}`,\n].join(\"\\n\");\n\nconst CLIENTS: Client[] = [\n {\n name: \"claude\",\n file: \".mcp.json\",\n key: \"mcpServers\",\n entry: { command: COMMAND, args: ARGS },\n },\n {\n name: \"cursor\",\n file: join(\".cursor\", \"mcp.json\"),\n key: \"mcpServers\",\n entry: { command: COMMAND, args: ARGS },\n },\n {\n name: \"vscode\",\n file: join(\".vscode\", \"mcp.json\"),\n key: \"servers\",\n entry: { type: \"stdio\", command: COMMAND, args: ARGS },\n },\n {\n name: \"opencode\",\n file: \"opencode.json\",\n key: \"mcp\",\n entry: { type: \"local\", command: [COMMAND, ...ARGS], enabled: true },\n },\n {\n name: \"codex\",\n file: CODEX_PATH,\n key: \"mcp_servers\",\n entry: {},\n },\n];\n\nconst CLIENT_NAMES: Set<string> = new Set(CLIENTS.map((client) => client.name));\n\nconst isClientName = (value: string): value is ClientName => CLIENT_NAMES.has(value);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst readOrUndefined = (path: string): string | undefined => {\n try {\n return readFileSync(path, \"utf8\");\n } catch (error) {\n if (error instanceof Error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n};\n\nconst readJson = (path: string): Record<string, unknown> | undefined => {\n const source = readOrUndefined(path);\n\n if (source === undefined) {\n return undefined;\n }\n\n const parsed: unknown = JSON.parse(source);\n\n if (!isRecord(parsed)) {\n throw new Error(`Refusing to edit ${path}: its contents are not a JSON object.`);\n }\n\n return parsed;\n};\n\nconst getSection = (document: Record<string, unknown>, key: string): Record<string, unknown> => {\n const section = document[key];\n\n return isRecord(section) ? section : {};\n};\n\nconst clientFor = (name: ClientName): Client => {\n const client = CLIENTS.find((candidate) => candidate.name === name);\n\n if (client === undefined) {\n throw new Error(`Unknown MCP client \"${name}\".`);\n }\n\n return client;\n};\n\nconst writeClientConfig = (root: string, name: ClientName): ClientResult => {\n const client = clientFor(name);\n\n if (name === \"codex\") {\n return { kind: \"manual\", path: CODEX_PATH, snippet: CODEX_SNIPPET };\n }\n\n const path = join(root, client.file);\n const existing = readJson(path);\n const document = existing ?? {};\n const section = { ...getSection(document, client.key), [SERVER_NAME]: client.entry };\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify({ ...document, [client.key]: section }, null, 4)}\\n`);\n\n return { kind: \"written\", path, isCreated: existing === undefined };\n};\n\nexport { CLIENTS, isClientName, writeClientConfig, type ClientName, type ClientResult };\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ConfigLoader } from "@gtkx/config";
2
+ import type { Plugin } from "vite";
3
+ declare function gtkxAnimated(loadConfig?: ConfigLoader): Plugin;
4
+ export { gtkxAnimated };
5
+ //# sourceMappingURL=animated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/animated.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AA8b/C,iBAAS,YAAY,CAAC,UAAU,GAAE,YAAmC,GAAG,MAAM,CAoC7E;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,325 @@
1
+ import { readGeneratedElements } from "@gtkx/codegen";
2
+ import { createConfigLoader } from "@gtkx/config/internal";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+ import { parseSync } from "vite";
6
+ import { sourceLanguage } from "../internal/source-imports.js";
7
+ import { stripQuery } from "./strip-query.js";
8
+ const ANIMATED_PACKAGE = "@gtkx/animated";
9
+ const INTERNAL_SPECIFIER = "@gtkx/animated/internal";
10
+ const VIRTUAL_ID = "virtual:gtkx-animated";
11
+ const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}`;
12
+ const NAMESPACE_HELPER = "__gtkxAnimated";
13
+ const CALL_HELPER = "__gtkxWithAnimated";
14
+ const BINDING_PARENT_KEYS = {
15
+ VariableDeclarator: "id",
16
+ ImportSpecifier: "local",
17
+ ImportDefaultSpecifier: "local",
18
+ ImportNamespaceSpecifier: "local",
19
+ FunctionDeclaration: "id",
20
+ ClassDeclaration: "id",
21
+ CatchClause: "param",
22
+ AssignmentPattern: "left",
23
+ RestElement: "argument",
24
+ Property: "value",
25
+ };
26
+ const BINDING_PARENT_ARRAY_KEYS = {
27
+ ArrowFunctionExpression: "params",
28
+ FunctionDeclaration: "params",
29
+ FunctionExpression: "params",
30
+ ArrayPattern: "elements",
31
+ };
32
+ const isAstNode = (value) => typeof value === "object" &&
33
+ value !== null &&
34
+ typeof value.type === "string" &&
35
+ typeof value.start === "number" &&
36
+ typeof value.end === "number";
37
+ const walkChildren = (node, visit) => {
38
+ for (const [key, child] of Object.entries(node)) {
39
+ if (key !== "type") {
40
+ walk(child, node, visit);
41
+ }
42
+ }
43
+ };
44
+ const walk = (value, parent, visit) => {
45
+ if (Array.isArray(value)) {
46
+ for (const item of value) {
47
+ walk(item, parent, visit);
48
+ }
49
+ return;
50
+ }
51
+ if (!isAstNode(value)) {
52
+ return;
53
+ }
54
+ visit(value, parent);
55
+ walkChildren(value, visit);
56
+ };
57
+ const identifierName = (node) => {
58
+ if (!isAstNode(node)) {
59
+ return undefined;
60
+ }
61
+ if (node.type !== "Identifier" && node.type !== "JSXIdentifier") {
62
+ return undefined;
63
+ }
64
+ return typeof node.name === "string" ? node.name : undefined;
65
+ };
66
+ const isValueImportSpecifier = (specifier) => isAstNode(specifier) && specifier.type === "ImportSpecifier" && specifier.importKind !== "type";
67
+ const animatedSpecifierLocal = (node) => {
68
+ const specifiers = node.specifiers ?? [];
69
+ let local;
70
+ for (const specifier of specifiers) {
71
+ if (isValueImportSpecifier(specifier) && identifierName(specifier.imported) === "animated") {
72
+ local ??= identifierName(specifier.local);
73
+ }
74
+ }
75
+ return local;
76
+ };
77
+ const animatedLocalName = (program) => {
78
+ let local;
79
+ walk(program, null, (node) => {
80
+ if (node.type !== "ImportDeclaration" || node.source?.value !== ANIMATED_PACKAGE) {
81
+ return;
82
+ }
83
+ if (node.importKind === "type") {
84
+ return;
85
+ }
86
+ local ??= animatedSpecifierLocal(node);
87
+ });
88
+ return local;
89
+ };
90
+ const isBindingSlot = (node, parent) => {
91
+ const key = BINDING_PARENT_KEYS[parent.type];
92
+ return key !== undefined && parent[key] === node;
93
+ };
94
+ const isBindingListEntry = (node, parent) => {
95
+ const arrayKey = BINDING_PARENT_ARRAY_KEYS[parent.type];
96
+ const entries = arrayKey === undefined ? undefined : parent[arrayKey];
97
+ return Array.isArray(entries) && entries.includes(node);
98
+ };
99
+ const isBindingParent = (node, parent) => isBindingSlot(node, parent) || isBindingListEntry(node, parent);
100
+ const isBindingNamed = (node, parent, name) => node.type === "Identifier" &&
101
+ node.name === name &&
102
+ isBindingParent(node, parent);
103
+ const countDeclarations = (program, name) => {
104
+ const spans = new Set();
105
+ walk(program, null, (node, parent) => {
106
+ if (parent !== null && isBindingNamed(node, parent, name)) {
107
+ spans.add(node.start);
108
+ }
109
+ });
110
+ return spans.size;
111
+ };
112
+ const isRewritableJsxMember = (node, local) => node.type === "JSXMemberExpression" && identifierName(node.object) === local;
113
+ const isRewritableObjectMember = (node, local) => node.type === "MemberExpression" &&
114
+ node.computed !== true &&
115
+ node.optional !== true &&
116
+ identifierName(node.object) === local;
117
+ const isForbiddenTarget = (node, parent) => parent !== null &&
118
+ ((parent.type === "AssignmentExpression" && parent.left === node) ||
119
+ (parent.type === "UpdateExpression" && parent.argument === node) ||
120
+ (parent.type === "UnaryExpression" && parent.operator === "delete" && parent.argument === node));
121
+ const isRewritableMember = (node, parent, local) => {
122
+ if (isRewritableJsxMember(node, local)) {
123
+ return true;
124
+ }
125
+ return isRewritableObjectMember(node, local) && !isForbiddenTarget(node, parent);
126
+ };
127
+ const collectMemberEdit = (rewrite, claimed, node, elements) => {
128
+ const property = identifierName(node.property);
129
+ if (property !== undefined && elements.get(property)?.isMountable === true) {
130
+ const object = node.object;
131
+ rewrite.edits.push({ start: object.start, end: object.end, replacement: NAMESPACE_HELPER });
132
+ rewrite.hasMemberEdits = true;
133
+ claimed.add(object.start);
134
+ }
135
+ };
136
+ const collectCallEdit = (rewrite, claimed, node) => {
137
+ const callee = node.callee;
138
+ rewrite.edits.push({ start: callee.start, end: callee.end, replacement: CALL_HELPER });
139
+ rewrite.hasCallEdits = true;
140
+ claimed.add(callee.start);
141
+ };
142
+ const isPropertyReference = (node, parent) => parent?.type === "ImportSpecifier" ||
143
+ (parent?.type === "MemberExpression" && parent.property === node) ||
144
+ (parent?.type === "JSXMemberExpression" && parent.property === node);
145
+ const hasDynamicUse = (program, local, claimed) => {
146
+ let isFound = false;
147
+ walk(program, null, (node, parent) => {
148
+ if (identifierName(node) === local && !claimed.has(node.start) && !isPropertyReference(node, parent)) {
149
+ isFound = true;
150
+ }
151
+ });
152
+ return isFound;
153
+ };
154
+ const collectRewrite = (program, local, elements) => {
155
+ const rewrite = { edits: [], hasMemberEdits: false, hasCallEdits: false, hasDynamicUses: false };
156
+ const claimed = new Set();
157
+ walk(program, null, (node, parent) => {
158
+ if (isRewritableMember(node, parent, local)) {
159
+ collectMemberEdit(rewrite, claimed, node, elements);
160
+ return;
161
+ }
162
+ if (node.type === "CallExpression" && identifierName(node.callee) === local) {
163
+ collectCallEdit(rewrite, claimed, node);
164
+ }
165
+ });
166
+ rewrite.hasDynamicUses = hasDynamicUse(program, local, claimed);
167
+ return rewrite;
168
+ };
169
+ const lastImportEnd = (program) => {
170
+ const statements = program.body ?? [];
171
+ let end = 0;
172
+ for (const statement of statements) {
173
+ if (isAstNode(statement) && statement.type === "ImportDeclaration") {
174
+ end = Math.max(end, statement.end);
175
+ }
176
+ }
177
+ return end;
178
+ };
179
+ const helperImports = (rewrite) => {
180
+ const lines = [];
181
+ if (rewrite.hasMemberEdits) {
182
+ lines.push(`import * as ${NAMESPACE_HELPER} from ${JSON.stringify(VIRTUAL_ID)};`);
183
+ }
184
+ if (rewrite.hasCallEdits) {
185
+ lines.push(`import { withAnimated as ${CALL_HELPER} } from ${JSON.stringify(INTERNAL_SPECIFIER)};`);
186
+ }
187
+ return lines.join("\n");
188
+ };
189
+ const applyEdits = (code, edits) => {
190
+ const ordered = edits.toSorted((a, b) => b.start - a.start);
191
+ let result = code;
192
+ for (const edit of ordered) {
193
+ result = `${result.slice(0, edit.start)}${edit.replacement}${result.slice(edit.end)}`;
194
+ }
195
+ return result;
196
+ };
197
+ const parseProgram = (path, code) => {
198
+ const lang = sourceLanguage(path);
199
+ if (lang === undefined) {
200
+ return undefined;
201
+ }
202
+ const parsed = parseSync(path, code, { lang });
203
+ return parsed.errors.length > 0 ? undefined : parsed.program;
204
+ };
205
+ const unchangedRewrite = (code, rewrite) => rewrite.hasDynamicUses ? { code, hasDynamicUses: true, hasMemberEdits: false } : undefined;
206
+ const hasHelperCollision = (code) => code.includes(NAMESPACE_HELPER) || code.includes(CALL_HELPER);
207
+ const rewriteModule = (code, id, elements) => {
208
+ if (hasHelperCollision(code)) {
209
+ return undefined;
210
+ }
211
+ const program = parseProgram(stripQuery(id), code);
212
+ if (program === undefined) {
213
+ return undefined;
214
+ }
215
+ const local = animatedLocalName(program);
216
+ if (local === undefined || countDeclarations(program, local) > 1) {
217
+ return undefined;
218
+ }
219
+ const rewrite = collectRewrite(program, local, elements);
220
+ if (rewrite.edits.length === 0) {
221
+ return unchangedRewrite(code, rewrite);
222
+ }
223
+ const insertAt = lastImportEnd(program);
224
+ const helperEdit = { start: insertAt, end: insertAt, replacement: `\n${helperImports(rewrite)}` };
225
+ const withHelpers = applyEdits(code, [...rewrite.edits, helperEdit]);
226
+ return { code: withHelpers, hasDynamicUses: rewrite.hasDynamicUses, hasMemberEdits: rewrite.hasMemberEdits };
227
+ };
228
+ const renderVirtualModule = (elements) => {
229
+ const mountable = elements.values().filter((element) => element.isMountable).toArray();
230
+ const imports = mountable.map((element) => `${element.glibName} as $${element.glibName}`);
231
+ const consts = mountable.map((element) => `export const ${element.glibName} = /* @__PURE__ */ withAnimated($${element.glibName});`);
232
+ return (`import { ${imports.join(", ")} } from "@gtkx/jsx";\n` +
233
+ `import { withAnimated } from ${JSON.stringify(INTERNAL_SPECIFIER)};\n` +
234
+ `${consts.join("\n")}\n`);
235
+ };
236
+ const loadElements = (state) => {
237
+ if (state.elements !== null) {
238
+ return state.elements;
239
+ }
240
+ try {
241
+ const requireFromRoot = createRequire(join(state.root, "package.json"));
242
+ const jsxStoreDir = dirname(requireFromRoot.resolve("@gtkx/jsx/package.json"));
243
+ state.elements = new Map(readGeneratedElements(jsxStoreDir).map((element) => [element.glibName, element]));
244
+ }
245
+ catch {
246
+ return null;
247
+ }
248
+ return state.elements;
249
+ };
250
+ const resolveVirtualId = (state, source) => {
251
+ if (source === VIRTUAL_ID && state.isEnabled) {
252
+ return RESOLVED_VIRTUAL_ID;
253
+ }
254
+ return undefined;
255
+ };
256
+ const loadVirtualModule = (state, id) => {
257
+ if (id !== RESOLVED_VIRTUAL_ID || !state.isEnabled) {
258
+ return undefined;
259
+ }
260
+ const elements = loadElements(state);
261
+ return elements === null ? undefined : renderVirtualModule(elements);
262
+ };
263
+ const dynamicUseWarning = (id, hasDynamicUses) => hasDynamicUses
264
+ ? [
265
+ `${stripQuery(id)} uses the animated binding dynamically, which keeps the whole generated ` +
266
+ "widget namespace in the bundle; use animated(Component) calls to let unused widgets be dropped",
267
+ ]
268
+ : [];
269
+ const memberUseWarning = (id, hasMemberEdits) => hasMemberEdits
270
+ ? [
271
+ `${stripQuery(id)} reads widget components off the animated binding, which GTKX 2.0 removes; ` +
272
+ "import the component and call animated(Component) instead",
273
+ ]
274
+ : [];
275
+ const warningsFor = (state, id, rewritten) => state.isBuild
276
+ ? [
277
+ ...dynamicUseWarning(id, rewritten.hasDynamicUses),
278
+ ...memberUseWarning(id, rewritten.hasMemberEdits),
279
+ ]
280
+ : [];
281
+ const transformCode = (state, code, id) => {
282
+ if (!state.isEnabled || id.startsWith("\0") || !code.includes(ANIMATED_PACKAGE)) {
283
+ return undefined;
284
+ }
285
+ const elements = loadElements(state);
286
+ if (elements === null) {
287
+ return undefined;
288
+ }
289
+ const rewritten = rewriteModule(code, id, elements);
290
+ if (rewritten === undefined) {
291
+ return undefined;
292
+ }
293
+ return { code: rewritten.code, warnings: warningsFor(state, id, rewritten) };
294
+ };
295
+ function gtkxAnimated(loadConfig = createConfigLoader()) {
296
+ const state = { isEnabled: false, isBuild: false, root: process.cwd(), elements: null };
297
+ return {
298
+ name: "gtkx:animated",
299
+ enforce: "pre",
300
+ async config(config) {
301
+ const loaded = await loadConfig.load(config.root ?? process.cwd());
302
+ state.isEnabled = loaded.config.future?.v2TreeShaking === true;
303
+ },
304
+ configResolved(config) {
305
+ state.root = config.root;
306
+ state.isBuild = config.command === "build";
307
+ },
308
+ resolveId(source) {
309
+ return resolveVirtualId(state, source);
310
+ },
311
+ load(id) {
312
+ return loadVirtualModule(state, id);
313
+ },
314
+ transform(code, id) {
315
+ const result = transformCode(state, code, id);
316
+ const warnings = result?.warnings ?? [];
317
+ for (const warning of warnings) {
318
+ this.warn(warning);
319
+ }
320
+ return result?.code;
321
+ },
322
+ };
323
+ }
324
+ export { gtkxAnimated };
325
+ //# sourceMappingURL=animated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated.js","sourceRoot":"","sources":["../../src/vite-plugins/animated.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { type GeneratedElement, readGeneratedElements } from \"@gtkx/codegen\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { parseSync } from \"vite\";\nimport { sourceLanguage } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype AstNode = {\n type: string;\n start: number;\n end: number;\n} & Record<string, unknown>;\n\ntype Edit = {\n start: number;\n end: number;\n replacement: string;\n};\n\ntype Rewrite = {\n edits: Edit[];\n hasMemberEdits: boolean;\n hasCallEdits: boolean;\n hasDynamicUses: boolean;\n};\n\ntype RewrittenModule = { code: string; hasDynamicUses: boolean; hasMemberEdits: boolean };\n\ntype PluginState = {\n isEnabled: boolean;\n isBuild: boolean;\n root: string;\n elements: Map<string, GeneratedElement> | null;\n};\n\nconst ANIMATED_PACKAGE = \"@gtkx/animated\";\nconst INTERNAL_SPECIFIER = \"@gtkx/animated/internal\";\nconst VIRTUAL_ID = \"virtual:gtkx-animated\";\nconst RESOLVED_VIRTUAL_ID = `\\0${VIRTUAL_ID}`;\nconst NAMESPACE_HELPER = \"__gtkxAnimated\";\nconst CALL_HELPER = \"__gtkxWithAnimated\";\n\nconst BINDING_PARENT_KEYS: Record<string, string> = {\n VariableDeclarator: \"id\",\n ImportSpecifier: \"local\",\n ImportDefaultSpecifier: \"local\",\n ImportNamespaceSpecifier: \"local\",\n FunctionDeclaration: \"id\",\n ClassDeclaration: \"id\",\n CatchClause: \"param\",\n AssignmentPattern: \"left\",\n RestElement: \"argument\",\n Property: \"value\",\n};\n\nconst BINDING_PARENT_ARRAY_KEYS: Record<string, string> = {\n ArrowFunctionExpression: \"params\",\n FunctionDeclaration: \"params\",\n FunctionExpression: \"params\",\n ArrayPattern: \"elements\",\n};\n\nconst isAstNode = (value: unknown): value is AstNode =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as AstNode).type === \"string\" &&\n typeof (value as AstNode).start === \"number\" &&\n typeof (value as AstNode).end === \"number\";\n\nconst walkChildren = (node: AstNode, visit: (node: AstNode, parent: AstNode | null) => void): void => {\n for (const [key, child] of Object.entries(node)) {\n if (key !== \"type\") {\n walk(child, node, visit);\n }\n }\n};\n\nconst walk = (value: unknown, parent: AstNode | null, visit: (node: AstNode, parent: AstNode | null) => void): void => {\n if (Array.isArray(value)) {\n for (const item of value) {\n walk(item, parent, visit);\n }\n\n return;\n }\n\n if (!isAstNode(value)) {\n return;\n }\n\n visit(value, parent);\n walkChildren(value, visit);\n};\n\nconst identifierName = (node: unknown): string | undefined => {\n if (!isAstNode(node)) {\n return undefined;\n }\n\n if (node.type !== \"Identifier\" && node.type !== \"JSXIdentifier\") {\n return undefined;\n }\n\n return typeof node.name === \"string\" ? node.name : undefined;\n};\n\nconst isValueImportSpecifier = (specifier: unknown): specifier is AstNode =>\n isAstNode(specifier) && specifier.type === \"ImportSpecifier\" && specifier.importKind !== \"type\";\n\nconst animatedSpecifierLocal = (node: AstNode): string | undefined => {\n const specifiers = (node.specifiers as unknown[] | undefined) ?? [];\n let local: string | undefined;\n\n for (const specifier of specifiers) {\n if (isValueImportSpecifier(specifier) && identifierName(specifier.imported) === \"animated\") {\n local ??= identifierName(specifier.local);\n }\n }\n\n return local;\n};\n\nconst animatedLocalName = (program: AstNode): string | undefined => {\n let local: string | undefined;\n\n walk(program, null, (node) => {\n if (node.type !== \"ImportDeclaration\" || (node.source as AstNode | undefined)?.value !== ANIMATED_PACKAGE) {\n return;\n }\n\n if (node.importKind === \"type\") {\n return;\n }\n\n local ??= animatedSpecifierLocal(node);\n });\n\n return local;\n};\n\nconst isBindingSlot = (node: AstNode, parent: AstNode): boolean => {\n const key = BINDING_PARENT_KEYS[parent.type];\n\n return key !== undefined && parent[key] === node;\n};\n\nconst isBindingListEntry = (node: AstNode, parent: AstNode): boolean => {\n const arrayKey = BINDING_PARENT_ARRAY_KEYS[parent.type];\n const entries = arrayKey === undefined ? undefined : parent[arrayKey];\n\n return Array.isArray(entries) && entries.includes(node);\n};\n\nconst isBindingParent = (node: AstNode, parent: AstNode): boolean =>\n isBindingSlot(node, parent) || isBindingListEntry(node, parent);\n\nconst isBindingNamed = (node: AstNode, parent: AstNode, name: string): boolean =>\n node.type === \"Identifier\" &&\n node.name === name &&\n isBindingParent(node, parent);\n\nconst countDeclarations = (program: AstNode, name: string): number => {\n const spans: Set<number> = new Set();\n\n walk(program, null, (node, parent) => {\n if (parent !== null && isBindingNamed(node, parent, name)) {\n spans.add(node.start);\n }\n });\n\n return spans.size;\n};\n\nconst isRewritableJsxMember = (node: AstNode, local: string): boolean =>\n node.type === \"JSXMemberExpression\" && identifierName(node.object) === local;\n\nconst isRewritableObjectMember = (node: AstNode, local: string): boolean =>\n node.type === \"MemberExpression\" &&\n node.computed !== true &&\n node.optional !== true &&\n identifierName(node.object) === local;\n\nconst isForbiddenTarget = (node: AstNode, parent: AstNode | null): boolean =>\n parent !== null &&\n ((parent.type === \"AssignmentExpression\" && parent.left === node) ||\n (parent.type === \"UpdateExpression\" && parent.argument === node) ||\n (parent.type === \"UnaryExpression\" && parent.operator === \"delete\" && parent.argument === node));\n\nconst isRewritableMember = (node: AstNode, parent: AstNode | null, local: string): boolean => {\n if (isRewritableJsxMember(node, local)) {\n return true;\n }\n\n return isRewritableObjectMember(node, local) && !isForbiddenTarget(node, parent);\n};\n\nconst collectMemberEdit = (\n rewrite: Rewrite,\n claimed: Set<number>,\n node: AstNode,\n elements: Map<string, GeneratedElement>,\n): void => {\n const property = identifierName(node.property);\n\n if (property !== undefined && elements.get(property)?.isMountable === true) {\n const object = node.object as AstNode;\n rewrite.edits.push({ start: object.start, end: object.end, replacement: NAMESPACE_HELPER });\n rewrite.hasMemberEdits = true;\n claimed.add(object.start);\n }\n};\n\nconst collectCallEdit = (rewrite: Rewrite, claimed: Set<number>, node: AstNode): void => {\n const callee = node.callee as AstNode;\n rewrite.edits.push({ start: callee.start, end: callee.end, replacement: CALL_HELPER });\n rewrite.hasCallEdits = true;\n claimed.add(callee.start);\n};\n\nconst isPropertyReference = (node: AstNode, parent: AstNode | null): boolean =>\n parent?.type === \"ImportSpecifier\" ||\n (parent?.type === \"MemberExpression\" && parent.property === node) ||\n (parent?.type === \"JSXMemberExpression\" && parent.property === node);\n\nconst hasDynamicUse = (program: AstNode, local: string, claimed: Set<number>): boolean => {\n let isFound = false;\n\n walk(program, null, (node, parent) => {\n if (identifierName(node) === local && !claimed.has(node.start) && !isPropertyReference(node, parent)) {\n isFound = true;\n }\n });\n\n return isFound;\n};\n\nconst collectRewrite = (program: AstNode, local: string, elements: Map<string, GeneratedElement>): Rewrite => {\n const rewrite: Rewrite = { edits: [], hasMemberEdits: false, hasCallEdits: false, hasDynamicUses: false };\n const claimed: Set<number> = new Set();\n\n walk(program, null, (node, parent) => {\n if (isRewritableMember(node, parent, local)) {\n collectMemberEdit(rewrite, claimed, node, elements);\n\n return;\n }\n\n if (node.type === \"CallExpression\" && identifierName(node.callee) === local) {\n collectCallEdit(rewrite, claimed, node);\n }\n });\n\n rewrite.hasDynamicUses = hasDynamicUse(program, local, claimed);\n\n return rewrite;\n};\n\nconst lastImportEnd = (program: AstNode): number => {\n const statements = (program.body as unknown[] | undefined) ?? [];\n let end = 0;\n\n for (const statement of statements) {\n if (isAstNode(statement) && statement.type === \"ImportDeclaration\") {\n end = Math.max(end, statement.end);\n }\n }\n\n return end;\n};\n\nconst helperImports = (rewrite: Rewrite): string => {\n const lines: string[] = [];\n\n if (rewrite.hasMemberEdits) {\n lines.push(`import * as ${NAMESPACE_HELPER} from ${JSON.stringify(VIRTUAL_ID)};`);\n }\n\n if (rewrite.hasCallEdits) {\n lines.push(`import { withAnimated as ${CALL_HELPER} } from ${JSON.stringify(INTERNAL_SPECIFIER)};`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst applyEdits = (code: string, edits: Edit[]): string => {\n const ordered = edits.toSorted((a, b) => b.start - a.start);\n let result = code;\n\n for (const edit of ordered) {\n result = `${result.slice(0, edit.start)}${edit.replacement}${result.slice(edit.end)}`;\n }\n\n return result;\n};\n\nconst parseProgram = (path: string, code: string): AstNode | undefined => {\n const lang = sourceLanguage(path);\n\n if (lang === undefined) {\n return undefined;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n return parsed.errors.length > 0 ? undefined : (parsed.program as unknown as AstNode);\n};\n\nconst unchangedRewrite = (code: string, rewrite: Rewrite): RewrittenModule | undefined =>\n rewrite.hasDynamicUses ? { code, hasDynamicUses: true, hasMemberEdits: false } : undefined;\n\nconst hasHelperCollision = (code: string): boolean =>\n code.includes(NAMESPACE_HELPER) || code.includes(CALL_HELPER);\n\nconst rewriteModule = (\n code: string,\n id: string,\n elements: Map<string, GeneratedElement>,\n): RewrittenModule | undefined => {\n if (hasHelperCollision(code)) {\n return undefined;\n }\n\n const program = parseProgram(stripQuery(id), code);\n\n if (program === undefined) {\n return undefined;\n }\n\n const local = animatedLocalName(program);\n\n if (local === undefined || countDeclarations(program, local) > 1) {\n return undefined;\n }\n\n const rewrite = collectRewrite(program, local, elements);\n\n if (rewrite.edits.length === 0) {\n return unchangedRewrite(code, rewrite);\n }\n\n const insertAt = lastImportEnd(program);\n const helperEdit: Edit = { start: insertAt, end: insertAt, replacement: `\\n${helperImports(rewrite)}` };\n const withHelpers = applyEdits(code, [...rewrite.edits, helperEdit]);\n\n return { code: withHelpers, hasDynamicUses: rewrite.hasDynamicUses, hasMemberEdits: rewrite.hasMemberEdits };\n};\n\nconst renderVirtualModule = (elements: Map<string, GeneratedElement>): string => {\n const mountable = elements.values().filter((element) => element.isMountable).toArray();\n const imports = mountable.map((element) => `${element.glibName} as $${element.glibName}`);\n\n const consts = mountable.map(\n (element) => `export const ${element.glibName} = /* @__PURE__ */ withAnimated($${element.glibName});`,\n );\n\n return (\n `import { ${imports.join(\", \")} } from \"@gtkx/jsx\";\\n` +\n `import { withAnimated } from ${JSON.stringify(INTERNAL_SPECIFIER)};\\n` +\n `${consts.join(\"\\n\")}\\n`\n );\n};\n\nconst loadElements = (state: PluginState): Map<string, GeneratedElement> | null => {\n if (state.elements !== null) {\n return state.elements;\n }\n\n try {\n const requireFromRoot = createRequire(join(state.root, \"package.json\"));\n const jsxStoreDir = dirname(requireFromRoot.resolve(\"@gtkx/jsx/package.json\"));\n state.elements = new Map(readGeneratedElements(jsxStoreDir).map((element) => [element.glibName, element]));\n } catch {\n return null;\n }\n\n return state.elements;\n};\n\nconst resolveVirtualId = (state: PluginState, source: string): string | undefined => {\n if (source === VIRTUAL_ID && state.isEnabled) {\n return RESOLVED_VIRTUAL_ID;\n }\n\n return undefined;\n};\n\nconst loadVirtualModule = (state: PluginState, id: string): string | undefined => {\n if (id !== RESOLVED_VIRTUAL_ID || !state.isEnabled) {\n return undefined;\n }\n\n const elements = loadElements(state);\n\n return elements === null ? undefined : renderVirtualModule(elements);\n};\n\nconst dynamicUseWarning = (id: string, hasDynamicUses: boolean): string[] =>\n hasDynamicUses\n ? [\n `${stripQuery(id)} uses the animated binding dynamically, which keeps the whole generated ` +\n \"widget namespace in the bundle; use animated(Component) calls to let unused widgets be dropped\",\n ]\n : [];\n\nconst memberUseWarning = (id: string, hasMemberEdits: boolean): string[] =>\n hasMemberEdits\n ? [\n `${stripQuery(id)} reads widget components off the animated binding, which GTKX 2.0 removes; ` +\n \"import the component and call animated(Component) instead\",\n ]\n : [];\n\nconst warningsFor = (state: PluginState, id: string, rewritten: RewrittenModule): string[] =>\n state.isBuild\n ? [\n ...dynamicUseWarning(id, rewritten.hasDynamicUses),\n ...memberUseWarning(id, rewritten.hasMemberEdits),\n ]\n : [];\n\nconst transformCode = (\n state: PluginState,\n code: string,\n id: string,\n): { code: string; warnings: string[] } | undefined => {\n if (!state.isEnabled || id.startsWith(\"\\0\") || !code.includes(ANIMATED_PACKAGE)) {\n return undefined;\n }\n\n const elements = loadElements(state);\n\n if (elements === null) {\n return undefined;\n }\n\n const rewritten = rewriteModule(code, id, elements);\n\n if (rewritten === undefined) {\n return undefined;\n }\n\n return { code: rewritten.code, warnings: warningsFor(state, id, rewritten) };\n};\n\nfunction gtkxAnimated(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = { isEnabled: false, isBuild: false, root: process.cwd(), elements: null };\n\n return {\n name: \"gtkx:animated\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isEnabled = loaded.config.future?.v2TreeShaking === true;\n },\n\n configResolved(config) {\n state.root = config.root;\n state.isBuild = config.command === \"build\";\n },\n\n resolveId(source) {\n return resolveVirtualId(state, source);\n },\n\n load(id) {\n return loadVirtualModule(state, id);\n },\n\n transform(code, id) {\n const result = transformCode(state, code, id);\n const warnings = result?.warnings ?? [];\n\n for (const warning of warnings) {\n this.warn(warning);\n }\n\n return result?.code;\n },\n };\n}\n\nexport { gtkxAnimated };\n"]}
@@ -1,4 +1,4 @@
1
- import { createConfigLoader } from "@gtkx/config/internal";
1
+ import { createConfigLoader, resolveFuture } from "@gtkx/config/internal";
2
2
  import { parseSync } from "vite";
3
3
  import { sourceLanguage } from "../internal/source-imports.js";
4
4
  import { ASSET_MENTION_RE } from "./asset-extensions.js";
@@ -88,7 +88,7 @@ function gtkxAssetImports(loadConfig = createConfigLoader()) {
88
88
  enforce: "pre",
89
89
  async config(config) {
90
90
  const loaded = await loadConfig.load(config.root ?? process.cwd());
91
- state.isV2 = loaded.config.future?.v2ResourceImports === true;
91
+ state.isV2 = resolveFuture(loaded.config.future).isResourceImported;
92
92
  },
93
93
  transform(code, id) {
94
94
  checkAssetImports(code, id, state.isV2);