@gtkx/config 0.21.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.
- package/LICENSE +373 -0
- package/README.md +118 -0
- package/dist/bundled-modules.d.ts +2 -0
- package/dist/bundled-modules.d.ts.map +1 -0
- package/dist/bundled-modules.js +2 -0
- package/dist/bundled-modules.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +104 -0
- package/dist/config.js.map +1 -0
- package/dist/data-dir.d.ts +4 -0
- package/dist/data-dir.d.ts.map +1 -0
- package/dist/data-dir.js +37 -0
- package/dist/data-dir.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +20 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +62 -0
- package/dist/loader.js.map +1 -0
- package/dist/plugin.d.ts +9 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +24 -0
- package/dist/plugin.js.map +1 -0
- package/dist/runtime.d.ts +22 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +22 -0
- package/dist/runtime.js.map +1 -0
- package/dist/table-rules-ir.d.ts +36 -0
- package/dist/table-rules-ir.d.ts.map +1 -0
- package/dist/table-rules-ir.js +2 -0
- package/dist/table-rules-ir.js.map +1 -0
- package/dist/table-schema.d.ts +107 -0
- package/dist/table-schema.d.ts.map +1 -0
- package/dist/table-schema.js +199 -0
- package/dist/table-schema.js.map +1 -0
- package/dist/validators.d.ts +4 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +10 -0
- package/dist/validators.js.map +1 -0
- package/dist/virtual.d.ts +7 -0
- package/dist/virtual.d.ts.map +1 -0
- package/dist/virtual.js +20 -0
- package/dist/virtual.js.map +1 -0
- package/dist/wrapper-protocol.d.ts +12 -0
- package/dist/wrapper-protocol.d.ts.map +1 -0
- package/dist/wrapper-protocol.js +12 -0
- package/dist/wrapper-protocol.js.map +1 -0
- package/env.d.ts +26 -0
- package/package.json +52 -0
- package/src/bundled-modules.ts +1 -0
- package/src/config.ts +191 -0
- package/src/data-dir.ts +39 -0
- package/src/index.ts +88 -0
- package/src/loader.ts +88 -0
- package/src/plugin.ts +30 -0
- package/src/table-rules-ir.ts +42 -0
- package/src/table-schema.ts +342 -0
- package/src/validators.ts +15 -0
- package/src/virtual.ts +42 -0
- package/src/wrapper-protocol.ts +21 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { CAMEL_CASE_NAME_PATTERN, PASCAL_CASE_NAME_PATTERN, validateArrayOf } from "./validators.js";
|
|
2
|
+
const VERB_ARGS = ["child", "childName", "null", "prefixChild", "prefixNull"];
|
|
3
|
+
const PRESENCE_CONDITIONS = ["defined", "nonNull"];
|
|
4
|
+
const fail = (path, message) => {
|
|
5
|
+
throw new Error(`gtkx.config.ts: invalid \`${path}\` — ${message}`);
|
|
6
|
+
};
|
|
7
|
+
const requireRecord = (value, path) => {
|
|
8
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
9
|
+
fail(path, "must be an object");
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
};
|
|
13
|
+
const requireTypeName = (value, path) => {
|
|
14
|
+
if (typeof value !== "string" || !PASCAL_CASE_NAME_PATTERN.test(value)) {
|
|
15
|
+
fail(path, `must be a PascalCase GLib type name (e.g. "GtkWidget"), got "${String(value)}"`);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const requireMethodName = (value, path) => {
|
|
19
|
+
if (typeof value !== "string" || !CAMEL_CASE_NAME_PATTERN.test(value)) {
|
|
20
|
+
fail(path, `must be a camelCase method name (e.g. "addController"), got "${String(value)}"`);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const requireFieldName = (value, path) => {
|
|
24
|
+
if (typeof value !== "string" || !CAMEL_CASE_NAME_PATTERN.test(value)) {
|
|
25
|
+
fail(path, `must be a camelCase item field name (e.g. "iconName"), got "${String(value)}"`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const requireReactMemberName = (value, path, example) => {
|
|
29
|
+
if (typeof value !== "string" || !PASCAL_CASE_NAME_PATTERN.test(value)) {
|
|
30
|
+
fail(path, `must be a PascalCase exported member of @gtkx/react (e.g. "${example}")`);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const validateVerbArgs = (value, path) => {
|
|
34
|
+
if (!VERB_ARGS.includes(value)) {
|
|
35
|
+
fail(path, `must be one of ${VERB_ARGS.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const validateDetachGuard = (value, path) => {
|
|
39
|
+
const guard = requireRecord(value, path);
|
|
40
|
+
if (guard["side"] !== "child" && guard["side"] !== "parent") {
|
|
41
|
+
fail(`${path}.side`, 'must be "child" or "parent"');
|
|
42
|
+
}
|
|
43
|
+
requireMethodName(guard["getter"], `${path}.getter`);
|
|
44
|
+
};
|
|
45
|
+
const validateMethodVerb = (verb, path) => {
|
|
46
|
+
requireMethodName(verb["attach"], `${path}.attach`);
|
|
47
|
+
requireMethodName(verb["detach"], `${path}.detach`);
|
|
48
|
+
validateVerbArgs(verb["attachArgs"], `${path}.attachArgs`);
|
|
49
|
+
validateVerbArgs(verb["detachArgs"], `${path}.detachArgs`);
|
|
50
|
+
if (verb["detachGuard"] !== undefined)
|
|
51
|
+
validateDetachGuard(verb["detachGuard"], `${path}.detachGuard`);
|
|
52
|
+
};
|
|
53
|
+
const validateContainerPropRow = (value, path) => {
|
|
54
|
+
const row = requireRecord(value, path);
|
|
55
|
+
requireMethodName(row["attach"], `${path}.attach`);
|
|
56
|
+
if (row["attachArgs"] !== undefined)
|
|
57
|
+
validateVerbArgs(row["attachArgs"], `${path}.attachArgs`);
|
|
58
|
+
if (row["detach"] !== undefined)
|
|
59
|
+
requireMethodName(row["detach"], `${path}.detach`);
|
|
60
|
+
if (row["detachArgs"] !== undefined)
|
|
61
|
+
validateVerbArgs(row["detachArgs"], `${path}.detachArgs`);
|
|
62
|
+
if (row["detachGuard"] !== undefined)
|
|
63
|
+
validateDetachGuard(row["detachGuard"], `${path}.detachGuard`);
|
|
64
|
+
};
|
|
65
|
+
export const validateContainerPropRows = (containerProps) => {
|
|
66
|
+
validatePropRowMap(containerProps, "containerProps", validateContainerPropRow);
|
|
67
|
+
};
|
|
68
|
+
const validateOrderedInsertVerb = (verb, path) => {
|
|
69
|
+
requireMethodName(verb["attach"], `${path}.attach`);
|
|
70
|
+
requireMethodName(verb["detach"], `${path}.detach`);
|
|
71
|
+
requireMethodName(verb["collection"], `${path}.collection`);
|
|
72
|
+
};
|
|
73
|
+
const validateVerb = (value, path) => {
|
|
74
|
+
const verb = requireRecord(value, path);
|
|
75
|
+
if (verb["kind"] === "method")
|
|
76
|
+
validateMethodVerb(verb, path);
|
|
77
|
+
else if (verb["kind"] === "orderedInsert")
|
|
78
|
+
validateOrderedInsertVerb(verb, path);
|
|
79
|
+
else
|
|
80
|
+
fail(`${path}.kind`, 'must be "method" or "orderedInsert"');
|
|
81
|
+
};
|
|
82
|
+
const validateElementMapRule = (value, path) => {
|
|
83
|
+
const rule = requireRecord(value, path);
|
|
84
|
+
requireTypeName(rule["child"], `${path}.child`);
|
|
85
|
+
if (rule["parentType"] === undefined && rule["parentMethod"] === undefined) {
|
|
86
|
+
fail(path, "must declare `parentType` or `parentMethod`");
|
|
87
|
+
}
|
|
88
|
+
if (rule["parentType"] !== undefined)
|
|
89
|
+
requireTypeName(rule["parentType"], `${path}.parentType`);
|
|
90
|
+
if (rule["parentMethod"] !== undefined)
|
|
91
|
+
requireMethodName(rule["parentMethod"], `${path}.parentMethod`);
|
|
92
|
+
validateVerb(rule["verb"], `${path}.verb`);
|
|
93
|
+
};
|
|
94
|
+
export const validateElementMap = (elementMap) => {
|
|
95
|
+
if (elementMap === undefined)
|
|
96
|
+
return;
|
|
97
|
+
validateArrayOf(elementMap, "elementMap", validateElementMapRule, (path) => fail(path, "must be an array of attach rules"));
|
|
98
|
+
};
|
|
99
|
+
const validateWhen = (when, path) => {
|
|
100
|
+
if (when === undefined)
|
|
101
|
+
return;
|
|
102
|
+
const condition = requireRecord(when, path);
|
|
103
|
+
requireFieldName(condition["path"], `${path}.path`);
|
|
104
|
+
if (!PRESENCE_CONDITIONS.includes(condition["is"])) {
|
|
105
|
+
fail(`${path}.is`, `must be one of ${PRESENCE_CONDITIONS.join(", ")}`);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const validateCallArg = (value, path) => {
|
|
109
|
+
const arg = requireRecord(value, path);
|
|
110
|
+
if (arg["kind"] === "item") {
|
|
111
|
+
if (arg["path"] !== undefined)
|
|
112
|
+
requireFieldName(arg["path"], `${path}.path`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (arg["kind"] !== "value")
|
|
116
|
+
fail(`${path}.kind`, 'must be "item" or "value"');
|
|
117
|
+
};
|
|
118
|
+
const validateCallStep = (value, path) => {
|
|
119
|
+
const step = requireRecord(value, path);
|
|
120
|
+
requireMethodName(step["method"], `${path}.method`);
|
|
121
|
+
validateArrayOf(step["args"], `${path}.args`, validateCallArg, (argsPath) => fail(argsPath, "must be an array"));
|
|
122
|
+
validateWhen(step["when"], `${path}.when`);
|
|
123
|
+
};
|
|
124
|
+
const validateConstructSetter = (setter, setterPath) => {
|
|
125
|
+
const record = requireRecord(setter, setterPath);
|
|
126
|
+
requireMethodName(record["method"], `${setterPath}.method`);
|
|
127
|
+
requireFieldName(record["path"], `${setterPath}.path`);
|
|
128
|
+
if (!PRESENCE_CONDITIONS.includes(record["when"])) {
|
|
129
|
+
fail(`${setterPath}.when`, `must be one of ${PRESENCE_CONDITIONS.join(", ")}`);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const validateConstructStep = (value, path) => {
|
|
133
|
+
const step = requireRecord(value, path);
|
|
134
|
+
requireTypeName(step["type"], `${path}.type`);
|
|
135
|
+
requireMethodName(step["attach"], `${path}.attach`);
|
|
136
|
+
validateArrayOf(step["setters"], `${path}.setters`, validateConstructSetter, (settersPath) => fail(settersPath, "must be an array"));
|
|
137
|
+
};
|
|
138
|
+
const validateArrayPropRow = (value, path) => {
|
|
139
|
+
const row = requireRecord(value, path);
|
|
140
|
+
requireReactMemberName(row["itemType"], `${path}.itemType`, "ScaleMark");
|
|
141
|
+
if (row["clear"] !== undefined)
|
|
142
|
+
requireMethodName(row["clear"], `${path}.clear`);
|
|
143
|
+
if (row["set"] !== undefined)
|
|
144
|
+
requireMethodName(row["set"], `${path}.set`);
|
|
145
|
+
if (row["appendOnce"] !== undefined && typeof row["appendOnce"] !== "boolean") {
|
|
146
|
+
fail(`${path}.appendOnce`, "must be a boolean");
|
|
147
|
+
}
|
|
148
|
+
if (row["remove"] !== undefined)
|
|
149
|
+
validateCallStep(row["remove"], `${path}.remove`);
|
|
150
|
+
if (row["add"] !== undefined) {
|
|
151
|
+
validateArrayOf(row["add"], `${path}.add`, validateCallStep, (addPath) => fail(addPath, "must be an array of call steps"));
|
|
152
|
+
}
|
|
153
|
+
if (row["construct"] !== undefined)
|
|
154
|
+
validateConstructStep(row["construct"], `${path}.construct`);
|
|
155
|
+
};
|
|
156
|
+
export const validateArrayPropRows = (arrayProps) => {
|
|
157
|
+
validatePropRowMap(arrayProps, "arrayProps", validateArrayPropRow);
|
|
158
|
+
};
|
|
159
|
+
const validateObjectPropRow = (value, path) => {
|
|
160
|
+
const row = requireRecord(value, path);
|
|
161
|
+
requireReactMemberName(row["itemType"], `${path}.itemType`, "DragSourceIcon");
|
|
162
|
+
validateArrayOf(row["set"], `${path}.set`, validateCallStep, (setPath) => fail(setPath, "must be an array of call steps"));
|
|
163
|
+
if (row["unset"] !== undefined) {
|
|
164
|
+
validateArrayOf(row["unset"], `${path}.unset`, validateCallStep, (unsetPath) => fail(unsetPath, "must be an array of call steps"));
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
export const validateObjectPropRows = (objectProps) => {
|
|
168
|
+
validatePropRowMap(objectProps, "objectProps", validateObjectPropRow);
|
|
169
|
+
};
|
|
170
|
+
const QUALIFIED_TYPE_PATTERN = /^[A-Z][A-Za-z0-9]*\.[A-Z][A-Za-z0-9]*$/;
|
|
171
|
+
const validateVirtualPropRow = (value, path) => {
|
|
172
|
+
const row = requireRecord(value, path);
|
|
173
|
+
if (typeof row["type"] !== "string" || !QUALIFIED_TYPE_PATTERN.test(row["type"])) {
|
|
174
|
+
fail(`${path}.type`, `must be a qualified GIR type (e.g. "Gtk.DrawingAreaDrawFunc")`);
|
|
175
|
+
}
|
|
176
|
+
requireMethodName(row["setter"], `${path}.setter`);
|
|
177
|
+
if (row["after"] !== undefined)
|
|
178
|
+
requireMethodName(row["after"], `${path}.after`);
|
|
179
|
+
};
|
|
180
|
+
export const validateVirtualPropRows = (virtualProps) => {
|
|
181
|
+
validatePropRowMap(virtualProps, "virtualProps", validateVirtualPropRow);
|
|
182
|
+
};
|
|
183
|
+
const validatePropRowMap = (value, tableName, validateRow) => {
|
|
184
|
+
if (value === undefined)
|
|
185
|
+
return;
|
|
186
|
+
const map = requireRecord(value, tableName);
|
|
187
|
+
for (const [jsxName, props] of Object.entries(map)) {
|
|
188
|
+
requireTypeName(jsxName, `${tableName} key "${jsxName}"`);
|
|
189
|
+
const propMap = requireRecord(props, `${tableName}.${jsxName}`);
|
|
190
|
+
if (Object.keys(propMap).length === 0) {
|
|
191
|
+
fail(`${tableName}.${jsxName}`, "must declare at least one prop");
|
|
192
|
+
}
|
|
193
|
+
for (const [propName, row] of Object.entries(propMap)) {
|
|
194
|
+
requireMethodName(propName, `${tableName}.${jsxName} prop "${propName}"`);
|
|
195
|
+
validateRow(row, `${tableName}.${jsxName}.${propName}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=table-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-schema.js","sourceRoot":"","sources":["../src/table-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const PASCAL_CASE_NAME_PATTERN: RegExp;
|
|
2
|
+
export declare const CAMEL_CASE_NAME_PATTERN: RegExp;
|
|
3
|
+
export declare const validateArrayOf: (value: unknown, path: string, validateElement: (element: unknown, elementPath: string) => void, onNotArray: (path: string) => never) => void;
|
|
4
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,EAAE,MAA8B,CAAC;AAEtE,eAAO,MAAM,uBAAuB,EAAE,MAA8B,CAAC;AAErE,eAAO,MAAM,eAAe,GACxB,OAAO,OAAO,EACd,MAAM,MAAM,EACZ,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EAChE,YAAY,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,KACpC,IAKF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const PASCAL_CASE_NAME_PATTERN = /^[A-Z][A-Za-z0-9]*$/;
|
|
2
|
+
export const CAMEL_CASE_NAME_PATTERN = /^[a-z][A-Za-z0-9]*$/;
|
|
3
|
+
export const validateArrayOf = (value, path, validateElement, onNotArray) => {
|
|
4
|
+
if (!Array.isArray(value))
|
|
5
|
+
onNotArray(path);
|
|
6
|
+
value.forEach((element, index) => {
|
|
7
|
+
validateElement(element, `${path}[${index}]`);
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAW,qBAAqB,CAAC;AAEtE,MAAM,CAAC,MAAM,uBAAuB,GAAW,qBAAqB,CAAC;AAErE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC3B,KAAc,EACd,IAAY,EACZ,eAAgE,EAChE,UAAmC,EAC/B,EAAE;IACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC7B,eAAe,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ResolvedGtkxConfig } 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 type SerializedGtkxConfig = Pick<ResolvedGtkxConfig, "libraries" | "girPath" | "applicationId" | "containerProps" | "arrayProps" | "objectProps" | "virtualProps" | "elementMap" | "reactCompiler">;
|
|
5
|
+
export declare const serializeGtkxConfig: (config: ResolvedGtkxConfig) => SerializedGtkxConfig;
|
|
6
|
+
export declare const renderGtkxConfigModule: (config: ResolvedGtkxConfig) => string;
|
|
7
|
+
//# sourceMappingURL=virtual.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,eAAO,MAAM,+BAA+B,EAAE,MAAsC,CAAC;AAIrF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACnC,kBAAkB,EAChB,WAAW,GACX,SAAS,GACT,eAAe,GACf,gBAAgB,GAChB,YAAY,GACZ,aAAa,GACb,cAAc,GACd,YAAY,GACZ,eAAe,CACpB,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,QAAQ,kBAAkB,KAAG,oBAU/D,CAAC;AAEH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,kBAAkB,KAAG,MAMpD,CAAC"}
|
package/dist/virtual.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
|
|
2
|
+
export const RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\0${GTKX_CONFIG_VIRTUAL_ID}`;
|
|
3
|
+
const METADATA_SPECIFIER = "@gtkx/jsx/metadata";
|
|
4
|
+
const serializeConfigValue = (value) => (value === undefined ? "undefined" : JSON.stringify(value));
|
|
5
|
+
export const serializeGtkxConfig = (config) => ({
|
|
6
|
+
libraries: config.libraries,
|
|
7
|
+
girPath: config.girPath,
|
|
8
|
+
applicationId: config.applicationId,
|
|
9
|
+
containerProps: config.containerProps,
|
|
10
|
+
arrayProps: config.arrayProps,
|
|
11
|
+
objectProps: config.objectProps,
|
|
12
|
+
virtualProps: config.virtualProps,
|
|
13
|
+
elementMap: config.elementMap,
|
|
14
|
+
reactCompiler: config.reactCompiler,
|
|
15
|
+
});
|
|
16
|
+
export const renderGtkxConfigModule = (config) => [
|
|
17
|
+
`export * from ${JSON.stringify(METADATA_SPECIFIER)};`,
|
|
18
|
+
...Object.entries(serializeGtkxConfig(config)).map(([key, value]) => `export const ${key} = ${serializeConfigValue(value)};`),
|
|
19
|
+
].join("\n");
|
|
20
|
+
//# sourceMappingURL=virtual.js.map
|
|
@@ -0,0 +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,oBAAoB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAErH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA0B,EAAwB,EAAE,CAAC,CAAC;IACtF,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,aAAa,EAAE,MAAM,CAAC,aAAa;IACnC,cAAc,EAAE,MAAM,CAAC,cAAc;IACrC,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;IAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;IACjC,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAA0B,EAAU,EAAE,CACzE;IACI,iBAAiB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG;IACtD,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAC9C,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,gBAAgB,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAC5E;CACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const WRAPPER_NODE_ELEMENT = "__GTKX_WRAPPER_NODE__";
|
|
2
|
+
export declare const META_OBJECT_KIND = "meta-object";
|
|
3
|
+
export declare const LAYOUT_CHILD_KIND = "layout-child";
|
|
4
|
+
export declare const OVERLAY_KIND = "overlay";
|
|
5
|
+
export declare const TAB_LABEL_KIND = "tab-label";
|
|
6
|
+
export declare const SLOT_KIND = "slot";
|
|
7
|
+
export declare const CONTAINER_PROP_KIND = "container-slot";
|
|
8
|
+
export declare const TEXT_ANCHOR_KIND = "text-anchor";
|
|
9
|
+
export declare const TEXT_PAINTABLE_KIND = "text-paintable";
|
|
10
|
+
export declare const BUFFER_TEXT_KIND = "text";
|
|
11
|
+
export declare const LABEL_TEXT_KIND = "label-text";
|
|
12
|
+
//# sourceMappingURL=wrapper-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper-protocol.d.ts","sourceRoot":"","sources":["../src/wrapper-protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAE9C,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,eAAO,MAAM,YAAY,YAAY,CAAC;AAEtC,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAE9C,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC,eAAO,MAAM,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const WRAPPER_NODE_ELEMENT = "__GTKX_WRAPPER_NODE__";
|
|
2
|
+
export const META_OBJECT_KIND = "meta-object";
|
|
3
|
+
export const LAYOUT_CHILD_KIND = "layout-child";
|
|
4
|
+
export const OVERLAY_KIND = "overlay";
|
|
5
|
+
export const TAB_LABEL_KIND = "tab-label";
|
|
6
|
+
export const SLOT_KIND = "slot";
|
|
7
|
+
export const CONTAINER_PROP_KIND = "container-slot";
|
|
8
|
+
export const TEXT_ANCHOR_KIND = "text-anchor";
|
|
9
|
+
export const TEXT_PAINTABLE_KIND = "text-paintable";
|
|
10
|
+
export const BUFFER_TEXT_KIND = "text";
|
|
11
|
+
export const LABEL_TEXT_KIND = "label-text";
|
|
12
|
+
//# sourceMappingURL=wrapper-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper-protocol.js","sourceRoot":"","sources":["../src/wrapper-protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAEhC,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC"}
|
package/env.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare module "virtual:gtkx-config" {
|
|
2
|
+
export const SIGNALS: import("@gtkx/config").PerElementPropRows<string>;
|
|
3
|
+
export const CONSTRUCT_ONLY_PROPS: Record<string, Set<string>>;
|
|
4
|
+
export const CONSTRUCT_PROPS: Record<string, Set<string>>;
|
|
5
|
+
export const DEFAULT_PROPS: import("@gtkx/config").PerElementPropRows<unknown>;
|
|
6
|
+
export const ELEMENT_MAP: import("@gtkx/config").ElementMapRule[];
|
|
7
|
+
export const ARRAY_PROPS: import("@gtkx/config").PerElementPropRows<import("@gtkx/config").ArrayPropRow>;
|
|
8
|
+
export const OBJECT_PROPS: import("@gtkx/config").PerElementPropRows<import("@gtkx/config").ObjectPropRow>;
|
|
9
|
+
export const VIRTUAL_PROPS: import("@gtkx/config").PerElementPropRows<import("@gtkx/config").VirtualPropRow>;
|
|
10
|
+
export const PROP_RULES: Record<string, import("@gtkx/config").PropRule[]>;
|
|
11
|
+
export const TOP_LEVEL_TYPES: string[];
|
|
12
|
+
export const DEFAULT_BLOCKABLE_TYPES: string[];
|
|
13
|
+
export const META_OBJECT_ADD_METHODS: Record<string, import("@gtkx/config").AddMethodRule[]>;
|
|
14
|
+
export const PAGE_META_SETTERS: import("@gtkx/config").PageMetaSetter[];
|
|
15
|
+
export const CONTAINER_PROPS: import("@gtkx/config").PerElementPropRows<import("@gtkx/config").ContainerPropRow>;
|
|
16
|
+
export const ATTACH_SHAPES: import("@gtkx/config").AttachShapeTable;
|
|
17
|
+
export const libraries: import("@gtkx/config").ResolvedGtkxConfig["libraries"];
|
|
18
|
+
export const girPath: import("@gtkx/config").ResolvedGtkxConfig["girPath"];
|
|
19
|
+
export const applicationId: import("@gtkx/config").ResolvedGtkxConfig["applicationId"];
|
|
20
|
+
export const containerProps: import("@gtkx/config").ResolvedGtkxConfig["containerProps"];
|
|
21
|
+
export const arrayProps: import("@gtkx/config").ResolvedGtkxConfig["arrayProps"];
|
|
22
|
+
export const objectProps: import("@gtkx/config").ResolvedGtkxConfig["objectProps"];
|
|
23
|
+
export const virtualProps: import("@gtkx/config").ResolvedGtkxConfig["virtualProps"];
|
|
24
|
+
export const elementMap: import("@gtkx/config").ResolvedGtkxConfig["elementMap"];
|
|
25
|
+
export const reactCompiler: import("@gtkx/config").ResolvedGtkxConfig["reactCompiler"];
|
|
26
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gtkx/config",
|
|
3
|
+
"version": "0.21.0",
|
|
4
|
+
"description": "gtkx.config.ts schema, validation, and loader shared by the GTKX toolchain",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"gtkx",
|
|
7
|
+
"gtk",
|
|
8
|
+
"gtk4",
|
|
9
|
+
"react",
|
|
10
|
+
"typescript",
|
|
11
|
+
"config",
|
|
12
|
+
"linux",
|
|
13
|
+
"desktop"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://gtkx.dev",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/gtkx-org/gtkx/issues"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/gtkx-org/gtkx.git",
|
|
22
|
+
"directory": "packages/config"
|
|
23
|
+
},
|
|
24
|
+
"license": "MPL-2.0",
|
|
25
|
+
"author": "Eugenio Depalo <eugeniodepalo@gmail.com>",
|
|
26
|
+
"type": "module",
|
|
27
|
+
"exports": {
|
|
28
|
+
"./package.json": "./package.json",
|
|
29
|
+
".": {
|
|
30
|
+
"source": "./src/index.ts",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./env": {
|
|
35
|
+
"types": "./env.d.ts"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"src",
|
|
42
|
+
"env.d.ts"
|
|
43
|
+
],
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"c12": "^3.3.4",
|
|
46
|
+
"vite": "^8.0.16",
|
|
47
|
+
"@gtkx/utils": "0.21.0"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -b"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const gtkxBundledModulePatterns: RegExp[] = [/@gtkx\/(config|ffi|gi|react|jsx|testing|css)/, /[/\\]\.gtkx[/\\]/];
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { isValidApplicationId } from "@gtkx/utils";
|
|
2
|
+
import {
|
|
3
|
+
type ArrayPropRow,
|
|
4
|
+
type ContainerPropRow,
|
|
5
|
+
type ElementMapRule,
|
|
6
|
+
type ObjectPropRow,
|
|
7
|
+
type PerElementPropRows,
|
|
8
|
+
type UserTableRows,
|
|
9
|
+
type VirtualPropRow,
|
|
10
|
+
validateArrayPropRows,
|
|
11
|
+
validateContainerPropRows,
|
|
12
|
+
validateElementMap,
|
|
13
|
+
validateObjectPropRows,
|
|
14
|
+
validateVirtualPropRows,
|
|
15
|
+
} from "./table-schema.js";
|
|
16
|
+
|
|
17
|
+
export const LIBRARIES_WILDCARD = "*";
|
|
18
|
+
|
|
19
|
+
export const GIR_NAMESPACE_PATTERN: RegExp = /^[A-Za-z][A-Za-z0-9]*-\d+(?:\.\d+)*$/;
|
|
20
|
+
|
|
21
|
+
export type GtkxConfig = UserTableRows & {
|
|
22
|
+
libraries?: typeof LIBRARIES_WILDCARD | string[];
|
|
23
|
+
|
|
24
|
+
girPath?: string[];
|
|
25
|
+
|
|
26
|
+
applicationId?: string;
|
|
27
|
+
|
|
28
|
+
reactCompiler?: boolean | ReactCompilerOptions;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type ReactCompilerCompilationMode = "infer" | "syntax" | "annotation" | "all";
|
|
32
|
+
|
|
33
|
+
export type ReactCompilerPanicThreshold = "none" | "critical_errors" | "all_errors";
|
|
34
|
+
|
|
35
|
+
export type ReactCompilerOptions = {
|
|
36
|
+
compilationMode?: ReactCompilerCompilationMode;
|
|
37
|
+
panicThreshold?: ReactCompilerPanicThreshold;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type ResolvedReactCompilerOptions = ReactCompilerOptions & {
|
|
41
|
+
target: "19";
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const REACT_COMPILER_TARGET = "19";
|
|
45
|
+
|
|
46
|
+
export const resolveReactCompilerOptions = (
|
|
47
|
+
setting: GtkxConfig["reactCompiler"],
|
|
48
|
+
): ResolvedReactCompilerOptions | null => {
|
|
49
|
+
if (setting === false) return null;
|
|
50
|
+
const overrides = setting === undefined || setting === true ? {} : setting;
|
|
51
|
+
return { ...overrides, target: REACT_COMPILER_TARGET };
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const validateLibraryEntry = (library: unknown): void => {
|
|
55
|
+
if (typeof library === "string" && GIR_NAMESPACE_PATTERN.test(library)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (library === LIBRARIES_WILDCARD) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
'gtkx.config.ts: to generate every library, set `libraries: "*"` as a bare string, not an array entry',
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
throw new Error(
|
|
64
|
+
`gtkx.config.ts: invalid library identifier "${String(library)}" — must be of the form "Name-Version" (e.g. "Gtk-4.0")`,
|
|
65
|
+
);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const validateLibraries = (libraries: GtkxConfig["libraries"]): void => {
|
|
69
|
+
if (libraries === undefined || libraries === LIBRARIES_WILDCARD) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!Array.isArray(libraries) || libraries.length === 0) {
|
|
73
|
+
throw new Error('gtkx.config.ts: `libraries` must be "*", a non-empty string array, or omitted');
|
|
74
|
+
}
|
|
75
|
+
for (const library of libraries) {
|
|
76
|
+
validateLibraryEntry(library);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const validateGirPath = (girPath: GtkxConfig["girPath"]): void => {
|
|
81
|
+
if (girPath !== undefined && !Array.isArray(girPath)) {
|
|
82
|
+
throw new Error("gtkx.config.ts: `girPath` must be an array of strings if provided");
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const validateApplicationId = (applicationId: GtkxConfig["applicationId"]): void => {
|
|
87
|
+
if (applicationId === undefined) return;
|
|
88
|
+
if (typeof applicationId !== "string" || !isValidApplicationId(applicationId)) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`gtkx.config.ts: invalid \`applicationId\` "${String(applicationId)}" — ` +
|
|
91
|
+
`must satisfy g_application_id_is_valid (e.g. "org.example.MyApp")`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const REACT_COMPILER_COMPILATION_MODES: ReactCompilerCompilationMode[] = ["infer", "syntax", "annotation", "all"];
|
|
97
|
+
|
|
98
|
+
const REACT_COMPILER_PANIC_THRESHOLDS: ReactCompilerPanicThreshold[] = ["none", "critical_errors", "all_errors"];
|
|
99
|
+
|
|
100
|
+
const validateReactCompilerEnum = <T extends string>(value: T | undefined, allowed: T[], field: string): void => {
|
|
101
|
+
if (value !== undefined && !allowed.includes(value)) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`gtkx.config.ts: invalid \`reactCompiler.${field}\` "${String(value)}" — must be one of ${allowed.join(", ")}`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const validateReactCompiler = (reactCompiler: GtkxConfig["reactCompiler"]): void => {
|
|
109
|
+
if (reactCompiler === undefined || typeof reactCompiler === "boolean") return;
|
|
110
|
+
if (typeof reactCompiler !== "object" || reactCompiler === null || Array.isArray(reactCompiler)) {
|
|
111
|
+
throw new Error("gtkx.config.ts: `reactCompiler` must be a boolean or an options object");
|
|
112
|
+
}
|
|
113
|
+
validateReactCompilerEnum(reactCompiler.compilationMode, REACT_COMPILER_COMPILATION_MODES, "compilationMode");
|
|
114
|
+
validateReactCompilerEnum(reactCompiler.panicThreshold, REACT_COMPILER_PANIC_THRESHOLDS, "panicThreshold");
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const validateGtkxConfig = (config: GtkxConfig): void => {
|
|
118
|
+
validateLibraries(config.libraries);
|
|
119
|
+
validateGirPath(config.girPath);
|
|
120
|
+
validateApplicationId(config.applicationId);
|
|
121
|
+
validateContainerPropRows(config.containerProps);
|
|
122
|
+
validateArrayPropRows(config.arrayProps);
|
|
123
|
+
validateObjectPropRows(config.objectProps);
|
|
124
|
+
validateVirtualPropRows(config.virtualProps);
|
|
125
|
+
validateElementMap(config.elementMap);
|
|
126
|
+
validateReactCompiler(config.reactCompiler);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export type GtkxConfigEnv = {
|
|
130
|
+
mode?: string;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export type GtkxConfigFn = (env: GtkxConfigEnv) => GtkxConfig;
|
|
134
|
+
|
|
135
|
+
export type GtkxConfigFnPromise = (env: GtkxConfigEnv) => Promise<GtkxConfig>;
|
|
136
|
+
|
|
137
|
+
export type GtkxConfigExport = GtkxConfig | Promise<GtkxConfig> | GtkxConfigFn | GtkxConfigFnPromise;
|
|
138
|
+
|
|
139
|
+
export function defineConfig(config: GtkxConfig): GtkxConfig;
|
|
140
|
+
export function defineConfig(config: Promise<GtkxConfig>): Promise<GtkxConfig>;
|
|
141
|
+
export function defineConfig(config: GtkxConfigFn): GtkxConfigFn;
|
|
142
|
+
export function defineConfig(config: GtkxConfigFnPromise): GtkxConfigFnPromise;
|
|
143
|
+
export function defineConfig(config: GtkxConfigExport): GtkxConfigExport;
|
|
144
|
+
export function defineConfig(config: GtkxConfigExport): GtkxConfigExport {
|
|
145
|
+
return config;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const isMergeableObject = (value: unknown): value is Record<string, unknown> =>
|
|
149
|
+
typeof value === "object" && value !== null && !Array.isArray(value);
|
|
150
|
+
|
|
151
|
+
const mergeConfigValue = (base: unknown, override: unknown): unknown => {
|
|
152
|
+
if (override === undefined) return base;
|
|
153
|
+
if (base === undefined) return override;
|
|
154
|
+
if (Array.isArray(base) && Array.isArray(override)) return [...base, ...override];
|
|
155
|
+
if (isMergeableObject(base) && isMergeableObject(override)) {
|
|
156
|
+
const merged: Record<string, unknown> = { ...base };
|
|
157
|
+
for (const key of Object.keys(override)) {
|
|
158
|
+
merged[key] = mergeConfigValue(base[key], override[key]);
|
|
159
|
+
}
|
|
160
|
+
return merged;
|
|
161
|
+
}
|
|
162
|
+
return override;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
export const mergeConfig = (base: GtkxConfig, override: GtkxConfig): GtkxConfig =>
|
|
166
|
+
mergeConfigValue(base, override) as GtkxConfig;
|
|
167
|
+
|
|
168
|
+
export type ResolvedGtkxConfig = {
|
|
169
|
+
libraries: typeof LIBRARIES_WILDCARD | string[];
|
|
170
|
+
girPath: string[];
|
|
171
|
+
applicationId: string | undefined;
|
|
172
|
+
containerProps: PerElementPropRows<ContainerPropRow>;
|
|
173
|
+
arrayProps: PerElementPropRows<ArrayPropRow>;
|
|
174
|
+
objectProps: PerElementPropRows<ObjectPropRow>;
|
|
175
|
+
virtualProps: PerElementPropRows<VirtualPropRow>;
|
|
176
|
+
elementMap: ElementMapRule[];
|
|
177
|
+
reactCompiler: ResolvedReactCompilerOptions | null;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export const resolveGtkxConfig = (config: GtkxConfig): ResolvedGtkxConfig => ({
|
|
181
|
+
libraries: config.libraries ?? [],
|
|
182
|
+
girPath: config.girPath ?? [],
|
|
183
|
+
applicationId: config.applicationId,
|
|
184
|
+
containerProps: config.containerProps ?? {},
|
|
185
|
+
arrayProps: config.arrayProps ?? {},
|
|
186
|
+
objectProps: config.objectProps ?? {},
|
|
187
|
+
virtualProps: config.virtualProps ?? {},
|
|
188
|
+
elementMap: config.elementMap ?? [],
|
|
189
|
+
reactCompiler: resolveReactCompilerOptions(config.reactCompiler),
|
|
190
|
+
});
|
|
191
|
+
|
package/src/data-dir.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
export const DATA_IMPORT_PREFIX = "#data";
|
|
5
|
+
|
|
6
|
+
export const DATA_IMPORT_KEY: string = `${DATA_IMPORT_PREFIX}/*`;
|
|
7
|
+
|
|
8
|
+
const CONDITION_PRIORITY = ["default", "import", "node"] as const;
|
|
9
|
+
|
|
10
|
+
const targetString = (entry: unknown): string | null => {
|
|
11
|
+
if (typeof entry === "string") return entry;
|
|
12
|
+
if (entry !== null && typeof entry === "object" && !Array.isArray(entry)) {
|
|
13
|
+
const conditions = entry as Record<string, unknown>;
|
|
14
|
+
for (const condition of CONDITION_PRIORITY) {
|
|
15
|
+
const value = conditions[condition];
|
|
16
|
+
if (typeof value === "string") return value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const DATA_TARGET_PATTERN = /^\.?\/?(.+?)\/\*$/;
|
|
23
|
+
|
|
24
|
+
const directoryFromTarget = (target: string): string | null => {
|
|
25
|
+
const match = DATA_TARGET_PATTERN.exec(target);
|
|
26
|
+
return match?.[1] ?? null;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const resolveDataDir = (root: string): string | null => {
|
|
30
|
+
let manifest: { imports?: Record<string, unknown> };
|
|
31
|
+
try {
|
|
32
|
+
manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf-8"));
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const target = targetString(manifest.imports?.[DATA_IMPORT_KEY]);
|
|
37
|
+
if (target === null) return null;
|
|
38
|
+
return directoryFromTarget(target);
|
|
39
|
+
};
|