@gtkx/config 1.0.0-rc.1 → 1.0.0-rc.2

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 (45) hide show
  1. package/dist/config-error.d.ts +16 -0
  2. package/dist/config-error.d.ts.map +1 -0
  3. package/dist/config-error.js +45 -0
  4. package/dist/config-error.js.map +1 -0
  5. package/dist/config.d.ts +51 -56
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +90 -42
  8. package/dist/config.js.map +1 -1
  9. package/dist/index.d.ts +0 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/internal.d.ts +1 -1
  13. package/dist/internal.d.ts.map +1 -1
  14. package/dist/internal.js +1 -1
  15. package/dist/internal.js.map +1 -1
  16. package/dist/loader.d.ts +6 -5
  17. package/dist/loader.d.ts.map +1 -1
  18. package/dist/loader.js +10 -8
  19. package/dist/loader.js.map +1 -1
  20. package/dist/user-event-signals.d.ts +4 -0
  21. package/dist/user-event-signals.d.ts.map +1 -0
  22. package/dist/user-event-signals.js +54 -0
  23. package/dist/user-event-signals.js.map +1 -0
  24. package/dist/virtual.d.ts +8 -3
  25. package/dist/virtual.d.ts.map +1 -1
  26. package/dist/virtual.js +26 -6
  27. package/dist/virtual.js.map +1 -1
  28. package/dist/vite-plugin.d.ts.map +1 -1
  29. package/dist/vite-plugin.js +12 -13
  30. package/dist/vite-plugin.js.map +1 -1
  31. package/package.json +3 -9
  32. package/src/config-error.ts +67 -0
  33. package/src/config.ts +176 -84
  34. package/src/index.ts +0 -12
  35. package/src/internal.ts +1 -1
  36. package/src/loader.ts +22 -13
  37. package/src/user-event-signals.ts +57 -0
  38. package/src/virtual.ts +28 -5
  39. package/src/vite-plugin.ts +25 -11
  40. package/dist/element-props.d.ts +0 -180
  41. package/dist/element-props.d.ts.map +0 -1
  42. package/dist/element-props.js +0 -154
  43. package/dist/element-props.js.map +0 -1
  44. package/env.d.ts +0 -8
  45. package/src/element-props.ts +0 -248
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,EAAoC,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiB9F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,GAAW,EAAE,OAAO,GAAsB,EAAE,EAAyB,EAAE;IACpG,MAAM,MAAM,GAAG,MAAM,cAAc,CAAS;QACxC,IAAI,EAAE,MAAM;QACZ,GAAG;QACH,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QAC/B,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7F,IAAI,KAAK;QAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO;QACH,MAAM;QACN,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACjD,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG;KAC1B,CAAC;AACN,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAO,GAAsB,EAAE,EAAgB,EAAE;IAChF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;IACzD,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAA2B,EAAE;QACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,OAAO,CAAC,GAAW,EAA2B,EAAE;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { loadConfig as loadConfigFile } from \"c12\";\nimport { type Config, type ResolvedConfig, resolveConfig, validateConfig } from \"./config.js\";\n\n/**\n * Result of loading a `gtkx.config.ts` file: the parsed configuration, the\n * resolved config file path (`undefined` when none was found), and the project\n * root it was loaded from.\n */\nexport type LoadedConfig = {\n config: Config;\n configFile: string | undefined;\n root: string;\n};\n\nexport type LoadConfigOptions = {\n mode?: string | undefined;\n};\n\n/**\n * Loads and validates the `gtkx.config.ts` file for a project, returning the\n * parsed configuration together with the config file path and project root.\n * @param cwd Directory from which to search for the configuration file.\n * @param options Loading options, such as the environment mode.\n */\nexport const loadConfig = async (cwd: string, options: LoadConfigOptions = {}): Promise<LoadedConfig> => {\n const result = await loadConfigFile<Config>({\n name: \"gtkx\",\n cwd,\n rcFile: false,\n globalRc: false,\n packageJson: false,\n context: { mode: options.mode },\n ...(options.mode !== undefined ? { envName: options.mode } : {}),\n });\n\n const config = result.config;\n const found = result.configFile !== undefined && existsSync(resolve(cwd, result.configFile));\n\n if (found) validateConfig(config);\n\n return {\n config,\n configFile: found ? result.configFile : undefined,\n root: result.cwd ?? cwd,\n };\n};\n\nexport type ConfigLoader = (cwd: string) => Promise<ResolvedConfig>;\n\nexport const createConfigLoader = (options: LoadConfigOptions = {}): ConfigLoader => {\n const cache = new Map<string, Promise<ResolvedConfig>>();\n const loadResolved = async (root: string): Promise<ResolvedConfig> => {\n const { config } = await loadConfig(root, options);\n validateConfig(config);\n return resolveConfig(config);\n };\n return (cwd: string): Promise<ResolvedConfig> => {\n const root = resolve(cwd);\n let pending = cache.get(root);\n if (!pending) {\n pending = loadResolved(root);\n cache.set(root, pending);\n }\n return pending;\n };\n};\n"]}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAe,aAAa,EAAuB,cAAc,EAAE,MAAM,aAAa,CAAC;AAmB9F;;;;;GAKG;AACH,MAAM,UAAU,GAAG,KAAK,EAAE,GAAW,EAAE,UAA6B,EAAE,EAAyB,EAAE;IAC7F,MAAM,MAAM,GAAG,MAAM,cAAc,CAAS;QACxC,IAAI,EAAE,MAAM;QACZ,GAAG;QACH,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QAC/B,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KACjE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAE/F,IAAI,OAAO,EAAE,CAAC;QACV,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO;QACH,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACnD,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG;KAC1B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,UAA6B,EAAE,EAAgB,EAAE;IACzE,MAAM,KAAK,GAAyC,IAAI,GAAG,EAAE,CAAC;IAE9D,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAA2B,EAAE;QACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,cAAc,CAAC,MAAM,CAAC,CAAC;QAEvB,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO,CAAC,GAAW,EAA2B,EAAE;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAgE,CAAC","sourcesContent":["import { loadConfig as loadConfigFile } from \"c12\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { type Config, resolveConfig, type ResolvedConfig, validateConfig } from \"./config.js\";\n\n/**\n * Result of loading a `gtkx.config.ts` file: the parsed configuration, the\n * resolved config file path (`undefined` when none was found), and the project\n * root it was loaded from.\n */\ntype LoadedConfig = {\n config: Config;\n configFile: string | undefined;\n root: string;\n};\n\ntype LoadConfigOptions = {\n mode?: string | undefined;\n};\n\ntype ConfigLoader = (cwd: string) => Promise<ResolvedConfig>;\n\n/**\n * Loads and validates the `gtkx.config.ts` file for a project, returning the\n * parsed configuration together with the config file path and project root.\n * @param cwd Directory from which to search for the configuration file.\n * @param options Loading options, such as the environment mode.\n */\nconst loadConfig = async (cwd: string, options: LoadConfigOptions = {}): Promise<LoadedConfig> => {\n const result = await loadConfigFile<Config>({\n name: \"gtkx\",\n cwd,\n rcFile: false,\n globalRc: false,\n packageJson: false,\n context: { mode: options.mode },\n ...((options.mode !== undefined) && { envName: options.mode }),\n });\n\n const config = result.config;\n const isFound = result.configFile !== undefined && existsSync(resolve(cwd, result.configFile));\n\n if (isFound) {\n validateConfig(config);\n }\n\n return {\n config,\n configFile: isFound ? result.configFile : undefined,\n root: result.cwd ?? cwd,\n };\n};\n\nconst createConfigLoader = (options: LoadConfigOptions = {}): ConfigLoader => {\n const cache: Map<string, Promise<ResolvedConfig>> = new Map();\n\n const loadResolved = async (root: string): Promise<ResolvedConfig> => {\n const { config } = await loadConfig(root, options);\n validateConfig(config);\n\n return resolveConfig(config, root);\n };\n\n return (cwd: string): Promise<ResolvedConfig> => {\n const root = resolve(cwd);\n let pending = cache.get(root);\n\n if (!pending) {\n pending = loadResolved(root);\n cache.set(root, pending);\n }\n\n return pending;\n };\n};\n\nexport { loadConfig, createConfigLoader, type LoadedConfig, type LoadConfigOptions, type ConfigLoader };\n"]}
@@ -0,0 +1,4 @@
1
+ declare const DEFAULT_USER_EVENT_SIGNALS: Record<string, string[]>;
2
+ declare const resolveUserEventSignals: (overrides: Record<string, string[]> | undefined) => Record<string, string[]>;
3
+ export { DEFAULT_USER_EVENT_SIGNALS, resolveUserEventSignals };
4
+ //# sourceMappingURL=user-event-signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-event-signals.d.ts","sourceRoot":"","sources":["../src/user-event-signals.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA2CxD,CAAC;AAEF,QAAA,MAAM,uBAAuB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CASzG,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,54 @@
1
+ const DEFAULT_USER_EVENT_SIGNALS = {
2
+ AdwAlertDialog: ["response"],
3
+ AdwCarousel: ["page-changed"],
4
+ AdwDialog: ["closed"],
5
+ AdwNavigationView: ["pushed"],
6
+ AdwTabView: ["close-page", "page-attached", "page-detached", "page-reordered"],
7
+ GObject: ["notify"],
8
+ GtkAdjustment: ["changed", "value-changed"],
9
+ GtkAppChooserButton: ["changed"],
10
+ GtkAppChooserWidget: ["application-selected"],
11
+ GtkCalendar: ["day-selected"],
12
+ GtkCheckButton: ["toggled"],
13
+ GtkComboBox: ["changed"],
14
+ GtkEditable: ["changed", "delete-text", "insert-text"],
15
+ GtkEntryBuffer: ["deleted-text", "inserted-text"],
16
+ GtkFlowBox: ["selected-children-changed"],
17
+ GtkIconView: ["selection-changed"],
18
+ GtkListBox: ["row-selected", "selected-rows-changed"],
19
+ GtkNotebook: ["page-added", "page-removed", "page-reordered", "switch-page"],
20
+ GtkPopover: ["closed"],
21
+ GtkRange: ["value-changed"],
22
+ GtkScaleButton: ["value-changed"],
23
+ GtkScrolledWindow: ["edge-reached"],
24
+ GtkSearchEntry: ["search-changed"],
25
+ GtkSelectionModel: ["selection-changed"],
26
+ GtkSpinButton: ["value-changed"],
27
+ GtkSwitch: ["state-set"],
28
+ GtkTextBuffer: [
29
+ "apply-tag",
30
+ "changed",
31
+ "delete-range",
32
+ "insert-child-anchor",
33
+ "insert-paintable",
34
+ "insert-text",
35
+ "mark-deleted",
36
+ "mark-set",
37
+ "modified-changed",
38
+ "remove-tag",
39
+ ],
40
+ GtkToggleButton: ["toggled"],
41
+ GtkTreeSelection: ["changed"],
42
+ GtkTreeView: ["columns-changed", "cursor-changed", "row-collapsed", "row-expanded"],
43
+ GtkWidget: ["state-flags-changed"],
44
+ };
45
+ const resolveUserEventSignals = (overrides) => {
46
+ const resolved = { ...DEFAULT_USER_EVENT_SIGNALS };
47
+ const overrideEntries = Object.entries(overrides ?? {});
48
+ for (const [typeName, signals] of overrideEntries) {
49
+ resolved[typeName] = [...new Set([...(resolved[typeName] ?? []), ...signals])];
50
+ }
51
+ return resolved;
52
+ };
53
+ export { DEFAULT_USER_EVENT_SIGNALS, resolveUserEventSignals };
54
+ //# sourceMappingURL=user-event-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-event-signals.js","sourceRoot":"","sources":["../src/user-event-signals.ts"],"names":[],"mappings":"AAAA,MAAM,0BAA0B,GAA6B;IACzD,cAAc,EAAE,CAAC,UAAU,CAAC;IAC5B,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,iBAAiB,EAAE,CAAC,QAAQ,CAAC;IAC7B,UAAU,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC;IAC9E,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,aAAa,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;IAC3C,mBAAmB,EAAE,CAAC,SAAS,CAAC;IAChC,mBAAmB,EAAE,CAAC,sBAAsB,CAAC;IAC7C,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,cAAc,EAAE,CAAC,SAAS,CAAC;IAC3B,WAAW,EAAE,CAAC,SAAS,CAAC;IACxB,WAAW,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC;IACtD,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;IACjD,UAAU,EAAE,CAAC,2BAA2B,CAAC;IACzC,WAAW,EAAE,CAAC,mBAAmB,CAAC;IAClC,UAAU,EAAE,CAAC,cAAc,EAAE,uBAAuB,CAAC;IACrD,WAAW,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,CAAC;IAC5E,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,QAAQ,EAAE,CAAC,eAAe,CAAC;IAC3B,cAAc,EAAE,CAAC,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,cAAc,CAAC;IACnC,cAAc,EAAE,CAAC,gBAAgB,CAAC;IAClC,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;IACxC,aAAa,EAAE,CAAC,eAAe,CAAC;IAChC,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,aAAa,EAAE;QACX,WAAW;QACX,SAAS;QACT,cAAc;QACd,qBAAqB;QACrB,kBAAkB;QAClB,aAAa;QACb,cAAc;QACd,UAAU;QACV,kBAAkB;QAClB,YAAY;KACf;IACD,eAAe,EAAE,CAAC,SAAS,CAAC;IAC5B,gBAAgB,EAAE,CAAC,SAAS,CAAC;IAC7B,WAAW,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,CAAC;IACnF,SAAS,EAAE,CAAC,qBAAqB,CAAC;CACrC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,SAA+C,EAA4B,EAAE;IAC1G,MAAM,QAAQ,GAA6B,EAAE,GAAG,0BAA0B,EAAE,CAAC;IAC7E,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAExD,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC;QAChD,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,CAAC","sourcesContent":["const DEFAULT_USER_EVENT_SIGNALS: Record<string, string[]> = {\n AdwAlertDialog: [\"response\"],\n AdwCarousel: [\"page-changed\"],\n AdwDialog: [\"closed\"],\n AdwNavigationView: [\"pushed\"],\n AdwTabView: [\"close-page\", \"page-attached\", \"page-detached\", \"page-reordered\"],\n GObject: [\"notify\"],\n GtkAdjustment: [\"changed\", \"value-changed\"],\n GtkAppChooserButton: [\"changed\"],\n GtkAppChooserWidget: [\"application-selected\"],\n GtkCalendar: [\"day-selected\"],\n GtkCheckButton: [\"toggled\"],\n GtkComboBox: [\"changed\"],\n GtkEditable: [\"changed\", \"delete-text\", \"insert-text\"],\n GtkEntryBuffer: [\"deleted-text\", \"inserted-text\"],\n GtkFlowBox: [\"selected-children-changed\"],\n GtkIconView: [\"selection-changed\"],\n GtkListBox: [\"row-selected\", \"selected-rows-changed\"],\n GtkNotebook: [\"page-added\", \"page-removed\", \"page-reordered\", \"switch-page\"],\n GtkPopover: [\"closed\"],\n GtkRange: [\"value-changed\"],\n GtkScaleButton: [\"value-changed\"],\n GtkScrolledWindow: [\"edge-reached\"],\n GtkSearchEntry: [\"search-changed\"],\n GtkSelectionModel: [\"selection-changed\"],\n GtkSpinButton: [\"value-changed\"],\n GtkSwitch: [\"state-set\"],\n GtkTextBuffer: [\n \"apply-tag\",\n \"changed\",\n \"delete-range\",\n \"insert-child-anchor\",\n \"insert-paintable\",\n \"insert-text\",\n \"mark-deleted\",\n \"mark-set\",\n \"modified-changed\",\n \"remove-tag\",\n ],\n GtkToggleButton: [\"toggled\"],\n GtkTreeSelection: [\"changed\"],\n GtkTreeView: [\"columns-changed\", \"cursor-changed\", \"row-collapsed\", \"row-expanded\"],\n GtkWidget: [\"state-flags-changed\"],\n};\n\nconst resolveUserEventSignals = (overrides: Record<string, string[]> | undefined): Record<string, string[]> => {\n const resolved: Record<string, string[]> = { ...DEFAULT_USER_EVENT_SIGNALS };\n const overrideEntries = Object.entries(overrides ?? {});\n\n for (const [typeName, signals] of overrideEntries) {\n resolved[typeName] = [...new Set([...(resolved[typeName] ?? []), ...signals])];\n }\n\n return resolved;\n};\n\nexport { DEFAULT_USER_EVENT_SIGNALS, resolveUserEventSignals };\n"]}
package/dist/virtual.d.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  import type { ResolvedConfig } from "./config.js";
2
- export declare const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
3
- export declare const RESOLVED_GTKX_CONFIG_VIRTUAL_ID: string;
4
- export declare const renderConfigModule: (config: ResolvedConfig) => string;
2
+ declare const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
3
+ declare const RESOLVED_GTKX_CONFIG_VIRTUAL_ID = "\0virtual:gtkx-config";
4
+ /**
5
+ * The runtime element config is the app's static per-element config (currently its lazy flags) merged
6
+ * with its behaviors module, so a single `elements` map is registered.
7
+ */
8
+ declare const renderConfigModule: (config: ResolvedConfig) => string;
9
+ export { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule };
5
10
  //# sourceMappingURL=virtual.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,eAAO,MAAM,+BAA+B,EAAE,MAAsC,CAAC;AAIrF,eAAO,MAAM,kBAAkB,WAAY,cAAc,KAAG,MAI5C,CAAC"}
