irgen 0.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 (244) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/LICENSE +21 -0
  3. package/README.md +161 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +312 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/dsl/aggregator.d.ts +8 -0
  9. package/dist/dsl/aggregator.d.ts.map +1 -0
  10. package/dist/dsl/aggregator.js +64 -0
  11. package/dist/dsl/aggregator.js.map +1 -0
  12. package/dist/dsl/frontend-runtime.d.ts +486 -0
  13. package/dist/dsl/frontend-runtime.d.ts.map +1 -0
  14. package/dist/dsl/frontend-runtime.js +232 -0
  15. package/dist/dsl/frontend-runtime.js.map +1 -0
  16. package/dist/dsl/runtime.d.ts +33 -0
  17. package/dist/dsl/runtime.d.ts.map +1 -0
  18. package/dist/dsl/runtime.js +120 -0
  19. package/dist/dsl/runtime.js.map +1 -0
  20. package/dist/emit/backend/adapters.d.ts +11 -0
  21. package/dist/emit/backend/adapters.d.ts.map +1 -0
  22. package/dist/emit/backend/adapters.js +374 -0
  23. package/dist/emit/backend/adapters.js.map +1 -0
  24. package/dist/emit/backend/backend-tsmorph.d.ts +5 -0
  25. package/dist/emit/backend/backend-tsmorph.d.ts.map +1 -0
  26. package/dist/emit/backend/backend-tsmorph.js +858 -0
  27. package/dist/emit/backend/backend-tsmorph.js.map +1 -0
  28. package/dist/emit/backend/fake-backend.d.ts +2 -0
  29. package/dist/emit/backend/fake-backend.d.ts.map +1 -0
  30. package/dist/emit/backend/fake-backend.js +19 -0
  31. package/dist/emit/backend/fake-backend.js.map +1 -0
  32. package/dist/emit/backend/packaging.d.ts +3 -0
  33. package/dist/emit/backend/packaging.d.ts.map +1 -0
  34. package/dist/emit/backend/packaging.js +71 -0
  35. package/dist/emit/backend/packaging.js.map +1 -0
  36. package/dist/emit/backend/server.d.ts +4 -0
  37. package/dist/emit/backend/server.d.ts.map +1 -0
  38. package/dist/emit/backend/server.js +169 -0
  39. package/dist/emit/backend/server.js.map +1 -0
  40. package/dist/emit/cli/cli-fake.d.ts +2 -0
  41. package/dist/emit/cli/cli-fake.d.ts.map +1 -0
  42. package/dist/emit/cli/cli-fake.js +33 -0
  43. package/dist/emit/cli/cli-fake.js.map +1 -0
  44. package/dist/emit/electron/electron-shell.d.ts +3 -0
  45. package/dist/emit/electron/electron-shell.d.ts.map +1 -0
  46. package/dist/emit/electron/electron-shell.js +454 -0
  47. package/dist/emit/electron/electron-shell.js.map +1 -0
  48. package/dist/emit/engine.d.ts +14 -0
  49. package/dist/emit/engine.d.ts.map +1 -0
  50. package/dist/emit/engine.js +25 -0
  51. package/dist/emit/engine.js.map +1 -0
  52. package/dist/emit/format.d.ts +2 -0
  53. package/dist/emit/format.d.ts.map +1 -0
  54. package/dist/emit/format.js +23 -0
  55. package/dist/emit/format.js.map +1 -0
  56. package/dist/emit/frontend/frontend-react.d.ts +4 -0
  57. package/dist/emit/frontend/frontend-react.d.ts.map +1 -0
  58. package/dist/emit/frontend/frontend-react.js +2021 -0
  59. package/dist/emit/frontend/frontend-react.js.map +1 -0
  60. package/dist/emit/frontend/registry.d.ts +20 -0
  61. package/dist/emit/frontend/registry.d.ts.map +1 -0
  62. package/dist/emit/frontend/registry.js +46 -0
  63. package/dist/emit/frontend/registry.js.map +1 -0
  64. package/dist/emit/frontend/runtime-emitter.d.ts +4 -0
  65. package/dist/emit/frontend/runtime-emitter.d.ts.map +1 -0
  66. package/dist/emit/frontend/runtime-emitter.js +435 -0
  67. package/dist/emit/frontend/runtime-emitter.js.map +1 -0
  68. package/dist/emit/frontend/runtime-template.d.ts +28 -0
  69. package/dist/emit/frontend/runtime-template.d.ts.map +1 -0
  70. package/dist/emit/frontend/runtime-template.js +218 -0
  71. package/dist/emit/frontend/runtime-template.js.map +1 -0
  72. package/dist/emit/frontend/ssg.d.ts +8 -0
  73. package/dist/emit/frontend/ssg.d.ts.map +1 -0
  74. package/dist/emit/frontend/ssg.js +219 -0
  75. package/dist/emit/frontend/ssg.js.map +1 -0
  76. package/dist/emit/registry.d.ts +17 -0
  77. package/dist/emit/registry.d.ts.map +1 -0
  78. package/dist/emit/registry.js +38 -0
  79. package/dist/emit/registry.js.map +1 -0
  80. package/dist/emit/static-site/css.d.ts +5 -0
  81. package/dist/emit/static-site/css.d.ts.map +1 -0
  82. package/dist/emit/static-site/css.js +872 -0
  83. package/dist/emit/static-site/css.js.map +1 -0
  84. package/dist/emit/static-site/enhancements.d.ts +11 -0
  85. package/dist/emit/static-site/enhancements.d.ts.map +1 -0
  86. package/dist/emit/static-site/enhancements.js +266 -0
  87. package/dist/emit/static-site/enhancements.js.map +1 -0
  88. package/dist/emit/static-site/static-site-html.d.ts +3 -0
  89. package/dist/emit/static-site/static-site-html.d.ts.map +1 -0
  90. package/dist/emit/static-site/static-site-html.js +1172 -0
  91. package/dist/emit/static-site/static-site-html.js.map +1 -0
  92. package/dist/emit/utils/sdk.d.ts +15 -0
  93. package/dist/emit/utils/sdk.d.ts.map +1 -0
  94. package/dist/emit/utils/sdk.js +34 -0
  95. package/dist/emit/utils/sdk.js.map +1 -0
  96. package/dist/extensions/context.d.ts +23 -0
  97. package/dist/extensions/context.d.ts.map +1 -0
  98. package/dist/extensions/context.js +43 -0
  99. package/dist/extensions/context.js.map +1 -0
  100. package/dist/index.d.ts +32 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +135 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/ir/decl/backend.raw.schema.d.ts +128 -0
  105. package/dist/ir/decl/backend.raw.schema.d.ts.map +1 -0
  106. package/dist/ir/decl/backend.raw.schema.js +24 -0
  107. package/dist/ir/decl/backend.raw.schema.js.map +1 -0
  108. package/dist/ir/decl/bundle.d.ts +15 -0
  109. package/dist/ir/decl/bundle.d.ts.map +1 -0
  110. package/dist/ir/decl/bundle.js +8 -0
  111. package/dist/ir/decl/bundle.js.map +1 -0
  112. package/dist/ir/decl/cli.raw.schema.d.ts +133 -0
  113. package/dist/ir/decl/cli.raw.schema.d.ts.map +1 -0
  114. package/dist/ir/decl/cli.raw.schema.js +20 -0
  115. package/dist/ir/decl/cli.raw.schema.js.map +1 -0
  116. package/dist/ir/decl/frontend.raw.schema.d.ts +6631 -0
  117. package/dist/ir/decl/frontend.raw.schema.d.ts.map +1 -0
  118. package/dist/ir/decl/frontend.raw.schema.js +272 -0
  119. package/dist/ir/decl/frontend.raw.schema.js.map +1 -0
  120. package/dist/ir/decl/index.d.ts +6 -0
  121. package/dist/ir/decl/index.d.ts.map +1 -0
  122. package/dist/ir/decl/index.js +6 -0
  123. package/dist/ir/decl/index.js.map +1 -0
  124. package/dist/ir/decl/normalize.schema.d.ts +9154 -0
  125. package/dist/ir/decl/normalize.schema.d.ts.map +1 -0
  126. package/dist/ir/decl/normalize.schema.js +71 -0
  127. package/dist/ir/decl/normalize.schema.js.map +1 -0
  128. package/dist/ir/domain/backend.d.ts +19 -0
  129. package/dist/ir/domain/backend.d.ts.map +1 -0
  130. package/dist/ir/domain/backend.js +3 -0
  131. package/dist/ir/domain/backend.js.map +1 -0
  132. package/dist/ir/domain/cli.d.ts +18 -0
  133. package/dist/ir/domain/cli.d.ts.map +1 -0
  134. package/dist/ir/domain/cli.js +2 -0
  135. package/dist/ir/domain/cli.js.map +1 -0
  136. package/dist/ir/domain/frontend/index.d.ts +190 -0
  137. package/dist/ir/domain/frontend/index.d.ts.map +1 -0
  138. package/dist/ir/domain/frontend/index.js +2 -0
  139. package/dist/ir/domain/frontend/index.js.map +1 -0
  140. package/dist/ir/domain/frontend.d.ts +2 -0
  141. package/dist/ir/domain/frontend.d.ts.map +1 -0
  142. package/dist/ir/domain/frontend.js +3 -0
  143. package/dist/ir/domain/frontend.js.map +1 -0
  144. package/dist/ir/frontend-contract.d.ts +187 -0
  145. package/dist/ir/frontend-contract.d.ts.map +1 -0
  146. package/dist/ir/frontend-contract.js +6 -0
  147. package/dist/ir/frontend-contract.js.map +1 -0
  148. package/dist/ir/target/backend.d.ts +11 -0
  149. package/dist/ir/target/backend.d.ts.map +1 -0
  150. package/dist/ir/target/backend.js +2 -0
  151. package/dist/ir/target/backend.js.map +1 -0
  152. package/dist/ir/target/backend.policy.d.ts +896 -0
  153. package/dist/ir/target/backend.policy.d.ts.map +1 -0
  154. package/dist/ir/target/backend.policy.js +106 -0
  155. package/dist/ir/target/backend.policy.js.map +1 -0
  156. package/dist/ir/target/cli.d.ts +3 -0
  157. package/dist/ir/target/cli.d.ts.map +1 -0
  158. package/dist/ir/target/cli.js +2 -0
  159. package/dist/ir/target/cli.js.map +1 -0
  160. package/dist/ir/target/electron.d.ts +99 -0
  161. package/dist/ir/target/electron.d.ts.map +1 -0
  162. package/dist/ir/target/electron.js +2 -0
  163. package/dist/ir/target/electron.js.map +1 -0
  164. package/dist/ir/target/electron.policy.d.ts +7015 -0
  165. package/dist/ir/target/electron.policy.d.ts.map +1 -0
  166. package/dist/ir/target/electron.policy.js +119 -0
  167. package/dist/ir/target/electron.policy.js.map +1 -0
  168. package/dist/ir/target/frontend.d.ts +12 -0
  169. package/dist/ir/target/frontend.d.ts.map +1 -0
  170. package/dist/ir/target/frontend.js +2 -0
  171. package/dist/ir/target/frontend.js.map +1 -0
  172. package/dist/ir/target/frontend.policy.d.ts +268 -0
  173. package/dist/ir/target/frontend.policy.d.ts.map +1 -0
  174. package/dist/ir/target/frontend.policy.js +33 -0
  175. package/dist/ir/target/frontend.policy.js.map +1 -0
  176. package/dist/ir/target/index.d.ts +6 -0
  177. package/dist/ir/target/index.d.ts.map +1 -0
  178. package/dist/ir/target/index.js +6 -0
  179. package/dist/ir/target/index.js.map +1 -0
  180. package/dist/ir/target/static-site.d.ts +18 -0
  181. package/dist/ir/target/static-site.d.ts.map +1 -0
  182. package/dist/ir/target/static-site.js +2 -0
  183. package/dist/ir/target/static-site.js.map +1 -0
  184. package/dist/ir/target/static-site.policy.d.ts +2911 -0
  185. package/dist/ir/target/static-site.policy.d.ts.map +1 -0
  186. package/dist/ir/target/static-site.policy.js +127 -0
  187. package/dist/ir/target/static-site.policy.js.map +1 -0
  188. package/dist/lowering/backend.d.ts +4 -0
  189. package/dist/lowering/backend.d.ts.map +1 -0
  190. package/dist/lowering/backend.js +57 -0
  191. package/dist/lowering/backend.js.map +1 -0
  192. package/dist/lowering/cli.d.ts +4 -0
  193. package/dist/lowering/cli.d.ts.map +1 -0
  194. package/dist/lowering/cli.js +22 -0
  195. package/dist/lowering/cli.js.map +1 -0
  196. package/dist/lowering/engine.d.ts +18 -0
  197. package/dist/lowering/engine.d.ts.map +1 -0
  198. package/dist/lowering/engine.js +47 -0
  199. package/dist/lowering/engine.js.map +1 -0
  200. package/dist/lowering/frontend.d.ts +9 -0
  201. package/dist/lowering/frontend.d.ts.map +1 -0
  202. package/dist/lowering/frontend.js +246 -0
  203. package/dist/lowering/frontend.js.map +1 -0
  204. package/dist/lowering/targets/to-backend.d.ts +9 -0
  205. package/dist/lowering/targets/to-backend.d.ts.map +1 -0
  206. package/dist/lowering/targets/to-backend.js +55 -0
  207. package/dist/lowering/targets/to-backend.js.map +1 -0
  208. package/dist/lowering/targets/to-cli.d.ts +4 -0
  209. package/dist/lowering/targets/to-cli.d.ts.map +1 -0
  210. package/dist/lowering/targets/to-cli.js +11 -0
  211. package/dist/lowering/targets/to-cli.js.map +1 -0
  212. package/dist/lowering/targets/to-electron.d.ts +30 -0
  213. package/dist/lowering/targets/to-electron.d.ts.map +1 -0
  214. package/dist/lowering/targets/to-electron.js +87 -0
  215. package/dist/lowering/targets/to-electron.js.map +1 -0
  216. package/dist/lowering/targets/to-frontend.d.ts +4 -0
  217. package/dist/lowering/targets/to-frontend.d.ts.map +1 -0
  218. package/dist/lowering/targets/to-frontend.js +30 -0
  219. package/dist/lowering/targets/to-frontend.js.map +1 -0
  220. package/dist/lowering/targets/to-static-site.d.ts +16 -0
  221. package/dist/lowering/targets/to-static-site.d.ts.map +1 -0
  222. package/dist/lowering/targets/to-static-site.js +30 -0
  223. package/dist/lowering/targets/to-static-site.js.map +1 -0
  224. package/dist/mappers/index.d.ts +12 -0
  225. package/dist/mappers/index.d.ts.map +1 -0
  226. package/dist/mappers/index.js +60 -0
  227. package/dist/mappers/index.js.map +1 -0
  228. package/dist/types/extension.d.ts +3 -0
  229. package/dist/types/extension.d.ts.map +1 -0
  230. package/dist/types/extension.js +2 -0
  231. package/dist/types/extension.js.map +1 -0
  232. package/dist/utils/array.d.ts +2 -0
  233. package/dist/utils/array.d.ts.map +1 -0
  234. package/dist/utils/array.js +4 -0
  235. package/dist/utils/array.js.map +1 -0
  236. package/dist/utils/index.d.ts +3 -0
  237. package/dist/utils/index.d.ts.map +1 -0
  238. package/dist/utils/index.js +3 -0
  239. package/dist/utils/index.js.map +1 -0
  240. package/dist/utils/string.d.ts +13 -0
  241. package/dist/utils/string.d.ts.map +1 -0
  242. package/dist/utils/string.js +56 -0
  243. package/dist/utils/string.js.map +1 -0
  244. package/package.json +112 -0
