@gtkx/codegen 1.0.0 → 1.2.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 (347) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/descriptor-render.d.ts +12 -15
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +59 -38
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +25 -10
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +37 -9
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +80 -38
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +25 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +139 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -1
  19. package/dist/analysis/param-capability.js +3 -4
  20. package/dist/analysis/param-capability.js.map +1 -1
  21. package/dist/analysis/param-structure.js +2 -2
  22. package/dist/analysis/param-structure.js.map +1 -1
  23. package/dist/analysis/ts-type.d.ts +3 -2
  24. package/dist/analysis/ts-type.d.ts.map +1 -1
  25. package/dist/analysis/ts-type.js +26 -26
  26. package/dist/analysis/ts-type.js.map +1 -1
  27. package/dist/analysis/type-key.d.ts +5 -0
  28. package/dist/analysis/type-key.d.ts.map +1 -0
  29. package/dist/analysis/type-key.js +9 -0
  30. package/dist/analysis/type-key.js.map +1 -0
  31. package/dist/analysis/type-shape.d.ts +3 -2
  32. package/dist/analysis/type-shape.d.ts.map +1 -1
  33. package/dist/analysis/type-shape.js +2 -1
  34. package/dist/analysis/type-shape.js.map +1 -1
  35. package/dist/compile.d.ts +14 -6
  36. package/dist/compile.d.ts.map +1 -1
  37. package/dist/compile.js +125 -24
  38. package/dist/compile.js.map +1 -1
  39. package/dist/docs/api-reference.d.ts +2 -0
  40. package/dist/docs/api-reference.d.ts.map +1 -1
  41. package/dist/docs/api-reference.js +11 -10
  42. package/dist/docs/api-reference.js.map +1 -1
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +5 -3
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/pipeline.d.ts +1 -0
  47. package/dist/docs/pipeline.d.ts.map +1 -1
  48. package/dist/docs/pipeline.js +93 -19
  49. package/dist/docs/pipeline.js.map +1 -1
  50. package/dist/docs/render.d.ts +2 -1
  51. package/dist/docs/render.d.ts.map +1 -1
  52. package/dist/docs/render.js +5 -4
  53. package/dist/docs/render.js.map +1 -1
  54. package/dist/docs/symbol-page.d.ts.map +1 -1
  55. package/dist/docs/symbol-page.js +10 -9
  56. package/dist/docs/symbol-page.js.map +1 -1
  57. package/dist/fingerprint.d.ts +20 -3
  58. package/dist/fingerprint.d.ts.map +1 -1
  59. package/dist/fingerprint.js +56 -37
  60. package/dist/fingerprint.js.map +1 -1
  61. package/dist/gi.d.ts +1 -0
  62. package/dist/gi.d.ts.map +1 -1
  63. package/dist/gi.js +8 -2
  64. package/dist/gi.js.map +1 -1
  65. package/dist/gir/ancestry.d.ts +7 -1
  66. package/dist/gir/ancestry.d.ts.map +1 -1
  67. package/dist/gir/ancestry.js +9 -1
  68. package/dist/gir/ancestry.js.map +1 -1
  69. package/dist/gir/annotations.d.ts +1 -2
  70. package/dist/gir/annotations.d.ts.map +1 -1
  71. package/dist/gir/annotations.js +1 -1
  72. package/dist/gir/annotations.js.map +1 -1
  73. package/dist/gir/cursor-overrides.d.ts +8 -0
  74. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  75. package/dist/gir/cursor-overrides.js +6 -0
  76. package/dist/gir/cursor-overrides.js.map +1 -0
  77. package/dist/gir/emittable.d.ts +7 -0
  78. package/dist/gir/emittable.d.ts.map +1 -0
  79. package/dist/gir/emittable.js +3 -0
  80. package/dist/gir/emittable.js.map +1 -0
  81. package/dist/gir/function.d.ts.map +1 -1
  82. package/dist/gir/function.js +28 -2
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/gir-path.d.ts +1 -1
  85. package/dist/gir/gir-path.js +1 -1
  86. package/dist/gir/gir-path.js.map +1 -1
  87. package/dist/gir/library.d.ts +5 -1
  88. package/dist/gir/library.d.ts.map +1 -1
  89. package/dist/gir/library.js +9 -2
  90. package/dist/gir/library.js.map +1 -1
  91. package/dist/gir/namespace.d.ts +5 -1
  92. package/dist/gir/namespace.d.ts.map +1 -1
  93. package/dist/gir/namespace.js +4 -2
  94. package/dist/gir/namespace.js.map +1 -1
  95. package/dist/gir/parameter.d.ts +13 -1
  96. package/dist/gir/parameter.d.ts.map +1 -1
  97. package/dist/gir/parameter.js +1 -0
  98. package/dist/gir/parameter.js.map +1 -1
  99. package/dist/gir/parse.d.ts.map +1 -1
  100. package/dist/gir/parse.js +6 -6
  101. package/dist/gir/parse.js.map +1 -1
  102. package/dist/gir/primitives.js +1 -1
  103. package/dist/gir/primitives.js.map +1 -1
  104. package/dist/guards.d.ts +16 -0
  105. package/dist/guards.d.ts.map +1 -0
  106. package/dist/guards.js +11 -0
  107. package/dist/guards.js.map +1 -0
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.js +2 -0
  111. package/dist/internal.js.map +1 -1
  112. package/dist/json.d.ts +3 -0
  113. package/dist/json.d.ts.map +1 -0
  114. package/dist/json.js +11 -0
  115. package/dist/json.js.map +1 -0
  116. package/dist/khronos/args.d.ts.map +1 -1
  117. package/dist/khronos/args.js +8 -6
  118. package/dist/khronos/args.js.map +1 -1
  119. package/dist/khronos/modules.d.ts.map +1 -1
  120. package/dist/khronos/modules.js +22 -7
  121. package/dist/khronos/modules.js.map +1 -1
  122. package/dist/khronos/parse.d.ts.map +1 -1
  123. package/dist/khronos/parse.js +3 -4
  124. package/dist/khronos/parse.js.map +1 -1
  125. package/dist/khronos/pipeline.d.ts +1 -1
  126. package/dist/khronos/pipeline.d.ts.map +1 -1
  127. package/dist/khronos/pipeline.js.map +1 -1
  128. package/dist/khronos/plan.d.ts +1 -7
  129. package/dist/khronos/plan.d.ts.map +1 -1
  130. package/dist/khronos/plan.js +1 -1
  131. package/dist/khronos/plan.js.map +1 -1
  132. package/dist/khronos/render.d.ts.map +1 -1
  133. package/dist/khronos/render.js +8 -4
  134. package/dist/khronos/render.js.map +1 -1
  135. package/dist/runner.d.ts +7 -1
  136. package/dist/runner.d.ts.map +1 -1
  137. package/dist/runner.js +21 -3
  138. package/dist/runner.js.map +1 -1
  139. package/dist/staging.d.ts +5 -0
  140. package/dist/staging.d.ts.map +1 -0
  141. package/dist/staging.js +57 -0
  142. package/dist/staging.js.map +1 -0
  143. package/dist/store/compile-store.d.ts +0 -1
  144. package/dist/store/compile-store.d.ts.map +1 -1
  145. package/dist/store/compile-store.js +7 -32
  146. package/dist/store/compile-store.js.map +1 -1
  147. package/dist/store/gi/callables.d.ts +6 -3
  148. package/dist/store/gi/callables.d.ts.map +1 -1
  149. package/dist/store/gi/callables.js +40 -30
  150. package/dist/store/gi/callables.js.map +1 -1
  151. package/dist/store/gi/callback.d.ts.map +1 -1
  152. package/dist/store/gi/callback.js +9 -5
  153. package/dist/store/gi/callback.js.map +1 -1
  154. package/dist/store/gi/class.d.ts.map +1 -1
  155. package/dist/store/gi/class.js +104 -44
  156. package/dist/store/gi/class.js.map +1 -1
  157. package/dist/store/gi/companion.d.ts.map +1 -1
  158. package/dist/store/gi/companion.js +6 -6
  159. package/dist/store/gi/companion.js.map +1 -1
  160. package/dist/store/gi/constant.d.ts.map +1 -1
  161. package/dist/store/gi/constant.js +11 -3
  162. package/dist/store/gi/constant.js.map +1 -1
  163. package/dist/store/gi/constructor-props.js +1 -1
  164. package/dist/store/gi/constructor-props.js.map +1 -1
  165. package/dist/store/gi/enum.d.ts.map +1 -1
  166. package/dist/store/gi/enum.js +29 -12
  167. package/dist/store/gi/enum.js.map +1 -1
  168. package/dist/store/gi/function.d.ts +1 -3
  169. package/dist/store/gi/function.d.ts.map +1 -1
  170. package/dist/store/gi/function.js +24 -18
  171. package/dist/store/gi/function.js.map +1 -1
  172. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  173. package/dist/store/gi/gtype-binding.js +4 -1
  174. package/dist/store/gi/gtype-binding.js.map +1 -1
  175. package/dist/store/gi/interface.d.ts.map +1 -1
  176. package/dist/store/gi/interface.js +34 -19
  177. package/dist/store/gi/interface.js.map +1 -1
  178. package/dist/store/gi/method.d.ts +7 -6
  179. package/dist/store/gi/method.d.ts.map +1 -1
  180. package/dist/store/gi/method.js +13 -24
  181. package/dist/store/gi/method.js.map +1 -1
  182. package/dist/store/gi/param-marshal.d.ts +3 -2
  183. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  184. package/dist/store/gi/param-marshal.js +50 -5
  185. package/dist/store/gi/param-marshal.js.map +1 -1
  186. package/dist/store/gi/pipeline.d.ts.map +1 -1
  187. package/dist/store/gi/pipeline.js +21 -10
  188. package/dist/store/gi/pipeline.js.map +1 -1
  189. package/dist/store/gi/properties.d.ts +2 -1
  190. package/dist/store/gi/properties.d.ts.map +1 -1
  191. package/dist/store/gi/properties.js +6 -3
  192. package/dist/store/gi/properties.js.map +1 -1
  193. package/dist/store/gi/property-accessor.d.ts +10 -8
  194. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  195. package/dist/store/gi/property-accessor.js +49 -91
  196. package/dist/store/gi/property-accessor.js.map +1 -1
  197. package/dist/store/gi/record-constructor.d.ts +8 -1
  198. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  199. package/dist/store/gi/record-constructor.js +34 -13
  200. package/dist/store/gi/record-constructor.js.map +1 -1
  201. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  202. package/dist/store/gi/record-field-accessor.js +20 -4
  203. package/dist/store/gi/record-field-accessor.js.map +1 -1
  204. package/dist/store/gi/record-layout.d.ts +6 -1
  205. package/dist/store/gi/record-layout.d.ts.map +1 -1
  206. package/dist/store/gi/record-layout.js +8 -1
  207. package/dist/store/gi/record-layout.js.map +1 -1
  208. package/dist/store/gi/record.d.ts.map +1 -1
  209. package/dist/store/gi/record.js +19 -8
  210. package/dist/store/gi/record.js.map +1 -1
  211. package/dist/store/gi/registration.js +2 -2
  212. package/dist/store/gi/registration.js.map +1 -1
  213. package/dist/store/gi/return-wrap.js +1 -1
  214. package/dist/store/gi/return-wrap.js.map +1 -1
  215. package/dist/store/gi/signal.d.ts +2 -1
  216. package/dist/store/gi/signal.d.ts.map +1 -1
  217. package/dist/store/gi/signal.js +55 -28
  218. package/dist/store/gi/signal.js.map +1 -1
  219. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  220. package/dist/store/gi/value-marshalable.js +2 -1
  221. package/dist/store/gi/value-marshalable.js.map +1 -1
  222. package/dist/store/gi/vtable.d.ts +4 -1
  223. package/dist/store/gi/vtable.d.ts.map +1 -1
  224. package/dist/store/gi/vtable.js +60 -17
  225. package/dist/store/gi/vtable.js.map +1 -1
  226. package/dist/store/gi-store.d.ts +1 -0
  227. package/dist/store/gi-store.d.ts.map +1 -1
  228. package/dist/store/gi-store.js +15 -20
  229. package/dist/store/gi-store.js.map +1 -1
  230. package/dist/store/jsx/generated-elements.d.ts +2 -1
  231. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  232. package/dist/store/jsx/generated-elements.js +13 -7
  233. package/dist/store/jsx/generated-elements.js.map +1 -1
  234. package/dist/store/jsx/jsx.js +3 -3
  235. package/dist/store/jsx/jsx.js.map +1 -1
  236. package/dist/store/jsx/metadata.d.ts.map +1 -1
  237. package/dist/store/jsx/metadata.js +3 -1
  238. package/dist/store/jsx/metadata.js.map +1 -1
  239. package/dist/store/jsx-store.d.ts.map +1 -1
  240. package/dist/store/jsx-store.js +3 -4
  241. package/dist/store/jsx-store.js.map +1 -1
  242. package/dist/store/resolve-store.d.ts +14 -3
  243. package/dist/store/resolve-store.d.ts.map +1 -1
  244. package/dist/store/resolve-store.js +98 -15
  245. package/dist/store/resolve-store.js.map +1 -1
  246. package/dist/store/store-fs.d.ts +9 -7
  247. package/dist/store/store-fs.d.ts.map +1 -1
  248. package/dist/store/store-fs.js +54 -25
  249. package/dist/store/store-fs.js.map +1 -1
  250. package/dist/store/store-links.d.ts +3 -0
  251. package/dist/store/store-links.d.ts.map +1 -0
  252. package/dist/store/store-links.js +39 -0
  253. package/dist/store/store-links.js.map +1 -0
  254. package/dist/writer/comparison-context.d.ts +4 -0
  255. package/dist/writer/comparison-context.d.ts.map +1 -0
  256. package/dist/writer/comparison-context.js +13 -0
  257. package/dist/writer/comparison-context.js.map +1 -0
  258. package/dist/writer/context.d.ts +3 -3
  259. package/dist/writer/context.d.ts.map +1 -1
  260. package/dist/writer/context.js +11 -6
  261. package/dist/writer/context.js.map +1 -1
  262. package/dist/writer/module.d.ts +13 -5
  263. package/dist/writer/module.d.ts.map +1 -1
  264. package/dist/writer/module.js +68 -11
  265. package/dist/writer/module.js.map +1 -1
  266. package/dist/xml.d.ts +8 -1
  267. package/dist/xml.d.ts.map +1 -1
  268. package/dist/xml.js +70 -1
  269. package/dist/xml.js.map +1 -1
  270. package/overrides/gobject/object.ts.ejs +2 -0
  271. package/package.json +14 -3
  272. package/src/analysis/descriptor-render.ts +106 -52
  273. package/src/analysis/descriptor.ts +76 -15
  274. package/src/analysis/inheritance.ts +134 -44
  275. package/src/analysis/interface-conflicts.ts +235 -0
  276. package/src/analysis/param-capability.ts +3 -6
  277. package/src/analysis/param-structure.ts +2 -2
  278. package/src/analysis/ts-type.ts +43 -28
  279. package/src/analysis/type-key.ts +14 -0
  280. package/src/analysis/type-shape.ts +5 -2
  281. package/src/compile.ts +192 -27
  282. package/src/docs/api-reference.ts +13 -10
  283. package/src/docs/element-page.ts +5 -2
  284. package/src/docs/pipeline.ts +140 -24
  285. package/src/docs/render.ts +7 -3
  286. package/src/docs/symbol-page.ts +12 -11
  287. package/src/fingerprint.ts +95 -47
  288. package/src/gi.ts +10 -2
  289. package/src/gir/ancestry.ts +17 -1
  290. package/src/gir/annotations.ts +1 -1
  291. package/src/gir/cursor-overrides.ts +12 -0
  292. package/src/gir/emittable.ts +8 -0
  293. package/src/gir/function.ts +45 -9
  294. package/src/gir/gir-path.ts +1 -1
  295. package/src/gir/library.ts +10 -2
  296. package/src/gir/namespace.ts +8 -2
  297. package/src/gir/parameter.ts +15 -0
  298. package/src/gir/parse.ts +10 -7
  299. package/src/gir/primitives.ts +1 -1
  300. package/src/guards.ts +23 -0
  301. package/src/internal.ts +2 -0
  302. package/src/json.ts +11 -0
  303. package/src/khronos/args.ts +9 -6
  304. package/src/khronos/modules.ts +25 -9
  305. package/src/khronos/parse.ts +3 -4
  306. package/src/khronos/pipeline.ts +1 -1
  307. package/src/khronos/plan.ts +0 -1
  308. package/src/khronos/render.ts +8 -6
  309. package/src/runner.ts +26 -4
  310. package/src/staging.ts +67 -0
  311. package/src/store/compile-store.ts +7 -38
  312. package/src/store/gi/callables.ts +60 -33
  313. package/src/store/gi/callback.ts +9 -9
  314. package/src/store/gi/class.ts +140 -53
  315. package/src/store/gi/companion.ts +7 -6
  316. package/src/store/gi/constant.ts +13 -3
  317. package/src/store/gi/constructor-props.ts +1 -1
  318. package/src/store/gi/enum.ts +36 -26
  319. package/src/store/gi/function.ts +30 -24
  320. package/src/store/gi/gtype-binding.ts +7 -2
  321. package/src/store/gi/interface.ts +39 -20
  322. package/src/store/gi/method.ts +26 -32
  323. package/src/store/gi/param-marshal.ts +77 -6
  324. package/src/store/gi/pipeline.ts +25 -15
  325. package/src/store/gi/properties.ts +8 -4
  326. package/src/store/gi/property-accessor.ts +73 -161
  327. package/src/store/gi/record-constructor.ts +53 -21
  328. package/src/store/gi/record-field-accessor.ts +26 -4
  329. package/src/store/gi/record-layout.ts +11 -1
  330. package/src/store/gi/record.ts +20 -12
  331. package/src/store/gi/registration.ts +2 -2
  332. package/src/store/gi/return-wrap.ts +1 -1
  333. package/src/store/gi/signal.ts +66 -42
  334. package/src/store/gi/value-marshalable.ts +3 -1
  335. package/src/store/gi/vtable.ts +97 -20
  336. package/src/store/gi-store.ts +26 -31
  337. package/src/store/jsx/generated-elements.ts +17 -8
  338. package/src/store/jsx/jsx.ts +3 -3
  339. package/src/store/jsx/metadata.ts +4 -1
  340. package/src/store/jsx-store.ts +3 -4
  341. package/src/store/resolve-store.ts +133 -18
  342. package/src/store/store-fs.ts +82 -35
  343. package/src/store/store-links.ts +49 -0
  344. package/src/writer/comparison-context.ts +18 -0
  345. package/src/writer/context.ts +12 -6
  346. package/src/writer/module.ts +101 -14
  347. package/src/xml.ts +103 -1
