@gtkx/codegen 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +2 -1
  2. package/dist/analysis/descriptor-render.d.ts +7 -1
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +36 -15
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +4 -1
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +11 -2
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/param-capability.d.ts +5 -2
  11. package/dist/analysis/param-capability.d.ts.map +1 -1
  12. package/dist/analysis/param-capability.js +36 -4
  13. package/dist/analysis/param-capability.js.map +1 -1
  14. package/dist/analysis/param-structure.d.ts +1 -1
  15. package/dist/analysis/param-structure.d.ts.map +1 -1
  16. package/dist/analysis/param-structure.js.map +1 -1
  17. package/dist/analysis/ts-type.d.ts +1 -1
  18. package/dist/analysis/ts-type.d.ts.map +1 -1
  19. package/dist/analysis/ts-type.js +28 -10
  20. package/dist/analysis/ts-type.js.map +1 -1
  21. package/dist/compile.js +1 -1
  22. package/dist/compile.js.map +1 -1
  23. package/dist/docs/api-reference.d.ts +6 -0
  24. package/dist/docs/api-reference.d.ts.map +1 -1
  25. package/dist/docs/api-reference.js +11 -2
  26. package/dist/docs/api-reference.js.map +1 -1
  27. package/dist/docs/pipeline.d.ts +3 -0
  28. package/dist/docs/pipeline.d.ts.map +1 -1
  29. package/dist/docs/pipeline.js +10 -1
  30. package/dist/docs/pipeline.js.map +1 -1
  31. package/dist/fingerprint.d.ts +5 -0
  32. package/dist/fingerprint.d.ts.map +1 -1
  33. package/dist/fingerprint.js +107 -15
  34. package/dist/fingerprint.js.map +1 -1
  35. package/dist/gi.d.ts +3 -0
  36. package/dist/gi.d.ts.map +1 -1
  37. package/dist/gi.js +29 -7
  38. package/dist/gi.js.map +1 -1
  39. package/dist/gir/external-namespaces.d.ts +8 -0
  40. package/dist/gir/external-namespaces.d.ts.map +1 -0
  41. package/dist/gir/external-namespaces.js +4 -0
  42. package/dist/gir/external-namespaces.js.map +1 -0
  43. package/dist/gir/finish-overrides.d.ts +3 -0
  44. package/dist/gir/finish-overrides.d.ts.map +1 -0
  45. package/dist/gir/finish-overrides.js +5 -0
  46. package/dist/gir/finish-overrides.js.map +1 -0
  47. package/dist/gir/function.d.ts +5 -2
  48. package/dist/gir/function.d.ts.map +1 -1
  49. package/dist/gir/function.js +34 -5
  50. package/dist/gir/function.js.map +1 -1
  51. package/dist/gir/hidden-symbols.d.ts +3 -0
  52. package/dist/gir/hidden-symbols.d.ts.map +1 -0
  53. package/dist/gir/hidden-symbols.js +39 -0
  54. package/dist/gir/hidden-symbols.js.map +1 -0
  55. package/dist/gir/library.d.ts +22 -2
  56. package/dist/gir/library.d.ts.map +1 -1
  57. package/dist/gir/library.js +21 -3
  58. package/dist/gir/library.js.map +1 -1
  59. package/dist/gir/ucs4-overrides.d.ts +3 -0
  60. package/dist/gir/ucs4-overrides.d.ts.map +1 -0
  61. package/dist/gir/ucs4-overrides.js +7 -0
  62. package/dist/gir/ucs4-overrides.js.map +1 -0
  63. package/dist/jsx.d.ts.map +1 -1
  64. package/dist/jsx.js +27 -8
  65. package/dist/jsx.js.map +1 -1
  66. package/dist/runner.d.ts +8 -0
  67. package/dist/runner.d.ts.map +1 -1
  68. package/dist/runner.js +9 -3
  69. package/dist/runner.js.map +1 -1
  70. package/dist/store/external-package-links.d.ts +6 -0
  71. package/dist/store/external-package-links.d.ts.map +1 -0
  72. package/dist/store/external-package-links.js +158 -0
  73. package/dist/store/external-package-links.js.map +1 -0
  74. package/dist/store/gi/callable-doc.d.ts.map +1 -1
  75. package/dist/store/gi/callable-doc.js +4 -4
  76. package/dist/store/gi/callable-doc.js.map +1 -1
  77. package/dist/store/gi/callables.js +1 -1
  78. package/dist/store/gi/callables.js.map +1 -1
  79. package/dist/store/gi/class.d.ts.map +1 -1
  80. package/dist/store/gi/class.js +17 -0
  81. package/dist/store/gi/class.js.map +1 -1
  82. package/dist/store/gi/constructor-props.js +1 -1
  83. package/dist/store/gi/constructor-props.js.map +1 -1
  84. package/dist/store/gi/function.d.ts.map +1 -1
  85. package/dist/store/gi/function.js +2 -1
  86. package/dist/store/gi/function.js.map +1 -1
  87. package/dist/store/gi/gtype-binding.d.ts +2 -1
  88. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  89. package/dist/store/gi/gtype-binding.js +6 -1
  90. package/dist/store/gi/gtype-binding.js.map +1 -1
  91. package/dist/store/gi/method.d.ts +7 -2
  92. package/dist/store/gi/method.d.ts.map +1 -1
  93. package/dist/store/gi/method.js +126 -30
  94. package/dist/store/gi/method.js.map +1 -1
  95. package/dist/store/gi/param-marshal.d.ts +8 -1
  96. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  97. package/dist/store/gi/param-marshal.js +52 -4
  98. package/dist/store/gi/param-marshal.js.map +1 -1
  99. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  100. package/dist/store/gi/record-constructor.js +2 -3
  101. package/dist/store/gi/record-constructor.js.map +1 -1
  102. package/dist/store/gi/record-field-accessor.d.ts +2 -1
  103. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  104. package/dist/store/gi/record-field-accessor.js +9 -3
  105. package/dist/store/gi/record-field-accessor.js.map +1 -1
  106. package/dist/store/gi/runtime-override.js +1 -1
  107. package/dist/store/gi/runtime-override.js.map +1 -1
  108. package/dist/store/gi/signal.js +2 -2
  109. package/dist/store/gi/signal.js.map +1 -1
  110. package/dist/store/gi/vtable.d.ts.map +1 -1
  111. package/dist/store/gi/vtable.js +82 -12
  112. package/dist/store/gi/vtable.js.map +1 -1
  113. package/dist/store/gi-store.d.ts +7 -2
  114. package/dist/store/gi-store.d.ts.map +1 -1
  115. package/dist/store/gi-store.js +19 -4
  116. package/dist/store/gi-store.js.map +1 -1
  117. package/dist/store/jsx/jsx.d.ts.map +1 -1
  118. package/dist/store/jsx/jsx.js +3 -1
  119. package/dist/store/jsx/jsx.js.map +1 -1
  120. package/dist/store/jsx-store.d.ts +8 -1
  121. package/dist/store/jsx-store.d.ts.map +1 -1
  122. package/dist/store/jsx-store.js +9 -2
  123. package/dist/store/jsx-store.js.map +1 -1
  124. package/dist/store/resolve-store.d.ts +2 -1
  125. package/dist/store/resolve-store.d.ts.map +1 -1
  126. package/dist/store/resolve-store.js +2 -1
  127. package/dist/store/resolve-store.js.map +1 -1
  128. package/dist/store/store-fs.d.ts +2 -1
  129. package/dist/store/store-fs.d.ts.map +1 -1
  130. package/dist/store/store-fs.js +8 -3
  131. package/dist/store/store-fs.js.map +1 -1
  132. package/dist/writer/context.d.ts.map +1 -1
  133. package/dist/writer/context.js +8 -0
  134. package/dist/writer/context.js.map +1 -1
  135. package/dist/writer/gtk-doc.d.ts.map +1 -1
  136. package/dist/writer/gtk-doc.js +27 -1
  137. package/dist/writer/gtk-doc.js.map +1 -1
  138. package/overrides/gdk/rgba.ts.ejs +15 -1
  139. package/overrides/glib/index.ts.ejs +3 -0
  140. package/overrides/glib/regex.ts.ejs +66 -0
  141. package/overrides/gobject/index.ts.ejs +3 -0
  142. package/overrides/gobject/object-class.ts.ejs +27 -0
  143. package/overrides/gobject/param-spec-getters.ts.ejs +57 -0
  144. package/overrides/gobject/param-spec.ts.ejs +21 -0
  145. package/overrides/gobject/value.ts.ejs +6 -1
  146. package/overrides/graphene/structs.ts.ejs +38 -3
  147. package/overrides/gtk/index.ts.ejs +2 -0
  148. package/overrides/gtk/widget-class.ts.ejs +28 -0
  149. package/package.json +6 -5
  150. package/src/analysis/descriptor-render.ts +59 -16
  151. package/src/analysis/descriptor.ts +15 -3
  152. package/src/analysis/param-capability.ts +68 -5
  153. package/src/analysis/param-structure.ts +1 -1
  154. package/src/analysis/ts-type.ts +45 -11
  155. package/src/compile.ts +1 -1
  156. package/src/docs/api-reference.ts +20 -2
  157. package/src/docs/pipeline.ts +15 -1
  158. package/src/fingerprint.ts +144 -16
  159. package/src/gi.ts +44 -9
  160. package/src/gir/external-namespaces.ts +8 -0
  161. package/src/gir/finish-overrides.ts +5 -0
  162. package/src/gir/function.ts +52 -14
  163. package/src/gir/hidden-symbols.ts +39 -0
  164. package/src/gir/library.ts +36 -3
  165. package/src/gir/ucs4-overrides.ts +7 -0
  166. package/src/jsx.ts +33 -8
  167. package/src/runner.ts +17 -3
  168. package/src/store/external-package-links.ts +226 -0
  169. package/src/store/gi/callable-doc.ts +8 -4
  170. package/src/store/gi/callables.ts +1 -1
  171. package/src/store/gi/class.ts +29 -0
  172. package/src/store/gi/constructor-props.ts +1 -1
  173. package/src/store/gi/function.ts +2 -1
  174. package/src/store/gi/gtype-binding.ts +8 -1
  175. package/src/store/gi/method.ts +189 -36
  176. package/src/store/gi/param-marshal.ts +67 -4
  177. package/src/store/gi/record-constructor.ts +8 -3
  178. package/src/store/gi/record-field-accessor.ts +11 -2
  179. package/src/store/gi/runtime-override.ts +1 -1
  180. package/src/store/gi/signal.ts +2 -2
  181. package/src/store/gi/vtable.ts +118 -11
  182. package/src/store/gi-store.ts +33 -3
  183. package/src/store/jsx/jsx.ts +3 -1
  184. package/src/store/jsx-store.ts +23 -7
  185. package/src/store/resolve-store.ts +2 -1
  186. package/src/store/store-fs.ts +10 -2
  187. package/src/writer/context.ts +11 -0
  188. package/src/writer/gtk-doc.ts +38 -1
  189. package/overrides/cairo/context.ts.ejs +0 -1269
  190. package/overrides/cairo/font-face.ts.ejs +0 -151
  191. package/overrides/cairo/font-options.ts.ejs +0 -199
  192. package/overrides/cairo/image-surface.ts.ejs +0 -132
  193. package/overrides/cairo/index.ts.ejs +0 -22
  194. package/overrides/cairo/matrix.ts.ejs +0 -171
  195. package/overrides/cairo/pattern.ts.ejs +0 -476
  196. package/overrides/cairo/recording-surface.ts.ejs +0 -102
  197. package/overrides/cairo/region.ts.ejs +0 -237
  198. package/overrides/cairo/scaled-font.ts.ejs +0 -330
  199. package/overrides/cairo/surface.ts.ejs +0 -296
