@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.
- package/dist/config-error.d.ts +16 -0
- package/dist/config-error.d.ts.map +1 -0
- package/dist/config-error.js +45 -0
- package/dist/config-error.js.map +1 -0
- package/dist/config.d.ts +51 -56
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +90 -42
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/loader.d.ts +6 -5
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +10 -8
- package/dist/loader.js.map +1 -1
- package/dist/user-event-signals.d.ts +4 -0
- package/dist/user-event-signals.d.ts.map +1 -0
- package/dist/user-event-signals.js +54 -0
- package/dist/user-event-signals.js.map +1 -0
- package/dist/virtual.d.ts +8 -3
- package/dist/virtual.d.ts.map +1 -1
- package/dist/virtual.js +26 -6
- package/dist/virtual.js.map +1 -1
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.js +12 -13
- package/dist/vite-plugin.js.map +1 -1
- package/package.json +3 -9
- package/src/config-error.ts +67 -0
- package/src/config.ts +176 -84
- package/src/index.ts +0 -12
- package/src/internal.ts +1 -1
- package/src/loader.ts +22 -13
- package/src/user-event-signals.ts +57 -0
- package/src/virtual.ts +28 -5
- package/src/vite-plugin.ts +25 -11
- package/dist/element-props.d.ts +0 -180
- package/dist/element-props.d.ts.map +0 -1
- package/dist/element-props.js +0 -154
- package/dist/element-props.js.map +0 -1
- package/env.d.ts +0 -8
- package/src/element-props.ts +0 -248
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
package/dist/virtual.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
package/dist/virtual.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAEA,MAAM,
|
|
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;
|
|
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"}
|
package/dist/vite-plugin.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { createConfigLoader } from "./loader.js";
|
|
2
|
-
import { GTKX_CONFIG_VIRTUAL_ID,
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/dist/vite-plugin.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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.
|
|
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 };
|