@lunora/codegen 1.0.0-alpha.32 → 1.0.0-alpha.320

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 (125) hide show
  1. package/LICENSE.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.mts +4230 -2183
  4. package/dist/index.d.ts +4230 -2183
  5. package/dist/index.mjs +1 -35
  6. package/dist/packem_shared/AGENTS_FILENAME-B6-kjzM3.mjs +1 -0
  7. package/dist/packem_shared/CAPABILITY_PROBES-brcmKenl.mjs +25 -0
  8. package/dist/packem_shared/CONTAINERS_FILENAME-dFRtAyIe.mjs +1 -0
  9. package/dist/packem_shared/CodegenDiagnosticError-BUXlG3P-.mjs +1 -0
  10. package/dist/packem_shared/DEFAULT_TARGET-B0FkdiZq.mjs +1 -0
  11. package/dist/packem_shared/FLAGS_FILENAME-Bf0MSlHH.mjs +1 -0
  12. package/dist/packem_shared/GENERATED_HEADER-Ck_WOHzE.mjs +1 -0
  13. package/dist/packem_shared/LUNORA_ERROR_CODES-C2s0xWQD.mjs +1 -0
  14. package/dist/packem_shared/MUTATORS_FILENAME-Jkk8Zgkb.mjs +1 -0
  15. package/dist/packem_shared/NOTIFY_FILENAME-bAt7J3cs.mjs +1 -0
  16. package/dist/packem_shared/OPENRPC_VERSION-CCY7xqSL.mjs +3 -0
  17. package/dist/packem_shared/PROJECT_CONFIG_FILENAMES-DzOu-lSc.mjs +1 -0
  18. package/dist/packem_shared/QUEUES_FILENAME-CsRy4VTF.mjs +1 -0
  19. package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-Bo67h-3B.mjs +11 -0
  20. package/dist/packem_shared/SCHEMA_SNAPSHOT_VERSION-C0oHwiJZ.mjs +2 -0
  21. package/dist/packem_shared/SHAPES_FILENAME-DkBUN9dK.mjs +1 -0
  22. package/dist/packem_shared/SchemaSnapshotParseError-BRJT7c2k.mjs +18 -0
  23. package/dist/packem_shared/WORKFLOWS_FILENAME-CdeS224T.mjs +1 -0
  24. package/dist/packem_shared/attribution-hVBriwzy.mjs +1 -0
  25. package/dist/packem_shared/buildOpenApiDocument-DFv-RYZU.mjs +3 -0
  26. package/dist/packem_shared/capabilitiesUsedBy-QgSZyE0T.mjs +1 -0
  27. package/dist/packem_shared/chain-Cm6BMT8g.mjs +1 -0
  28. package/dist/packem_shared/classify-procedure-call-DVxdUhZt.mjs +1 -0
  29. package/dist/packem_shared/context-property-calls-Cn3upNgZ.mjs +1 -0
  30. package/dist/packem_shared/context-root-BdxINX-T.mjs +1 -0
  31. package/dist/packem_shared/createCodegenProject-V51_yBw3.mjs +1 -0
  32. package/dist/packem_shared/database-calls-BKozZUEW.mjs +1 -0
  33. package/dist/packem_shared/declared-output-Iaar469J.mjs +1 -0
  34. package/dist/packem_shared/describeErrorLevelFindings-vzaGS9KL.mjs +1 -0
  35. package/dist/packem_shared/discoverAuthApiCalls-xs0ONfI-.mjs +1 -0
  36. package/dist/packem_shared/discoverCrons-DBnCama4.mjs +1 -0
  37. package/dist/packem_shared/discoverFunctions-CZgLhsMn.mjs +1 -0
  38. package/dist/packem_shared/discoverHttpRoutes-WBAqBcfK.mjs +1 -0
  39. package/dist/packem_shared/discoverHyperdriveCalls-DV4IglLE.mjs +1 -0
  40. package/dist/packem_shared/discoverInserts-BjxXCACZ.mjs +1 -0
  41. package/dist/packem_shared/discoverMaskProcedures-DE-8CDen.mjs +1 -0
  42. package/dist/packem_shared/discoverMigrations-C9mLIhGZ.mjs +1 -0
  43. package/dist/packem_shared/discoverNondeterministicCalls-DvhyKM-f.mjs +1 -0
  44. package/dist/packem_shared/discoverQueries-C8E7TeRT.mjs +1 -0
  45. package/dist/packem_shared/discoverR2sqlCalls-DVcfMO6-.mjs +1 -0
  46. package/dist/packem_shared/discoverRlsMetadata-QRsWRQbM.mjs +1 -0
  47. package/dist/packem_shared/discoverRlsProcedures-Du7ITNTQ.mjs +1 -0
  48. package/dist/packem_shared/discoverSandboxUsage-w6Q3RvxZ.mjs +1 -0
  49. package/dist/packem_shared/discoverSchema-BtsX-CN9.mjs +1 -0
  50. package/dist/packem_shared/discoverStorageRulesMetadata-ClzKLdCV.mjs +1 -0
  51. package/dist/packem_shared/dispatch-namespace-DwTjD7BU.mjs +1 -0
  52. package/dist/packem_shared/emitAgents-CR2_X_ov.mjs +1 -0
  53. package/dist/packem_shared/emitApi-CDgIPAG2.mjs +147 -0
  54. package/dist/packem_shared/emitApp-BEe4wd3R.mjs +985 -0
  55. package/dist/packem_shared/emitCrons-BQW2lviZ.mjs +96 -0
  56. package/dist/packem_shared/emitDataModel-BskFt9Wv.mjs +114 -0
  57. package/dist/packem_shared/emitDrizzleSchema-DitcRZ1a.mjs +15 -0
  58. package/dist/packem_shared/emitFunctions-rjyb7h7k.mjs +422 -0
  59. package/dist/packem_shared/emitServer-D1vA5_X1.mjs +1 -0
  60. package/dist/packem_shared/emitShard-D3Po46nf.mjs +1 -0
  61. package/dist/packem_shared/exported-procedure-chains-BNBUkXui.mjs +1 -0
  62. package/dist/packem_shared/fingerprintSchemaSources-eVG9aVt0.mjs +1 -0
  63. package/dist/packem_shared/formatAdvisories-BCVASH7N.mjs +2 -0
  64. package/dist/packem_shared/handler-reference-vIeqkhV_.mjs +1 -0
  65. package/dist/packem_shared/index-JnqBWRYO.mjs +1 -0
  66. package/dist/packem_shared/isD1GlobalTable-udvHAAzD.mjs +1 -0
  67. package/dist/packem_shared/isTestPath-B81lOULB.mjs +1 -0
  68. package/dist/packem_shared/isTypedSchema-CKzc3ioR.mjs +4 -0
  69. package/dist/packem_shared/json-data-Chfs2Cz5.mjs +1 -0
  70. package/dist/packem_shared/loadProjectConfig-NO0dVJSl.mjs +1 -0
  71. package/dist/packem_shared/module-specifiers-WF8iAydP.mjs +1 -0
  72. package/dist/packem_shared/modules-CjOcuQnK.mjs +1 -0
  73. package/dist/packem_shared/parse-validator-IDBKIT7M.mjs +1 -0
  74. package/dist/packem_shared/platform-8oj7iXQy.mjs +1 -0
  75. package/dist/packem_shared/project-config-file-BV7RR-l6.mjs +1 -0
  76. package/dist/packem_shared/qualifiers-DEdXn5wP.mjs +1 -0
  77. package/dist/packem_shared/readPackageDependencies-RHhGiz0k.mjs +1 -0
  78. package/dist/packem_shared/readServiceBindings-DvqIThzd.mjs +1 -0
  79. package/dist/packem_shared/redact-Cy14LEnc.mjs +1 -0
  80. package/dist/packem_shared/reserved-words-CW1QFbTd.mjs +1 -0
  81. package/dist/packem_shared/schema-BgM8A3XV.mjs +1 -0
  82. package/dist/packem_shared/schemaFromIr-BWFnvCVg.mjs +1 -0
  83. package/dist/packem_shared/server-DAvi_bv_.mjs +368 -0
  84. package/dist/packem_shared/shard-CsOnD3Na.mjs +1601 -0
  85. package/dist/packem_shared/shard-runtime-BpoCV-aM.mjs +331 -0
  86. package/dist/packem_shared/shared-DnCokNcE.mjs +13 -0
  87. package/dist/packem_shared/unwrap-handler-return-CeaOifqX.mjs +1 -0
  88. package/dist/sdk/index.d.mts +288 -0
  89. package/dist/sdk/index.d.ts +288 -0
  90. package/dist/sdk/index.mjs +372 -0
  91. package/package.json +21 -8
  92. package/dist/packem_shared/CONTAINERS_FILENAME-DjpXMqhp.mjs +0 -224
  93. package/dist/packem_shared/CodegenDiagnosticError-DyQ5FwkM.mjs +0 -24
  94. package/dist/packem_shared/FLAGS_FILENAME-BjpS5w08.mjs +0 -139
  95. package/dist/packem_shared/GENERATED_HEADER-CLwPlCQe.mjs +0 -3
  96. package/dist/packem_shared/LUNORA_ERROR_CODES-CySpQPD3.mjs +0 -61
  97. package/dist/packem_shared/MUTATORS_FILENAME-BZOfUhlY.mjs +0 -81
  98. package/dist/packem_shared/OPENRPC_VERSION-4YIeMkOI.mjs +0 -60
  99. package/dist/packem_shared/QUEUES_FILENAME-BF0iUmx7.mjs +0 -119
  100. package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-OBXQBJV0.mjs +0 -3520
  101. package/dist/packem_shared/SCHEMA_SNAPSHOT_VERSION-D0ARY6rL.mjs +0 -249
  102. package/dist/packem_shared/SHAPES_FILENAME-DOhPGi-6.mjs +0 -94
  103. package/dist/packem_shared/WORKFLOWS_FILENAME-CCC_42o3.mjs +0 -124
  104. package/dist/packem_shared/buildOpenApiDocument-bp1pYSV6.mjs +0 -183
  105. package/dist/packem_shared/discover-ast-CT6BgBr4.mjs +0 -13
  106. package/dist/packem_shared/discoverAuthApiCalls-URDoTADN.mjs +0 -62
  107. package/dist/packem_shared/discoverCrons-DdZOeroL.mjs +0 -257
  108. package/dist/packem_shared/discoverFunctions-BJdF7lRs.mjs +0 -514
  109. package/dist/packem_shared/discoverHttpRoutes-CcwP-Rkr.mjs +0 -131
  110. package/dist/packem_shared/discoverInserts-BpFhM32L.mjs +0 -61
  111. package/dist/packem_shared/discoverMaskProcedures-DT-v8wvj.mjs +0 -273
  112. package/dist/packem_shared/discoverMigrations-cG1idBVM.mjs +0 -97
  113. package/dist/packem_shared/discoverNondeterministicCalls-CEOjmfk4.mjs +0 -122
  114. package/dist/packem_shared/discoverQueries-DeVBQVAG.mjs +0 -62
  115. package/dist/packem_shared/discoverR2sqlCalls-CWCAU-xJ.mjs +0 -80
  116. package/dist/packem_shared/discoverRlsMetadata-BL0oukaK.mjs +0 -280
  117. package/dist/packem_shared/discoverSchema-CeXJWVKV.mjs +0 -874
  118. package/dist/packem_shared/discoverStorageRulesMetadata-CFHByjIl.mjs +0 -97
  119. package/dist/packem_shared/emit-CBwEvCXQ.mjs +0 -3451
  120. package/dist/packem_shared/emitApp-nQ2oC-8G.mjs +0 -668
  121. package/dist/packem_shared/formatAdvisories-C9wNBNvL.mjs +0 -113
  122. package/dist/packem_shared/parse-validator-D6zI2i85.mjs +0 -134
  123. package/dist/packem_shared/paths-BRd6JHuF.mjs +0 -11
  124. package/dist/packem_shared/redact-oTmsol5A.mjs +0 -33
  125. package/dist/packem_shared/schemaFromIr-DTYsLBaA.mjs +0 -57