@@ -1,11 +1,19 @@
1
- import { chmodSync, existsSync, mkdirSync, mkdtempSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
1
+ import { errorMessage } from "@gtkx/utils";
2
+ import { chmodSync, existsSync, mkdirSync, realpathSync, renameSync, rmSync, symlinkSync, writeFileSync, } from "node:fs";
2
3
  import { dirname, join, relative } from "node:path";
4
+ import { keepFailedProject } from "../compile.js";
5
+ import { createStagingDir } from "../staging.js";
3
6
  import { compileStore } from "./compile-store.js";
4
7
  const STORE_DIR_MODE = 0o755;
8
+ const FAILED_STORE_SUFFIX = ".failed";
5
9
  const subpathExport = (stem) => ({
6
10
  types: `./${stem}.d.ts`,
7
11
  default: `./${stem}.js`,
8
12
  });
13
+ const namespaceBarrel = (directory) => ({
14
+ fileName: `${directory}/index.ts`,
15
+ source: `export * from "./${directory}.js";\n`,
16
+ });
9
17
  const buildManifest = (input) => {
10
18
  const manifest = {
11
19
  name: input.name,
@@ -21,25 +29,26 @@ const buildManifest = (input) => {
21
29
  };
22
30
  const writeStore = (params) => {
23
31
  const tmp = createTempStore(params.storeDir);
32
+ const keepAt = `${params.storeDir}${FAILED_STORE_SUFFIX}`;
24
33
  try {
25
- for (const file of params.files) {
26
- writeSourceFile(tmp, file.fileName, file.source);
27
- }
28
- compileStore({
29
- storeDir: tmp,
30
- files: params.files,
31
- packageName: params.manifest.name,
32
- ...(params.requiresEnvReference !== undefined && { requiresEnvReference: params.requiresEnvReference }),
33
- });
34
- writePackageJson(tmp, params.manifest);
35
- const rawFiles = params.rawFiles ?? [];
36
- for (const raw of rawFiles) {
37
- writeFileSync(join(tmp, raw.relativePath), raw.content);
38
- }
39
- swapStore(tmp, params.storeDir, params.linkDir);
34
+ buildTempStore(tmp, params);
35
+ swapStore(tmp, params.storeDir);
36
+ ensureStoreLink(params);
37
+ }
38
+ catch (error) {
39
+ throw keepFailedProject({ projectDir: tmp, keepAt, error });
40
+ }
41
+ rmSync(keepAt, { recursive: true, force: true });
42
+ };
43
+ const buildTempStore = (tmp, params) => {
44
+ writePackageJson(tmp, params.manifest);
45
+ for (const file of params.files) {
46
+ writeSourceFile(tmp, file.fileName, file.source);
40
47
  }
41
- finally {
42
- rmSync(tmp, { recursive: true, force: true });
48
+ compileStore({ storeDir: tmp, files: params.files, packageName: params.manifest.name });
49
+ const rawFiles = params.rawFiles ?? [];
50
+ for (const raw of rawFiles) {
51
+ writeFileSync(join(tmp, raw.relativePath), raw.content);
43
52
  }
44
53
  };
45
54
  const writeSourceFile = (storeDir, fileName, source) => {
@@ -55,7 +64,7 @@ const symlinkRelative = (linkPath, realTarget) => {
55
64
  const writePackageJson = (storeDir, manifest) => {
56
65
  writeFileSync(join(storeDir, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`);
57
66
  };
58
- const swapStore = (tmp, storeDir, visibleLink) => {
67
+ const swapStore = (tmp, storeDir) => {
59
68
  const previous = `${storeDir}.old`;
60
69
  rmSync(previous, { recursive: true, force: true });
61
70
  if (existsSync(storeDir)) {
@@ -63,13 +72,33 @@ const swapStore = (tmp, storeDir, visibleLink) => {
63
72
  }
64
73
  renameSync(tmp, storeDir);
65
74
  rmSync(previous, { recursive: true, force: true });
66
- symlinkRelative(visibleLink, storeDir);
67
75
  };
76
+ const isStoreLinked = (link) => {
77
+ try {
78
+ return realpathSync(link.linkDir) === realpathSync(link.storeDir);
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ };
84
+ const ensureStoreLink = (link) => {
85
+ if (!existsSync(join(link.storeDir, "package.json")) || isStoreLinked(link)) {
86
+ return;
87
+ }
88
+ symlinkRelative(link.linkDir, link.storeDir);
89
+ };
90
+ const storeWriteMessage = (storeDir, error) => `Cannot write the generated store to ${storeDir}: ${errorMessage(error)}. ` +
91
+ "Codegen writes the store into the node_modules the @gtkx packages resolve from, " +
92
+ `so ${dirname(storeDir)} has to be writable.`;
68
93
  const createTempStore = (storeDir) => {
69
- mkdirSync(dirname(storeDir), { recursive: true });
70
- const tmp = mkdtempSync(`${storeDir}.tmp-`);
71
- chmodSync(tmp, STORE_DIR_MODE);
72
- return tmp;
94
+ try {
95
+ const tmp = createStagingDir(storeDir);
96
+ chmodSync(tmp, STORE_DIR_MODE);
97
+ return tmp;
98
+ }
99
+ catch (error) {
100
+ throw new Error(storeWriteMessage(storeDir, error), { cause: error });
101
+ }
73
102
  };
74
- export { subpathExport, buildManifest, writeStore };
103
+ export { subpathExport, buildManifest, ensureStoreLink, namespaceBarrel, writeStore, };
75
104
  //# sourceMappingURL=store-fs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store-fs.js","sourceRoot":"","sources":["../../src/store/store-fs.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, existsSync, mkdirSync, mkdtempSync, renameSync, rmSync, symlinkSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport { compileStore } from \"./compile-store.js\";\n\n/** Where one generated store is written and how it is reached. */\ntype StoreOptions = {\n /** Directory the generated package is written to, replaced atomically on each run. */\n storeDir: string;\n /** Path the store is symlinked at, which is the specifier's resolution target under `node_modules`. */\n linkDir: string;\n /** Version stamped on the store's `package.json`, taken from the dependency the store is generated for. */\n version: string;\n};\n\ntype StoreFile = {\n fileName: string;\n source: string;\n};\n\ntype Manifest = {\n name: string;\n type: \"module\";\n version: string;\n sideEffects: true;\n exports: Record<string, unknown>;\n peerDependencies?: Record<string, string>;\n};\n\ntype ManifestInput = {\n name: string;\n version: string;\n exports: Record<string, unknown>;\n peerDependencies?: Record<string, string>;\n};\n\ntype RawFile = { relativePath: string; content: string };\n\ntype WriteStoreParams = {\n storeDir: string;\n linkDir: string;\n files: StoreFile[];\n manifest: Manifest;\n rawFiles?: RawFile[];\n requiresEnvReference?: boolean;\n};\n\nconst STORE_DIR_MODE = 0o755;\n\nconst subpathExport = (stem: string): { types: string; default: string } => ({\n types: `./${stem}.d.ts`,\n default: `./${stem}.js`,\n});\n\nconst buildManifest = (input: ManifestInput): Manifest => {\n const manifest: Manifest = {\n name: input.name,\n type: \"module\",\n version: input.version,\n sideEffects: true,\n exports: { \"./package.json\": \"./package.json\", ...input.exports },\n };\n\n if (input.peerDependencies) {\n manifest.peerDependencies = input.peerDependencies;\n }\n\n return manifest;\n};\n\nconst writeStore = (params: WriteStoreParams): void => {\n const tmp = createTempStore(params.storeDir);\n\n try {\n for (const file of params.files) {\n writeSourceFile(tmp, file.fileName, file.source);\n }\n\n compileStore({\n storeDir: tmp,\n files: params.files,\n packageName: params.manifest.name,\n ...(params.requiresEnvReference !== undefined && { requiresEnvReference: params.requiresEnvReference }),\n });\n\n writePackageJson(tmp, params.manifest);\n const rawFiles = params.rawFiles ?? [];\n\n for (const raw of rawFiles) {\n writeFileSync(join(tmp, raw.relativePath), raw.content);\n }\n\n swapStore(tmp, params.storeDir, params.linkDir);\n } finally {\n rmSync(tmp, { recursive: true, force: true });\n }\n};\n\nconst writeSourceFile = (storeDir: string, fileName: string, source: string): void => {\n const filePath = join(storeDir, fileName);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, source);\n};\n\nconst symlinkRelative = (linkPath: string, realTarget: string): void => {\n mkdirSync(dirname(linkPath), { recursive: true });\n rmSync(linkPath, { recursive: true, force: true });\n symlinkSync(relative(dirname(linkPath), realTarget), linkPath, \"dir\");\n};\n\nconst writePackageJson = (storeDir: string, manifest: Manifest): void => {\n writeFileSync(join(storeDir, \"package.json\"), `${JSON.stringify(manifest, null, 2)}\\n`);\n};\n\nconst swapStore = (tmp: string, storeDir: string, visibleLink: string): void => {\n const previous = `${storeDir}.old`;\n rmSync(previous, { recursive: true, force: true });\n\n if (existsSync(storeDir)) {\n renameSync(storeDir, previous);\n }\n\n renameSync(tmp, storeDir);\n rmSync(previous, { recursive: true, force: true });\n symlinkRelative(visibleLink, storeDir);\n};\n\nconst createTempStore = (storeDir: string): string => {\n mkdirSync(dirname(storeDir), { recursive: true });\n const tmp = mkdtempSync(`${storeDir}.tmp-`);\n chmodSync(tmp, STORE_DIR_MODE);\n\n return tmp;\n};\n\nexport { subpathExport, buildManifest, writeStore, type StoreOptions, type RawFile };\n"]}
1
+ {"version":3,"file":"store-fs.js","sourceRoot":"","sources":["../../src/store/store-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACH,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,MAAM,EACN,WAAW,EACX,aAAa,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAwClD,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAEtC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAsC,EAAE,CAAC,CAAC;IACzE,KAAK,EAAE,KAAK,IAAI,OAAO;IACvB,OAAO,EAAE,KAAK,IAAI,KAAK;CAC1B,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAwC,EAAE,CAAC,CAAC;IAClF,QAAQ,EAAE,GAAG,SAAS,WAAW;IACjC,MAAM,EAAE,oBAAoB,SAAS,SAAS;CACjD,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAY,EAAE;IACrD,MAAM,QAAQ,GAAa;QACvB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;KACpE,CAAC;IAEF,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACzB,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAwB,EAAQ,EAAE;IAClD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAE1D,IAAI,CAAC;QACD,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,MAAwB,EAAQ,EAAE;IACnE,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9B,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,QAAgB,EAAE,MAAc,EAAQ,EAAE;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,UAAkB,EAAQ,EAAE;IACnE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,QAAkB,EAAQ,EAAE;IACpE,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAQ,EAAE;IACtD,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IACnC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1B,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAe,EAAW,EAAE;IAC/C,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAe,EAAQ,EAAE;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1E,OAAO;IACX,CAAC;IAED,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,KAAc,EAAU,EAAE,CACnE,uCAAuC,QAAQ,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI;IAC3E,kFAAkF;IAClF,MAAM,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;AAElD,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAU,EAAE;IACjD,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACvC,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAE/B,OAAO,GAAG,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EACH,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,UAAU,GAGb,CAAC","sourcesContent":["import { errorMessage } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n realpathSync,\n renameSync,\n rmSync,\n symlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport { keepFailedProject, type SourceModule } from \"../compile.js\";\nimport { createStagingDir } from \"../staging.js\";\nimport { compileStore } from \"./compile-store.js\";\n\n/** Where one generated store is written and how it is reached. */\ntype StoreOptions = {\n /** Directory the generated package is written to, replaced atomically on each run. */\n storeDir: string;\n /** Path the store is symlinked at, which is the specifier's resolution target under `node_modules`. */\n linkDir: string;\n /** Version stamped on the store's `package.json`, taken from the dependency the store is generated for. */\n version: string;\n};\n\ntype StoreLink = Pick<StoreOptions, \"storeDir\" | \"linkDir\">;\n\ntype Manifest = {\n name: string;\n type: \"module\";\n version: string;\n sideEffects: true;\n exports: Record<string, unknown>;\n peerDependencies?: Record<string, string>;\n};\n\ntype ManifestInput = {\n name: string;\n version: string;\n exports: Record<string, unknown>;\n peerDependencies?: Record<string, string>;\n};\n\ntype RawFile = { relativePath: string; content: string };\n\ntype WriteStoreParams = {\n storeDir: string;\n linkDir: string;\n files: SourceModule[];\n manifest: Manifest;\n rawFiles?: RawFile[];\n};\n\nconst STORE_DIR_MODE = 0o755;\nconst FAILED_STORE_SUFFIX = \".failed\";\n\nconst subpathExport = (stem: string): { types: string; default: string } => ({\n types: `./${stem}.d.ts`,\n default: `./${stem}.js`,\n});\n\nconst namespaceBarrel = (directory: string): { fileName: string; source: string } => ({\n fileName: `${directory}/index.ts`,\n source: `export * from \"./${directory}.js\";\\n`,\n});\n\nconst buildManifest = (input: ManifestInput): Manifest => {\n const manifest: Manifest = {\n name: input.name,\n type: \"module\",\n version: input.version,\n sideEffects: true,\n exports: { \"./package.json\": \"./package.json\", ...input.exports },\n };\n\n if (input.peerDependencies) {\n manifest.peerDependencies = input.peerDependencies;\n }\n\n return manifest;\n};\n\nconst writeStore = (params: WriteStoreParams): void => {\n const tmp = createTempStore(params.storeDir);\n const keepAt = `${params.storeDir}${FAILED_STORE_SUFFIX}`;\n\n try {\n buildTempStore(tmp, params);\n swapStore(tmp, params.storeDir);\n ensureStoreLink(params);\n } catch (error) {\n throw keepFailedProject({ projectDir: tmp, keepAt, error });\n }\n\n rmSync(keepAt, { recursive: true, force: true });\n};\n\nconst buildTempStore = (tmp: string, params: WriteStoreParams): void => {\n writePackageJson(tmp, params.manifest);\n\n for (const file of params.files) {\n writeSourceFile(tmp, file.fileName, file.source);\n }\n\n compileStore({ storeDir: tmp, files: params.files, packageName: params.manifest.name });\n const rawFiles = params.rawFiles ?? [];\n\n for (const raw of rawFiles) {\n writeFileSync(join(tmp, raw.relativePath), raw.content);\n }\n};\n\nconst writeSourceFile = (storeDir: string, fileName: string, source: string): void => {\n const filePath = join(storeDir, fileName);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, source);\n};\n\nconst symlinkRelative = (linkPath: string, realTarget: string): void => {\n mkdirSync(dirname(linkPath), { recursive: true });\n rmSync(linkPath, { recursive: true, force: true });\n symlinkSync(relative(dirname(linkPath), realTarget), linkPath, \"dir\");\n};\n\nconst writePackageJson = (storeDir: string, manifest: Manifest): void => {\n writeFileSync(join(storeDir, \"package.json\"), `${JSON.stringify(manifest, null, 2)}\\n`);\n};\n\nconst swapStore = (tmp: string, storeDir: string): void => {\n const previous = `${storeDir}.old`;\n rmSync(previous, { recursive: true, force: true });\n\n if (existsSync(storeDir)) {\n renameSync(storeDir, previous);\n }\n\n renameSync(tmp, storeDir);\n rmSync(previous, { recursive: true, force: true });\n};\n\nconst isStoreLinked = (link: StoreLink): boolean => {\n try {\n return realpathSync(link.linkDir) === realpathSync(link.storeDir);\n } catch {\n return false;\n }\n};\n\nconst ensureStoreLink = (link: StoreLink): void => {\n if (!existsSync(join(link.storeDir, \"package.json\")) || isStoreLinked(link)) {\n return;\n }\n\n symlinkRelative(link.linkDir, link.storeDir);\n};\n\nconst storeWriteMessage = (storeDir: string, error: unknown): string =>\n `Cannot write the generated store to ${storeDir}: ${errorMessage(error)}. ` +\n \"Codegen writes the store into the node_modules the @gtkx packages resolve from, \" +\n `so ${dirname(storeDir)} has to be writable.`;\n\nconst createTempStore = (storeDir: string): string => {\n try {\n const tmp = createStagingDir(storeDir);\n chmodSync(tmp, STORE_DIR_MODE);\n\n return tmp;\n } catch (error) {\n throw new Error(storeWriteMessage(storeDir, error), { cause: error });\n }\n};\n\nexport {\n subpathExport,\n buildManifest,\n ensureStoreLink,\n namespaceBarrel,\n writeStore,\n type StoreOptions,\n type RawFile,\n};\n"]}
@@ -0,0 +1,3 @@
1
+ declare const ensureStoreLinks: (projectRoot: string) => void;
2
+ export { ensureStoreLinks };
3
+ //# sourceMappingURL=store-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-links.d.ts","sourceRoot":"","sources":["../../src/store/store-links.ts"],"names":[],"mappings":"AAkCA,QAAA,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,IAY/C,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { resolveStore } from "./resolve-store.js";
4
+ import { ensureStoreLink } from "./store-fs.js";
5
+ const resolvedStores = new Map();
6
+ const resolveStoreOrNull = (projectRoot) => {
7
+ try {
8
+ return resolveStore(projectRoot);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ };
14
+ const isStoreDirPresent = (store) => existsSync(join(store.gi.storeDir, "package.json"));
15
+ const storeFor = (projectRoot) => {
16
+ const cached = resolvedStores.get(projectRoot);
17
+ if (cached !== undefined && isStoreDirPresent(cached)) {
18
+ return cached;
19
+ }
20
+ const resolved = resolveStoreOrNull(projectRoot);
21
+ resolvedStores.delete(projectRoot);
22
+ if (resolved !== null) {
23
+ resolvedStores.set(projectRoot, resolved);
24
+ }
25
+ return resolved;
26
+ };
27
+ const ensureStoreLinks = (projectRoot) => {
28
+ const store = storeFor(projectRoot);
29
+ if (store === null) {
30
+ return;
31
+ }
32
+ for (const unit of [store.gi, store.jsx]) {
33
+ if (unit !== null) {
34
+ ensureStoreLink(unit);
35
+ }
36
+ }
37
+ };
38
+ export { ensureStoreLinks };
39
+ //# sourceMappingURL=store-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-links.js","sourceRoot":"","sources":["../../src/store/store-links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAsB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,cAAc,GAA+B,IAAI,GAAG,EAAE,CAAC;AAE7D,MAAM,kBAAkB,GAAG,CAAC,WAAmB,EAAwB,EAAE;IACrE,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAoB,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;AAEjH,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAwB,EAAE;IAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,MAAM,KAAK,SAAS,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACjD,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpB,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAQ,EAAE;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO;IACX,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type ResolvedStore, resolveStore } from \"./resolve-store.js\";\nimport { ensureStoreLink } from \"./store-fs.js\";\n\nconst resolvedStores: Map<string, ResolvedStore> = new Map();\n\nconst resolveStoreOrNull = (projectRoot: string): ResolvedStore | null => {\n try {\n return resolveStore(projectRoot);\n } catch {\n return null;\n }\n};\n\nconst isStoreDirPresent = (store: ResolvedStore): boolean => existsSync(join(store.gi.storeDir, \"package.json\"));\n\nconst storeFor = (projectRoot: string): ResolvedStore | null => {\n const cached = resolvedStores.get(projectRoot);\n\n if (cached !== undefined && isStoreDirPresent(cached)) {\n return cached;\n }\n\n const resolved = resolveStoreOrNull(projectRoot);\n resolvedStores.delete(projectRoot);\n\n if (resolved !== null) {\n resolvedStores.set(projectRoot, resolved);\n }\n\n return resolved;\n};\n\nconst ensureStoreLinks = (projectRoot: string): void => {\n const store = storeFor(projectRoot);\n\n if (store === null) {\n return;\n }\n\n for (const unit of [store.gi, store.jsx]) {\n if (unit !== null) {\n ensureStoreLink(unit);\n }\n }\n};\n\nexport { ensureStoreLinks };\n"]}
@@ -0,0 +1,4 @@
1
+ import { ModuleContext } from "./context.js";
2
+ declare const comparisonContextFor: (context: ModuleContext) => ModuleContext;
3
+ export { comparisonContextFor };
4
+ //# sourceMappingURL=comparison-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison-context.d.ts","sourceRoot":"","sources":["../../src/writer/comparison-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,QAAA,MAAM,oBAAoB,GAAI,SAAS,aAAa,KAAG,aAWtD,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { ModuleContext } from "./context.js";
2
+ const COMPARISON_CONTEXTS = new WeakMap();
3
+ const comparisonContextFor = (context) => {
4
+ const existing = COMPARISON_CONTEXTS.get(context);
5
+ if (existing !== undefined) {
6
+ return existing;
7
+ }
8
+ const created = new ModuleContext(context.namespace, context.library);
9
+ COMPARISON_CONTEXTS.set(context, created);
10
+ return created;
11
+ };
12
+ export { comparisonContextFor };
13
+ //# sourceMappingURL=comparison-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison-context.js","sourceRoot":"","sources":["../../src/writer/comparison-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,mBAAmB,GAA0C,IAAI,OAAO,EAAE,CAAC;AAEjF,MAAM,oBAAoB,GAAG,CAAC,OAAsB,EAAiB,EAAE;IACnE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC","sourcesContent":["import { ModuleContext } from \"./context.js\";\n\nconst COMPARISON_CONTEXTS: WeakMap<ModuleContext, ModuleContext> = new WeakMap();\n\nconst comparisonContextFor = (context: ModuleContext): ModuleContext => {\n const existing = COMPARISON_CONTEXTS.get(context);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const created = new ModuleContext(context.namespace, context.library);\n COMPARISON_CONTEXTS.set(context, created);\n\n return created;\n};\n\nexport { comparisonContextFor };\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { Library } from "../gir/library.js";
2
2
  import type { GirNamespace } from "../gir/namespace.js";
3
- import { type DeclaredType, ModuleBuilder } from "./module.js";
3
+ import { type Declaration, ModuleBuilder } from "./module.js";
4
4
  declare class ModuleContext {
5
5
  module: ModuleBuilder;
6
6
  namespace: GirNamespace;
@@ -11,8 +11,8 @@ declare class ModuleContext {
11
11
  hoistDescriptor(expression: string): string;
12
12
  addGObjectBootstrapImports(): void;
13
13
  addCrossNamespaceImport(namespaceName: string): string;
14
- declaredType(owner: string, name?: string): DeclaredType;
15
- qualify(namespaceName: string, typeName: string): string;
14
+ declare(declaration: Declaration): void;
15
+ qualify(namespaceName: string, name: string): string;
16
16
  }
17
17
  export { ModuleContext };
18
18
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/writer/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,KAAK,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,cAAM,aAAa;IACR,MAAM,EAAE,aAAa,CAAuB;IAC5C,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;gBAEZ,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;IAKrD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI3C,0BAA0B,IAAI,IAAI;IAalC,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAkBtD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAc,GAAG,YAAY;IAI/D,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAO3D;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/writer/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,cAAM,aAAa;IACR,MAAM,EAAE,aAAa,CAAuB;IAC5C,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;gBAEZ,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;IAKrD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI3C,0BAA0B,IAAI,IAAI;IAalC,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAkBtD,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAUvC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;CAOvD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -39,14 +39,19 @@ class ModuleContext {
39
39
  this.module.imports.addNamespace(path, namespaceName);
40
40
  return namespaceName;
41
41
  }
42
- declaredType(owner, name = owner) {
43
- return { name, owner: `${this.namespace.name}.${owner}` };
44
- }
45
- qualify(namespaceName, typeName) {
42
+ declare(declaration) {
43
+ const { name, code, owner } = declaration;
44
+ this.module.appendDeclaration({
45
+ name,
46
+ code,
47
+ owner: owner === undefined ? undefined : `${this.namespace.name}.${owner}`,
48
+ });
49
+ }
50
+ qualify(namespaceName, name) {
46
51
  if (namespaceName === this.namespace.name) {
47
- return typeName;
52
+ return name;
48
53
  }
49
- return `${this.addCrossNamespaceImport(namespaceName)}.${typeName}`;
54
+ return `${this.addCrossNamespaceImport(namespaceName)}.${name}`;
50
55
  }
51
56
  }
52
57
  export { ModuleContext };
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/writer/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,aAAa;IACR,MAAM,GAAkB,IAAI,aAAa,EAAE,CAAC;IAC5C,SAAS,CAAe;IACxB,OAAO,CAAU;IAExB,YAAY,SAAuB,EAAE,OAAgB;QACjD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,oBAAoB,CAAC,IAAY;QAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,eAAe,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,0BAA0B;QACtB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;IACvE,CAAC;IAED,uBAAuB,CAAC,aAAqB;QACzC,IAAI,aAAa,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,cAAc,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC;QACvE,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,WAAW,CAAC;QAE7F,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAEtD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,OAAe,KAAK;QAC5C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,aAAqB,EAAE,QAAgB;QAC3C,IAAI,aAAa,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,IAAI,QAAQ,EAAE,CAAC;IACxE,CAAC;CACJ;AAED,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type { Library } from \"../gir/library.js\";\nimport type { GirNamespace } from \"../gir/namespace.js\";\nimport { type DeclaredType, ModuleBuilder } from \"./module.js\";\n\nclass ModuleContext {\n public module: ModuleBuilder = new ModuleBuilder();\n public namespace: GirNamespace;\n public library: Library;\n\n constructor(namespace: GirNamespace, library: Library) {\n this.namespace = namespace;\n this.library = library;\n }\n\n addRuntimeImport(name: string): void {\n this.module.imports.addNamed(\"@gtkx/runtime\", name);\n }\n\n addRuntimeTypeImport(name: string): void {\n this.module.imports.addNamed(\"@gtkx/runtime\", name, true);\n }\n\n hoistDescriptor(expression: string): string {\n return this.module.hoistDescriptor(expression);\n }\n\n addGObjectBootstrapImports(): void {\n if (this.namespace.name === \"GObject\") {\n return;\n }\n\n if (this.namespace.name === \"GLib\") {\n return;\n }\n\n this.module.imports.addSideEffect(\"../gobject/overrides/object.js\");\n this.module.imports.addSideEffect(\"../gobject/overrides/value.js\");\n }\n\n addCrossNamespaceImport(namespaceName: string): string {\n if (namespaceName === this.namespace.name) {\n return namespaceName;\n }\n\n const directory = namespaceName.toLowerCase();\n const isFoundational = directory === \"gobject\" || directory === \"glib\";\n const path = isFoundational ? `../${directory}/${directory}.js` : `../${directory}/index.js`;\n\n if (!isFoundational) {\n this.module.imports.addSideEffect(path);\n }\n\n this.module.imports.addNamespace(path, namespaceName);\n\n return namespaceName;\n }\n\n declaredType(owner: string, name: string = owner): DeclaredType {\n return { name, owner: `${this.namespace.name}.${owner}` };\n }\n\n qualify(namespaceName: string, typeName: string): string {\n if (namespaceName === this.namespace.name) {\n return typeName;\n }\n\n return `${this.addCrossNamespaceImport(namespaceName)}.${typeName}`;\n }\n}\n\nexport { ModuleContext };\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/writer/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,aAAa;IACR,MAAM,GAAkB,IAAI,aAAa,EAAE,CAAC;IAC5C,SAAS,CAAe;IACxB,OAAO,CAAU;IAExB,YAAY,SAAuB,EAAE,OAAgB;QACjD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,oBAAoB,CAAC,IAAY;QAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,eAAe,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,0BAA0B;QACtB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;IACvE,CAAC;IAED,uBAAuB,CAAC,aAAqB;QACzC,IAAI,aAAa,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,cAAc,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC;QACvE,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,WAAW,CAAC;QAE7F,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAEtD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,WAAwB;QAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC1B,IAAI;YACJ,IAAI;YACJ,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,KAAK,EAAE;SAC7E,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,aAAqB,EAAE,IAAY;QACvC,IAAI,aAAa,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;IACpE,CAAC;CACJ;AAED,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type { Library } from \"../gir/library.js\";\nimport type { GirNamespace } from \"../gir/namespace.js\";\nimport { type Declaration, ModuleBuilder } from \"./module.js\";\n\nclass ModuleContext {\n public module: ModuleBuilder = new ModuleBuilder();\n public namespace: GirNamespace;\n public library: Library;\n\n constructor(namespace: GirNamespace, library: Library) {\n this.namespace = namespace;\n this.library = library;\n }\n\n addRuntimeImport(name: string): void {\n this.module.imports.addNamed(\"@gtkx/runtime\", name);\n }\n\n addRuntimeTypeImport(name: string): void {\n this.module.imports.addNamed(\"@gtkx/runtime\", name, true);\n }\n\n hoistDescriptor(expression: string): string {\n return this.module.hoistDescriptor(expression);\n }\n\n addGObjectBootstrapImports(): void {\n if (this.namespace.name === \"GObject\") {\n return;\n }\n\n if (this.namespace.name === \"GLib\") {\n return;\n }\n\n this.module.imports.addSideEffect(\"../gobject/overrides/object.js\");\n this.module.imports.addSideEffect(\"../gobject/overrides/value.js\");\n }\n\n addCrossNamespaceImport(namespaceName: string): string {\n if (namespaceName === this.namespace.name) {\n return namespaceName;\n }\n\n const directory = namespaceName.toLowerCase();\n const isFoundational = directory === \"gobject\" || directory === \"glib\";\n const path = isFoundational ? `../${directory}/${directory}.js` : `../${directory}/index.js`;\n\n if (!isFoundational) {\n this.module.imports.addSideEffect(path);\n }\n\n this.module.imports.addNamespace(path, namespaceName);\n\n return namespaceName;\n }\n\n declare(declaration: Declaration): void {\n const { name, code, owner } = declaration;\n\n this.module.appendDeclaration({\n name,\n code,\n owner: owner === undefined ? undefined : `${this.namespace.name}.${owner}`,\n });\n }\n\n qualify(namespaceName: string, name: string): string {\n if (namespaceName === this.namespace.name) {\n return name;\n }\n\n return `${this.addCrossNamespaceImport(namespaceName)}.${name}`;\n }\n}\n\nexport { ModuleContext };\n"]}
@@ -1,22 +1,30 @@
1
1
  import { ImportsBuilder } from "./imports.js";
2
- type DeclaredType = {
2
+ type Declaration = {
3
3
  name: string;
4
- owner: string;
4
+ code: string;
5
+ owner?: string | undefined;
5
6
  };
6
7
  declare class ModuleBuilder {
7
8
  private bindings;
8
9
  private bindingNames;
9
10
  private hoistedDescriptors;
11
+ private claimedSpaces;
10
12
  private declarations;
13
+ private declaredNames;
11
14
  private declaredTypes;
12
15
  private registrations;
16
+ private requiredNames;
13
17
  imports: ImportsBuilder;
18
+ private claimSpace;
19
+ private claimExportedName;
14
20
  private claimTypeName;
21
+ private verifyRegistrations;
15
22
  appendBinding(code: string, name?: string): void;
16
23
  hoistDescriptor(expression: string): string;
17
- appendDeclaration(code: string, declared?: DeclaredType): void;
18
- appendRegistration(code: string): void;
24
+ appendDeclaration(declaration: Declaration): void;
25
+ hasExports(): boolean;
26
+ appendRegistration(code: string, requires?: string[]): void;
19
27
  toSource(): string;
20
28
  }
21
- export { type DeclaredType, ModuleBuilder };
29
+ export { type Declaration, ModuleBuilder };
22
30
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/writer/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,KAAK,YAAY,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,cAAM,aAAa;IACf,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,aAAa,CAAgB;IAC9B,OAAO,EAAE,cAAc,CAAwB;IAEtD,OAAO,CAAC,aAAa;IAarB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAYhD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAc3C,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI;IAQ9D,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,QAAQ,IAAI,MAAM;CAsBrB;AAED,OAAO,EAAE,KAAK,YAAY,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/writer/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,KAAK,WAAW,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC;AA6BF,cAAM,aAAa;IACf,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAA0B;IACxC,OAAO,EAAE,cAAc,CAAwB;IAEtD,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,mBAAmB;IAa3B,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAYhD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAc3C,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAOjD,UAAU,IAAI,OAAO;IAIrB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,IAAI;IAQ/D,QAAQ,IAAI,MAAM;CAuBrB;AAED,OAAO,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,CAAC"}
@@ -1,19 +1,69 @@
1
1
  import { ImportsBuilder } from "./imports.js";
2
+ const EXPORTED_DECLARATION = /^export (?:abstract )?(class|const|enum|function|interface|type) ([A-Za-z_$][\w$]*)/mu;
3
+ const SPACES_BY_KEYWORD = new Map([
4
+ ["class", ["value", "type"]],
5
+ ["const", ["value"]],
6
+ ["enum", ["value", "type"]],
7
+ ["function", ["value"]],
8
+ ["interface", []],
9
+ ["type", ["type"]],
10
+ ]);
11
+ const getExportedDeclaration = (code) => {
12
+ const match = EXPORTED_DECLARATION.exec(code);
13
+ const spaces = SPACES_BY_KEYWORD.get(match?.[1] ?? "");
14
+ const name = match?.[2];
15
+ return spaces === undefined || name === undefined ? undefined : { name, spaces };
16
+ };
17
+ const exportedNameText = (exported) => exported === undefined ? "no name at all" : `'${exported.name}'`;
2
18
  class ModuleBuilder {
3
19
  bindings = [];
4
20
  bindingNames = new Set();
5
21
  hoistedDescriptors = new Map();
22
+ claimedSpaces = new Set();
6
23
  declarations = [];
24
+ declaredNames = new Set();
7
25
  declaredTypes = new Map();
8
26
  registrations = [];
27
+ requiredNames = new Set();
9
28
  imports = new ImportsBuilder();
10
- claimTypeName(declared) {
11
- const owner = this.declaredTypes.get(declared.name);
12
- if (owner !== undefined && owner !== declared.owner) {
13
- throw new Error(`The generated type '${declared.name}' is declared for both ${owner} and ${declared.owner}. ` +
29
+ claimSpace(name, space) {
30
+ const key = `${space} ${name}`;
31
+ if (this.claimedSpaces.has(key)) {
32
+ throw new Error(`The generated module declares '${name}' twice in its ${space} space. ` +
33
+ "A module may declare each exported name once per declaration space.");
34
+ }
35
+ this.claimedSpaces.add(key);
36
+ }
37
+ claimExportedName(declaration) {
38
+ const exported = getExportedDeclaration(declaration.code);
39
+ const spaces = exported?.name === declaration.name ? exported.spaces : undefined;
40
+ if (spaces === undefined) {
41
+ throw new Error(`The declaration recorded as '${declaration.name}' exports ${exportedNameText(exported)}. ` +
42
+ "A declaration may only be recorded under the name its own code exports.");
43
+ }
44
+ for (const space of spaces) {
45
+ this.claimSpace(declaration.name, space);
46
+ }
47
+ }
48
+ claimTypeName(declaration) {
49
+ const { name, owner } = declaration;
50
+ if (owner === undefined) {
51
+ return;
52
+ }
53
+ const previous = this.declaredTypes.get(name);
54
+ if (previous !== undefined && previous !== owner) {
55
+ throw new Error(`The generated type '${name}' is declared for both ${previous} and ${owner}. ` +
14
56
  "Rename one of them, or drop the namespace from the configuration.");
15
57
  }
16
- this.declaredTypes.set(declared.name, declared.owner);
58
+ this.declaredTypes.set(name, owner);
59
+ }
60
+ verifyRegistrations() {
61
+ const missing = [...this.requiredNames].filter((name) => !this.declaredNames.has(name));
62
+ if (missing.length === 0) {
63
+ return;
64
+ }
65
+ throw new Error(`The generated module registers ${missing.join(", ")}, which it never declares. ` +
66
+ "A registration may only name a symbol whose declaration the same module emits.");
17
67
  }
18
68
  appendBinding(code, name) {
19
69
  if (name !== undefined) {
@@ -34,16 +84,23 @@ class ModuleBuilder {
34
84
  this.appendBinding(`const ${name} = ${expression};`, name);
35
85
  return name;
36
86
  }
37
- appendDeclaration(code, declared) {
38
- if (declared !== undefined) {
39
- this.claimTypeName(declared);
40
- }
41
- this.declarations.push(code);
87
+ appendDeclaration(declaration) {
88
+ this.claimExportedName(declaration);
89
+ this.claimTypeName(declaration);
90
+ this.declaredNames.add(declaration.name);
91
+ this.declarations.push(declaration.code);
42
92
  }
43
- appendRegistration(code) {
93
+ hasExports() {
94
+ return this.declaredNames.size > 0;
95
+ }
96
+ appendRegistration(code, requires = []) {
97
+ for (const name of requires) {
98
+ this.requiredNames.add(name);
99
+ }
44
100
  this.registrations.push(code);
45
101
  }
46
102
  toSource() {
103
+ this.verifyRegistrations();
47
104
  const sections = [];
48
105
  const importsBlock = this.imports.toSource();
49
106
  if (importsBlock.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/writer/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9C,MAAM,aAAa;IACP,QAAQ,GAAa,EAAE,CAAC;IACxB,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IACtC,kBAAkB,GAAwB,IAAI,GAAG,EAAE,CAAC;IACpD,YAAY,GAAa,EAAE,CAAC;IAC5B,aAAa,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC/C,aAAa,GAAa,EAAE,CAAC;IAC9B,OAAO,GAAmB,IAAI,cAAc,EAAE,CAAC;IAE9C,aAAa,CAAC,QAAsB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACX,uBAAuB,QAAQ,CAAC,IAAI,0BAA0B,KAAK,QAAQ,QAAQ,CAAC,KAAK,IAAI;gBAC7F,mEAAmE,CACtE,CAAC;QACN,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,IAAa;QACrC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,OAAO;YACX,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,eAAe,CAAC,UAAkB;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEzD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,CAAC;QAE3D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,iBAAiB,CAAC,IAAY,EAAE,QAAuB;QACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,kBAAkB,CAAC,IAAY;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ;QACJ,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAE7C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACxC,CAAC;CACJ;AAED,OAAO,EAAqB,aAAa,EAAE,CAAC","sourcesContent":["import { ImportsBuilder } from \"./imports.js\";\n\ntype DeclaredType = {\n name: string;\n owner: string;\n};\n\nclass ModuleBuilder {\n private bindings: string[] = [];\n private bindingNames: Set<string> = new Set();\n private hoistedDescriptors: Map<string, string> = new Map();\n private declarations: string[] = [];\n private declaredTypes: Map<string, string> = new Map();\n private registrations: string[] = [];\n public imports: ImportsBuilder = new ImportsBuilder();\n\n private claimTypeName(declared: DeclaredType): void {\n const owner = this.declaredTypes.get(declared.name);\n\n if (owner !== undefined && owner !== declared.owner) {\n throw new Error(\n `The generated type '${declared.name}' is declared for both ${owner} and ${declared.owner}. ` +\n \"Rename one of them, or drop the namespace from the configuration.\",\n );\n }\n\n this.declaredTypes.set(declared.name, declared.owner);\n }\n\n appendBinding(code: string, name?: string): void {\n if (name !== undefined) {\n if (this.bindingNames.has(name)) {\n return;\n }\n\n this.bindingNames.add(name);\n }\n\n this.bindings.push(code);\n }\n\n hoistDescriptor(expression: string): string {\n const existing = this.hoistedDescriptors.get(expression);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const name = `_desc${String(this.hoistedDescriptors.size)}`;\n this.hoistedDescriptors.set(expression, name);\n this.appendBinding(`const ${name} = ${expression};`, name);\n\n return name;\n }\n\n appendDeclaration(code: string, declared?: DeclaredType): void {\n if (declared !== undefined) {\n this.claimTypeName(declared);\n }\n\n this.declarations.push(code);\n }\n\n appendRegistration(code: string): void {\n this.registrations.push(code);\n }\n\n toSource(): string {\n const sections: string[] = [];\n const importsBlock = this.imports.toSource();\n\n if (importsBlock.length > 0) {\n sections.push(importsBlock.trimEnd());\n }\n\n if (this.declarations.length > 0) {\n sections.push(this.declarations.join(\"\\n\\n\"));\n }\n\n if (this.bindings.length > 0) {\n sections.push(this.bindings.join(\"\\n\\n\"));\n }\n\n if (this.registrations.length > 0) {\n sections.push(this.registrations.join(\"\\n\\n\"));\n }\n\n return `${sections.join(\"\\n\\n\")}\\n`;\n }\n}\n\nexport { type DeclaredType, ModuleBuilder };\n"]}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/writer/module.ts"],"names":[],"mappings":"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","sourcesContent":["import { ImportsBuilder } from \"./imports.js\";\n\ntype Declaration = {\n name: string;\n code: string;\n owner?: string | undefined;\n};\n\ntype ExportedDeclaration = {\n name: string;\n spaces: string[];\n};\n\nconst EXPORTED_DECLARATION = /^export (?:abstract )?(class|const|enum|function|interface|type) ([A-Za-z_$][\\w$]*)/mu;\n\nconst SPACES_BY_KEYWORD: Map<string, string[]> = new Map([\n [\"class\", [\"value\", \"type\"]],\n [\"const\", [\"value\"]],\n [\"enum\", [\"value\", \"type\"]],\n [\"function\", [\"value\"]],\n [\"interface\", []],\n [\"type\", [\"type\"]],\n]);\n\nconst getExportedDeclaration = (code: string): ExportedDeclaration | undefined => {\n const match = EXPORTED_DECLARATION.exec(code);\n const spaces = SPACES_BY_KEYWORD.get(match?.[1] ?? \"\");\n const name = match?.[2];\n\n return spaces === undefined || name === undefined ? undefined : { name, spaces };\n};\n\nconst exportedNameText = (exported: ExportedDeclaration | undefined): string =>\n exported === undefined ? \"no name at all\" : `'${exported.name}'`;\n\nclass ModuleBuilder {\n private bindings: string[] = [];\n private bindingNames: Set<string> = new Set();\n private hoistedDescriptors: Map<string, string> = new Map();\n private claimedSpaces: Set<string> = new Set();\n private declarations: string[] = [];\n private declaredNames: Set<string> = new Set();\n private declaredTypes: Map<string, string> = new Map();\n private registrations: string[] = [];\n private requiredNames: Set<string> = new Set();\n public imports: ImportsBuilder = new ImportsBuilder();\n\n private claimSpace(name: string, space: string): void {\n const key = `${space} ${name}`;\n\n if (this.claimedSpaces.has(key)) {\n throw new Error(\n `The generated module declares '${name}' twice in its ${space} space. ` +\n \"A module may declare each exported name once per declaration space.\",\n );\n }\n\n this.claimedSpaces.add(key);\n }\n\n private claimExportedName(declaration: Declaration): void {\n const exported = getExportedDeclaration(declaration.code);\n const spaces = exported?.name === declaration.name ? exported.spaces : undefined;\n\n if (spaces === undefined) {\n throw new Error(\n `The declaration recorded as '${declaration.name}' exports ${exportedNameText(exported)}. ` +\n \"A declaration may only be recorded under the name its own code exports.\",\n );\n }\n\n for (const space of spaces) {\n this.claimSpace(declaration.name, space);\n }\n }\n\n private claimTypeName(declaration: Declaration): void {\n const { name, owner } = declaration;\n\n if (owner === undefined) {\n return;\n }\n\n const previous = this.declaredTypes.get(name);\n\n if (previous !== undefined && previous !== owner) {\n throw new Error(\n `The generated type '${name}' is declared for both ${previous} and ${owner}. ` +\n \"Rename one of them, or drop the namespace from the configuration.\",\n );\n }\n\n this.declaredTypes.set(name, owner);\n }\n\n private verifyRegistrations(): void {\n const missing = [...this.requiredNames].filter((name) => !this.declaredNames.has(name));\n\n if (missing.length === 0) {\n return;\n }\n\n throw new Error(\n `The generated module registers ${missing.join(\", \")}, which it never declares. ` +\n \"A registration may only name a symbol whose declaration the same module emits.\",\n );\n }\n\n appendBinding(code: string, name?: string): void {\n if (name !== undefined) {\n if (this.bindingNames.has(name)) {\n return;\n }\n\n this.bindingNames.add(name);\n }\n\n this.bindings.push(code);\n }\n\n hoistDescriptor(expression: string): string {\n const existing = this.hoistedDescriptors.get(expression);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const name = `_desc${String(this.hoistedDescriptors.size)}`;\n this.hoistedDescriptors.set(expression, name);\n this.appendBinding(`const ${name} = ${expression};`, name);\n\n return name;\n }\n\n appendDeclaration(declaration: Declaration): void {\n this.claimExportedName(declaration);\n this.claimTypeName(declaration);\n this.declaredNames.add(declaration.name);\n this.declarations.push(declaration.code);\n }\n\n hasExports(): boolean {\n return this.declaredNames.size > 0;\n }\n\n appendRegistration(code: string, requires: string[] = []): void {\n for (const name of requires) {\n this.requiredNames.add(name);\n }\n\n this.registrations.push(code);\n }\n\n toSource(): string {\n this.verifyRegistrations();\n const sections: string[] = [];\n const importsBlock = this.imports.toSource();\n\n if (importsBlock.length > 0) {\n sections.push(importsBlock.trimEnd());\n }\n\n if (this.declarations.length > 0) {\n sections.push(this.declarations.join(\"\\n\\n\"));\n }\n\n if (this.bindings.length > 0) {\n sections.push(this.bindings.join(\"\\n\\n\"));\n }\n\n if (this.registrations.length > 0) {\n sections.push(this.registrations.join(\"\\n\\n\"));\n }\n\n return `${sections.join(\"\\n\\n\")}\\n`;\n }\n}\n\nexport { type Declaration, ModuleBuilder };\n"]}
package/dist/xml.d.ts CHANGED
@@ -1,4 +1,11 @@
1
1
  import { type X2jOptions, XMLParser } from "fast-xml-parser";
2
+ type XmlFileInput = {
3
+ parser: XMLParser;
4
+ label: string;
5
+ path: string;
6
+ malformedRemedy?: string;
7
+ };
2
8
  declare const createXmlParser: (options: Partial<X2jOptions>) => XMLParser;
3
- export { createXmlParser };
9
+ declare const parseXmlFile: (input: XmlFileInput) => unknown;
10
+ export { createXmlParser, parseXmlFile };
4
11
  //# sourceMappingURL=xml.d.ts.map
package/dist/xml.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7D,QAAA,MAAM,eAAe,GAAI,SAAS,OAAO,CAAC,UAAU,CAAC,KAAG,SAOlD,CAAC;AAEP,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI7D,KAAK,YAAY,GAAG;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAKF,QAAA,MAAM,eAAe,GAAI,SAAS,OAAO,CAAC,UAAU,CAAC,KAAG,SAOlD,CAAC;AAgFP,QAAA,MAAM,YAAY,GAAI,OAAO,YAAY,KAAG,OAS3C,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC"}
package/dist/xml.js CHANGED
@@ -1,4 +1,9 @@
1
+ import { errorMessage, isRecord } from "@gtkx/utils";
1
2
  import { XMLParser } from "fast-xml-parser";
3
+ import { SyntaxValidator } from "fast-xml-validator";
4
+ import { readFileSync } from "node:fs";
5
+ const HIGHEST_CONTROL_CODE = 0x1F;
6
+ const LEGAL_CONTROL_CODES = new Set([0x09, 0x0A, 0x0D]);
2
7
  const createXmlParser = (options) => new XMLParser({
3
8
  ignoreAttributes: false,
4
9
  attributeNamePrefix: "@_",
@@ -6,5 +11,69 @@ const createXmlParser = (options) => new XMLParser({
6
11
  parseTagValue: false,
7
12
  ...options,
8
13
  });
9
- export { createXmlParser };
14
+ const xmlFileError = (input, action, error) => new Error(`Cannot ${action} the ${input.label} at ${input.path}: ${errorMessage(error)}`, { cause: error });
15
+ const readXmlFile = (input) => {
16
+ try {
17
+ return readFileSync(input.path, "utf8");
18
+ }
19
+ catch (error) {
20
+ throw xmlFileError(input, "read", error);
21
+ }
22
+ };
23
+ const isLocated = (line, col) => typeof line === "number" && typeof col === "number" && (line > 1 || col > 1);
24
+ const positionSuffix = (error) => {
25
+ if (!isRecord(error)) {
26
+ return "";
27
+ }
28
+ const { line, col } = error;
29
+ if (!isLocated(line, col)) {
30
+ return "";
31
+ }
32
+ return ` (line ${String(line)}, column ${String(col)})`;
33
+ };
34
+ const isIllegalControlCode = (code) => code <= HIGHEST_CONTROL_CODE && !LEGAL_CONTROL_CODES.has(code);
35
+ const escapedCode = (code) => `[U+${code.toString(16).toUpperCase().padStart(4, "0")}]`;
36
+ const escapeControlCodes = (text) => {
37
+ let escaped = "";
38
+ for (const character of text) {
39
+ const code = character.codePointAt(0) ?? 0;
40
+ escaped += isIllegalControlCode(code) ? escapedCode(code) : character;
41
+ }
42
+ return escaped;
43
+ };
44
+ const offendingLine = (xml, error) => {
45
+ const line = isRecord(error) ? error.line : undefined;
46
+ if (typeof line !== "number") {
47
+ return "";
48
+ }
49
+ const text = xml.split("\n")[line - 1];
50
+ if (text === undefined) {
51
+ return "";
52
+ }
53
+ return `\n ${escapeControlCodes(text.replace(/^[ \t]+/, "").replace(/\r$/, ""))}`;
54
+ };
55
+ const remedySuffix = (input, xml, error) => {
56
+ const remedy = input.malformedRemedy;
57
+ return remedy === undefined ? "" : `${offendingLine(xml, error)}\n${remedy}`;
58
+ };
59
+ const assertWellFormed = (input, xml) => {
60
+ try {
61
+ SyntaxValidator.validate(xml);
62
+ }
63
+ catch (error) {
64
+ throw new Error(`The ${input.label} at ${input.path} is not well-formed XML: ` +
65
+ `${errorMessage(error)}${positionSuffix(error)}${remedySuffix(input, xml, error)}`, { cause: error });
66
+ }
67
+ };
68
+ const parseXmlFile = (input) => {
69
+ const xml = readXmlFile(input);
70
+ assertWellFormed(input, xml);
71
+ try {
72
+ return input.parser.parse(xml);
73
+ }
74
+ catch (error) {
75
+ throw xmlFileError(input, "parse", error);
76
+ }
77
+ };
78
+ export { createXmlParser, parseXmlFile };
10
79
  //# sourceMappingURL=xml.js.map