@@ -1,26 +1,110 @@
1
- import { sortStrings } from "@gtkx/utils";
2
1
  import { createHash } from "node:crypto";
3
2
  import { existsSync, readdirSync, readFileSync } from "node:fs";
4
- import { dirname, join, resolve } from "node:path";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join, relative, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import packageManifest from "../package.json" with { type: "json" };
7
+ import { EXTERNAL_NAMESPACES } from "./gir/external-namespaces.js";
7
8
  import { arrayGuard, hasFields, isNumber, isString, optionalGuard } from "./guards.js";
8
9
  import { readJsonFile } from "./json.js";
9
10
  const FINGERPRINT_FILENAME = ".codegen-fingerprint.json";
10
- const CODEGEN_VERSION = packageManifest.version;
11
- const OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "overrides");
12
- const sortAlpha = (values) => sortStrings(values).join(",");
13
- const overrideFiles = () => {
14
- if (!existsSync(OVERRIDES_ROOT)) {
11
+ const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
12
+ const OVERRIDES_ROOT = join(PACKAGE_ROOT, "overrides");
13
+ const requireFromCodegen = createRequire(import.meta.url);
14
+ const codegenHashCache = new Map();
15
+ const compareOrdinal = (a, b) => {
16
+ if (a < b) {
17
+ return -1;
18
+ }
19
+ return a > b ? 1 : 0;
20
+ };
21
+ const sortOrdinal = (values) => values.toSorted(compareOrdinal);
22
+ const sortAlpha = (values) => sortOrdinal(values).join(",");
23
+ const filesUnder = (root) => {
24
+ if (!existsSync(root)) {
15
25
  return [];
16
26
  }
17
- return readdirSync(OVERRIDES_ROOT, { recursive: true, withFileTypes: true })
27
+ return readdirSync(root, { recursive: true, withFileTypes: true })
18
28
  .filter((entry) => entry.isFile())
19
29
  .map((entry) => join(entry.parentPath, entry.name));
20
30
  };
31
+ const hashTree = (hash, label, root) => {
32
+ const files = sortOrdinal(filesUnder(root));
33
+ for (const file of files) {
34
+ hash.update("\n");
35
+ hash.update(join(label, relative(root, file)));
36
+ hash.update("\0");
37
+ hash.update(readFileSync(file));
38
+ }
39
+ };
40
+ const isInstalledManifest = (value) => hasFields(value, { name: isString, version: isString });
41
+ const tryResolve = (specifier) => {
42
+ try {
43
+ return requireFromCodegen.resolve(specifier);
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ };
49
+ const manifestVersion = (path, name) => {
50
+ if (path === undefined) {
51
+ return undefined;
52
+ }
53
+ const manifest = readJsonFile(path);
54
+ return isInstalledManifest(manifest) && manifest.name === name ? manifest.version : undefined;
55
+ };
56
+ const packageRootFor = (name) => {
57
+ const entry = tryResolve(name);
58
+ if (entry === undefined) {
59
+ return undefined;
60
+ }
61
+ for (let directory = dirname(entry); directory !== dirname(directory); directory = dirname(directory)) {
62
+ if (manifestVersion(join(directory, "package.json"), name) !== undefined) {
63
+ return directory;
64
+ }
65
+ }
66
+ return undefined;
67
+ };
68
+ const installedVersion = (name) => {
69
+ const direct = manifestVersion(tryResolve(`${name}/package.json`), name);
70
+ if (direct !== undefined) {
71
+ return direct;
72
+ }
73
+ const root = packageRootFor(name);
74
+ return root === undefined ? undefined : manifestVersion(join(root, "package.json"), name);
75
+ };
76
+ const dependencyVersions = () => sortOrdinal(Object.entries(packageManifest.dependencies)
77
+ .filter(([name]) => !name.startsWith("@types/"))
78
+ .map(([name, range]) => `${name}@${installedVersion(name) ?? range}`));
79
+ const hashPackageCode = (hash, label, root) => {
80
+ hashTree(hash, join(label, "src"), join(root, "src"));
81
+ hashTree(hash, join(label, "dist"), join(root, "dist"));
82
+ };
83
+ const computeCodegenHash = () => {
84
+ const hash = createHash("sha256");
85
+ hash.update(dependencyVersions().join(","));
86
+ hashPackageCode(hash, "codegen", PACKAGE_ROOT);
87
+ hashTree(hash, "overrides", OVERRIDES_ROOT);
88
+ const utilsRoot = packageRootFor("@gtkx/utils");
89
+ if (utilsRoot !== undefined) {
90
+ hashPackageCode(hash, "@gtkx/utils", utilsRoot);
91
+ }
92
+ return hash.digest("hex");
93
+ };
94
+ const codegenHash = () => {
95
+ const cached = codegenHashCache.get("codegen");
96
+ if (cached !== undefined) {
97
+ return cached;
98
+ }
99
+ const value = computeCodegenHash();
100
+ codegenHashCache.set("codegen", value);
101
+ return value;
102
+ };
21
103
  const hashGi = (inputs) => {
22
104
  const hash = createHash("sha256");
23
- hash.update(CODEGEN_VERSION);
105
+ hash.update(codegenHash());
106
+ hash.update("\n");
107
+ hash.update(JSON.stringify(EXTERNAL_NAMESPACES));
24
108
  hash.update("\n");
25
109
  hash.update(sortAlpha(inputs.libraries));
26
110
  hash.update("\n");
@@ -28,8 +112,15 @@ const hashGi = (inputs) => {
28
112
  hash.update("\n");
29
113
  hash.update(String(inputs.isByteArrayTyped));
30
114
  hash.update("\n");
31
- const hashedFiles = sortStrings([...inputs.girFiles, ...overrideFiles()]);
32
- for (const file of hashedFiles) {
115
+ hash.update(String(inputs.isValueUnwrapped));
116
+ hash.update("\n");
117
+ hash.update(String(inputs.isFinishTrimmed));
118
+ hash.update("\n");
119
+ hash.update(String(inputs.isInoutInPlace));
120
+ hash.update("\n");
121
+ hash.update(String(inputs.storeVersion));
122
+ const girFiles = sortOrdinal(inputs.girFiles);
123
+ for (const file of girFiles) {
33
124
  hash.update("\n");
34
125
  hash.update(file);
35
126
  hash.update("\0");
@@ -89,14 +180,15 @@ const isDocsOutputFresh = (outDir, inputs, input) => {
89
180
  const giValue = recordedGiValue(sentinel.gi, inputs);
90
181
  return giValue !== undefined && hashDocs(giValue, input) === sentinel.value;
91
182
  };
92
- const serializeModuleExports = (map) => sortStrings(Object.keys(map)).map((type) => [type, map[type]?.module ?? "", map[type]?.export ?? ""]);
93
- const serializeOmittedProps = (map) => sortStrings(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);
183
+ const serializeModuleExports = (map) => sortOrdinal(Object.keys(map)).map((type) => [type, map[type]?.module ?? "", map[type]?.export ?? ""]);
184
+ const serializeOmittedProps = (map) => sortOrdinal(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);
94
185
  const hashJsx = (input) => createHash("sha256")
95
186
  .update(JSON.stringify([
96
- CODEGEN_VERSION,
187
+ codegenHash(),
97
188
  input.reactVersion,
189
+ sortOrdinal(input.reactSubexports),
98
190
  serializeModuleExports(input.components),
99
- sortStrings(input.lazyElements),
191
+ sortOrdinal(input.lazyElements),
100
192
  serializeModuleExports(input.props),
101
193
  serializeOmittedProps(input.omittedProps),
102
194
  ]))
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStrings } from \"@gtkx/utils\";\nimport { createHash } from \"node:crypto\";\nimport { type Dirent, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport packageManifest from \"../package.json\" with { type: \"json\" };\nimport { arrayGuard, hasFields, isNumber, isString, optionalGuard } from \"./guards.js\";\nimport { readJsonFile } from \"./json.js\";\n\ntype GiInputs = {\n girFiles: string[];\n libraries: string[];\n girPath: string[];\n isByteArrayTyped: boolean;\n};\n\ntype GiFingerprint = {\n value: string;\n girFiles: string[];\n libraries: string[];\n girPath?: string[];\n};\n\ntype ModuleExport = { module: string; export: string };\n\ntype DocsFingerprintInput = {\n basePath: string;\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype DocsFingerprint = {\n value: string;\n gi: GiFingerprint;\n};\n\ntype JsxFingerprintInput = {\n reactVersion: string;\n components: Record<string, ModuleExport>;\n lazyElements: string[];\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype JsxFingerprint = {\n value: string;\n intrinsicElementCount: number;\n};\n\nconst FINGERPRINT_FILENAME = \".codegen-fingerprint.json\";\nconst CODEGEN_VERSION: string = packageManifest.version;\nconst OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"overrides\");\n\nconst sortAlpha = (values: string[]): string => sortStrings(values).join(\",\");\n\nconst overrideFiles = (): string[] => {\n if (!existsSync(OVERRIDES_ROOT)) {\n return [];\n }\n\n return readdirSync(OVERRIDES_ROOT, { recursive: true, withFileTypes: true })\n .filter((entry: Dirent) => entry.isFile())\n .map((entry: Dirent) => join(entry.parentPath, entry.name));\n};\n\nconst hashGi = (inputs: GiInputs): string => {\n const hash = createHash(\"sha256\");\n hash.update(CODEGEN_VERSION);\n hash.update(\"\\n\");\n hash.update(sortAlpha(inputs.libraries));\n hash.update(\"\\n\");\n hash.update(sortAlpha(inputs.girPath));\n hash.update(\"\\n\");\n hash.update(String(inputs.isByteArrayTyped));\n hash.update(\"\\n\");\n const hashedFiles = sortStrings([...inputs.girFiles, ...overrideFiles()]);\n\n for (const file of hashedFiles) {\n hash.update(\"\\n\");\n hash.update(file);\n hash.update(\"\\0\");\n hash.update(readFileSync(file));\n }\n\n return hash.digest(\"hex\");\n};\n\nconst computeGiFingerprint = (inputs: GiInputs): GiFingerprint => ({\n value: hashGi(inputs),\n girFiles: inputs.girFiles,\n libraries: inputs.libraries,\n girPath: inputs.girPath,\n});\n\nconst readSentinel = (storeDir: string): unknown => readJsonFile(join(storeDir, FINGERPRINT_FILENAME));\n\nconst isGiFingerprint = (value: unknown): value is GiFingerprint =>\n hasFields<GiFingerprint>(value, {\n value: isString,\n girFiles: arrayGuard(isString),\n libraries: arrayGuard(isString),\n girPath: optionalGuard(arrayGuard(isString)),\n });\n\nconst isDocsFingerprint = (value: unknown): value is DocsFingerprint =>\n hasFields<DocsFingerprint>(value, { value: isString, gi: isGiFingerprint });\n\nconst isJsxFingerprint = (value: unknown): value is JsxFingerprint =>\n hasFields<JsxFingerprint>(value, { value: isString, intrinsicElementCount: isNumber });\n\nconst recordedGiValue = (sentinel: GiFingerprint, inputs: GiInputs): string | undefined => {\n if (!hasMatchingRecordedInputs(sentinel, inputs)) {\n return undefined;\n }\n\n try {\n return hashGi({ ...inputs, girFiles: sentinel.girFiles, libraries: sentinel.libraries });\n } catch {\n return undefined;\n }\n};\n\nconst isGiStoreFresh = (giStoreDir: string, inputs: GiInputs): boolean => {\n const sentinel = readSentinel(giStoreDir);\n\n return isGiFingerprint(sentinel) && recordedGiValue(sentinel, inputs) === sentinel.value;\n};\n\nconst hasMatchingRecordedInputs = (sentinel: GiFingerprint, inputs: GiInputs): boolean =>\n sortAlpha(sentinel.libraries) === sortAlpha(inputs.libraries) &&\n sortAlpha(sentinel.girPath ?? []) === sortAlpha(inputs.girPath);\n\nconst hashDocs = (giValue: string, input: DocsFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n giValue,\n input.basePath,\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeDocsFingerprint = (inputs: GiInputs, input: DocsFingerprintInput): DocsFingerprint => {\n const gi = computeGiFingerprint(inputs);\n\n return { value: hashDocs(gi.value, input), gi };\n};\n\nconst isDocsOutputFresh = (outDir: string, inputs: GiInputs, input: DocsFingerprintInput): boolean => {\n const sentinel = readSentinel(outDir);\n\n if (!isDocsFingerprint(sentinel)) {\n return false;\n }\n\n const giValue = recordedGiValue(sentinel.gi, inputs);\n\n return giValue !== undefined && hashDocs(giValue, input) === sentinel.value;\n};\n\nconst serializeModuleExports = (map: Record<string, ModuleExport>): [string, string, string][] =>\n sortStrings(Object.keys(map)).map((type) => [type, map[type]?.module ?? \"\", map[type]?.export ?? \"\"]);\n\nconst serializeOmittedProps = (map: Record<string, string[]>): [string, string][] =>\n sortStrings(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);\n\nconst hashJsx = (input: JsxFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n CODEGEN_VERSION,\n input.reactVersion,\n serializeModuleExports(input.components),\n sortStrings(input.lazyElements),\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeJsxFingerprint = (input: JsxFingerprintInput, intrinsicElementCount: number): JsxFingerprint => ({\n value: hashJsx(input),\n intrinsicElementCount,\n});\n\nconst jsxStoreFreshness = (\n jsxStoreDir: string,\n input: JsxFingerprintInput,\n): { isFresh: boolean; intrinsicElementCount: number } => {\n const sentinel = readSentinel(jsxStoreDir);\n\n if (!isJsxFingerprint(sentinel)) {\n return { isFresh: false, intrinsicElementCount: 0 };\n }\n\n return sentinel.value === hashJsx(input)\n ? { isFresh: true, intrinsicElementCount: sentinel.intrinsicElementCount }\n : { isFresh: false, intrinsicElementCount: 0 };\n};\n\nexport {\n FINGERPRINT_FILENAME,\n computeGiFingerprint,\n computeDocsFingerprint,\n isGiStoreFresh,\n isDocsOutputFresh,\n computeJsxFingerprint,\n jsxStoreFreshness,\n type DocsFingerprintInput,\n type GiInputs,\n type GiFingerprint,\n type JsxFingerprintInput,\n};\n"]}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, type Hash } from \"node:crypto\";\nimport { type Dirent, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport packageManifest from \"../package.json\" with { type: \"json\" };\nimport { EXTERNAL_NAMESPACES } from \"./gir/external-namespaces.js\";\nimport { arrayGuard, hasFields, isNumber, isString, optionalGuard } from \"./guards.js\";\nimport { readJsonFile } from \"./json.js\";\n\ntype GiInputs = {\n girFiles: string[];\n libraries: string[];\n girPath: string[];\n storeVersion: string | undefined;\n isByteArrayTyped: boolean;\n isValueUnwrapped: boolean;\n isFinishTrimmed: boolean;\n isInoutInPlace: boolean;\n};\n\ntype GiFingerprint = {\n value: string;\n girFiles: string[];\n libraries: string[];\n girPath?: string[];\n};\n\ntype ModuleExport = { module: string; export: string };\n\ntype DocsFingerprintInput = {\n basePath: string;\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype DocsFingerprint = {\n value: string;\n gi: GiFingerprint;\n};\n\ntype JsxFingerprintInput = {\n reactVersion: string;\n reactSubexports: string[];\n components: Record<string, ModuleExport>;\n lazyElements: string[];\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype JsxFingerprint = {\n value: string;\n intrinsicElementCount: number;\n};\n\ntype InstalledManifest = { name: string; version: string };\n\nconst FINGERPRINT_FILENAME = \".codegen-fingerprint.json\";\nconst PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), \"..\");\nconst OVERRIDES_ROOT = join(PACKAGE_ROOT, \"overrides\");\nconst requireFromCodegen = createRequire(import.meta.url);\nconst codegenHashCache: Map<string, string> = new Map();\n\nconst compareOrdinal = (a: string, b: string): number => {\n if (a < b) {\n return -1;\n }\n\n return a > b ? 1 : 0;\n};\n\nconst sortOrdinal = (values: string[]): string[] => values.toSorted(compareOrdinal);\nconst sortAlpha = (values: string[]): string => sortOrdinal(values).join(\",\");\n\nconst filesUnder = (root: string): string[] => {\n if (!existsSync(root)) {\n return [];\n }\n\n return readdirSync(root, { recursive: true, withFileTypes: true })\n .filter((entry: Dirent) => entry.isFile())\n .map((entry: Dirent) => join(entry.parentPath, entry.name));\n};\n\nconst hashTree = (hash: Hash, label: string, root: string): void => {\n const files = sortOrdinal(filesUnder(root));\n\n for (const file of files) {\n hash.update(\"\\n\");\n hash.update(join(label, relative(root, file)));\n hash.update(\"\\0\");\n hash.update(readFileSync(file));\n }\n};\n\nconst isInstalledManifest = (value: unknown): value is InstalledManifest =>\n hasFields<InstalledManifest>(value, { name: isString, version: isString });\n\nconst tryResolve = (specifier: string): string | undefined => {\n try {\n return requireFromCodegen.resolve(specifier);\n } catch {\n return undefined;\n }\n};\n\nconst manifestVersion = (path: string | undefined, name: string): string | undefined => {\n if (path === undefined) {\n return undefined;\n }\n\n const manifest = readJsonFile(path);\n\n return isInstalledManifest(manifest) && manifest.name === name ? manifest.version : undefined;\n};\n\nconst packageRootFor = (name: string): string | undefined => {\n const entry = tryResolve(name);\n\n if (entry === undefined) {\n return undefined;\n }\n\n for (let directory = dirname(entry); directory !== dirname(directory); directory = dirname(directory)) {\n if (manifestVersion(join(directory, \"package.json\"), name) !== undefined) {\n return directory;\n }\n }\n\n return undefined;\n};\n\nconst installedVersion = (name: string): string | undefined => {\n const direct = manifestVersion(tryResolve(`${name}/package.json`), name);\n\n if (direct !== undefined) {\n return direct;\n }\n\n const root = packageRootFor(name);\n\n return root === undefined ? undefined : manifestVersion(join(root, \"package.json\"), name);\n};\n\nconst dependencyVersions = (): string[] =>\n sortOrdinal(\n Object.entries(packageManifest.dependencies)\n .filter(([name]) => !name.startsWith(\"@types/\"))\n .map(([name, range]) => `${name}@${installedVersion(name) ?? range}`),\n );\n\nconst hashPackageCode = (hash: Hash, label: string, root: string): void => {\n hashTree(hash, join(label, \"src\"), join(root, \"src\"));\n hashTree(hash, join(label, \"dist\"), join(root, \"dist\"));\n};\n\nconst computeCodegenHash = (): string => {\n const hash = createHash(\"sha256\");\n hash.update(dependencyVersions().join(\",\"));\n hashPackageCode(hash, \"codegen\", PACKAGE_ROOT);\n hashTree(hash, \"overrides\", OVERRIDES_ROOT);\n const utilsRoot = packageRootFor(\"@gtkx/utils\");\n\n if (utilsRoot !== undefined) {\n hashPackageCode(hash, \"@gtkx/utils\", utilsRoot);\n }\n\n return hash.digest(\"hex\");\n};\n\nconst codegenHash = (): string => {\n const cached = codegenHashCache.get(\"codegen\");\n\n if (cached !== undefined) {\n return cached;\n }\n\n const value = computeCodegenHash();\n codegenHashCache.set(\"codegen\", value);\n\n return value;\n};\n\nconst hashGi = (inputs: GiInputs): string => {\n const hash = createHash(\"sha256\");\n hash.update(codegenHash());\n hash.update(\"\\n\");\n hash.update(JSON.stringify(EXTERNAL_NAMESPACES));\n hash.update(\"\\n\");\n hash.update(sortAlpha(inputs.libraries));\n hash.update(\"\\n\");\n hash.update(sortAlpha(inputs.girPath));\n hash.update(\"\\n\");\n hash.update(String(inputs.isByteArrayTyped));\n hash.update(\"\\n\");\n hash.update(String(inputs.isValueUnwrapped));\n hash.update(\"\\n\");\n hash.update(String(inputs.isFinishTrimmed));\n hash.update(\"\\n\");\n hash.update(String(inputs.isInoutInPlace));\n hash.update(\"\\n\");\n hash.update(String(inputs.storeVersion));\n const girFiles = sortOrdinal(inputs.girFiles);\n\n for (const file of girFiles) {\n hash.update(\"\\n\");\n hash.update(file);\n hash.update(\"\\0\");\n hash.update(readFileSync(file));\n }\n\n return hash.digest(\"hex\");\n};\n\nconst computeGiFingerprint = (inputs: GiInputs): GiFingerprint => ({\n value: hashGi(inputs),\n girFiles: inputs.girFiles,\n libraries: inputs.libraries,\n girPath: inputs.girPath,\n});\n\nconst readSentinel = (storeDir: string): unknown => readJsonFile(join(storeDir, FINGERPRINT_FILENAME));\n\nconst isGiFingerprint = (value: unknown): value is GiFingerprint =>\n hasFields<GiFingerprint>(value, {\n value: isString,\n girFiles: arrayGuard(isString),\n libraries: arrayGuard(isString),\n girPath: optionalGuard(arrayGuard(isString)),\n });\n\nconst isDocsFingerprint = (value: unknown): value is DocsFingerprint =>\n hasFields<DocsFingerprint>(value, { value: isString, gi: isGiFingerprint });\n\nconst isJsxFingerprint = (value: unknown): value is JsxFingerprint =>\n hasFields<JsxFingerprint>(value, { value: isString, intrinsicElementCount: isNumber });\n\nconst recordedGiValue = (sentinel: GiFingerprint, inputs: GiInputs): string | undefined => {\n if (!hasMatchingRecordedInputs(sentinel, inputs)) {\n return undefined;\n }\n\n try {\n return hashGi({ ...inputs, girFiles: sentinel.girFiles, libraries: sentinel.libraries });\n } catch {\n return undefined;\n }\n};\n\nconst isGiStoreFresh = (giStoreDir: string, inputs: GiInputs): boolean => {\n const sentinel = readSentinel(giStoreDir);\n\n return isGiFingerprint(sentinel) && recordedGiValue(sentinel, inputs) === sentinel.value;\n};\n\nconst hasMatchingRecordedInputs = (sentinel: GiFingerprint, inputs: GiInputs): boolean =>\n sortAlpha(sentinel.libraries) === sortAlpha(inputs.libraries) &&\n sortAlpha(sentinel.girPath ?? []) === sortAlpha(inputs.girPath);\n\nconst hashDocs = (giValue: string, input: DocsFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n giValue,\n input.basePath,\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeDocsFingerprint = (inputs: GiInputs, input: DocsFingerprintInput): DocsFingerprint => {\n const gi = computeGiFingerprint(inputs);\n\n return { value: hashDocs(gi.value, input), gi };\n};\n\nconst isDocsOutputFresh = (outDir: string, inputs: GiInputs, input: DocsFingerprintInput): boolean => {\n const sentinel = readSentinel(outDir);\n\n if (!isDocsFingerprint(sentinel)) {\n return false;\n }\n\n const giValue = recordedGiValue(sentinel.gi, inputs);\n\n return giValue !== undefined && hashDocs(giValue, input) === sentinel.value;\n};\n\nconst serializeModuleExports = (map: Record<string, ModuleExport>): [string, string, string][] =>\n sortOrdinal(Object.keys(map)).map((type) => [type, map[type]?.module ?? \"\", map[type]?.export ?? \"\"]);\n\nconst serializeOmittedProps = (map: Record<string, string[]>): [string, string][] =>\n sortOrdinal(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);\n\nconst hashJsx = (input: JsxFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n codegenHash(),\n input.reactVersion,\n sortOrdinal(input.reactSubexports),\n serializeModuleExports(input.components),\n sortOrdinal(input.lazyElements),\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeJsxFingerprint = (input: JsxFingerprintInput, intrinsicElementCount: number): JsxFingerprint => ({\n value: hashJsx(input),\n intrinsicElementCount,\n});\n\nconst jsxStoreFreshness = (\n jsxStoreDir: string,\n input: JsxFingerprintInput,\n): { isFresh: boolean; intrinsicElementCount: number } => {\n const sentinel = readSentinel(jsxStoreDir);\n\n if (!isJsxFingerprint(sentinel)) {\n return { isFresh: false, intrinsicElementCount: 0 };\n }\n\n return sentinel.value === hashJsx(input)\n ? { isFresh: true, intrinsicElementCount: sentinel.intrinsicElementCount }\n : { isFresh: false, intrinsicElementCount: 0 };\n};\n\nexport {\n FINGERPRINT_FILENAME,\n computeGiFingerprint,\n computeDocsFingerprint,\n isGiStoreFresh,\n isDocsOutputFresh,\n computeJsxFingerprint,\n jsxStoreFreshness,\n type DocsFingerprintInput,\n type GiInputs,\n type GiFingerprint,\n type JsxFingerprintInput,\n};\n"]}
package/dist/gi.d.ts CHANGED
@@ -5,6 +5,9 @@ type GiCodegenOptions = {
5
5
  libraries: string[];
6
6
  girPath: string[];
7
7
  isByteArrayTyped: boolean;
8
+ isValueUnwrapped: boolean;
9
+ isFinishTrimmed: boolean;
10
+ isInoutInPlace: boolean;
8
11
  };
9
12
  declare const runGiCodegen: (library: Library, options: GiCodegenOptions) => number;
10
13
  export { runGiCodegen };
package/dist/gi.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gi.d.ts","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,KAAK,gBAAgB,GAAG;IACpB,EAAE,EAAE,YAAY,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,SAAS,OAAO,EAAE,SAAS,gBAAgB,KAAG,MAmBnE,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"gi.d.ts","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,KAAK,gBAAgB,GAAG;IACpB,EAAE,EAAE,YAAY,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CAC3B,CAAC;AAkCF,QAAA,MAAM,YAAY,GAAI,SAAS,OAAO,EAAE,SAAS,gBAAgB,KAAG,MAkBnE,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
package/dist/gi.js CHANGED
@@ -1,21 +1,43 @@
1
1
  import { computeGiFingerprint } from "./fingerprint.js";
2
+ import { externalPackageFor } from "./gir/external-namespaces.js";
2
3
  import { namespaceDirectory } from "./gir/namespace.js";
3
4
  import { writeGiStore } from "./store/gi-store.js";
4
5
  import { generateNamespaceModule } from "./store/gi/pipeline.js";
6
+ const splitNamespaces = (library) => {
7
+ const namespaces = [];
8
+ const externalNamespaces = [];
9
+ for (const namespace of library.namespaces.values()) {
10
+ const packageName = externalPackageFor(namespace.name);
11
+ if (packageName !== undefined) {
12
+ externalNamespaces.push({
13
+ directory: namespaceDirectory(namespace),
14
+ packageName,
15
+ girFile: namespace.girFile,
16
+ });
17
+ continue;
18
+ }
19
+ namespaces.push({
20
+ directory: namespaceDirectory(namespace),
21
+ rawSource: generateNamespaceModule(namespace, library),
22
+ girFile: namespace.girFile,
23
+ });
24
+ }
25
+ return { namespaces, externalNamespaces };
26
+ };
5
27
  const runGiCodegen = (library, options) => {
6
- const { gi, libraries, girPath, isByteArrayTyped } = options;
7
- const namespaces = Array.from(library.namespaces.values(), (namespace) => ({
8
- directory: namespaceDirectory(namespace),
9
- rawSource: generateNamespaceModule(namespace, library),
10
- girFile: namespace.girFile,
11
- }));
28
+ const { gi, libraries, girPath, isByteArrayTyped, isValueUnwrapped, isFinishTrimmed, isInoutInPlace } = options;
29
+ const { namespaces, externalNamespaces } = splitNamespaces(library);
12
30
  const fingerprint = computeGiFingerprint({
13
31
  girFiles: library.girFiles,
14
32
  libraries: [...libraries],
15
33
  girPath: [...girPath],
34
+ storeVersion: gi.version,
16
35
  isByteArrayTyped,
36
+ isValueUnwrapped,
37
+ isFinishTrimmed,
38
+ isInoutInPlace,
17
39
  });
18
- writeGiStore(gi, namespaces, fingerprint);
40
+ writeGiStore(gi, namespaces, externalNamespaces, fingerprint);
19
41
  return library.namespaces.size;
20
42
  };
21
43
  export { runGiCodegen };
package/dist/gi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gi.js","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAyB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AASjE,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,OAAyB,EAAU,EAAE;IACzE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,UAAU,GAAuB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3F,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QACtD,OAAO,EAAE,SAAS,CAAC,OAAO;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,gBAAgB;KACnB,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACnC,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Library } from \"./gir/library.js\";\nimport type { StoreOptions } from \"./store/store-fs.js\";\nimport { computeGiFingerprint } from \"./fingerprint.js\";\nimport { namespaceDirectory } from \"./gir/namespace.js\";\nimport { type GiNamespaceInput, writeGiStore } from \"./store/gi-store.js\";\nimport { generateNamespaceModule } from \"./store/gi/pipeline.js\";\n\ntype GiCodegenOptions = {\n gi: StoreOptions;\n libraries: string[];\n girPath: string[];\n isByteArrayTyped: boolean;\n};\n\nconst runGiCodegen = (library: Library, options: GiCodegenOptions): number => {\n const { gi, libraries, girPath, isByteArrayTyped } = options;\n\n const namespaces: GiNamespaceInput[] = Array.from(library.namespaces.values(), (namespace) => ({\n directory: namespaceDirectory(namespace),\n rawSource: generateNamespaceModule(namespace, library),\n girFile: namespace.girFile,\n }));\n\n const fingerprint = computeGiFingerprint({\n girFiles: library.girFiles,\n libraries: [...libraries],\n girPath: [...girPath],\n isByteArrayTyped,\n });\n\n writeGiStore(gi, namespaces, fingerprint);\n\n return library.namespaces.size;\n};\n\nexport { runGiCodegen };\n"]}
1
+ {"version":3,"file":"gi.js","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAwD,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAiBjE,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAmB,EAAE;IAC1D,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,MAAM,kBAAkB,GAA+B,EAAE,CAAC;IAE1D,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5B,kBAAkB,CAAC,IAAI,CAAC;gBACpB,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;gBACxC,WAAW;gBACX,OAAO,EAAE,SAAS,CAAC,OAAO;aAC7B,CAAC,CAAC;YAEH,SAAS;QACb,CAAC;QAED,UAAU,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACxC,SAAS,EAAE,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;YACtD,OAAO,EAAE,SAAS,CAAC,OAAO;SAC7B,CAAC,CAAC;IACP,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,OAAyB,EAAU,EAAE;IACzE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAChH,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,YAAY,EAAE,EAAE,CAAC,OAAO;QACxB,gBAAgB;QAChB,gBAAgB;QAChB,eAAe;QACf,cAAc;KACjB,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAE9D,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACnC,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Library } from \"./gir/library.js\";\nimport type { StoreOptions } from \"./store/store-fs.js\";\nimport { computeGiFingerprint } from \"./fingerprint.js\";\nimport { externalPackageFor } from \"./gir/external-namespaces.js\";\nimport { namespaceDirectory } from \"./gir/namespace.js\";\nimport { type GiExternalNamespaceInput, type GiNamespaceInput, writeGiStore } from \"./store/gi-store.js\";\nimport { generateNamespaceModule } from \"./store/gi/pipeline.js\";\n\ntype GiCodegenOptions = {\n gi: StoreOptions;\n libraries: string[];\n girPath: string[];\n isByteArrayTyped: boolean;\n isValueUnwrapped: boolean;\n isFinishTrimmed: boolean;\n isInoutInPlace: boolean;\n};\n\ntype SplitNamespaces = {\n namespaces: GiNamespaceInput[];\n externalNamespaces: GiExternalNamespaceInput[];\n};\n\nconst splitNamespaces = (library: Library): SplitNamespaces => {\n const namespaces: GiNamespaceInput[] = [];\n const externalNamespaces: GiExternalNamespaceInput[] = [];\n\n for (const namespace of library.namespaces.values()) {\n const packageName = externalPackageFor(namespace.name);\n\n if (packageName !== undefined) {\n externalNamespaces.push({\n directory: namespaceDirectory(namespace),\n packageName,\n girFile: namespace.girFile,\n });\n\n continue;\n }\n\n namespaces.push({\n directory: namespaceDirectory(namespace),\n rawSource: generateNamespaceModule(namespace, library),\n girFile: namespace.girFile,\n });\n }\n\n return { namespaces, externalNamespaces };\n};\n\nconst runGiCodegen = (library: Library, options: GiCodegenOptions): number => {\n const { gi, libraries, girPath, isByteArrayTyped, isValueUnwrapped, isFinishTrimmed, isInoutInPlace } = options;\n const { namespaces, externalNamespaces } = splitNamespaces(library);\n\n const fingerprint = computeGiFingerprint({\n girFiles: library.girFiles,\n libraries: [...libraries],\n girPath: [...girPath],\n storeVersion: gi.version,\n isByteArrayTyped,\n isValueUnwrapped,\n isFinishTrimmed,\n isInoutInPlace,\n });\n\n writeGiStore(gi, namespaces, externalNamespaces, fingerprint);\n\n return library.namespaces.size;\n};\n\nexport { runGiCodegen };\n"]}
@@ -0,0 +1,8 @@
1
+ type ExternalNamespace = {
2
+ namespace: string;
3
+ packageName: string;
4
+ };
5
+ declare const EXTERNAL_NAMESPACES: ExternalNamespace[];
6
+ declare const externalPackageFor: (namespaceName: string) => string | undefined;
7
+ export { EXTERNAL_NAMESPACES, externalPackageFor, type ExternalNamespace };
8
+ //# sourceMappingURL=external-namespaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-namespaces.d.ts","sourceRoot":"","sources":["../../src/gir/external-namespaces.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,QAAA,MAAM,mBAAmB,EAAE,iBAAiB,EAAyD,CAAC;AAEtG,QAAA,MAAM,kBAAkB,GAAI,eAAe,MAAM,KAAG,MAAM,GAAG,SAC0B,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ const EXTERNAL_NAMESPACES = [{ namespace: "cairo", packageName: "@gtkx/cairo" }];
2
+ const externalPackageFor = (namespaceName) => EXTERNAL_NAMESPACES.find((entry) => entry.namespace === namespaceName)?.packageName;
3
+ export { EXTERNAL_NAMESPACES, externalPackageFor };
4
+ //# sourceMappingURL=external-namespaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-namespaces.js","sourceRoot":"","sources":["../../src/gir/external-namespaces.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAwB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;AAEtG,MAAM,kBAAkB,GAAG,CAAC,aAAqB,EAAsB,EAAE,CACrE,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,aAAa,CAAC,EAAE,WAAW,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAA0B,CAAC","sourcesContent":["type ExternalNamespace = { namespace: string; packageName: string };\n\nconst EXTERNAL_NAMESPACES: ExternalNamespace[] = [{ namespace: \"cairo\", packageName: \"@gtkx/cairo\" }];\n\nconst externalPackageFor = (namespaceName: string): string | undefined =>\n EXTERNAL_NAMESPACES.find((entry) => entry.namespace === namespaceName)?.packageName;\n\nexport { EXTERNAL_NAMESPACES, externalPackageFor, type ExternalNamespace };\n"]}
@@ -0,0 +1,3 @@
1
+ declare const FUNCTIONS_MISSING_FINISH_FUNC: Map<string, string>;
2
+ export { FUNCTIONS_MISSING_FINISH_FUNC };
3
+ //# sourceMappingURL=finish-overrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish-overrides.d.ts","sourceRoot":"","sources":["../../src/gir/finish-overrides.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,6BAA6B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAErD,CAAC;AAEH,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ const FUNCTIONS_MISSING_FINISH_FUNC = new Map([
2
+ ["g_file_replace_contents_bytes_async", "replace_contents_finish"],
3
+ ]);
4
+ export { FUNCTIONS_MISSING_FINISH_FUNC };
5
+ //# sourceMappingURL=finish-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish-overrides.js","sourceRoot":"","sources":["../../src/gir/finish-overrides.ts"],"names":[],"mappings":"AAAA,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC;IAC/D,CAAC,qCAAqC,EAAE,yBAAyB,CAAC;CACrE,CAAC,CAAC;AAEH,OAAO,EAAE,6BAA6B,EAAE,CAAC","sourcesContent":["const FUNCTIONS_MISSING_FINISH_FUNC: Map<string, string> = new Map([\n [\"g_file_replace_contents_bytes_async\", \"replace_contents_finish\"],\n]);\n\nexport { FUNCTIONS_MISSING_FINISH_FUNC };\n"]}
@@ -14,13 +14,16 @@ type GirFunction = {
14
14
  cIdentifier: string | undefined;
15
15
  /** Whether the C function takes a trailing `GError` out parameter and can fail. */
16
16
  throws: boolean;
17
- /** Whether the GIR marks the callable as introspectable, and so bindable. */
17
+ /** Whether the callable is bindable: the GIR marks it introspectable and GTKX does not hide it. */
18
18
  introspectable: boolean;
19
19
  /** Qualified `Type.member` the GIR redirects the callable to, from its `moved-to` annotation. */
20
20
  movedTo: string | undefined;
21
21
  /** Name of the callable that shadows this one, from the GIR's `shadowed-by` annotation. */
22
22
  shadowedBy: string | undefined;
23
- /** Name of the callable that completes this asynchronous one, from the GIR's `glib:finish-func`. */
23
+ /**
24
+ * Name of the callable that completes this asynchronous one, from the GIR's `glib:finish-func`
25
+ * or a GTKX override for a GIR that lacks the annotation.
26
+ */
24
27
  finishFunc: string | undefined;
25
28
  /** The instance the callable is invoked on, absent for constructors and namespace-level functions. */
26
29
  instance: GirParameter | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAoC,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1D,wGAAwG;AACxG,KAAK,WAAW,GAAG;IACf,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,uEAAuE;IACvE,WAAW,EAAE,cAAc,CAAC;IAC5B,gDAAgD;IAChD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,cAAc,EAAE,OAAO,CAAC;IACxB,iGAAiG;IACjG,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,oGAAoG;IACpG,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sGAAsG;IACtG,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,oEAAoE;IACpE,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,oEAAoE;IACpE,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AAqDF,QAAA,MAAM,gBAAgB,GAAI,MAAM,OAAO,EAAE,SAAS,YAAY,KAAG,WAchE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAoC,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1D,wGAAwG;AACxG,KAAK,WAAW,GAAG;IACf,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,uEAAuE;IACvE,WAAW,EAAE,cAAc,CAAC;IAC5B,gDAAgD;IAChD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,mGAAmG;IACnG,cAAc,EAAE,OAAO,CAAC;IACxB,iGAAiG;IACjG,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sGAAsG;IACtG,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,oEAAoE;IACpE,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,oEAAoE;IACpE,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AAkFF,QAAA,MAAM,gBAAgB,GAAI,MAAM,OAAO,EAAE,SAAS,YAAY,KAAG,WAiBhE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,CAAC"}
@@ -1,7 +1,10 @@
1
1
  import { PARAMETERS_MISSING_ARRAY_EXTENT } from "./cursor-overrides.js";
2
+ import { FUNCTIONS_MISSING_FINISH_FUNC } from "./finish-overrides.js";
3
+ import { HIDDEN_SYMBOLS } from "./hidden-symbols.js";
2
4
  import { PARAMETERS_MISSING_NULLABLE_ANNOTATION } from "./nullable-overrides.js";
3
5
  import { parameterFromNode, parseCallable } from "./parameter.js";
4
6
  import { attr, getChild } from "./parse.js";
7
+ import { RETURNS_MISSING_UCS4_ARRAY_TYPE } from "./ucs4-overrides.js";
5
8
  const relaxParameters = (parameters, names) => {
6
9
  for (const parameter of parameters) {
7
10
  if (names.includes(parameter.name)) {
@@ -41,17 +44,43 @@ const bindMissingArrayExtent = (fn) => {
41
44
  }
42
45
  return fn;
43
46
  };
47
+ const bindMissingUcs4ReturnArray = (fn, context) => {
48
+ if (fn.cIdentifier !== undefined && RETURNS_MISSING_UCS4_ARRAY_TYPE.has(fn.cIdentifier)) {
49
+ fn.returnValue.type = context.addContainer({
50
+ kind: "carray",
51
+ element: context.addPrimitive("unichar"),
52
+ elementCType: "gunichar",
53
+ arrayCType: "gunichar*",
54
+ lengthParameterIndex: undefined,
55
+ fixedSize: undefined,
56
+ isZeroTerminated: true,
57
+ });
58
+ }
59
+ return fn;
60
+ };
61
+ const annotatedFinishFunc = (node, cIdentifier) => {
62
+ const annotated = attr(node, "glib:finish-func");
63
+ if (annotated !== undefined) {
64
+ return annotated;
65
+ }
66
+ return cIdentifier === undefined ? undefined : FUNCTIONS_MISSING_FINISH_FUNC.get(cIdentifier);
67
+ };
68
+ const isHiddenSymbol = (cIdentifier) => cIdentifier !== undefined && HIDDEN_SYMBOLS.has(cIdentifier);
44
69
  const functionFromNode = (node, context) => {
45
70
  const instanceNode = getChild(getChild(node, "parameters"), "instance-parameter");
46
- return bindMissingArrayExtent(relaxMissingNullable({
47
- ...parseCallable(node, context),
71
+ const callable = parseCallable(node, context);
72
+ const cIdentifier = attr(node, "c:identifier");
73
+ const fn = {
74
+ ...callable,
75
+ introspectable: callable.introspectable && !isHiddenSymbol(cIdentifier),
48
76
  name: attr(node, "shadows") ?? attr(node, "name") ?? "",
49
- cIdentifier: attr(node, "c:identifier"),
77
+ cIdentifier,
50
78
  movedTo: attr(node, "moved-to"),
51
79
  shadowedBy: attr(node, "shadowed-by"),
52
- finishFunc: attr(node, "glib:finish-func"),
80
+ finishFunc: annotatedFinishFunc(node, cIdentifier),
53
81
  instance: instanceNode === undefined ? undefined : parameterFromNode(instanceNode, context),
54
- }));
82
+ };
83
+ return bindMissingUcs4ReturnArray(bindMissingArrayExtent(relaxMissingNullable(fn)), context);
55
84
  };
56
85
  export { functionFromNode };
57
86
  //# sourceMappingURL=function.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirAnnotations } from \"./annotations.js\";\nimport type { ParseContext } from \"./type-id.js\";\nimport { type CursorParameterNames, PARAMETERS_MISSING_ARRAY_EXTENT } from \"./cursor-overrides.js\";\nimport { PARAMETERS_MISSING_NULLABLE_ANNOTATION } from \"./nullable-overrides.js\";\nimport { type GirParameter, type GirReturnValue, parameterFromNode, parseCallable } from \"./parameter.js\";\nimport { attr, getChild, type RawNode } from \"./parse.js\";\n\n/** A callable declared by a GIR namespace, class, or record: a function, a method, or a constructor. */\ntype GirFunction = {\n /** Local name within its owner, taken from the `shadows` annotation when the callable has one. */\n name: string;\n /** Documentation text carried by the GIR node. */\n doc: string | undefined;\n /** Release and deprecation annotations GIR carries on the callable. */\n annotations: GirAnnotations;\n /** C symbol the callable is invoked through. */\n cIdentifier: string | undefined;\n /** Whether the C function takes a trailing `GError` out parameter and can fail. */\n throws: boolean;\n /** Whether the GIR marks the callable as introspectable, and so bindable. */\n introspectable: boolean;\n /** Qualified `Type.member` the GIR redirects the callable to, from its `moved-to` annotation. */\n movedTo: string | undefined;\n /** Name of the callable that shadows this one, from the GIR's `shadowed-by` annotation. */\n shadowedBy: string | undefined;\n /** Name of the callable that completes this asynchronous one, from the GIR's `glib:finish-func`. */\n finishFunc: string | undefined;\n /** The instance the callable is invoked on, absent for constructors and namespace-level functions. */\n instance: GirParameter | undefined;\n /** Parameters other than the instance one, in declaration order. */\n parameters: GirParameter[];\n /** What the callable returns, with its transfer and nullability. */\n returnValue: GirReturnValue;\n};\n\nconst relaxParameters = (parameters: GirParameter[], names: string[]): void => {\n for (const parameter of parameters) {\n if (names.includes(parameter.name)) {\n parameter.nullable = true;\n }\n }\n};\n\nconst relaxMissingNullable = (fn: GirFunction): GirFunction => {\n const names = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_NULLABLE_ANNOTATION.get(fn.cIdentifier);\n\n if (names !== undefined) {\n relaxParameters(fn.parameters, names);\n }\n\n return fn;\n};\n\nconst parameterIndexFor = (parameters: GirParameter[], name: string): number => {\n const index = parameters.findIndex((parameter) => parameter.name === name);\n\n if (index === -1) {\n throw new Error(`A cursor correction names a parameter the GIR does not declare: ${name}`);\n }\n\n return index;\n};\n\nconst bindCursorParameters = (parameters: GirParameter[], corrections: CursorParameterNames[]): void => {\n for (const names of corrections) {\n const parameter = parameters[parameterIndexFor(parameters, names.cursor)];\n\n if (parameter !== undefined) {\n parameter.cursor = {\n baseIndex: parameterIndexFor(parameters, names.base),\n lengthIndex: parameterIndexFor(parameters, names.length),\n };\n }\n }\n};\n\nconst bindMissingArrayExtent = (fn: GirFunction): GirFunction => {\n const corrections = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_ARRAY_EXTENT.get(fn.cIdentifier);\n\n if (corrections !== undefined) {\n bindCursorParameters(fn.parameters, corrections);\n }\n\n return fn;\n};\n\nconst functionFromNode = (node: RawNode, context: ParseContext): GirFunction => {\n const instanceNode = getChild(getChild(node, \"parameters\"), \"instance-parameter\");\n\n return bindMissingArrayExtent(\n relaxMissingNullable({\n ...parseCallable(node, context),\n name: attr(node, \"shadows\") ?? attr(node, \"name\") ?? \"\",\n cIdentifier: attr(node, \"c:identifier\"),\n movedTo: attr(node, \"moved-to\"),\n shadowedBy: attr(node, \"shadowed-by\"),\n finishFunc: attr(node, \"glib:finish-func\"),\n instance: instanceNode === undefined ? undefined : parameterFromNode(instanceNode, context),\n }),\n );\n};\n\nexport { functionFromNode, type GirFunction };\n"]}
1
+ {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirAnnotations } from \"./annotations.js\";\nimport type { ParseContext } from \"./type-id.js\";\nimport { type CursorParameterNames, PARAMETERS_MISSING_ARRAY_EXTENT } from \"./cursor-overrides.js\";\nimport { FUNCTIONS_MISSING_FINISH_FUNC } from \"./finish-overrides.js\";\nimport { HIDDEN_SYMBOLS } from \"./hidden-symbols.js\";\nimport { PARAMETERS_MISSING_NULLABLE_ANNOTATION } from \"./nullable-overrides.js\";\nimport { type GirParameter, type GirReturnValue, parameterFromNode, parseCallable } from \"./parameter.js\";\nimport { attr, getChild, type RawNode } from \"./parse.js\";\nimport { RETURNS_MISSING_UCS4_ARRAY_TYPE } from \"./ucs4-overrides.js\";\n\n/** A callable declared by a GIR namespace, class, or record: a function, a method, or a constructor. */\ntype GirFunction = {\n /** Local name within its owner, taken from the `shadows` annotation when the callable has one. */\n name: string;\n /** Documentation text carried by the GIR node. */\n doc: string | undefined;\n /** Release and deprecation annotations GIR carries on the callable. */\n annotations: GirAnnotations;\n /** C symbol the callable is invoked through. */\n cIdentifier: string | undefined;\n /** Whether the C function takes a trailing `GError` out parameter and can fail. */\n throws: boolean;\n /** Whether the callable is bindable: the GIR marks it introspectable and GTKX does not hide it. */\n introspectable: boolean;\n /** Qualified `Type.member` the GIR redirects the callable to, from its `moved-to` annotation. */\n movedTo: string | undefined;\n /** Name of the callable that shadows this one, from the GIR's `shadowed-by` annotation. */\n shadowedBy: string | undefined;\n /**\n * Name of the callable that completes this asynchronous one, from the GIR's `glib:finish-func`\n * or a GTKX override for a GIR that lacks the annotation.\n */\n finishFunc: string | undefined;\n /** The instance the callable is invoked on, absent for constructors and namespace-level functions. */\n instance: GirParameter | undefined;\n /** Parameters other than the instance one, in declaration order. */\n parameters: GirParameter[];\n /** What the callable returns, with its transfer and nullability. */\n returnValue: GirReturnValue;\n};\n\nconst relaxParameters = (parameters: GirParameter[], names: string[]): void => {\n for (const parameter of parameters) {\n if (names.includes(parameter.name)) {\n parameter.nullable = true;\n }\n }\n};\n\nconst relaxMissingNullable = (fn: GirFunction): GirFunction => {\n const names = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_NULLABLE_ANNOTATION.get(fn.cIdentifier);\n\n if (names !== undefined) {\n relaxParameters(fn.parameters, names);\n }\n\n return fn;\n};\n\nconst parameterIndexFor = (parameters: GirParameter[], name: string): number => {\n const index = parameters.findIndex((parameter) => parameter.name === name);\n\n if (index === -1) {\n throw new Error(`A cursor correction names a parameter the GIR does not declare: ${name}`);\n }\n\n return index;\n};\n\nconst bindCursorParameters = (parameters: GirParameter[], corrections: CursorParameterNames[]): void => {\n for (const names of corrections) {\n const parameter = parameters[parameterIndexFor(parameters, names.cursor)];\n\n if (parameter !== undefined) {\n parameter.cursor = {\n baseIndex: parameterIndexFor(parameters, names.base),\n lengthIndex: parameterIndexFor(parameters, names.length),\n };\n }\n }\n};\n\nconst bindMissingArrayExtent = (fn: GirFunction): GirFunction => {\n const corrections = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_ARRAY_EXTENT.get(fn.cIdentifier);\n\n if (corrections !== undefined) {\n bindCursorParameters(fn.parameters, corrections);\n }\n\n return fn;\n};\n\nconst bindMissingUcs4ReturnArray = (fn: GirFunction, context: ParseContext): GirFunction => {\n if (fn.cIdentifier !== undefined && RETURNS_MISSING_UCS4_ARRAY_TYPE.has(fn.cIdentifier)) {\n fn.returnValue.type = context.addContainer({\n kind: \"carray\",\n element: context.addPrimitive(\"unichar\"),\n elementCType: \"gunichar\",\n arrayCType: \"gunichar*\",\n lengthParameterIndex: undefined,\n fixedSize: undefined,\n isZeroTerminated: true,\n });\n }\n\n return fn;\n};\n\nconst annotatedFinishFunc = (node: RawNode, cIdentifier: string | undefined): string | undefined => {\n const annotated = attr(node, \"glib:finish-func\");\n\n if (annotated !== undefined) {\n return annotated;\n }\n\n return cIdentifier === undefined ? undefined : FUNCTIONS_MISSING_FINISH_FUNC.get(cIdentifier);\n};\n\nconst isHiddenSymbol = (cIdentifier: string | undefined): boolean =>\n cIdentifier !== undefined && HIDDEN_SYMBOLS.has(cIdentifier);\n\nconst functionFromNode = (node: RawNode, context: ParseContext): GirFunction => {\n const instanceNode = getChild(getChild(node, \"parameters\"), \"instance-parameter\");\n const callable = parseCallable(node, context);\n const cIdentifier = attr(node, \"c:identifier\");\n\n const fn: GirFunction = {\n ...callable,\n introspectable: callable.introspectable && !isHiddenSymbol(cIdentifier),\n name: attr(node, \"shadows\") ?? attr(node, \"name\") ?? \"\",\n cIdentifier,\n movedTo: attr(node, \"moved-to\"),\n shadowedBy: attr(node, \"shadowed-by\"),\n finishFunc: annotatedFinishFunc(node, cIdentifier),\n instance: instanceNode === undefined ? undefined : parameterFromNode(instanceNode, context),\n };\n\n return bindMissingUcs4ReturnArray(bindMissingArrayExtent(relaxMissingNullable(fn)), context);\n};\n\nexport { functionFromNode, type GirFunction };\n"]}
@@ -0,0 +1,3 @@
1
+ declare const HIDDEN_SYMBOLS: Set<string>;
2
+ export { HIDDEN_SYMBOLS };
3
+ //# sourceMappingURL=hidden-symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden-symbols.d.ts","sourceRoot":"","sources":["../../src/gir/hidden-symbols.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAoC9B,CAAC;AAEH,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ const HIDDEN_SYMBOLS = new Set([
2
+ "g_action_map_add_action_entries",
3
+ "g_ascii_dtostr",
4
+ "g_ascii_formatd",
5
+ "g_file_info_set_attribute",
6
+ "g_file_set_attribute",
7
+ "g_log_set_writer_func",
8
+ "g_object_get_data",
9
+ "g_object_get_qdata",
10
+ "g_object_set_data",
11
+ "g_object_set_data_full",
12
+ "g_object_set_qdata",
13
+ "g_object_set_qdata_full",
14
+ "g_object_steal_data",
15
+ "g_object_steal_qdata",
16
+ "g_param_spec_get_qdata",
17
+ "g_param_spec_set_qdata",
18
+ "g_param_spec_set_qdata_full",
19
+ "g_param_spec_steal_qdata",
20
+ "g_ref_string_acquire",
21
+ "g_ref_string_length",
22
+ "g_ref_string_new",
23
+ "g_ref_string_new_intern",
24
+ "g_ref_string_new_len",
25
+ "g_ref_string_release",
26
+ "g_stpcpy",
27
+ "g_strcanon",
28
+ "g_strchomp",
29
+ "g_strchug",
30
+ "g_strdelimit",
31
+ "g_strdown",
32
+ "g_strreverse",
33
+ "g_strup",
34
+ "g_thread_exit",
35
+ "g_thread_new",
36
+ "g_thread_try_new",
37
+ ]);
38
+ export { HIDDEN_SYMBOLS };
39
+ //# sourceMappingURL=hidden-symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden-symbols.js","sourceRoot":"","sources":["../../src/gir/hidden-symbols.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAgB,IAAI,GAAG,CAAC;IACxC,iCAAiC;IACjC,gBAAgB;IAChB,iBAAiB;IACjB,2BAA2B;IAC3B,sBAAsB;IACtB,uBAAuB;IACvB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;IACxB,oBAAoB;IACpB,yBAAyB;IACzB,qBAAqB;IACrB,sBAAsB;IACtB,wBAAwB;IACxB,wBAAwB;IACxB,6BAA6B;IAC7B,0BAA0B;IAC1B,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,yBAAyB;IACzB,sBAAsB;IACtB,sBAAsB;IACtB,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,cAAc;IACd,WAAW;IACX,cAAc;IACd,SAAS;IACT,eAAe;IACf,cAAc;IACd,kBAAkB;CACrB,CAAC,CAAC;AAEH,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["const HIDDEN_SYMBOLS: Set<string> = new Set([\n \"g_action_map_add_action_entries\",\n \"g_ascii_dtostr\",\n \"g_ascii_formatd\",\n \"g_file_info_set_attribute\",\n \"g_file_set_attribute\",\n \"g_log_set_writer_func\",\n \"g_object_get_data\",\n \"g_object_get_qdata\",\n \"g_object_set_data\",\n \"g_object_set_data_full\",\n \"g_object_set_qdata\",\n \"g_object_set_qdata_full\",\n \"g_object_steal_data\",\n \"g_object_steal_qdata\",\n \"g_param_spec_get_qdata\",\n \"g_param_spec_set_qdata\",\n \"g_param_spec_set_qdata_full\",\n \"g_param_spec_steal_qdata\",\n \"g_ref_string_acquire\",\n \"g_ref_string_length\",\n \"g_ref_string_new\",\n \"g_ref_string_new_intern\",\n \"g_ref_string_new_len\",\n \"g_ref_string_release\",\n \"g_stpcpy\",\n \"g_strcanon\",\n \"g_strchomp\",\n \"g_strchug\",\n \"g_strdelimit\",\n \"g_strdown\",\n \"g_strreverse\",\n \"g_strup\",\n \"g_thread_exit\",\n \"g_thread_new\",\n \"g_thread_try_new\",\n]);\n\nexport { HIDDEN_SYMBOLS };\n"]}
@@ -1,6 +1,17 @@
1
1
  import type { TypeId } from "./type-id.js";