@@ -0,0 +1,374 @@
1
+ import path from "node:path";
2
+ export function emitIdAdapter(project, outDir, policies) {
3
+ const sf = project.createSourceFile(path.join(outDir, "lib", "id.ts"), "", { overwrite: true });
4
+ sf.addStatements([`// Generated: single point of truth for ID generation`]);
5
+ const gen = policies?.generateId ?? policies?.core?.generateId ?? "uuid_v4";
6
+ if (gen === "uuid_v4") {
7
+ sf.addStatements([
8
+ `import { v4 as uuidv4 } from "uuid";`,
9
+ ``,
10
+ `export function newId(): string {`,
11
+ ` return uuidv4();`,
12
+ `}`,
13
+ ``,
14
+ ]);
15
+ }
16
+ else if (gen === "shortid") {
17
+ sf.addStatements([
18
+ `import crypto from "node:crypto";`,
19
+ ``,
20
+ `export function newId(): string {`,
21
+ ` return crypto.randomBytes(4).toString("hex");`,
22
+ `}`,
23
+ ``,
24
+ ]);
25
+ }
26
+ else {
27
+ sf.addStatements([
28
+ `export function newId(): string {`,
29
+ ` throw new Error("no generateId policy implemented");`,
30
+ `}`,
31
+ ``,
32
+ ]);
33
+ }
34
+ }
35
+ export function emitLoggerAdapter(project, outDir, policies) {
36
+ const impl = policies?.loggerImpl ?? policies?.core?.loggerImpl ?? "console";
37
+ const sf = project.createSourceFile(path.join(outDir, "lib", "logger.ts"), "", { overwrite: true });
38
+ sf.addStatements([`// Generated: logger adapter (${impl})`]);
39
+ if (impl === "console") {
40
+ sf.addStatements([
41
+ `export const logger = {`,
42
+ ` info: (...args: any[]) => console.info(...args),`,
43
+ ` warn: (...args: any[]) => console.warn(...args),`,
44
+ ` error: (...args: any[]) => console.error(...args),`,
45
+ ` debug: (...args: any[]) => console.debug(...args),`,
46
+ `};`,
47
+ ``,
48
+ ]);
49
+ }
50
+ else if (impl === "pino" || impl === "winston") {
51
+ sf.addStatements([
52
+ `// ${impl} adapter: please add ${impl} as a dependency in the generated project`,
53
+ `export const logger = {`,
54
+ ` info: (...args: any[]) => console.info("[logger:${impl}]", ...args),`,
55
+ ` warn: (...args: any[]) => console.warn("[logger:${impl}]", ...args),`,
56
+ ` error: (...args: any[]) => console.error("[logger:${impl}]", ...args),`,
57
+ ` debug: (...args: any[]) => console.debug("[logger:${impl}]", ...args),`,
58
+ `};`,
59
+ ``,
60
+ ]);
61
+ }
62
+ else {
63
+ sf.addStatements([
64
+ `export const logger = {`,
65
+ ` info: (..._args: any[]) => { throw new Error("logger implementation not provided"); },`,
66
+ ` warn: (..._args: any[]) => { throw new Error("logger implementation not provided"); },`,
67
+ ` error: (..._args: any[]) => { throw new Error("logger implementation not provided"); },`,
68
+ ` debug: (..._args: any[]) => { throw new Error("logger implementation not provided"); },`,
69
+ `};`,
70
+ ``,
71
+ ]);
72
+ }
73
+ }
74
+ export function emitContextAdapter(project, outDir, policies) {
75
+ const sf = project.createSourceFile(path.join(outDir, "lib", "context.ts"), "", { overwrite: true });
76
+ sf.addStatements([
77
+ `// Generated: request context middleware (requestId + scoped logger)`,
78
+ `import type { Request, Response, NextFunction } from "express";`,
79
+ `import { newId } from "./id";`,
80
+ `import { logger } from "./logger";`,
81
+ ``,
82
+ `export interface RequestContext {`,
83
+ ` requestId: string;`,
84
+ ` logger: { info: (...args: any[]) => void; warn: (...args: any[]) => void; error: (...args: any[]) => void; debug: (...args: any[]) => void; };`,
85
+ `}`,
86
+ ``,
87
+ `export function requestContextMiddleware() {`,
88
+ ` return (req: Request, res: Response, next: NextFunction) => {`,
89
+ ` const incoming = req.headers["x-request-id"] as string | undefined;`,
90
+ ` const requestId = incoming && incoming.trim() ? incoming : newId();`,
91
+ ` const scopedLogger = {`,
92
+ ` info: (...args: any[]) => logger.info(\`[req:\${requestId}]\`, ...args),`,
93
+ ` warn: (...args: any[]) => logger.warn(\`[req:\${requestId}]\`, ...args),`,
94
+ ` error: (...args: any[]) => logger.error(\`[req:\${requestId}]\`, ...args),`,
95
+ ` debug: (...args: any[]) => logger.debug(\`[req:\${requestId}]\`, ...args),`,
96
+ ` };`,
97
+ ` (req as any).ctx = { requestId, logger: scopedLogger } as RequestContext;`,
98
+ ` res.setHeader("x-request-id", requestId);`,
99
+ ` next();`,
100
+ ` };`,
101
+ `}`,
102
+ ]);
103
+ }
104
+ export function emitHttpAdapter(project, outDir, policies) {
105
+ const impl = policies?.httpClient ?? policies?.core?.httpClient ?? "fetch";
106
+ const sf = project.createSourceFile(path.join(outDir, "lib", "http.ts"), "", { overwrite: true });
107
+ sf.addStatements([`// Generated: http client adapter (${impl})`]);
108
+ if (impl === "fetch") {
109
+ sf.addStatements([
110
+ `export async function httpGet(url: string) {`,
111
+ ` const res = await fetch(url);`,
112
+ ` return await res.json();`,
113
+ `}`,
114
+ ``,
115
+ `export async function httpPost(url: string, body: any) {`,
116
+ ` const res = await fetch(url, { method: "POST", headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });`,
117
+ ` return await res.json();`,
118
+ `}`,
119
+ ``,
120
+ ]);
121
+ }
122
+ else if (impl === "axios") {
123
+ sf.addStatements([
124
+ `// axios adapter: install axios in the generated project to use a real HTTP client`,
125
+ `import axios from "axios";`,
126
+ ``,
127
+ `export async function httpGet(url: string) {`,
128
+ ` const res = await axios.get(url);`,
129
+ ` return res.data;`,
130
+ `}`,
131
+ ``,
132
+ `export async function httpPost(url: string, body: any) {`,
133
+ ` const res = await axios.post(url, body);`,
134
+ ` return res.data;`,
135
+ `}`,
136
+ ``,
137
+ ]);
138
+ }
139
+ else {
140
+ sf.addStatements([
141
+ `export async function httpGet(_url: string) {`,
142
+ ` throw new Error("http client implementation not provided");`,
143
+ `}`,
144
+ ``,
145
+ `export async function httpPost(_url: string, _body: any) {`,
146
+ ` throw new Error("http client implementation not provided");`,
147
+ `}`,
148
+ ``,
149
+ ]);
150
+ }
151
+ }
152
+ export function emitErrorAdapter(project, outDir, policies) {
153
+ const sf = project.createSourceFile(path.join(outDir, "lib", "errors.ts"), "", { overwrite: true });
154
+ sf.addStatements([
155
+ `// Generated: centralized error types and handler`,
156
+ `import type { Request, Response, NextFunction } from "express";`,
157
+ `import { fail } from "./response";`,
158
+ ``,
159
+ `export class AppError extends Error {`,
160
+ ` code: string;`,
161
+ ` status: number;`,
162
+ ` details: any;`,
163
+ ` constructor(code: string, status: number, message: string, details: any = null) {`,
164
+ ` super(message);`,
165
+ ` this.code = code;`,
166
+ ` this.status = status;`,
167
+ ` this.details = details;`,
168
+ ` }`,
169
+ `}`,
170
+ ``,
171
+ `export function toAppError(err: any, fallbackCode = "INTERNAL_ERROR", fallbackStatus = 500): AppError {`,
172
+ ` if (err instanceof AppError) return err;`,
173
+ ` const message = typeof err?.message === "string" ? err.message : "Internal error";`,
174
+ ` const details = err?.details ?? null;`,
175
+ ` return new AppError(fallbackCode, fallbackStatus, message, details);`,
176
+ `}`,
177
+ ``,
178
+ `export function toHttpResponse(err: AppError) {`,
179
+ ` const status = err.status ?? 500;`,
180
+ ` const safeMessage = err.code === "INTERNAL_ERROR" ? "Internal error" : err.message;`,
181
+ ` return { status, body: fail(err.code, safeMessage, err.details ?? null) };`,
182
+ `}`,
183
+ ``,
184
+ `export function errorMiddleware(err: any, _req: Request, res: Response, _next: NextFunction) {`,
185
+ ` const appErr = toAppError(err);`,
186
+ ` const { status, body } = toHttpResponse(appErr);`,
187
+ ` res.status(status).json(body);`,
188
+ `}`,
189
+ ]);
190
+ }
191
+ export function emitPaginationAdapter(project, outDir, policies) {
192
+ const defaults = policies?.pagination?.defaults ?? { page: 1, limit: 20, maxLimit: 100 };
193
+ const metaKeys = policies?.pagination?.meta ?? { pageKey: "page", limitKey: "limit", totalKey: "total", hasNextKey: "hasNext" };
194
+ const sf = project.createSourceFile(path.join(outDir, "lib", "pagination.ts"), "", { overwrite: true });
195
+ sf.addStatements([
196
+ `// Generated: pagination helper (page/limit)`,
197
+ `export function parsePagination(query: any) {`,
198
+ ` const rawPage = Number((query?.page as any) ?? ${defaults.page});`,
199
+ ` const rawLimit = Number((query?.limit as any) ?? ${defaults.limit});`,
200
+ ` const page = Math.max(Number.isFinite(rawPage) ? rawPage : ${defaults.page}, 1);`,
201
+ ` const limit = Math.min(Math.max(Number.isFinite(rawLimit) ? rawLimit : ${defaults.limit}, 1), ${defaults.maxLimit});`,
202
+ ` return { page, limit };`,
203
+ `}`,
204
+ ``,
205
+ `export function sliceWithMeta<T>(items: T[], page: number, limit: number) {`,
206
+ ` const start = (page - 1) * limit;`,
207
+ ` const slice = items.slice(start, start + limit);`,
208
+ ` const total = items.length;`,
209
+ ` const hasNext = start + slice.length < total;`,
210
+ ` const meta = {`,
211
+ ` ${metaKeys.pageKey}: page,`,
212
+ ` ${metaKeys.limitKey}: limit,`,
213
+ ` ${metaKeys.totalKey}: total,`,
214
+ ` ${metaKeys.hasNextKey}: hasNext,`,
215
+ ` };`,
216
+ ` return { items: slice, meta };`,
217
+ `}`,
218
+ ]);
219
+ }
220
+ export function emitValidationAdapter(project, outDir, policies) {
221
+ const sf = project.createSourceFile(path.join(outDir, "lib", "validation.ts"), "", { overwrite: true });
222
+ sf.addStatements([
223
+ `// Generated: validation helpers (zod)`,
224
+ `import type { Request, Response, NextFunction } from "express";`,
225
+ `import { z, type ZodTypeAny } from "zod";`,
226
+ `import { AppError } from "./errors";`,
227
+ ``,
228
+ `const passthrough = z.any();`,
229
+ ``,
230
+ `function handleParse(result: ReturnType<ZodTypeAny["safeParse"]>, target: "body" | "params" | "query") {`,
231
+ ` if (result.success) return result.data;`,
232
+ ` const formatted = result.error.format();`,
233
+ ` throw new AppError("VALIDATION_ERROR", 400, \`Invalid \${target}\`, formatted);`,
234
+ `}`,
235
+ ``,
236
+ `export function validateBody(schema?: ZodTypeAny) {`,
237
+ ` const s = schema ?? passthrough;`,
238
+ ` return (req: Request, _res: Response, next: NextFunction) => {`,
239
+ ` try {`,
240
+ ` const data = handleParse(s.safeParse(req.body), "body");`,
241
+ ` (req as any).body = data;`,
242
+ ` next();`,
243
+ ` } catch (err) { next(err); }`,
244
+ ` };`,
245
+ `}`,
246
+ ``,
247
+ `export function validateParams(schema?: ZodTypeAny) {`,
248
+ ` const s = schema ?? passthrough;`,
249
+ ` return (req: Request, _res: Response, next: NextFunction) => {`,
250
+ ` try {`,
251
+ ` const data = handleParse(s.safeParse(req.params), "params");`,
252
+ ` (req as any).params = data;`,
253
+ ` next();`,
254
+ ` } catch (err) { next(err); }`,
255
+ ` };`,
256
+ `}`,
257
+ ``,
258
+ `export function validateQuery(schema?: ZodTypeAny) {`,
259
+ ` const s = schema ?? passthrough;`,
260
+ ` return (req: Request, _res: Response, next: NextFunction) => {`,
261
+ ` try {`,
262
+ ` const data = handleParse(s.safeParse(req.query), "query");`,
263
+ ` (req as any).query = data;`,
264
+ ` next();`,
265
+ ` } catch (err) { next(err); }`,
266
+ ` };`,
267
+ `}`,
268
+ ]);
269
+ }
270
+ export function emitResponseAdapter(project, outDir, policies) {
271
+ const keys = policies?.envelope?.keys;
272
+ const metaKeys = policies?.envelope?.meta;
273
+ const errorKeys = policies?.envelope?.errorShape;
274
+ const sf = project.createSourceFile(path.join(outDir, "lib", "response.ts"), "", { overwrite: true });
275
+ sf.addStatements([
276
+ `// Generated response helpers (envelope)`,
277
+ `export interface Envelope<T> {`,
278
+ ` ${keys.data}: T | null;`,
279
+ ` ${keys.meta}: Record<string, unknown> | null;`,
280
+ ` ${keys.error}: Record<string, unknown> | null;`,
281
+ `}`,
282
+ ``,
283
+ `export interface EnvelopePayload<T> { data?: T | null; meta?: any; error?: any }`,
284
+ ``,
285
+ `export function envelope<T>(payload: EnvelopePayload<T>): Envelope<T> {`,
286
+ ` return {`,
287
+ ` ${keys.data}: payload.data ?? null,`,
288
+ ` ${keys.meta}: payload.meta ?? null,`,
289
+ ` ${keys.error}: payload.error ?? null,`,
290
+ ` } as Envelope<T>;`,
291
+ `}`,
292
+ ``,
293
+ `export function ok<T>(data: T, meta: any = null): Envelope<T> {`,
294
+ ` return envelope({ data, meta, error: null });`,
295
+ `}`,
296
+ ``,
297
+ `export function fail(code: string, message: string, details?: any): Envelope<null> {`,
298
+ ` const error = {`,
299
+ ` ${errorKeys.codeKey}: code,`,
300
+ ` ${errorKeys.messageKey}: message,`,
301
+ ` ${errorKeys.detailsKey}: details ?? null,`,
302
+ ` };`,
303
+ ` return envelope({ data: null, meta: null, error });`,
304
+ `}`,
305
+ ``,
306
+ `export function withRequestId(meta: any = {}, requestId?: string): any {`,
307
+ ` if (!requestId) return meta;`,
308
+ ` return { ...meta, ${metaKeys.requestIdKey}: requestId };`,
309
+ `}`,
310
+ ]);
311
+ }
312
+ export function emitAuthAdapter(project, outDir, policies) {
313
+ const jwt = policies?.auth?.jwt;
314
+ const sf = project.createSourceFile(path.join(outDir, "lib", "auth.ts"), "", { overwrite: true });
315
+ sf.addStatements([
316
+ `// Generated: simple JWT verification middleware`,
317
+ `import jwt from "jsonwebtoken";`,
318
+ `import type { Request, Response, NextFunction } from "express";`,
319
+ `import { AppError } from "./errors";`,
320
+ ``,
321
+ `const JWT_ENABLED = ${jwt?.enabled ?? false};`,
322
+ `const JWT_ALG = ${JSON.stringify(jwt?.algorithm ?? "HS256")};`,
323
+ `const JWT_SECRET = ${JSON.stringify(jwt?.secret ?? "CHANGE_ME_SUPER_SECRET_MIN_16_CHARS")};`,
324
+ `const JWT_ISSUER = ${JSON.stringify(jwt?.issuer ?? null)};`,
325
+ `const JWT_AUDIENCE = ${JSON.stringify(jwt?.audience ?? null)};`,
326
+ `const JWT_CLOCK_TOLERANCE = ${jwt?.clockToleranceSec ?? 30};`,
327
+ `const CLAIM_SUB = ${JSON.stringify(jwt?.claims?.subjectKey ?? "sub")};`,
328
+ `const CLAIM_ROLES = ${JSON.stringify(jwt?.claims?.rolesKey ?? "roles")};`,
329
+ ``,
330
+ `export function verifyToken(token: string): { sub: string; roles: string[] } {`,
331
+ ` if (!JWT_ENABLED) throw new Error("JWT disabled");`,
332
+ ` const decoded = jwt.verify(token, JWT_SECRET, { algorithms: [JWT_ALG], issuer: JWT_ISSUER ?? undefined, audience: JWT_AUDIENCE ?? undefined, clockTolerance: JWT_CLOCK_TOLERANCE });`,
333
+ ` const payload = decoded as any;`,
334
+ ` const sub = payload?.[CLAIM_SUB];`,
335
+ ` const roles = payload?.[CLAIM_ROLES] ?? [];`,
336
+ ` return { sub, roles };`,
337
+ `}`,
338
+ ``,
339
+ `export function authMiddleware(publicRoutes: string[] = []) {`,
340
+ ` return (req: Request, res: Response, next: NextFunction) => {`,
341
+ ` if (!JWT_ENABLED) return next();`,
342
+ ` const path = req.path;`,
343
+ ` if (publicRoutes.some((p) => path.startsWith(p))) return next();`,
344
+ ` const header = req.headers["authorization"];`,
345
+ ` if (!header || typeof header !== "string" || !header.startsWith("Bearer ")) {`,
346
+ ` res.status(401).json({ error: { code: "UNAUTHORIZED", message: "Missing bearer token", details: null }, data: null, meta: null });`,
347
+ ` return;`,
348
+ ` }`,
349
+ ` const token = header.replace("Bearer ", "");`,
350
+ ` try {`,
351
+ ` const user = verifyToken(token);`,
352
+ ` (req as any).user = user;`,
353
+ ` next();`,
354
+ ` } catch (err: any) {`,
355
+ ` res.status(401).json({ error: { code: "UNAUTHORIZED", message: err?.message ?? "Invalid token", details: null }, data: null, meta: null });`,
356
+ ` }`,
357
+ ` };`,
358
+ `}`,
359
+ ``,
360
+ `export function requireRoles(roles: string[], mode: "any" | "all" = "any") {`,
361
+ ` const normalized = roles ?? [];`,
362
+ ` return (req: Request, _res: Response, next: NextFunction) => {`,
363
+ ` if (!JWT_ENABLED || normalized.length === 0) return next();`,
364
+ ` const userRoles = (req as any).user?.roles ?? [];`,
365
+ ` const ok = mode === "all" ? normalized.every((r) => userRoles.includes(r)) : normalized.some((r) => userRoles.includes(r));`,
366
+ ` if (!ok) return next(new AppError("FORBIDDEN", 403, "Insufficient role"));`,
367
+ ` return next();`,
368
+ ` };`,
369
+ `}`,
370
+ ``,
371
+ `export function isAuthEnabled() { return JWT_ENABLED; }`,
372
+ ]);
373
+ }
374
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/emit/backend/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Project } from "ts-morph";
2
+ import type { BackendTargetIR } from "../../ir/target/backend.js";
3
+ export declare function emitBackendToProject(project: Project, outDir: string, ir: BackendTargetIR): void;
4
+ export declare function emitBackend(ir: BackendTargetIR, outDir: string): void;
5
+ //# sourceMappingURL=backend-tsmorph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-tsmorph.d.ts","sourceRoot":"","sources":["../../../src/emit/backend/backend-tsmorph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAmD,MAAM,UAAU,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAoClE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,QA+CzF;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,QAuB9D"}