@apollo-deploy/signal-schemas 1.0.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 (258) hide show
  1. package/README.md +117 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/definitions/common.d.ts +72 -0
  4. package/dist/definitions/common.d.ts.map +1 -0
  5. package/dist/definitions/common.js +95 -0
  6. package/dist/definitions/common.js.map +1 -0
  7. package/dist/definitions/deliverability/deliverability.schema.d.ts +98 -0
  8. package/dist/definitions/deliverability/deliverability.schema.d.ts.map +1 -0
  9. package/dist/definitions/deliverability/deliverability.schema.js +77 -0
  10. package/dist/definitions/deliverability/domain.schema.d.ts +23 -0
  11. package/dist/definitions/deliverability/domain.schema.d.ts.map +1 -0
  12. package/dist/definitions/deliverability/domain.schema.js +12 -0
  13. package/dist/definitions/deliverability/domain.schema.js.map +1 -0
  14. package/dist/definitions/deliverability/index.d.ts +4 -0
  15. package/dist/definitions/deliverability/index.d.ts.map +1 -0
  16. package/dist/definitions/deliverability/index.js +4 -0
  17. package/dist/definitions/deliverability/index.js.map +1 -0
  18. package/dist/definitions/deliverability/request.schema.d.ts +27 -0
  19. package/dist/definitions/deliverability/request.schema.d.ts.map +1 -0
  20. package/dist/definitions/deliverability/request.schema.js +17 -0
  21. package/dist/definitions/deliverability/request.schema.js.map +1 -0
  22. package/dist/definitions/deliverability/response.schema.d.ts +72 -0
  23. package/dist/definitions/deliverability/response.schema.d.ts.map +1 -0
  24. package/dist/definitions/deliverability/response.schema.js +37 -0
  25. package/dist/definitions/deliverability/response.schema.js.map +1 -0
  26. package/dist/definitions/deliverability/schemas.d.ts +91 -0
  27. package/dist/definitions/deliverability/schemas.d.ts.map +1 -0
  28. package/dist/definitions/deliverability/schemas.js +67 -0
  29. package/dist/definitions/domains/domain.schema.d.ts +160 -0
  30. package/dist/definitions/domains/domain.schema.d.ts.map +1 -0
  31. package/dist/definitions/domains/domain.schema.js +36 -0
  32. package/dist/definitions/domains/domain.schema.js.map +1 -0
  33. package/dist/definitions/domains/domains.schema.d.ts +668 -0
  34. package/dist/definitions/domains/domains.schema.d.ts.map +1 -0
  35. package/dist/definitions/domains/domains.schema.js +113 -0
  36. package/dist/definitions/domains/index.d.ts +4 -0
  37. package/dist/definitions/domains/index.d.ts.map +1 -0
  38. package/dist/definitions/domains/index.js +4 -0
  39. package/dist/definitions/domains/index.js.map +1 -0
  40. package/dist/definitions/domains/request.schema.d.ts +26 -0
  41. package/dist/definitions/domains/request.schema.d.ts.map +1 -0
  42. package/dist/definitions/domains/request.schema.js +21 -0
  43. package/dist/definitions/domains/request.schema.js.map +1 -0
  44. package/dist/definitions/domains/response.schema.d.ts +491 -0
  45. package/dist/definitions/domains/response.schema.d.ts.map +1 -0
  46. package/dist/definitions/domains/response.schema.js +24 -0
  47. package/dist/definitions/domains/response.schema.js.map +1 -0
  48. package/dist/definitions/domains/schemas.d.ts +545 -0
  49. package/dist/definitions/domains/schemas.d.ts.map +1 -0
  50. package/dist/definitions/domains/schemas.js +110 -0
  51. package/dist/definitions/emails/domain.schema.d.ts +20 -0
  52. package/dist/definitions/emails/domain.schema.d.ts.map +1 -0
  53. package/dist/definitions/emails/domain.schema.js +11 -0
  54. package/dist/definitions/emails/domain.schema.js.map +1 -0
  55. package/dist/definitions/emails/emails.schema.d.ts +230 -0
  56. package/dist/definitions/emails/emails.schema.d.ts.map +1 -0
  57. package/dist/definitions/emails/emails.schema.js +176 -0
  58. package/dist/definitions/emails/index.d.ts +4 -0
  59. package/dist/definitions/emails/index.d.ts.map +1 -0
  60. package/dist/definitions/emails/index.js +4 -0
  61. package/dist/definitions/emails/index.js.map +1 -0
  62. package/dist/definitions/emails/request.schema.d.ts +96 -0
  63. package/dist/definitions/emails/request.schema.d.ts.map +1 -0
  64. package/dist/definitions/emails/request.schema.js +65 -0
  65. package/dist/definitions/emails/request.schema.js.map +1 -0
  66. package/dist/definitions/emails/response.schema.d.ts +141 -0
  67. package/dist/definitions/emails/response.schema.d.ts.map +1 -0
  68. package/dist/definitions/emails/response.schema.js +54 -0
  69. package/dist/definitions/emails/response.schema.js.map +1 -0
  70. package/dist/definitions/emails/schemas.d.ts +284 -0
  71. package/dist/definitions/emails/schemas.d.ts.map +1 -0
  72. package/dist/definitions/emails/schemas.js +227 -0
  73. package/dist/definitions/health/domain.schema.d.ts +11 -0
  74. package/dist/definitions/health/domain.schema.d.ts.map +1 -0
  75. package/dist/definitions/health/domain.schema.js +8 -0
  76. package/dist/definitions/health/domain.schema.js.map +1 -0
  77. package/dist/definitions/health/health.schema.d.ts +27 -0
  78. package/dist/definitions/health/health.schema.d.ts.map +1 -0
  79. package/dist/definitions/health/health.schema.js +23 -0
  80. package/dist/definitions/health/index.d.ts +3 -0
  81. package/dist/definitions/health/index.d.ts.map +1 -0
  82. package/dist/definitions/health/index.js +3 -0
  83. package/dist/definitions/health/index.js.map +1 -0
  84. package/dist/definitions/health/request.schema.d.ts +8 -0
  85. package/dist/definitions/health/request.schema.d.ts.map +1 -0
  86. package/dist/definitions/health/request.schema.js +8 -0
  87. package/dist/definitions/health/request.schema.js.map +1 -0
  88. package/dist/definitions/health/response.schema.d.ts +26 -0
  89. package/dist/definitions/health/response.schema.d.ts.map +1 -0
  90. package/dist/definitions/health/response.schema.js +16 -0
  91. package/dist/definitions/health/response.schema.js.map +1 -0
  92. package/dist/definitions/health/schemas.d.ts +30 -0
  93. package/dist/definitions/health/schemas.d.ts.map +1 -0
  94. package/dist/definitions/health/schemas.js +23 -0
  95. package/dist/definitions/index.d.ts +25 -0
  96. package/dist/definitions/index.d.ts.map +1 -0
  97. package/dist/definitions/index.js +25 -0
  98. package/dist/definitions/index.js.map +1 -0
  99. package/dist/definitions/projects/domain.schema.d.ts +42 -0
  100. package/dist/definitions/projects/domain.schema.d.ts.map +1 -0
  101. package/dist/definitions/projects/domain.schema.js +46 -0
  102. package/dist/definitions/projects/domain.schema.js.map +1 -0
  103. package/dist/definitions/projects/index.d.ts +4 -0
  104. package/dist/definitions/projects/index.d.ts.map +1 -0
  105. package/dist/definitions/projects/index.js +4 -0
  106. package/dist/definitions/projects/index.js.map +1 -0
  107. package/dist/definitions/projects/projects.schema.d.ts +8 -0
  108. package/dist/definitions/projects/projects.schema.d.ts.map +1 -0
  109. package/dist/definitions/projects/projects.schema.js +23 -0
  110. package/dist/definitions/projects/request.schema.d.ts +41 -0
  111. package/dist/definitions/projects/request.schema.d.ts.map +1 -0
  112. package/dist/definitions/projects/request.schema.js +43 -0
  113. package/dist/definitions/projects/request.schema.js.map +1 -0
  114. package/dist/definitions/projects/response.schema.d.ts +79 -0
  115. package/dist/definitions/projects/response.schema.d.ts.map +1 -0
  116. package/dist/definitions/projects/response.schema.js +43 -0
  117. package/dist/definitions/projects/response.schema.js.map +1 -0
  118. package/dist/definitions/projects/schemas.d.ts +114 -0
  119. package/dist/definitions/projects/schemas.d.ts.map +1 -0
  120. package/dist/definitions/projects/schemas.js +87 -0
  121. package/dist/definitions/signal-email/domain.schema.d.ts +135 -0
  122. package/dist/definitions/signal-email/domain.schema.d.ts.map +1 -0
  123. package/dist/definitions/signal-email/domain.schema.js +130 -0
  124. package/dist/definitions/signal-email/domain.schema.js.map +1 -0
  125. package/dist/definitions/signal-email/index.d.ts +23 -0
  126. package/dist/definitions/signal-email/index.d.ts.map +1 -0
  127. package/dist/definitions/signal-email/index.js +26 -0
  128. package/dist/definitions/signal-email/index.js.map +1 -0
  129. package/dist/definitions/signal-email/request.schema.d.ts +123 -0
  130. package/dist/definitions/signal-email/request.schema.d.ts.map +1 -0
  131. package/dist/definitions/signal-email/request.schema.js +201 -0
  132. package/dist/definitions/signal-email/request.schema.js.map +1 -0
  133. package/dist/definitions/signal-email/response.schema.d.ts +73 -0
  134. package/dist/definitions/signal-email/response.schema.d.ts.map +1 -0
  135. package/dist/definitions/signal-email/response.schema.js +83 -0
  136. package/dist/definitions/signal-email/response.schema.js.map +1 -0
  137. package/dist/definitions/signal-projects/domain.schema.d.ts +227 -0
  138. package/dist/definitions/signal-projects/domain.schema.d.ts.map +1 -0
  139. package/dist/definitions/signal-projects/domain.schema.js +230 -0
  140. package/dist/definitions/signal-projects/domain.schema.js.map +1 -0
  141. package/dist/definitions/signal-projects/index.d.ts +16 -0
  142. package/dist/definitions/signal-projects/index.d.ts.map +1 -0
  143. package/dist/definitions/signal-projects/index.js +16 -0
  144. package/dist/definitions/signal-projects/index.js.map +1 -0
  145. package/dist/definitions/signal-projects/request.schema.d.ts +254 -0
  146. package/dist/definitions/signal-projects/request.schema.d.ts.map +1 -0
  147. package/dist/definitions/signal-projects/request.schema.js +213 -0
  148. package/dist/definitions/signal-projects/request.schema.js.map +1 -0
  149. package/dist/definitions/signal-projects/response.schema.d.ts +615 -0
  150. package/dist/definitions/signal-projects/response.schema.d.ts.map +1 -0
  151. package/dist/definitions/signal-projects/response.schema.js +267 -0
  152. package/dist/definitions/signal-projects/response.schema.js.map +1 -0
  153. package/dist/definitions/suppressions/domain.schema.d.ts +13 -0
  154. package/dist/definitions/suppressions/domain.schema.d.ts.map +1 -0
  155. package/dist/definitions/suppressions/domain.schema.js +8 -0
  156. package/dist/definitions/suppressions/domain.schema.js.map +1 -0
  157. package/dist/definitions/suppressions/index.d.ts +4 -0
  158. package/dist/definitions/suppressions/index.d.ts.map +1 -0
  159. package/dist/definitions/suppressions/index.js +4 -0
  160. package/dist/definitions/suppressions/index.js.map +1 -0
  161. package/dist/definitions/suppressions/request.schema.d.ts +39 -0
  162. package/dist/definitions/suppressions/request.schema.d.ts.map +1 -0
  163. package/dist/definitions/suppressions/request.schema.js +27 -0
  164. package/dist/definitions/suppressions/request.schema.js.map +1 -0
  165. package/dist/definitions/suppressions/response.schema.d.ts +42 -0
  166. package/dist/definitions/suppressions/response.schema.d.ts.map +1 -0
  167. package/dist/definitions/suppressions/response.schema.js +18 -0
  168. package/dist/definitions/suppressions/response.schema.js.map +1 -0
  169. package/dist/definitions/suppressions/schemas.d.ts +90 -0
  170. package/dist/definitions/suppressions/schemas.d.ts.map +1 -0
  171. package/dist/definitions/suppressions/schemas.js +68 -0
  172. package/dist/definitions/suppressions/suppressions.schema.d.ts +79 -0
  173. package/dist/definitions/suppressions/suppressions.schema.d.ts.map +1 -0
  174. package/dist/definitions/suppressions/suppressions.schema.js +63 -0
  175. package/dist/definitions/templates/domain.schema.d.ts +11 -0
  176. package/dist/definitions/templates/domain.schema.d.ts.map +1 -0
  177. package/dist/definitions/templates/domain.schema.js +14 -0
  178. package/dist/definitions/templates/domain.schema.js.map +1 -0
  179. package/dist/definitions/templates/index.d.ts +4 -0
  180. package/dist/definitions/templates/index.d.ts.map +1 -0
  181. package/dist/definitions/templates/index.js +4 -0
  182. package/dist/definitions/templates/index.js.map +1 -0
  183. package/dist/definitions/templates/request.schema.d.ts +33 -0
  184. package/dist/definitions/templates/request.schema.d.ts.map +1 -0
  185. package/dist/definitions/templates/request.schema.js +32 -0
  186. package/dist/definitions/templates/request.schema.js.map +1 -0
  187. package/dist/definitions/templates/response.schema.d.ts +91 -0
  188. package/dist/definitions/templates/response.schema.d.ts.map +1 -0
  189. package/dist/definitions/templates/response.schema.js +49 -0
  190. package/dist/definitions/templates/response.schema.js.map +1 -0
  191. package/dist/definitions/templates/schemas.d.ts +113 -0
  192. package/dist/definitions/templates/schemas.d.ts.map +1 -0
  193. package/dist/definitions/templates/schemas.js +80 -0
  194. package/dist/definitions/usage/domain.schema.d.ts +60 -0
  195. package/dist/definitions/usage/domain.schema.d.ts.map +1 -0
  196. package/dist/definitions/usage/domain.schema.js +23 -0
  197. package/dist/definitions/usage/domain.schema.js.map +1 -0
  198. package/dist/definitions/usage/index.d.ts +4 -0
  199. package/dist/definitions/usage/index.d.ts.map +1 -0
  200. package/dist/definitions/usage/index.js +4 -0
  201. package/dist/definitions/usage/index.js.map +1 -0
  202. package/dist/definitions/usage/request.schema.d.ts +12 -0
  203. package/dist/definitions/usage/request.schema.d.ts.map +1 -0
  204. package/dist/definitions/usage/request.schema.js +13 -0
  205. package/dist/definitions/usage/request.schema.js.map +1 -0
  206. package/dist/definitions/usage/response.schema.d.ts +76 -0
  207. package/dist/definitions/usage/response.schema.d.ts.map +1 -0
  208. package/dist/definitions/usage/response.schema.js +22 -0
  209. package/dist/definitions/usage/response.schema.js.map +1 -0
  210. package/dist/definitions/usage/schemas.d.ts +156 -0
  211. package/dist/definitions/usage/schemas.d.ts.map +1 -0
  212. package/dist/definitions/usage/schemas.js +83 -0
  213. package/dist/definitions/usage/usage.schema.d.ts +140 -0
  214. package/dist/definitions/usage/usage.schema.d.ts.map +1 -0
  215. package/dist/definitions/usage/usage.schema.js +77 -0
  216. package/dist/definitions/webhooks/domain.schema.d.ts +26 -0
  217. package/dist/definitions/webhooks/domain.schema.d.ts.map +1 -0
  218. package/dist/definitions/webhooks/domain.schema.js +14 -0
  219. package/dist/definitions/webhooks/domain.schema.js.map +1 -0
  220. package/dist/definitions/webhooks/index.d.ts +4 -0
  221. package/dist/definitions/webhooks/index.d.ts.map +1 -0
  222. package/dist/definitions/webhooks/index.js +4 -0
  223. package/dist/definitions/webhooks/index.js.map +1 -0
  224. package/dist/definitions/webhooks/request.schema.d.ts +64 -0
  225. package/dist/definitions/webhooks/request.schema.d.ts.map +1 -0
  226. package/dist/definitions/webhooks/request.schema.js +32 -0
  227. package/dist/definitions/webhooks/request.schema.js.map +1 -0
  228. package/dist/definitions/webhooks/response.schema.d.ts +76 -0
  229. package/dist/definitions/webhooks/response.schema.d.ts.map +1 -0
  230. package/dist/definitions/webhooks/response.schema.js +27 -0
  231. package/dist/definitions/webhooks/response.schema.js.map +1 -0
  232. package/dist/definitions/webhooks/schemas.d.ts +145 -0
  233. package/dist/definitions/webhooks/schemas.d.ts.map +1 -0
  234. package/dist/definitions/webhooks/schemas.js +97 -0
  235. package/dist/definitions/webhooks/webhooks.schema.d.ts +152 -0
  236. package/dist/definitions/webhooks/webhooks.schema.d.ts.map +1 -0
  237. package/dist/definitions/webhooks/webhooks.schema.js +96 -0
  238. package/dist/generators/generate-schemas.d.ts +10 -0
  239. package/dist/generators/generate-schemas.d.ts.map +1 -0
  240. package/dist/generators/generate-schemas.js +119 -0
  241. package/dist/generators/generate-schemas.js.map +1 -0
  242. package/dist/generators/index.d.ts +8 -0
  243. package/dist/generators/index.d.ts.map +1 -0
  244. package/dist/generators/index.js +8 -0
  245. package/dist/generators/index.js.map +1 -0
  246. package/dist/generators/register-global-registry.d.ts +14 -0
  247. package/dist/generators/register-global-registry.d.ts.map +1 -0
  248. package/dist/generators/register-global-registry.js +516 -0
  249. package/dist/generators/register-global-registry.js.map +1 -0
  250. package/dist/generators/zod-to-json-schema.d.ts +64 -0
  251. package/dist/generators/zod-to-json-schema.d.ts.map +1 -0
  252. package/dist/generators/zod-to-json-schema.js +300 -0
  253. package/dist/generators/zod-to-json-schema.js.map +1 -0
  254. package/dist/index.d.ts +15 -0
  255. package/dist/index.d.ts.map +1 -0
  256. package/dist/index.js +15 -0
  257. package/dist/index.js.map +1 -0
  258. package/package.json +103 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Apollo Signal Schemas — Generators