2
2
  import type { GirType } from "./type.js";
3
3
  import { type GirNamespace } from "./namespace.js";
4
+ /** Behavior a project opted into ahead of the next major version, through the `future` block of its config. */
5
+ type FutureBehavior = {
6
+ /** Whether byte sequences render as `Uint8Array` rather than `number[]`. */
7
+ isByteArrayTyped?: boolean;
8
+ /** Whether a `GObject.Value` a binding hands back surfaces as what it holds rather than as the value. */
9
+ isValueUnwrapped?: boolean;
10
+ /** Whether a promisified result drops the leading success boolean of a throwing finish function. */
11
+ isFinishTrimmed?: boolean;
12
+ /** Whether a handle-passing inout parameter is mutated in place rather than packed into the result. */
13
+ isInoutInPlace?: boolean;
14
+ };
4
15
  /**
5
16
  * The parsed GIR universe: every requested namespace plus everything those namespaces include,
6
17
  * with types resolvable across namespace boundaries.
@@ -12,10 +23,10 @@ declare class Library {
12
23
  *
13
24
  * @param libraries GIR identifiers to load, such as `Gtk-4.0`.
14
25
  * @param girPath Directories searched, in order, for each `.gir` file.
15
- * @param isByteArrayTyped Whether byte sequences render as `Uint8Array` rather than `number[]`.
26
+ * @param future Behavior the project opted into ahead of the next major version.
16
27
  * @returns A library holding every namespace that was parsed.
17
28
  */