1
+ {"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,QAAA,MAAM,sBAAsB,wBAAwB,CAAC;AACrD,QAAA,MAAM,+BAA+B,0BAAgC,CAAC;AAMtE;;;GAGG;AACH,QAAA,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,MAoBpD,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC"}
package/dist/virtual.js CHANGED
@@ -1,8 +1,28 @@
1
- export const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
2
- export const RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\0${GTKX_CONFIG_VIRTUAL_ID}`;
1
+ const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
2
+ const RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\0${GTKX_CONFIG_VIRTUAL_ID}`;
3
3
  const METADATA_SPECIFIER = "@gtkx/jsx/metadata";
4
- export const renderConfigModule = (config) => [
5
- `export * from ${JSON.stringify(METADATA_SPECIFIER)};`,
6
- `export const applicationId = ${JSON.stringify(config.applicationId)};`,
7
- ].join("\n");
4
+ const lazyElementConfig = (lazyElements) => Object.fromEntries(lazyElements.map((type) => [type, { lazy: true }]));
5
+ /**
6
+ * The runtime element config is the app's static per-element config (currently its lazy flags) merged
7
+ * with its behaviors module, so a single `elements` map is registered.
8
+ */
9
+ const renderConfigModule = (config) => {
10
+ const lazyJson = JSON.stringify(lazyElementConfig(config.lazyElements));
11
+ const behaviorImports = config.elements === null
12
+ ? []
13
+ : [
14
+ "import { mergeElementConfigs } from \"@gtkx/react/config\";",
15
+ `import __elementBehaviors from ${JSON.stringify(config.elements)};`,
16
+ ];
17
+ return [
18
+ ...behaviorImports,
19
+ `export * from ${JSON.stringify(METADATA_SPECIFIER)};`,
20
+ `export const applicationId = ${JSON.stringify(config.applicationId)};`,
21
+ `export const userEventSignals = ${JSON.stringify(config.userEventSignals)};`,
22
+ config.elements === null
23
+ ? `export const elements = ${lazyJson};`
24
+ : `export const elements = mergeElementConfigs(__elementBehaviors, ${lazyJson});`,
25
+ ].join("\n");
26
+ };
27
+ export { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule };
8
28
  //# sourceMappingURL=virtual.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAE5D,MAAM,CAAC,MAAM,+BAA+B,GAAW,KAAK,sBAAsB,EAAE,CAAC;AAErF,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAU,EAAE,CACjE;IACI,iBAAiB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG;IACtD,gCAAgC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;CAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import type { ResolvedConfig } from \"./config.js\";\n\nexport const GTKX_CONFIG_VIRTUAL_ID = \"virtual:gtkx-config\";\n\nexport const RESOLVED_GTKX_CONFIG_VIRTUAL_ID: string = `\\0${GTKX_CONFIG_VIRTUAL_ID}`;\n\nconst METADATA_SPECIFIER = \"@gtkx/jsx/metadata\";\n\nexport const renderConfigModule = (config: ResolvedConfig): string =>\n [\n `export * from ${JSON.stringify(METADATA_SPECIFIER)};`,\n `export const applicationId = ${JSON.stringify(config.applicationId)};`,\n ].join(\"\\n\");\n"]}