3
+ *
4
+ * Utilities for converting Zod schemas to JSON Schema format
5
+ * for cross-language type definitions.
6
+ */
7
+ export { convertToJsonSchema, convertMultipleToJsonSchema, createCombinedSchema, } from './zod-to-json-schema.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,GAGrB,MAAM,yBAAyB,CAAC","sourcesContent":["/**\n * Apollo Signal Schemas — Generators\n *\n * Utilities for converting Zod schemas to JSON Schema format\n * for cross-language type definitions.\n */\n\nexport {\n convertToJsonSchema,\n convertMultipleToJsonSchema,\n createCombinedSchema,\n type GeneratorOptions,\n type GeneratedSchema,\n} from './zod-to-json-schema.js';\n"]}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Global Registry Auto-Registration
4
+ *
5
+ * Scans all `*.schema.ts` files and ensures every exported `*Schema` constant
6
+ * has a corresponding `z.globalRegistry.add(...)` entry.
7
+ *
8
+ * Usage:
9
+ * bun run src/generators/register-global-registry.ts --check
10
+ * bun run src/generators/register-global-registry.ts --write
11
+ * bun run src/generators/register-global-registry.ts --check --root ./src
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=register-global-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-global-registry.d.ts","sourceRoot":"","sources":["../../src/generators/register-global-registry.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
@@ -0,0 +1,516 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Global Registry Auto-Registration
4
+ *
5
+ * Scans all `*.schema.ts` files and ensures every exported `*Schema` constant
6
+ * has a corresponding `z.globalRegistry.add(...)` entry.
7
+ *
8
+ * Usage:
9
+ * bun run src/generators/register-global-registry.ts --check
10
+ * bun run src/generators/register-global-registry.ts --write
11
+ * bun run src/generators/register-global-registry.ts --check --root ./src
12
+ */
13
+ import { readdirSync, readFileSync, renameSync, statSync, writeFileSync, } from 'node:fs';
14
+ import { basename, dirname, join, relative, sep } from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+ import * as ts from 'typescript';
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = dirname(__filename);
19
+ const DEFAULT_SRC_ROOT = join(__dirname, '..');
20
+ const REGISTRY_HEADER = '// Schema registry — promotes types to OpenAPI components/schemas';
21
+ const IGNORED_DIRS = new Set([
22
+ '.git',
23
+ '.idea',
24
+ '.next',
25
+ '.turbo',
26
+ 'build',
27
+ 'coverage',
28
+ 'dist',
29
+ 'node_modules',
30
+ ]);
31
+ function printHelp() {
32
+ console.log(`
33
+ Global Registry Auto-Registration
34
+
35
+ Usage:
36
+ bun run src/generators/register-global-registry.ts --check
37
+ bun run src/generators/register-global-registry.ts --write
38
+ bun run src/generators/register-global-registry.ts --remove-all
39
+ bun run src/generators/register-global-registry.ts --check --root ./src
40
+
41
+ Options:
42
+ --check Validate only. Exits with code 1 if registrations are missing.
43
+ --write Apply missing registrations in-place.
44
+ --remove-all Remove all existing z.globalRegistry.add(...) registrations.
45
+ --root <dir> Override the source root directory to scan.
46
+ --help Show this help.
47
+ `.trim());
48
+ }
49
+ function parseArgs(argv = process.argv.slice(2)) {
50
+ let mode = 'check';
51
+ let rootDir = DEFAULT_SRC_ROOT;
52
+ let modeExplicitlySet = false;
53
+ for (let i = 0; i < argv.length; i += 1) {
54
+ const arg = argv[i];
55
+ if (!arg) {
56
+ continue;
57
+ }
58
+ if (arg === '--help' || arg === '-h') {
59
+ printHelp();
60
+ process.exit(0);
61
+ }
62
+ if (arg === '--check') {
63
+ if (modeExplicitlySet && mode !== 'check') {
64
+ throw new Error('Choose either --check or --write, not both.');
65
+ }
66
+ mode = 'check';
67
+ modeExplicitlySet = true;
68
+ continue;
69
+ }
70
+ if (arg === '--write') {
71
+ if (modeExplicitlySet && mode !== 'write') {
72
+ throw new Error('Choose exactly one mode: --check, --write, or --remove-all.');
73
+ }
74
+ mode = 'write';
75
+ modeExplicitlySet = true;
76
+ continue;
77
+ }
78
+ if (arg === '--remove-all') {
79
+ if (modeExplicitlySet && mode !== 'remove-all') {
80
+ throw new Error('Choose exactly one mode: --check, --write, or --remove-all.');
81
+ }
82
+ mode = 'remove-all';
83
+ modeExplicitlySet = true;
84
+ continue;
85
+ }
86
+ if (arg === '--root') {
87
+ const value = argv[i + 1];
88
+ if (!value) {
89
+ throw new Error('Missing value for --root.');
90
+ }
91
+ rootDir = value;
92
+ i += 1;
93
+ continue;
94
+ }
95
+ if (arg.startsWith('--root=')) {
96
+ const value = arg.slice('--root='.length);
97
+ if (!value) {
98
+ throw new Error('Missing value for --root.');
99
+ }
100
+ rootDir = value;
101
+ continue;
102
+ }
103
+ throw new Error(`Unknown argument: ${arg}`);
104
+ }
105
+ return { mode, rootDir };
106
+ }
107
+ function ensureDirectoryExists(dirPath) {
108
+ let stats;
109
+ try {
110
+ stats = statSync(dirPath);
111
+ }
112
+ catch (error) {
113
+ throw new Error(`Cannot access directory "${dirPath}": ${error instanceof Error ? error.message : String(error)}`);
114
+ }
115
+ if (!stats.isDirectory()) {
116
+ throw new Error(`Path is not a directory: "${dirPath}"`);
117
+ }
118
+ }
119
+ function listSchemaFiles(rootDir) {
120
+ const files = [];
121
+ const stack = [rootDir];
122
+ while (stack.length > 0) {
123
+ const currentDir = stack.pop();
124
+ if (!currentDir) {
125
+ continue;
126
+ }
127
+ let entries;
128
+ try {
129
+ entries = readdirSync(currentDir, {
130
+ withFileTypes: true,
131
+ encoding: 'utf8',
132
+ });
133
+ }
134
+ catch (error) {
135
+ throw new Error(`Failed to read directory "${currentDir}": ${error instanceof Error ? error.message : String(error)}`);
136
+ }
137
+ for (const entry of entries) {
138
+ if (entry.name.startsWith('.')) {
139
+ continue;
140
+ }
141
+ if (IGNORED_DIRS.has(entry.name)) {
142
+ continue;
143
+ }
144
+ if (entry.isSymbolicLink()) {
145
+ continue;
146
+ }
147
+ const fullPath = join(currentDir, entry.name);
148
+ if (entry.isDirectory()) {
149
+ stack.push(fullPath);
150
+ continue;
151
+ }
152
+ if (entry.isFile() && entry.name.endsWith('.schema.ts')) {
153
+ files.push(fullPath);
154
+ }
155
+ }
156
+ }
157
+ return files;
158
+ }
159
+ function readTextFile(filePath) {
160
+ try {
161
+ return readFileSync(filePath, 'utf8');
162
+ }
163
+ catch (error) {
164
+ throw new Error(`Failed to read file "${filePath}": ${error instanceof Error ? error.message : String(error)}`);
165
+ }
166
+ }
167
+ function writeTextFileAtomic(filePath, content) {
168
+ const dir = dirname(filePath);
169
+ const tempPath = join(dir, `.${basename(filePath)}.${process.pid}.${Date.now()}.tmp`);
170
+ try {
171
+ writeFileSync(tempPath, content, 'utf8');
172
+ renameSync(tempPath, filePath);
173
+ }
174
+ catch (error) {
175
+ throw new Error(`Failed to write file "${filePath}": ${error instanceof Error ? error.message : String(error)}`);
176
+ }
177
+ }
178
+ function detectEol(content) {
179
+ return content.includes('\r\n') ? '\r\n' : '\n';
180
+ }
181
+ function createSourceFile(filePath, content) {
182
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
183
+ const parseErrors = sourceFile.parseDiagnostics?.filter((diag) => diag.category === ts.DiagnosticCategory.Error) ?? [];
184
+ if (parseErrors.length > 0) {
185
+ const first = parseErrors[0];
186
+ if (!first) {
187
+ throw new Error(`Parse error in "${filePath}".`);
188
+ }
189
+ const message = ts.flattenDiagnosticMessageText(first.messageText, '\n');
190
+ if (typeof first.start === 'number') {
191
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(first.start);
192
+ throw new Error(`Parse error in "${filePath}" at ${line + 1}:${character + 1}: ${message}`);
193
+ }
194
+ throw new Error(`Parse error in "${filePath}": ${message}`);
195
+ }
196
+ return sourceFile;
197
+ }
198
+ function hasModifier(node, kind) {
199
+ if (!ts.canHaveModifiers(node)) {
200
+ return false;
201
+ }
202
+ return ts.getModifiers(node)?.some((modifier) => modifier.kind === kind) ?? false;
203
+ }
204
+ function isConstVariableStatement(statement) {
205
+ return (ts.isVariableStatement(statement) &&
206
+ (ts.getCombinedNodeFlags(statement.declarationList) & ts.NodeFlags.Const) !== 0);
207
+ }
208
+ function getSchemaIdentifiersFromVariableStatement(statement) {
209
+ const result = [];
210
+ for (const declaration of statement.declarationList.declarations) {
211
+ if (!ts.isIdentifier(declaration.name)) {
212
+ continue;
213
+ }
214
+ const name = declaration.name.text;
215
+ if (name.endsWith('Schema')) {
216
+ result.push(name);
217
+ }
218
+ }
219
+ return result;
220
+ }
221
+ function extractExportedSchemas(sourceFile) {
222
+ const constSchemasInOrder = [];
223
+ const seenConstSchemas = new Set();
224
+ const exportedLocalNames = new Set();
225
+ for (const statement of sourceFile.statements) {
226
+ if (isConstVariableStatement(statement)) {
227
+ const schemaNames = getSchemaIdentifiersFromVariableStatement(statement);
228
+ for (const schemaName of schemaNames) {
229
+ if (!seenConstSchemas.has(schemaName)) {
230
+ seenConstSchemas.add(schemaName);
231
+ constSchemasInOrder.push(schemaName);
232
+ }
233
+ }
234
+ if (hasModifier(statement, ts.SyntaxKind.ExportKeyword)) {
235
+ for (const schemaName of schemaNames) {
236
+ exportedLocalNames.add(schemaName);
237
+ }
238
+ }
239
+ }
240
+ if (ts.isExportDeclaration(statement) &&
241
+ !statement.moduleSpecifier &&
242
+ statement.exportClause &&
243
+ ts.isNamedExports(statement.exportClause)) {
244
+ for (const specifier of statement.exportClause.elements) {
245
+ const localName = specifier.propertyName?.text ?? specifier.name.text;
246
+ if (localName.endsWith('Schema')) {
247
+ exportedLocalNames.add(localName);
248
+ }
249
+ }
250
+ }
251
+ }
252
+ return constSchemasInOrder.filter((name) => exportedLocalNames.has(name));
253
+ }
254
+ function isZInferLikeTypeReference(node) {
255
+ if (!ts.isQualifiedName(node.typeName)) {
256
+ return false;
257
+ }
258
+ if (!ts.isIdentifier(node.typeName.left)) {
259
+ return false;
260
+ }
261
+ const namespace = node.typeName.left.text;
262
+ const typeName = node.typeName.right.text;
263
+ return (namespace === 'z' &&
264
+ (typeName === 'infer' || typeName === 'input' || typeName === 'output'));
265
+ }
266
+ function getSchemaNameFromTypeAlias(statement) {
267
+ if (!ts.isTypeReferenceNode(statement.type)) {
268
+ return null;
269
+ }
270
+ if (!isZInferLikeTypeReference(statement.type)) {
271
+ return null;
272
+ }
273
+ const [firstTypeArg] = statement.type.typeArguments ?? [];
274
+ if (!firstTypeArg || !ts.isTypeQueryNode(firstTypeArg)) {
275
+ return null;
276
+ }
277
+ if (!ts.isIdentifier(firstTypeArg.exprName)) {
278
+ return null;
279
+ }
280
+ const schemaName = firstTypeArg.exprName.text;
281
+ return schemaName.endsWith('Schema') ? schemaName : null;
282
+ }
283
+ function extractSchemaToTypeMap(sourceFile) {
284
+ const mapping = new Map();
285
+ for (const statement of sourceFile.statements) {
286
+ if (!ts.isTypeAliasDeclaration(statement)) {
287
+ continue;
288
+ }
289
+ const schemaName = getSchemaNameFromTypeAlias(statement);
290
+ if (!schemaName) {
291
+ continue;
292
+ }
293
+ const typeName = statement.name.text;
294
+ const existing = mapping.get(schemaName);
295
+ if (existing) {
296
+ existing.push(typeName);
297
+ }
298
+ else {
299
+ mapping.set(schemaName, [typeName]);
300
+ }
301
+ }
302
+ return mapping;
303
+ }
304
+ function isZGlobalRegistryAddCallExpression(node) {
305
+ if (!ts.isCallExpression(node)) {
306
+ return false;
307
+ }
308
+ if (!ts.isPropertyAccessExpression(node.expression)) {
309
+ return false;
310
+ }
311
+ if (node.expression.name.text !== 'add') {
312
+ return false;
313
+ }
314
+ const registryExpr = node.expression.expression;
315
+ if (!ts.isPropertyAccessExpression(registryExpr)) {
316
+ return false;
317
+ }
318
+ if (registryExpr.name.text !== 'globalRegistry') {
319
+ return false;
320
+ }
321
+ return ts.isIdentifier(registryExpr.expression) && registryExpr.expression.text === 'z';
322
+ }
323
+ function extractRegisteredSchemas(sourceFile) {
324
+ const registeredSchemas = new Set();
325
+ const registryStatementEnds = [];
326
+ const registryStatementRanges = [];
327
+ for (const statement of sourceFile.statements) {
328
+ if (!ts.isExpressionStatement(statement)) {
329
+ continue;
330
+ }
331
+ if (!isZGlobalRegistryAddCallExpression(statement.expression)) {
332
+ continue;
333
+ }
334
+ registryStatementEnds.push(statement.end);
335
+ registryStatementRanges.push({
336
+ start: statement.getStart(sourceFile),
337
+ end: statement.end,
338
+ });
339
+ const [firstArg] = statement.expression.arguments;
340
+ if (firstArg && ts.isIdentifier(firstArg) && firstArg.text.endsWith('Schema')) {
341
+ registeredSchemas.add(firstArg.text);
342
+ }
343
+ }
344
+ return { registeredSchemas, registryStatementEnds, registryStatementRanges };
345
+ }
346
+ function removeRegistryHeaderIfUnused(content) {
347
+ if (content.includes('z.globalRegistry.add(')) {
348
+ return content;
349
+ }
350
+ const eol = detectEol(content);
351
+ const lines = content.split(eol);
352
+ const filtered = lines.filter((line) => line.trim() !== REGISTRY_HEADER);
353
+ while (filtered.length > 0 && filtered[filtered.length - 1]?.trim() === '') {
354
+ filtered.pop();
355
+ }
356
+ return `${filtered.join(eol)}${eol}`;
357
+ }
358
+ function removeRegistrationStatements(content, ranges) {
359
+ if (ranges.length === 0) {
360
+ return content;
361
+ }
362
+ const sorted = [...ranges].sort((a, b) => b.start - a.start);
363
+ let updated = content;
364
+ for (const range of sorted) {
365
+ let start = range.start;
366
+ let end = range.end;
367
+ // Remove a trailing newline as part of the statement to avoid empty lines.
368
+ if (end < updated.length && updated[end] === '\r' && updated[end + 1] === '\n') {
369
+ end += 2;
370
+ }
371
+ else if (end < updated.length && (updated[end] === '\n' || updated[end] === '\r')) {
372
+ end += 1;
373
+ }
374
+ while (start > 0 && (updated[start - 1] === ' ' || updated[start - 1] === '\t')) {
375
+ start -= 1;
376
+ }
377
+ updated = `${updated.slice(0, start)}${updated.slice(end)}`;
378
+ }
379
+ return removeRegistryHeaderIfUnused(updated);
380
+ }
381
+ function inferRegistryId(schemaName, schemaToTypes) {
382
+ const fallback = schemaName.replace(/Schema$/, '');
383
+ const candidateTypes = schemaToTypes.get(schemaName) ?? [];
384
+ if (candidateTypes.length === 0) {
385
+ return fallback;
386
+ }
387
+ const exactMatch = candidateTypes.find((typeName) => typeName === fallback);
388
+ return exactMatch ?? candidateTypes[0] ?? fallback;
389
+ }
390
+ function buildRegistryLine(schemaName, schemaToTypes) {
391
+ const id = inferRegistryId(schemaName, schemaToTypes);
392
+ return `z.globalRegistry.add(${schemaName}, { id: '${id}' });`;
393
+ }
394
+ function insertMissingRegistrations(content, registryStatementEnds, linesToAdd) {
395
+ if (linesToAdd.length === 0) {
396
+ return content;
397
+ }
398
+ const eol = detectEol(content);
399
+ const block = linesToAdd.join(eol);
400
+ if (registryStatementEnds.length > 0) {
401
+ const insertAt = registryStatementEnds[registryStatementEnds.length - 1];
402
+ const before = content.slice(0, insertAt);
403
+ const after = content.slice(insertAt);
404
+ const needsLeadingEol = !before.endsWith(eol);
405
+ const needsTrailingEol = after.length > 0 && !after.startsWith(eol) && !after.startsWith('\n') && !after.startsWith('\r');
406
+ return `${before}${needsLeadingEol ? eol : ''}${block}${needsTrailingEol ? eol : ''}${after}`;
407
+ }
408
+ const trimmed = content.trimEnd();
409
+ const hasHeader = trimmed.includes(REGISTRY_HEADER);
410
+ if (trimmed.length === 0) {
411
+ return `${REGISTRY_HEADER}${eol}${block}${eol}`;
412
+ }
413
+ if (hasHeader) {
414
+ return `${trimmed}${eol}${block}${eol}`;
415
+ }
416
+ return `${trimmed}${eol}${eol}${REGISTRY_HEADER}${eol}${block}${eol}`;
417
+ }
418
+ function processFile(filePath, mode) {
419
+ const original = readTextFile(filePath);
420
+ const sourceFile = createSourceFile(filePath, original);
421
+ const exportedSchemas = extractExportedSchemas(sourceFile);
422
+ const schemaToTypes = extractSchemaToTypeMap(sourceFile);
423
+ const { registeredSchemas, registryStatementEnds, registryStatementRanges, } = extractRegisteredSchemas(sourceFile);
424
+ if (mode === 'remove-all') {
425
+ const updatedContent = removeRegistrationStatements(original, registryStatementRanges);
426
+ const updated = updatedContent !== original;
427
+ if (updated) {
428
+ writeTextFileAtomic(filePath, updatedContent);
429
+ }
430
+ return {
431
+ filePath,
432
+ missingSchemas: [],
433
+ removedRegistrations: registryStatementRanges.length,
434
+ updated,
435
+ };
436
+ }
437
+ const missingSchemas = exportedSchemas.filter((schemaName) => !registeredSchemas.has(schemaName));
438
+ if (missingSchemas.length === 0) {
439
+ return {
440
+ filePath,
441
+ missingSchemas: [],
442
+ removedRegistrations: 0,
443
+ updated: false,
444
+ };
445
+ }
446
+ const registryLines = missingSchemas.map((schemaName) => buildRegistryLine(schemaName, schemaToTypes));
447
+ const updatedContent = insertMissingRegistrations(original, registryStatementEnds, registryLines);
448
+ if (mode === 'write' && updatedContent !== original) {
449
+ writeTextFileAtomic(filePath, updatedContent);
450
+ }
451
+ return {
452
+ filePath,
453
+ missingSchemas,
454
+ removedRegistrations: 0,
455
+ updated: mode === 'write' && updatedContent !== original,
456
+ };
457
+ }
458
+ function relativeToPackageRoot(filePath, scanRoot) {
459
+ const packageRoot = join(scanRoot, '..');
460
+ return relative(packageRoot, filePath).split(sep).join('/');
461
+ }
462
+ function main() {
463
+ const { mode, rootDir } = parseArgs();
464
+ ensureDirectoryExists(rootDir);
465
+ const files = listSchemaFiles(rootDir).sort();
466
+ if (files.length === 0) {
467
+ console.log(`No .schema.ts files found under ${rootDir}`);
468
+ return 0;
469
+ }
470
+ if (mode === 'remove-all') {
471
+ const results = files.map((filePath) => processFile(filePath, mode));
472
+ const updatedFiles = results.filter((result) => result.updated);
473
+ const removedCount = results.reduce((sum, result) => sum + result.removedRegistrations, 0);
474
+ if (removedCount === 0) {
475
+ console.log('No z.globalRegistry.add(...) registrations found to remove.');
476
+ return 0;
477
+ }
478
+ for (const result of updatedFiles) {
479
+ if (result.removedRegistrations === 0) {
480
+ continue;
481
+ }
482
+ console.log(`${relativeToPackageRoot(result.filePath, rootDir)}: removed ${result.removedRegistrations} registration${result.removedRegistrations === 1 ? '' : 's'}`);
483
+ }
484
+ console.log(`\nRemoved ${removedCount} registration${removedCount === 1 ? '' : 's'} across ${updatedFiles.length} file${updatedFiles.length === 1 ? '' : 's'}.`);
485
+ return 0;
486
+ }
487
+ const results = files.map((filePath) => processFile(filePath, mode));
488
+ const withMissing = results.filter((result) => result.missingSchemas.length > 0);
489
+ const missingCount = withMissing.reduce((sum, result) => sum + result.missingSchemas.length, 0);
490
+ if (withMissing.length === 0) {
491
+ console.log('All exported schemas are already registered in z.globalRegistry.');
492
+ return 0;
493
+ }
494
+ for (const result of withMissing) {
495
+ console.log(`\n${relativeToPackageRoot(result.filePath, rootDir)}`);
496
+ for (const schemaName of result.missingSchemas) {
497
+ console.log(` - missing registration: ${schemaName}`);
498
+ }
499
+ }
500
+ if (mode === 'write') {
501
+ console.log(`\nAdded ${missingCount} missing registration${missingCount === 1 ? '' : 's'} across ${withMissing.length} file${withMissing.length === 1 ? '' : 's'}.`);
502
+ return 0;
503
+ }
504
+ console.log(`\nFound ${missingCount} missing registration${missingCount === 1 ? '' : 's'} across ${withMissing.length} file${withMissing.length === 1 ? '' : 's'}.`);
505
+ console.log('Run with --write to apply fixes.');
506
+ return 1;
507
+ }
508
+ try {
509
+ process.exitCode = main();
510
+ }
511
+ catch (error) {
512
+ const message = error instanceof Error ? error.message : String(error);
513
+ console.error(`Error: ${message}`);
514
+ process.exitCode = 2;
515
+ }
516
+ //# sourceMappingURL=register-global-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-global-registry.js","sourceRoot":"","sources":["../../src/generators/register-global-registry.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env bun\n/**\n * Global Registry Auto-Registration\n *\n * Scans all `*.schema.ts` files and ensures every exported `*Schema` constant\n * has a corresponding `z.globalRegistry.add(...)` entry.\n *\n * Usage:\n * bun run src/generators/register-global-registry.ts --check\n * bun run src/generators/register-global-registry.ts --write\n * bun run src/generators/register-global-registry.ts --check --root ./src\n */\n\nimport {\n readdirSync,\n readFileSync,\n renameSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { basename, dirname, join, relative, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport * as ts from 'typescript';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst DEFAULT_SRC_ROOT = join(__dirname, '..');\n\nconst REGISTRY_HEADER =\n '// Schema registry — promotes types to OpenAPI components/schemas';\n\nconst IGNORED_DIRS = new Set([\n '.git',\n '.idea',\n '.next',\n '.turbo',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules',\n]);\n\ntype Mode = 'check' | 'write' | 'remove-all';\n\ninterface CliOptions {\n mode: Mode;\n rootDir: string;\n}\n\ninterface FileResult {\n filePath: string;\n missingSchemas: string[];\n removedRegistrations: number;\n updated: boolean;\n}\n\nfunction printHelp(): void {\n console.log(`\nGlobal Registry Auto-Registration\n\nUsage:\n bun run src/generators/register-global-registry.ts --check\n bun run src/generators/register-global-registry.ts --write\n bun run src/generators/register-global-registry.ts --remove-all\n bun run src/generators/register-global-registry.ts --check --root ./src\n\nOptions:\n --check Validate only. Exits with code 1 if registrations are missing.\n --write Apply missing registrations in-place.\n --remove-all Remove all existing z.globalRegistry.add(...) registrations.\n --root <dir> Override the source root directory to scan.\n --help Show this help.\n`.trim());\n}\n\nfunction parseArgs(argv: string[] = process.argv.slice(2)): CliOptions {\n let mode: Mode = 'check';\n let rootDir = DEFAULT_SRC_ROOT;\n let modeExplicitlySet = false;\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n if (!arg) {continue;}\n\n if (arg === '--help' || arg === '-h') {\n printHelp();\n process.exit(0);\n }\n\n if (arg === '--check') {\n if (modeExplicitlySet && mode !== 'check') {\n throw new Error('Choose either --check or --write, not both.');\n }\n mode = 'check';\n modeExplicitlySet = true;\n continue;\n }\n\n if (arg === '--write') {\n if (modeExplicitlySet && mode !== 'write') {\n throw new Error('Choose exactly one mode: --check, --write, or --remove-all.');\n }\n mode = 'write';\n modeExplicitlySet = true;\n continue;\n }\n\n if (arg === '--remove-all') {\n if (modeExplicitlySet && mode !== 'remove-all') {\n throw new Error('Choose exactly one mode: --check, --write, or --remove-all.');\n }\n mode = 'remove-all';\n modeExplicitlySet = true;\n continue;\n }\n\n if (arg === '--root') {\n const value = argv[i + 1];\n if (!value) {\n throw new Error('Missing value for --root.');\n }\n rootDir = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--root=')) {\n const value = arg.slice('--root='.length);\n if (!value) {\n throw new Error('Missing value for --root.');\n }\n rootDir = value;\n continue;\n }\n\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n return { mode, rootDir };\n}\n\nfunction ensureDirectoryExists(dirPath: string): void {\n let stats: ReturnType<typeof statSync>;\n try {\n stats = statSync(dirPath);\n } catch (error) {\n throw new Error(\n `Cannot access directory \"${dirPath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (!stats.isDirectory()) {\n throw new Error(`Path is not a directory: \"${dirPath}\"`);\n }\n}\n\nfunction listSchemaFiles(rootDir: string): string[] {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop();\n if (!currentDir) {continue;}\n\n let entries;\n try {\n entries = readdirSync(currentDir, {\n withFileTypes: true,\n encoding: 'utf8',\n });\n } catch (error) {\n throw new Error(\n `Failed to read directory \"${currentDir}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) {continue;}\n if (IGNORED_DIRS.has(entry.name)) {continue;}\n if (entry.isSymbolicLink()) {continue;}\n\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && entry.name.endsWith('.schema.ts')) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nfunction readTextFile(filePath: string): string {\n try {\n return readFileSync(filePath, 'utf8');\n } catch (error) {\n throw new Error(\n `Failed to read file \"${filePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\nfunction writeTextFileAtomic(filePath: string, content: string): void {\n const dir = dirname(filePath);\n const tempPath = join(\n dir,\n `.${basename(filePath)}.${process.pid}.${Date.now()}.tmp`,\n );\n\n try {\n writeFileSync(tempPath, content, 'utf8');\n renameSync(tempPath, filePath);\n } catch (error) {\n throw new Error(\n `Failed to write file \"${filePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\nfunction detectEol(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n\nfunction createSourceFile(filePath: string, content: string): ts.SourceFile {\n const sourceFile = ts.createSourceFile(\n filePath,\n content,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const parseErrors = (\n sourceFile as ts.SourceFile & { parseDiagnostics?: readonly ts.Diagnostic[] }\n ).parseDiagnostics?.filter(\n (diag: ts.Diagnostic) => diag.category === ts.DiagnosticCategory.Error,\n ) ?? [];\n\n if (parseErrors.length > 0) {\n const first = parseErrors[0];\n if (!first) {\n throw new Error(`Parse error in \"${filePath}\".`);\n }\n\n const message = ts.flattenDiagnosticMessageText(first.messageText, '\\n');\n\n if (typeof first.start === 'number') {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n first.start,\n );\n throw new Error(\n `Parse error in \"${filePath}\" at ${line + 1}:${character + 1}: ${message}`,\n );\n }\n\n throw new Error(`Parse error in \"${filePath}\": ${message}`);\n }\n\n return sourceFile;\n}\n\nfunction hasModifier(\n node: ts.Node,\n kind: ts.SyntaxKind,\n): boolean {\n if (!ts.canHaveModifiers(node)) {\n return false;\n }\n\n return ts.getModifiers(node)?.some((modifier) => modifier.kind === kind) ?? false;\n}\n\nfunction isConstVariableStatement(statement: ts.Statement): statement is ts.VariableStatement {\n return (\n ts.isVariableStatement(statement) &&\n (ts.getCombinedNodeFlags(statement.declarationList) & ts.NodeFlags.Const) !== 0\n );\n}\n\nfunction getSchemaIdentifiersFromVariableStatement(\n statement: ts.VariableStatement,\n): string[] {\n const result: string[] = [];\n\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name)) {continue;}\n const name = declaration.name.text;\n if (name.endsWith('Schema')) {\n result.push(name);\n }\n }\n\n return result;\n}\n\nfunction extractExportedSchemas(sourceFile: ts.SourceFile): string[] {\n const constSchemasInOrder: string[] = [];\n const seenConstSchemas = new Set<string>();\n const exportedLocalNames = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (isConstVariableStatement(statement)) {\n const schemaNames = getSchemaIdentifiersFromVariableStatement(statement);\n\n for (const schemaName of schemaNames) {\n if (!seenConstSchemas.has(schemaName)) {\n seenConstSchemas.add(schemaName);\n constSchemasInOrder.push(schemaName);\n }\n }\n\n if (hasModifier(statement, ts.SyntaxKind.ExportKeyword)) {\n for (const schemaName of schemaNames) {\n exportedLocalNames.add(schemaName);\n }\n }\n }\n\n if (\n ts.isExportDeclaration(statement) &&\n !statement.moduleSpecifier &&\n statement.exportClause &&\n ts.isNamedExports(statement.exportClause)\n ) {\n for (const specifier of statement.exportClause.elements) {\n const localName = specifier.propertyName?.text ?? specifier.name.text;\n if (localName.endsWith('Schema')) {\n exportedLocalNames.add(localName);\n }\n }\n }\n }\n\n return constSchemasInOrder.filter((name) => exportedLocalNames.has(name));\n}\n\nfunction isZInferLikeTypeReference(\n node: ts.TypeReferenceNode,\n): boolean {\n if (!ts.isQualifiedName(node.typeName)) {return false;}\n if (!ts.isIdentifier(node.typeName.left)) {return false;}\n\n const namespace = node.typeName.left.text;\n const typeName = node.typeName.right.text;\n\n return (\n namespace === 'z' &&\n (typeName === 'infer' || typeName === 'input' || typeName === 'output')\n );\n}\n\nfunction getSchemaNameFromTypeAlias(\n statement: ts.TypeAliasDeclaration,\n): string | null {\n if (!ts.isTypeReferenceNode(statement.type)) {\n return null;\n }\n\n if (!isZInferLikeTypeReference(statement.type)) {\n return null;\n }\n\n const [firstTypeArg] = statement.type.typeArguments ?? [];\n if (!firstTypeArg || !ts.isTypeQueryNode(firstTypeArg)) {\n return null;\n }\n\n if (!ts.isIdentifier(firstTypeArg.exprName)) {\n return null;\n }\n\n const schemaName = firstTypeArg.exprName.text;\n return schemaName.endsWith('Schema') ? schemaName : null;\n}\n\nfunction extractSchemaToTypeMap(sourceFile: ts.SourceFile): Map<string, string[]> {\n const mapping = new Map<string, string[]>();\n\n for (const statement of sourceFile.statements) {\n if (!ts.isTypeAliasDeclaration(statement)) {continue;}\n\n const schemaName = getSchemaNameFromTypeAlias(statement);\n if (!schemaName) {continue;}\n\n const typeName = statement.name.text;\n const existing = mapping.get(schemaName);\n\n if (existing) {\n existing.push(typeName);\n } else {\n mapping.set(schemaName, [typeName]);\n }\n }\n\n return mapping;\n}\n\nfunction isZGlobalRegistryAddCallExpression(\n node: ts.Expression,\n): node is ts.CallExpression {\n if (!ts.isCallExpression(node)) {return false;}\n if (!ts.isPropertyAccessExpression(node.expression)) {return false;}\n if (node.expression.name.text !== 'add') {return false;}\n\n const registryExpr = node.expression.expression;\n if (!ts.isPropertyAccessExpression(registryExpr)) {return false;}\n if (registryExpr.name.text !== 'globalRegistry') {return false;}\n\n return ts.isIdentifier(registryExpr.expression) && registryExpr.expression.text === 'z';\n}\n\nfunction extractRegisteredSchemas(sourceFile: ts.SourceFile): {\n registeredSchemas: Set<string>;\n registryStatementEnds: number[];\n registryStatementRanges: Array<{ start: number; end: number }>;\n} {\n const registeredSchemas = new Set<string>();\n const registryStatementEnds: number[] = [];\n const registryStatementRanges: Array<{ start: number; end: number }> = [];\n\n for (const statement of sourceFile.statements) {\n if (!ts.isExpressionStatement(statement)) {continue;}\n if (!isZGlobalRegistryAddCallExpression(statement.expression)) {continue;}\n\n registryStatementEnds.push(statement.end);\n registryStatementRanges.push({\n start: statement.getStart(sourceFile),\n end: statement.end,\n });\n\n const [firstArg] = statement.expression.arguments;\n if (firstArg && ts.isIdentifier(firstArg) && firstArg.text.endsWith('Schema')) {\n registeredSchemas.add(firstArg.text);\n }\n }\n\n return { registeredSchemas, registryStatementEnds, registryStatementRanges };\n}\n\nfunction removeRegistryHeaderIfUnused(content: string): string {\n if (content.includes('z.globalRegistry.add(')) {\n return content;\n }\n\n const eol = detectEol(content);\n const lines = content.split(eol);\n const filtered = lines.filter((line) => line.trim() !== REGISTRY_HEADER);\n\n while (filtered.length > 0 && filtered[filtered.length - 1]?.trim() === '') {\n filtered.pop();\n }\n\n return `${filtered.join(eol)}${eol}`;\n}\n\nfunction removeRegistrationStatements(\n content: string,\n ranges: Array<{ start: number; end: number }>,\n): string {\n if (ranges.length === 0) {\n return content;\n }\n\n const sorted = [...ranges].sort((a, b) => b.start - a.start);\n let updated = content;\n\n for (const range of sorted) {\n let start = range.start;\n let end = range.end;\n\n // Remove a trailing newline as part of the statement to avoid empty lines.\n if (end < updated.length && updated[end] === '\\r' && updated[end + 1] === '\\n') {\n end += 2;\n } else if (end < updated.length && (updated[end] === '\\n' || updated[end] === '\\r')) {\n end += 1;\n }\n\n while (start > 0 && (updated[start - 1] === ' ' || updated[start - 1] === '\\t')) {\n start -= 1;\n }\n\n updated = `${updated.slice(0, start)}${updated.slice(end)}`;\n }\n\n return removeRegistryHeaderIfUnused(updated);\n}\n\nfunction inferRegistryId(\n schemaName: string,\n schemaToTypes: Map<string, string[]>,\n): string {\n const fallback = schemaName.replace(/Schema$/, '');\n const candidateTypes = schemaToTypes.get(schemaName) ?? [];\n\n if (candidateTypes.length === 0) {\n return fallback;\n }\n\n const exactMatch = candidateTypes.find((typeName) => typeName === fallback);\n return exactMatch ?? candidateTypes[0] ?? fallback;\n}\n\nfunction buildRegistryLine(\n schemaName: string,\n schemaToTypes: Map<string, string[]>,\n): string {\n const id = inferRegistryId(schemaName, schemaToTypes);\n return `z.globalRegistry.add(${schemaName}, { id: '${id}' });`;\n}\n\nfunction insertMissingRegistrations(\n content: string,\n registryStatementEnds: number[],\n linesToAdd: string[],\n): string {\n if (linesToAdd.length === 0) {\n return content;\n }\n\n const eol = detectEol(content);\n const block = linesToAdd.join(eol);\n\n if (registryStatementEnds.length > 0) {\n const insertAt = registryStatementEnds[registryStatementEnds.length - 1]!;\n const before = content.slice(0, insertAt);\n const after = content.slice(insertAt);\n\n const needsLeadingEol = !before.endsWith(eol);\n const needsTrailingEol =\n after.length > 0 && !after.startsWith(eol) && !after.startsWith('\\n') && !after.startsWith('\\r');\n\n return `${before}${needsLeadingEol ? eol : ''}${block}${needsTrailingEol ? eol : ''}${after}`;\n }\n\n const trimmed = content.trimEnd();\n const hasHeader = trimmed.includes(REGISTRY_HEADER);\n\n if (trimmed.length === 0) {\n return `${REGISTRY_HEADER}${eol}${block}${eol}`;\n }\n\n if (hasHeader) {\n return `${trimmed}${eol}${block}${eol}`;\n }\n\n return `${trimmed}${eol}${eol}${REGISTRY_HEADER}${eol}${block}${eol}`;\n}\n\nfunction processFile(filePath: string, mode: Mode): FileResult {\n const original = readTextFile(filePath);\n const sourceFile = createSourceFile(filePath, original);\n\n const exportedSchemas = extractExportedSchemas(sourceFile);\n const schemaToTypes = extractSchemaToTypeMap(sourceFile);\n const {\n registeredSchemas,\n registryStatementEnds,\n registryStatementRanges,\n } = extractRegisteredSchemas(sourceFile);\n\n if (mode === 'remove-all') {\n const updatedContent = removeRegistrationStatements(original, registryStatementRanges);\n const updated = updatedContent !== original;\n\n if (updated) {\n writeTextFileAtomic(filePath, updatedContent);\n }\n\n return {\n filePath,\n missingSchemas: [],\n removedRegistrations: registryStatementRanges.length,\n updated,\n };\n }\n\n const missingSchemas = exportedSchemas.filter((schemaName) => !registeredSchemas.has(schemaName));\n\n if (missingSchemas.length === 0) {\n return {\n filePath,\n missingSchemas: [],\n removedRegistrations: 0,\n updated: false,\n };\n }\n\n const registryLines = missingSchemas.map((schemaName) =>\n buildRegistryLine(schemaName, schemaToTypes),\n );\n\n const updatedContent = insertMissingRegistrations(\n original,\n registryStatementEnds,\n registryLines,\n );\n\n if (mode === 'write' && updatedContent !== original) {\n writeTextFileAtomic(filePath, updatedContent);\n }\n\n return {\n filePath,\n missingSchemas,\n removedRegistrations: 0,\n updated: mode === 'write' && updatedContent !== original,\n };\n}\n\nfunction relativeToPackageRoot(filePath: string, scanRoot: string): string {\n const packageRoot = join(scanRoot, '..');\n return relative(packageRoot, filePath).split(sep).join('/');\n}\n\nfunction main(): number {\n const { mode, rootDir } = parseArgs();\n ensureDirectoryExists(rootDir);\n\n const files = listSchemaFiles(rootDir).sort();\n\n if (files.length === 0) {\n console.log(`No .schema.ts files found under ${rootDir}`);\n return 0;\n }\n\n if (mode === 'remove-all') {\n const results = files.map((filePath) => processFile(filePath, mode));\n const updatedFiles = results.filter((result) => result.updated);\n const removedCount = results.reduce(\n (sum, result) => sum + result.removedRegistrations,\n 0,\n );\n\n if (removedCount === 0) {\n console.log('No z.globalRegistry.add(...) registrations found to remove.');\n return 0;\n }\n\n for (const result of updatedFiles) {\n if (result.removedRegistrations === 0) {continue;}\n console.log(\n `${relativeToPackageRoot(result.filePath, rootDir)}: removed ${result.removedRegistrations} registration${result.removedRegistrations === 1 ? '' : 's'}`,\n );\n }\n\n console.log(\n `\\nRemoved ${removedCount} registration${removedCount === 1 ? '' : 's'} across ${updatedFiles.length} file${updatedFiles.length === 1 ? '' : 's'}.`,\n );\n return 0;\n }\n\n const results = files.map((filePath) => processFile(filePath, mode));\n const withMissing = results.filter((result) => result.missingSchemas.length > 0);\n const missingCount = withMissing.reduce(\n (sum, result) => sum + result.missingSchemas.length,\n 0,\n );\n\n if (withMissing.length === 0) {\n console.log('All exported schemas are already registered in z.globalRegistry.');\n return 0;\n }\n\n for (const result of withMissing) {\n console.log(`\\n${relativeToPackageRoot(result.filePath, rootDir)}`);\n for (const schemaName of result.missingSchemas) {\n console.log(` - missing registration: ${schemaName}`);\n }\n }\n\n if (mode === 'write') {\n console.log(\n `\\nAdded ${missingCount} missing registration${missingCount === 1 ? '' : 's'} across ${withMissing.length} file${withMissing.length === 1 ? '' : 's'}.`,\n );\n return 0;\n }\n\n console.log(\n `\\nFound ${missingCount} missing registration${missingCount === 1 ? '' : 's'} across ${withMissing.length} file${withMissing.length === 1 ? '' : 's'}.`,\n );\n console.log('Run with --write to apply fixes.');\n return 1;\n}\n\ntry {\n process.exitCode = main();\n} catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exitCode = 2;\n}"]}