18
- static load(libraries: string[], girPath: string[], isByteArrayTyped?: boolean): Library;
29
+ static load(libraries: string[], girPath: string[], future?: FutureBehavior): Library;
19
30
  private namespacesByName;
20
31
  private namespaceById;
21
32
  private nsNameById;
@@ -23,6 +34,9 @@ declare class Library {
23
34
  private typeTables;
24
35
  private girFilesValue;
25
36
  private isByteArrayTypedValue;
37
+ private isValueUnwrappedValue;
38
+ private isFinishTrimmedValue;
39
+ private isInoutInPlaceValue;
26
40
  /** Creates a library with no namespaces loaded; {@link Library.load} builds a populated one. */
27
41
  constructor();
28
42
  private ensureNsId;
@@ -48,6 +62,12 @@ declare class Library {
48
62
  get namespaces(): Map<string, GirNamespace>;
49
63
  /** Whether byte sequences render as `Uint8Array` rather than `number[]`. */
50
64
  get isByteArrayTyped(): boolean;
65
+ /** Whether a `GObject.Value` a binding hands back surfaces as what it holds rather than as the value. */
66
+ get isValueUnwrapped(): boolean;
67
+ /** Whether a promisified result drops the leading success boolean of a throwing finish function. */
68
+ get isFinishTrimmed(): boolean;
69
+ /** Whether a handle-passing inout parameter is mutated in place rather than packed into the result. */
70
+ get isInoutInPlace(): boolean;
51
71
  /** Paths of the `.gir` files that were read, in the order they were discovered. */
52
72
  get girFiles(): string[];
53
73
  /**