1
+ {"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAEA,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AACrD,MAAM,+BAA+B,GAAG,KAAK,sBAAsB,EAAE,CAAC;AACtE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEhD,MAAM,iBAAiB,GAAG,CAAC,YAAsB,EAAkC,EAAE,CACjF,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAU,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAExE,MAAM,eAAe,GACjB,MAAM,CAAC,QAAQ,KAAK,IAAI;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACM,6DAA6D;YAC7D,kCAAkC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;SACvE,CAAC;IAEd,OAAO;QACH,GAAG,eAAe;QAClB,iBAAiB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG;QACtD,gCAAgC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QACvE,mCAAmC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG;QAC7E,MAAM,CAAC,QAAQ,KAAK,IAAI;YACpB,CAAC,CAAC,2BAA2B,QAAQ,GAAG;YACxC,CAAC,CAAC,mEAAmE,QAAQ,IAAI;KACxF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC","sourcesContent":["import type { ResolvedConfig } from \"./config.js\";\n\nconst GTKX_CONFIG_VIRTUAL_ID = \"virtual:gtkx-config\";\nconst RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\\0${GTKX_CONFIG_VIRTUAL_ID}`;\nconst METADATA_SPECIFIER = \"@gtkx/jsx/metadata\";\n\nconst lazyElementConfig = (lazyElements: string[]): Record<string, { lazy: true }> =>\n Object.fromEntries(lazyElements.map((type) => [type, { lazy: true }]));\n\n/**\n * The runtime element config is the app's static per-element config (currently its lazy flags) merged\n * with its behaviors module, so a single `elements` map is registered.\n */\nconst renderConfigModule = (config: ResolvedConfig): string => {\n const lazyJson = JSON.stringify(lazyElementConfig(config.lazyElements));\n\n const behaviorImports =\n config.elements === null\n ? []\n : [\n \"import { mergeElementConfigs } from \\\"@gtkx/react/config\\\";\",\n `import __elementBehaviors from ${JSON.stringify(config.elements)};`,\n ];\n\n return [\n ...behaviorImports,\n `export * from ${JSON.stringify(METADATA_SPECIFIER)};`,\n `export const applicationId = ${JSON.stringify(config.applicationId)};`,\n `export const userEventSignals = ${JSON.stringify(config.userEventSignals)};`,\n config.elements === null\n ? `export const elements = ${lazyJson};`\n : `export const elements = mergeElementConfigs(__elementBehaviors, ${lazyJson});`,\n ].join(\"\\n\");\n};\n\nexport { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAGpE;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,YAAa;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;CAC9C,KAAG,MAmBH,CAAC;eAEa,kBAAkB"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAsBpE;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,GAAI,SAAS;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;CAC9C,KAAG,MAcH,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,5 +1,12 @@
1
1
  import { createConfigLoader } from "./loader.js";
2
- import { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule } from "./virtual.js";
2
+ import { GTKX_CONFIG_VIRTUAL_ID, renderConfigModule, RESOLVED_GTKX_CONFIG_VIRTUAL_ID } from "./virtual.js";
3
+ const resolveVirtualId = (id) => id === GTKX_CONFIG_VIRTUAL_ID ? RESOLVED_GTKX_CONFIG_VIRTUAL_ID : null;
4
+ const loadVirtualModule = async (id, loadConfig, state) => {
5
+ if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID) {
6
+ return undefined;
7
+ }
8
+ return renderConfigModule(await loadConfig(state.root ?? process.cwd()));
9
+ };
3
10
  /**
4
11
  * Creates the Vite plugin that resolves and serves the `virtual:gtkx-config`
5
12
  * module, exposing the JSX metadata and the resolved application ID from the
@@ -9,23 +16,15 @@ import { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigMo
9
16
  */
10
17
  const createConfigPlugin = (options) => {
11
18
  const loadConfig = options.loadConfig ?? createConfigLoader();
12
- let root;
19
+ const state = { root: undefined };
13
20
  return {
14
21
  name: options.name,
15
22
  config(config) {
16
- root = config.root ?? root;
23
+ state.root = config.root ?? state.root;
17
24
  return options.config?.();
18
25
  },
19
- resolveId(id) {
20
- if (id === GTKX_CONFIG_VIRTUAL_ID)
21
- return RESOLVED_GTKX_CONFIG_VIRTUAL_ID;
22
- return undefined;
23
- },
24
- async load(id) {
25
- if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID)
26
- return undefined;
27
- return renderConfigModule(await loadConfig(root ?? process.cwd()));
28
- },
26
+ resolveId: (id) => resolveVirtualId(id),
27
+ load: (id) => loadVirtualModule(id, loadConfig, state),
29
28
  };
30
29
  };