@@ -1,224 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { containerClassName, containerBindingName, normalizeContainerImage } from '@lunora/container';
4
- import { SyntaxKind, Node } from 'ts-morph';
5
- import { diagnosticAt } from './CodegenDiagnosticError-DyQ5FwkM.mjs';
6
-
7
- const CONTAINERS_FILENAME = "containers.ts";
8
- const isDefineContainer = (identifier) => {
9
- const symbol = identifier.getSymbol();
10
- if (!symbol) {
11
- return identifier.getText() === "defineContainer";
12
- }
13
- for (const declaration of symbol.getDeclarations()) {
14
- if (!Node.isImportSpecifier(declaration)) {
15
- continue;
16
- }
17
- if (declaration.getImportDeclaration().getModuleSpecifierValue() !== "@lunora/container") {
18
- return false;
19
- }
20
- return declaration.getNameNode().getText() === "defineContainer";
21
- }
22
- return false;
23
- };
24
- const stringProperty = (expression, exportName, property) => {
25
- if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {
26
- return expression.getLiteralValue();
27
- }
28
- throw diagnosticAt(
29
- expression,
30
- `container "${exportName}": \`${property}\` must be a static string literal — it is deploy configuration codegen writes into wrangler.jsonc`
31
- );
32
- };
33
- const numberProperty = (expression, exportName, property) => {
34
- if (Node.isNumericLiteral(expression)) {
35
- return expression.getLiteralValue();
36
- }
37
- throw diagnosticAt(
38
- expression,
39
- `container "${exportName}": \`${property}\` must be a static number literal — it is deploy configuration codegen writes into wrangler.jsonc`
40
- );
41
- };
42
- const imageFromExpression = (expression, exportName) => {
43
- if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {
44
- return normalizeContainerImage(expression.getLiteralValue());
45
- }
46
- if (Node.isObjectLiteralExpression(expression)) {
47
- const registry = expression.getProperty("registry");
48
- if (registry && Node.isPropertyAssignment(registry)) {
49
- const initializer = registry.getInitializerOrThrow();
50
- return normalizeContainerImage({ registry: stringProperty(initializer, exportName, "image.registry") });
51
- }
52
- const build = expression.getProperty("build");
53
- if (build && Node.isPropertyAssignment(build)) {
54
- const initializer = build.getInitializerOrThrow();
55
- return normalizeContainerImage({ build: stringProperty(initializer, exportName, "image.build") });
56
- }
57
- }
58
- throw diagnosticAt(expression, `container "${exportName}": \`image\` must be a static string path, { registry: "…" }, or { build: "…" } literal`);
59
- };
60
- const stringRecordLiteral = (expression) => {
61
- if (!Node.isObjectLiteralExpression(expression)) {
62
- return void 0;
63
- }
64
- const record = {};
65
- for (const property of expression.getProperties()) {
66
- if (!Node.isPropertyAssignment(property)) {
67
- continue;
68
- }
69
- const value = property.getInitializerOrThrow();
70
- if (Node.isStringLiteral(value) || Node.isNoSubstitutionTemplateLiteral(value)) {
71
- record[property.getName()] = value.getLiteralValue();
72
- }
73
- }
74
- return Object.keys(record).length > 0 ? record : void 0;
75
- };
76
- const rolloutLiteral = (expression) => {
77
- if (!Node.isObjectLiteralExpression(expression)) {
78
- return void 0;
79
- }
80
- const rollout = {};
81
- for (const property of expression.getProperties()) {
82
- if (!Node.isPropertyAssignment(property)) {
83
- continue;
84
- }
85
- const key = property.getName();
86
- const value = property.getInitializerOrThrow();
87
- if (Node.isNumericLiteral(value) && (key === "gracePeriodSeconds" || key === "stepPercentage")) {
88
- rollout[key] = value.getLiteralValue();
89
- }
90
- }
91
- return rollout.gracePeriodSeconds === void 0 && rollout.stepPercentage === void 0 ? void 0 : rollout;
92
- };
93
- const booleanLiteral = (expression) => {
94
- if (Node.isTrueLiteral(expression)) {
95
- return true;
96
- }
97
- if (Node.isFalseLiteral(expression)) {
98
- return false;
99
- }
100
- return void 0;
101
- };
102
- const stringOrNumberLiteral = (expression) => {
103
- if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {
104
- return expression.getLiteralValue();
105
- }
106
- if (Node.isNumericLiteral(expression)) {
107
- return expression.getLiteralValue();
108
- }
109
- return void 0;
110
- };
111
- const instanceTypeFromExpression = (expression, exportName) => {
112
- if (Node.isStringLiteral(expression)) {
113
- return expression.getLiteralValue();
114
- }
115
- if (Node.isObjectLiteralExpression(expression)) {
116
- const custom = {};
117
- for (const property of expression.getProperties()) {
118
- if (!Node.isPropertyAssignment(property)) {
119
- throw diagnosticAt(property, `container "${exportName}": \`instanceType\` must be an object of static number literals`);
120
- }
121
- const key = property.getName();
122
- if (key !== "diskMb" && key !== "memoryMib" && key !== "vcpu") {
123
- throw diagnosticAt(property, `container "${exportName}": unknown \`instanceType\` field "${key}" — expected vcpu, memoryMib, or diskMb`);
124
- }
125
- custom[key] = numberProperty(property.getInitializerOrThrow(), exportName, `instanceType.${key}`);
126
- }
127
- return custom;
128
- }
129
- throw diagnosticAt(expression, `container "${exportName}": \`instanceType\` must be a static string or { vcpu, memoryMib, diskMb } literal`);
130
- };
131
- const containerFromCall = (call, exportName) => {
132
- const argument = call.getArguments()[0];
133
- if (!argument || !Node.isObjectLiteralExpression(argument)) {
134
- throw diagnosticAt(call, `container "${exportName}": defineContainer must be passed an inline object literal`);
135
- }
136
- const ir = {
137
- bindingName: containerBindingName(exportName),
138
- className: containerClassName(exportName),
139
- exportName,
140
- image: { buildContext: ".", dockerfilePath: "./Dockerfile", kind: "dockerfile" }
141
- };
142
- let sawImage = false;
143
- for (const property of argument.getProperties()) {
144
- if (!Node.isPropertyAssignment(property)) {
145
- continue;
146
- }
147
- const key = property.getName();
148
- const initializer = property.getInitializerOrThrow();
149
- switch (key) {
150
- case "buildArgs": {
151
- ir.buildArgs = stringRecordLiteral(initializer);
152
- break;
153
- }
154
- case "enableInternet": {
155
- ir.enableInternet = booleanLiteral(initializer);
156
- break;
157
- }
158
- case "image": {
159
- ir.image = imageFromExpression(initializer, exportName);
160
- sawImage = true;
161
- break;
162
- }
163
- case "instanceType": {
164
- ir.instanceType = instanceTypeFromExpression(initializer, exportName);
165
- break;
166
- }
167
- case "maxInstances": {
168
- ir.maxInstances = numberProperty(initializer, exportName, "maxInstances");
169
- break;
170
- }
171
- case "name": {
172
- ir.name = stringProperty(initializer, exportName, "name");
173
- break;
174
- }
175
- case "rollout": {
176
- ir.rollout = rolloutLiteral(initializer);
177
- break;
178
- }
179
- case "sleepAfter": {
180
- ir.sleepAfter = stringOrNumberLiteral(initializer);
181
- break;
182
- }
183
- }
184
- }
185
- if (!sawImage) {
186
- throw diagnosticAt(argument, `container "${exportName}": defineContainer requires a static \`image\` property`);
187
- }
188
- return ir;
189
- };
190
- const containersFromSource = (source) => {
191
- const containers = [];
192
- for (const declaration of source.getVariableDeclarations()) {
193
- if (!declaration.isExported()) {
194
- continue;
195
- }
196
- const initializer = declaration.getInitializer();
197
- if (initializer?.getKind() !== SyntaxKind.CallExpression) {
198
- continue;
199
- }
200
- const call = initializer;
201
- const callee = call.getExpression();
202
- if (!Node.isIdentifier(callee) || !isDefineContainer(callee)) {
203
- continue;
204
- }
205
- const nameNode = declaration.getNameNode();
206
- if (!Node.isIdentifier(nameNode)) {
207
- throw diagnosticAt(nameNode, "defineContainer exports must be plain named exports (no destructuring)");
208
- }
209
- containers.push(containerFromCall(call, nameNode.getText()));
210
- }
211
- return containers;
212
- };
213
- const discoverContainers = (project, lunoraDirectory) => {
214
- const containersPath = join(lunoraDirectory, CONTAINERS_FILENAME);
215
- if (!existsSync(containersPath)) {
216
- return [];
217
- }
218
- const source = project.getSourceFile(containersPath) ?? project.addSourceFileAtPath(containersPath);
219
- const containers = containersFromSource(source);
220
- containers.sort((a, b) => a.exportName.localeCompare(b.exportName));
221
- return containers;
222
- };
223
-
224
- export { CONTAINERS_FILENAME, discoverContainers };
@@ -1,24 +0,0 @@
1
- import { LunoraError } from '@lunora/errors';
2
-
3
- class CodegenDiagnosticError extends LunoraError {
4
- column;
5
- file;
6
- line;
7
- constructor(message, file, line, column) {
8
- super("CODEGEN_DIAGNOSTIC", message, { location: { column, file, line }, name: "CodegenDiagnosticError" });
9
- this.file = file;
10
- this.line = line;
11
- this.column = column;
12
- }
13
- }
14
- const diagnosticAt = (node, detail, meta) => {
15
- const sourceFile = node.getSourceFile();
16
- const file = sourceFile.getFilePath();
17
- const line = node.getStartLineNumber();
18
- const { column } = sourceFile.getLineAndColumnAtPos(node.getStart());
19
- const message = `@lunora/codegen: ${detail} (${file}:${line.toString()}:${column.toString()})`;
20
- const error = new CodegenDiagnosticError(message, file, line, column);
21
- return meta ? Object.assign(error, meta) : error;
22
- };
23
-
24
- export { CodegenDiagnosticError, diagnosticAt };
@@ -1,139 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { SyntaxKind, Node } from 'ts-morph';
4
- import { listLunoraSourceFiles } from './discoverFunctions-BJdF7lRs.mjs';
5
-
6
- const FLAGS_FILENAME = "flags.ts";
7
- const FLAG_TYPES = /* @__PURE__ */ new Set(["boolean", "number", "object", "string"]);
8
- const FLAGSHIP_PROVIDER_MODULE = "@lunora/flags/providers/flagship";
9
- const isFlagshipProvider = (identifier) => {
10
- const symbol = identifier.getSymbol();
11
- if (!symbol) {
12
- return identifier.getText() === "flagshipProvider";
13
- }
14
- for (const declaration of symbol.getDeclarations()) {
15
- if (!Node.isImportSpecifier(declaration)) {
16
- continue;
17
- }
18
- if (declaration.getImportDeclaration().getModuleSpecifierValue() !== FLAGSHIP_PROVIDER_MODULE) {
19
- return false;
20
- }
21
- return declaration.getNameNode().getText() === "flagshipProvider";
22
- }
23
- return false;
24
- };
25
- const stringPropertyOrUndefined = (argument, property) => {
26
- const node = argument.getProperty(property);
27
- if (!node || !Node.isPropertyAssignment(node)) {
28
- return void 0;
29
- }
30
- const initializer = node.getInitializerOrThrow();
31
- if (Node.isStringLiteral(initializer) || Node.isNoSubstitutionTemplateLiteral(initializer)) {
32
- return initializer.getLiteralValue();
33
- }
34
- return void 0;
35
- };
36
- const flagshipIrFromCall = (call) => {
37
- const argument = call.getArguments()[0];
38
- if (argument && Node.isObjectLiteralExpression(argument)) {
39
- const bindingName = stringPropertyOrUndefined(argument, "binding");
40
- if (bindingName !== void 0 && bindingName.length > 0) {
41
- return { bindingName, mode: "binding", provider: "flagship" };
42
- }
43
- }
44
- return { mode: "http", provider: "flagship" };
45
- };
46
- const defaultExportExpression = (source) => {
47
- const assignment = source.getExportAssignment((declaration2) => !declaration2.isExportEquals());
48
- if (!assignment) {
49
- return void 0;
50
- }
51
- const expression = assignment.getExpression();
52
- if (!Node.isIdentifier(expression)) {
53
- return expression;
54
- }
55
- const declaration = expression.getSymbol()?.getValueDeclaration();
56
- if (declaration && Node.isVariableDeclaration(declaration)) {
57
- return declaration.getInitializer();
58
- }
59
- return expression;
60
- };
61
- const providerInitializer = (defineFlagsCall) => {
62
- const argument = defineFlagsCall.getArguments()[0];
63
- if (!argument || !Node.isObjectLiteralExpression(argument)) {
64
- return void 0;
65
- }
66
- const property = argument.getProperty("provider");
67
- return property && Node.isPropertyAssignment(property) ? property.getInitializer() : void 0;
68
- };
69
- const discoverFlags = (project, lunoraDirectory) => {
70
- const flagsPath = join(lunoraDirectory, FLAGS_FILENAME);
71
- if (!existsSync(flagsPath)) {
72
- return void 0;
73
- }
74
- const source = project.getSourceFile(flagsPath) ?? project.addSourceFileAtPath(flagsPath);
75
- const exported = defaultExportExpression(source);
76
- if (!exported || !Node.isCallExpression(exported)) {
77
- return { provider: "custom" };
78
- }
79
- const provider = providerInitializer(exported);
80
- if (provider && Node.isCallExpression(provider)) {
81
- const callee = provider.getExpression();
82
- if (Node.isIdentifier(callee) && isFlagshipProvider(callee)) {
83
- return flagshipIrFromCall(provider);
84
- }
85
- }
86
- return { provider: "custom" };
87
- };
88
- const isContextIdentifier = (node) => Node.isIdentifier(node) && node.getText() === "ctx";
89
- const flagTypeFromAccess = (access) => {
90
- const name = access.getName();
91
- if (!FLAG_TYPES.has(name)) {
92
- return void 0;
93
- }
94
- const receiver = access.getExpression();
95
- if (!Node.isPropertyAccessExpression(receiver)) {
96
- return void 0;
97
- }
98
- if (receiver.getName() === "flags" && isContextIdentifier(receiver.getExpression())) {
99
- return name;
100
- }
101
- const inner = receiver.getExpression();
102
- if (receiver.getName() === "details" && Node.isPropertyAccessExpression(inner) && inner.getName() === "flags" && isContextIdentifier(inner.getExpression())) {
103
- return name;
104
- }
105
- return void 0;
106
- };
107
- const flagKeyFromCall = (call) => {
108
- const callee = call.getExpression();
109
- if (!Node.isPropertyAccessExpression(callee)) {
110
- return void 0;
111
- }
112
- const type = flagTypeFromAccess(callee);
113
- if (type === void 0) {
114
- return void 0;
115
- }
116
- const argument = call.getArguments()[0];
117
- if (!argument || !(Node.isStringLiteral(argument) || Node.isNoSubstitutionTemplateLiteral(argument))) {
118
- return void 0;
119
- }
120
- const key = argument.getLiteralValue();
121
- return key.length > 0 ? { key, type } : void 0;
122
- };
123
- const discoverFlagKeys = (project, lunoraDirectory) => {
124
- const found = /* @__PURE__ */ new Map();
125
- for (const filePath of listLunoraSourceFiles(lunoraDirectory)) {
126
- const sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
127
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
128
- const candidate = flagKeyFromCall(call);
129
- if (candidate && !found.has(candidate.key)) {
130
- found.set(candidate.key, candidate.type);
131
- }
132
- }
133
- }
134
- return [...found.entries()].map(([key, type]) => {
135
- return { key, type };
136
- }).toSorted((a, b) => a.key.localeCompare(b.key));
137
- };
138
-
139
- export { FLAGS_FILENAME, discoverFlagKeys, discoverFlags };
@@ -1,3 +0,0 @@
1
- import '@lunora/errors';
2
- export { G as GENERATED_HEADER, m as buildStorageColumns, e as emitApi, a as emitCollections, b as emitContainers, c as emitCrons, d as emitDataModel, f as emitDrizzleSchema, g as emitFunctions, n as emitQueues, o as emitSeed, h as emitServer, i as emitShard, j as emitVectors, k as emitWorkflows, l as emitWranglerCronTriggers } from './emit-CBwEvCXQ.mjs';
3
- import './paths-BRd6JHuF.mjs';
@@ -1,61 +0,0 @@
1
- import { jsonSchemaFromNode, objectSchemaFromNodes } from '@lunora/values';
2
-
3
- const literalConst = (literalValue) => {
4
- if (literalValue === void 0) {
5
- return {};
6
- }
7
- const trimmed = literalValue.trim();
8
- if (trimmed === "true") {
9
- return { const: true };
10
- }
11
- if (trimmed === "false") {
12
- return { const: false };
13
- }
14
- if (trimmed === "null") {
15
- return { const: null, type: "null" };
16
- }
17
- if (trimmed.startsWith('"') && trimmed.endsWith('"') || trimmed.startsWith("'") && trimmed.endsWith("'")) {
18
- return { const: trimmed.slice(1, -1), type: "string" };
19
- }
20
- const asNumber = Number(trimmed);
21
- if (!Number.isNaN(asNumber)) {
22
- return { const: asNumber };
23
- }
24
- return { const: trimmed };
25
- };
26
- const irReader = {
27
- constraints: () => void 0,
28
- inner: (validator) => validator.inner,
29
- isNullable: (validator) => validator.column?.notNull === false,
30
- // `ValidatorIR.kind` is a loose `string` (build-time AST); narrow it to the
31
- // shared reader's `ValidatorKind`. Unknown kinds fall through the mapper's
32
- // `default` branch to an empty schema, exactly as before.
33
- kind: (validator) => validator.kind,
34
- literalSchema: (validator) => literalConst(validator.literalValue),
35
- members: (validator) => validator.members ?? [],
36
- shape: (validator) => validator.shape ?? {},
37
- tableName: (validator) => validator.tableName,
38
- valueChild: (validator) => validator.valueType
39
- };
40
- const validatorIrToJsonSchema = (validator) => jsonSchemaFromNode(validator, irReader);
41
- const objectSchema = (shape) => objectSchemaFromNodes(shape, irReader);
42
- const argsObjectSchema = (args) => objectSchema(args);
43
- const LUNORA_ERROR_CODES = [
44
- "BAD_REQUEST",
45
- "CONFLICT",
46
- "COUNT_RLS_UNSUPPORTED",
47
- "FORBIDDEN",
48
- "FUNCTION_NOT_FOUND",
49
- "INTERNAL",
50
- "INTERNAL_SERVER_ERROR",
51
- "METHOD_NOT_ALLOWED",
52
- "NOT_FOUND",
53
- "NOT_IMPLEMENTED",
54
- "PAYLOAD_TOO_LARGE",
55
- "TOO_MANY_REQUESTS",
56
- "UNAUTHORIZED",
57
- "UNPROCESSABLE",
58
- "VALIDATION_ERROR"
59
- ];
60
-
61
- export { LUNORA_ERROR_CODES, argsObjectSchema, literalConst, objectSchema, validatorIrToJsonSchema };
@@ -1,81 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { Node, SyntaxKind } from 'ts-morph';
4
- import { diagnosticAt } from './CodegenDiagnosticError-DyQ5FwkM.mjs';
5
-
6
- const MUTATORS_FILENAME = "mutators.ts";
7
- const MUTATOR_MODULE_SPECIFIERS = /* @__PURE__ */ new Set(["@lunora/server", "lunorash/server"]);
8
- const isDefineMutator = (identifier) => {
9
- const symbol = identifier.getSymbol();
10
- if (!symbol) {
11
- return identifier.getText() === "defineMutator";
12
- }
13
- for (const declaration of symbol.getDeclarations()) {
14
- if (!Node.isImportSpecifier(declaration)) {
15
- continue;
16
- }
17
- if (!MUTATOR_MODULE_SPECIFIERS.has(declaration.getImportDeclaration().getModuleSpecifierValue())) {
18
- return false;
19
- }
20
- return declaration.getNameNode().getText() === "defineMutator";
21
- }
22
- return false;
23
- };
24
- const isMutatorNamespaceImport = (identifier) => {
25
- const symbol = identifier.getSymbol();
26
- if (!symbol) {
27
- return false;
28
- }
29
- for (const declaration of symbol.getDeclarations()) {
30
- if (!Node.isNamespaceImport(declaration)) {
31
- continue;
32
- }
33
- const importDeclaration = declaration.getFirstAncestorByKind(SyntaxKind.ImportDeclaration);
34
- return importDeclaration !== void 0 && MUTATOR_MODULE_SPECIFIERS.has(importDeclaration.getModuleSpecifierValue());
35
- }
36
- return false;
37
- };
38
- const isDefineMutatorCallee = (callee) => {
39
- if (Node.isIdentifier(callee)) {
40
- return isDefineMutator(callee);
41
- }
42
- if (Node.isPropertyAccessExpression(callee)) {
43
- const object = callee.getExpression();
44
- return callee.getName() === "defineMutator" && Node.isIdentifier(object) && isMutatorNamespaceImport(object);
45
- }
46
- return false;
47
- };
48
- const mutatorsFromSource = (source) => {
49
- const mutators = [];
50
- for (const declaration of source.getVariableDeclarations()) {
51
- if (!declaration.isExported()) {
52
- continue;
53
- }
54
- const initializer = declaration.getInitializer();
55
- if (initializer?.getKind() !== SyntaxKind.CallExpression) {
56
- continue;
57
- }
58
- const callee = initializer.getExpression();
59
- if (!isDefineMutatorCallee(callee)) {
60
- continue;
61
- }
62
- const nameNode = declaration.getNameNode();
63
- if (!Node.isIdentifier(nameNode)) {
64
- throw diagnosticAt(nameNode, "defineMutator exports must be plain named exports (no destructuring)");
65
- }
66
- mutators.push({ exportName: nameNode.getText(), filePath: "mutators" });
67
- }
68
- return mutators;
69
- };
70
- const discoverMutators = (project, lunoraDirectory) => {
71
- const mutatorsPath = join(lunoraDirectory, MUTATORS_FILENAME);
72
- if (!existsSync(mutatorsPath)) {
73
- return [];
74
- }
75
- const source = project.getSourceFile(mutatorsPath) ?? project.addSourceFileAtPath(mutatorsPath);
76
- const mutators = mutatorsFromSource(source);
77
- mutators.sort((a, b) => a.exportName.localeCompare(b.exportName));
78
- return mutators;
79
- };
80
-
81
- export { MUTATORS_FILENAME, discoverMutators, isDefineMutatorCallee };
@@ -1,60 +0,0 @@
1
- import { G as GENERATED_HEADER } from './emit-CBwEvCXQ.mjs';
2
- import { s as sanitizeNamespace } from './paths-BRd6JHuF.mjs';
3
- import { argsObjectSchema, LUNORA_ERROR_CODES } from './LUNORA_ERROR_CODES-CySpQPD3.mjs';
4
-
5
- const OPENRPC_VERSION = "1.3.2";
6
- const inferredResultSchema = () => {
7
- return { description: "Result is TS-inferred from the function's return type (no `.output()` declared); best-effort — any JSON." };
8
- };
9
- const rpcMethod = (definition) => {
10
- const namespace = sanitizeNamespace(definition.filePath);
11
- const functionPath = `${namespace}:${definition.exportName}`;
12
- return {
13
- description: `Invoke the \`${definition.kind}\` \`${functionPath}\` over the Lunora RPC envelope (POST /_lunora/rpc, body \`{ "functionPath": "${functionPath}", "args": { … } }\`).`,
14
- errors: LUNORA_ERROR_CODES.map((code, index) => {
15
- return { code: -32e3 - index, data: { code }, message: code };
16
- }),
17
- name: functionPath,
18
- params: [
19
- {
20
- description: "The function's argument object (the RPC envelope's `args`).",
21
- name: "args",
22
- // A function with no declared args still takes an (empty) args
23
- // object; `required` reflects whether the function declares any
24
- // arguments at all.
25
- required: Object.keys(definition.args).length > 0,
26
- schema: argsObjectSchema(definition.args)
27
- }
28
- ],
29
- result: {
30
- name: "result",
31
- schema: inferredResultSchema()
32
- },
33
- summary: `${definition.kind}: ${functionPath}`,
34
- "x-lunora-function-kind": definition.kind,
35
- // OpenRPC has no first-class tag grouping; surface the file namespace as
36
- // an `x-tags` extension so tooling can group methods by source file.
37
- "x-tags": [{ name: namespace }]
38
- };
39
- };
40
- const buildOpenRpcDocument = (input) => {
41
- const version = input.version ?? "0.0.0";
42
- const rpcFunctions = input.functions.filter((definition) => definition.visibility !== "internal" && definition.kind !== "stream");
43
- const methods = rpcFunctions.map((definition) => rpcMethod(definition)).toSorted((a, b) => a.name.localeCompare(b.name));
44
- const document = {
45
- info: {
46
- description: "Auto-generated from @lunora/values-typed functions by @lunora/codegen. Do not edit — run `lunora codegen` to regenerate.",
47
- title: "Lunora RPC",
48
- version
49
- },
50
- methods,
51
- openrpc: OPENRPC_VERSION
52
- };
53
- return document;
54
- };
55
- const emitOpenRpc = (input) => `${JSON.stringify(buildOpenRpcDocument(input), void 0, 2)}
56
- `;
57
- const emitOpenRpcModule = (document_) => `${GENERATED_HEADER}export const openRpcSpec: Record<string, unknown> = ${JSON.stringify(document_, void 0, 4)};
58
- `;
59
-
60
- export { OPENRPC_VERSION, buildOpenRpcDocument, emitOpenRpc, emitOpenRpcModule };