31
30
  export default createConfigPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE3G;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAI3B,EAAU,EAAE;IACT,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;IAC9D,IAAI,IAAwB,CAAC;IAE7B,OAAO;QACH,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,CAAC,MAAkB;YACrB,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;YAC3B,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9B,CAAC;QACD,SAAS,CAAC,EAAU;YAChB,IAAI,EAAE,KAAK,sBAAsB;gBAAE,OAAO,+BAA+B,CAAC;YAC1E,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAU;YACjB,IAAI,EAAE,KAAK,+BAA+B;gBAAE,OAAO,SAAS,CAAC;YAC7D,OAAO,kBAAkB,CAAC,MAAM,UAAU,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { type ConfigLoader, createConfigLoader } from \"./loader.js\";\nimport { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule } from \"./virtual.js\";\n\n/**\n * Creates the Vite plugin that resolves and serves the `virtual:gtkx-config`\n * module, exposing the JSX metadata and the resolved application ID from the\n * project's configuration.\n * @param options Plugin name, an optional custom {@link ConfigLoader}, and an\n * optional hook returning extra Vite user config.\n */\nconst createConfigPlugin = (options: {\n name: string;\n loadConfig?: ConfigLoader;\n config?: () => Omit<UserConfig, \"plugins\">;\n}): Plugin => {\n const loadConfig = options.loadConfig ?? createConfigLoader();\n let root: string | undefined;\n\n return {\n name: options.name,\n config(config: UserConfig) {\n root = config.root ?? root;\n return options.config?.();\n },\n resolveId(id: string) {\n if (id === GTKX_CONFIG_VIRTUAL_ID) return RESOLVED_GTKX_CONFIG_VIRTUAL_ID;\n return undefined;\n },\n async load(id: string) {\n if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID) return undefined;\n return renderConfigModule(await loadConfig(root ?? process.cwd()));\n },\n };\n};\n\nexport default createConfigPlugin;\n"]}
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAM3G,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAiB,EAAE,CACnD,EAAE,KAAK,sBAAsB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3E,MAAM,iBAAiB,GAAG,KAAK,EAC3B,EAAU,EACV,UAAwB,EACxB,KAAkB,EACS,EAAE;IAC7B,IAAI,EAAE,KAAK,+BAA+B,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAI3B,EAAU,EAAE;IACT,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAE/C,OAAO;QACH,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,CAAC,MAAkB;YACrB,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;YAEvC,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9B,CAAC;QACD,SAAS,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/C,IAAI,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC;KACjE,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { type ConfigLoader, createConfigLoader } from \"./loader.js\";\nimport { GTKX_CONFIG_VIRTUAL_ID, renderConfigModule, RESOLVED_GTKX_CONFIG_VIRTUAL_ID } from \"./virtual.js\";\n\ntype PluginState = {\n root: string | undefined;\n};\n\nconst resolveVirtualId = (id: string): string | null =>\n id === GTKX_CONFIG_VIRTUAL_ID ? RESOLVED_GTKX_CONFIG_VIRTUAL_ID : null;\n\nconst loadVirtualModule = async (\n id: string,\n loadConfig: ConfigLoader,\n state: PluginState,\n): Promise<string | undefined> => {\n if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID) {\n return undefined;\n }\n\n return renderConfigModule(await loadConfig(state.root ?? process.cwd()));\n};\n\n/**\n * Creates the Vite plugin that resolves and serves the `virtual:gtkx-config`\n * module, exposing the JSX metadata and the resolved application ID from the\n * project's configuration.\n * @param options Plugin name, an optional custom {@link ConfigLoader}, and an\n * optional hook returning extra Vite user config.\n */\nconst createConfigPlugin = (options: {\n name: string;\n loadConfig?: ConfigLoader;\n config?: () => Omit<UserConfig, \"plugins\">;\n}): Plugin => {\n const loadConfig = options.loadConfig ?? createConfigLoader();\n const state: PluginState = { root: undefined };\n\n return {\n name: options.name,\n config(config: UserConfig) {\n state.root = config.root ?? state.root;\n\n return options.config?.();\n },\n resolveId: (id: string) => resolveVirtualId(id),\n load: (id: string) => loadVirtualModule(id, loadConfig, state),\n };\n};\n\nexport default createConfigPlugin;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtkx/config",
3
- "version": "1.0.0-rc.1",
3
+ "version": "1.0.0-rc.2",
4
4
  "description": "gtkx.config.ts schema, loader, and the element-prop mapping language shared across the GTKX toolchain",
5
5
  "keywords": [
6
6
  "gtkx",
@@ -30,9 +30,6 @@
30
30
  "types": "./dist/index.d.ts",
31
31
  "default": "./dist/index.js"
32
32
  },
33
- "./env": {
34
- "types": "./env.d.ts"
35
- },
36
33
  "./internal": {
37
34
  "types": "./dist/internal.d.ts",
38
35
  "default": "./dist/internal.js"
@@ -45,8 +42,7 @@
45
42
  "sideEffects": false,
46
43
  "files": [
47
44
  "dist",
48
- "src",
49
- "env.d.ts"
45
+ "src"
50
46
  ],
51
47
  "engines": {
52
48
  "node": ">=24"
@@ -54,12 +50,10 @@
54
50
  "dependencies": {
55
51
  "c12": "^3.3.4",
56
52
  "defu": "^6.1.7",
57
- "vite": "^8.1.4",
53
+ "vite": "^8.1.5",
58
54
  "zod": "^4.4.3"
59
55
  },
60
56
  "scripts": {
61
- "build": "tsc -b tsconfig.lib.json",
62
- "typecheck": "tsc -b --emitDeclarationOnly",
63
57
  "release": "tsx ../../scripts/release-package.ts"
64
58
  }
65
59
  }
@@ -0,0 +1,67 @@
1
+ import type { z } from "zod";
2
+
3
+ type IssuePath = (string | number)[];
4
+
5
+ const CONFIG_PREFIX = "gtkx.config.ts:";
6
+
7
+ const isRecord = (value: unknown): value is Record<string, unknown> =>
8
+ typeof value === "object" && value !== null && !Array.isArray(value);
9
+
10
+ const rawIssue = (input: unknown, path: IssuePath, message: string, isStandalone = false) => ({
11
+ code: "custom" as const,
12
+ input,
13
+ path,
14
+ message,
15
+ continue: true as const,
16
+ ...(isStandalone && { params: { standalone: true } }),
17
+ });
18
+
19
+ const appendSegment = (path: string, segment: PropertyKey): string => {
20
+ if (typeof segment === "number") {
21
+ return `${path}[${String(segment)}]`;
22
+ }
23
+
24
+ return path === "" ? String(segment) : `${path}.${String(segment)}`;
25
+ };
26
+
27
+ const dottedPath = (segments: PropertyKey[]): string => {
28
+ let path = "";
29
+
30
+ for (const segment of segments) {
31
+ path = appendSegment(path, segment);
32
+ }
33
+
34
+ return path;
35
+ };
36
+
37
+ const isStandaloneIssue = (issue: z.core.$ZodIssue): boolean =>
38
+ "params" in issue && isRecord(issue.params) && issue.params.standalone === true;
39
+
40
+ const formatIssue = (issue: z.core.$ZodIssue, fullPath: PropertyKey[]): string => {
41
+ if (issue.code === "unrecognized_keys") {
42
+ const [key] = issue.keys;
43
+ const path = dottedPath(key === undefined ? fullPath : [...fullPath, key]);
44
+
45
+ return `${CONFIG_PREFIX} \`${path}\` is not a recognized key`;
46
+ }
47
+
48
+ if (isStandaloneIssue(issue)) {
49
+ return `${CONFIG_PREFIX} ${issue.message}`;
50
+ }
51
+
52
+ const path = dottedPath(fullPath);
53
+
54
+ return path === "" ? `${CONFIG_PREFIX} ${issue.message}` : `${CONFIG_PREFIX} \`${path}\` ${issue.message}`;
55
+ };
56
+
57
+ const configError = (error: z.ZodError): Error => {
58
+ const issue = error.issues[0];
59
+
60
+ if (issue === undefined) {
61
+ return new Error(`${CONFIG_PREFIX} invalid configuration`);
62
+ }
63
+
64
+ return new Error(formatIssue(issue, issue.path));
65
+ };
66
+
67
+ export { isRecord, rawIssue, configError };