@lunora/codegen 1.0.0-alpha.30 → 1.0.0-alpha.301

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 (122) hide show
  1. package/LICENSE.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.mts +4467 -2142
  4. package/dist/index.d.ts +4467 -2142
  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-BnQiNNKu.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-qVDmv8st.mjs +1 -0
  15. package/dist/packem_shared/NOTIFY_FILENAME-CLoeWMb5.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-ClWw0gb0.mjs +11 -0
  20. package/dist/packem_shared/SCHEMA_SNAPSHOT_VERSION-C0oHwiJZ.mjs +2 -0
  21. package/dist/packem_shared/SDK_LANGUAGES-Df_CnJx5.mjs +372 -0
  22. package/dist/packem_shared/SHAPES_FILENAME-DkBUN9dK.mjs +1 -0
  23. package/dist/packem_shared/SchemaSnapshotParseError-BRJT7c2k.mjs +18 -0
  24. package/dist/packem_shared/WORKFLOWS_FILENAME-CQR8fE9B.mjs +1 -0
  25. package/dist/packem_shared/attribution-hVBriwzy.mjs +1 -0
  26. package/dist/packem_shared/buildOpenApiDocument-DFv-RYZU.mjs +3 -0
  27. package/dist/packem_shared/capabilitiesUsedBy-QgSZyE0T.mjs +1 -0
  28. package/dist/packem_shared/chain-CRDaTj2c.mjs +1 -0
  29. package/dist/packem_shared/classify-procedure-call-BAj0D1u2.mjs +1 -0
  30. package/dist/packem_shared/context-property-calls-CQWCNUVH.mjs +1 -0
  31. package/dist/packem_shared/context-root-LyOsqj_o.mjs +1 -0
  32. package/dist/packem_shared/createCodegenProject-V51_yBw3.mjs +1 -0
  33. package/dist/packem_shared/database-calls-BPpefKqO.mjs +1 -0
  34. package/dist/packem_shared/declared-output-Iaar469J.mjs +1 -0
  35. package/dist/packem_shared/describeErrorLevelFindings-vzaGS9KL.mjs +1 -0
  36. package/dist/packem_shared/discoverAuthApiCalls-xs0ONfI-.mjs +1 -0
  37. package/dist/packem_shared/discoverCrons-DF7dOP9x.mjs +1 -0
  38. package/dist/packem_shared/discoverFunctions-CbxZGGj0.mjs +1 -0
  39. package/dist/packem_shared/discoverHttpRoutes-DgfoyNcf.mjs +1 -0
  40. package/dist/packem_shared/discoverHyperdriveCalls-CwnXgjFJ.mjs +1 -0
  41. package/dist/packem_shared/discoverInserts-mHOX_dJR.mjs +1 -0
  42. package/dist/packem_shared/discoverMaskProcedures-BTePIpmk.mjs +1 -0
  43. package/dist/packem_shared/discoverMigrations-C9mLIhGZ.mjs +1 -0
  44. package/dist/packem_shared/discoverNondeterministicCalls-9ZDpRptb.mjs +1 -0
  45. package/dist/packem_shared/discoverQueries-CfxkjP5X.mjs +1 -0
  46. package/dist/packem_shared/discoverR2sqlCalls-XBhs4XRZ.mjs +1 -0
  47. package/dist/packem_shared/discoverRlsMetadata-Cb8JR1b4.mjs +1 -0
  48. package/dist/packem_shared/discoverRlsProcedures-TskedRMh.mjs +1 -0
  49. package/dist/packem_shared/discoverSandboxUsage-w6Q3RvxZ.mjs +1 -0
  50. package/dist/packem_shared/discoverSchema-CRBUNY3s.mjs +1 -0
  51. package/dist/packem_shared/discoverStorageRulesMetadata-BPJplDfz.mjs +1 -0
  52. package/dist/packem_shared/dispatch-namespace-DwTjD7BU.mjs +1 -0
  53. package/dist/packem_shared/emitAgents-D_UUdNe1.mjs +1 -0
  54. package/dist/packem_shared/emitApi-Zx6VPN-7.mjs +135 -0
  55. package/dist/packem_shared/emitApp-DAZCUDbr.mjs +864 -0
  56. package/dist/packem_shared/emitCrons-BQW2lviZ.mjs +96 -0
  57. package/dist/packem_shared/emitDataModel-BskFt9Wv.mjs +114 -0
  58. package/dist/packem_shared/emitDrizzleSchema-DitcRZ1a.mjs +15 -0
  59. package/dist/packem_shared/emitFunctions-BeKgL3dl.mjs +241 -0
  60. package/dist/packem_shared/emitServer-D1vA5_X1.mjs +1 -0
  61. package/dist/packem_shared/emitShard-C8I2zw1K.mjs +1 -0
  62. package/dist/packem_shared/exported-procedure-chains-DKK5HoK3.mjs +1 -0
  63. package/dist/packem_shared/fingerprintSchemaSources-eVG9aVt0.mjs +1 -0
  64. package/dist/packem_shared/formatAdvisories-BCVASH7N.mjs +2 -0
  65. package/dist/packem_shared/handler-reference-vIeqkhV_.mjs +1 -0
  66. package/dist/packem_shared/index-CkS96b8a.mjs +1 -0
  67. package/dist/packem_shared/isD1GlobalTable-udvHAAzD.mjs +1 -0
  68. package/dist/packem_shared/isTestPath-B81lOULB.mjs +1 -0
  69. package/dist/packem_shared/isTypedSchema-CKzc3ioR.mjs +4 -0
  70. package/dist/packem_shared/json-data-Chfs2Cz5.mjs +1 -0
  71. package/dist/packem_shared/loadProjectConfig-NO0dVJSl.mjs +1 -0
  72. package/dist/packem_shared/module-specifiers-WF8iAydP.mjs +1 -0
  73. package/dist/packem_shared/modules-CjOcuQnK.mjs +1 -0
  74. package/dist/packem_shared/parse-validator-IDBKIT7M.mjs +1 -0
  75. package/dist/packem_shared/platform-8oj7iXQy.mjs +1 -0
  76. package/dist/packem_shared/project-config-file-BV7RR-l6.mjs +1 -0
  77. package/dist/packem_shared/qualifiers-DEdXn5wP.mjs +1 -0
  78. package/dist/packem_shared/readPackageDependencies-RHhGiz0k.mjs +1 -0
  79. package/dist/packem_shared/readServiceBindings-DvqIThzd.mjs +1 -0
  80. package/dist/packem_shared/redact-Cy14LEnc.mjs +1 -0
  81. package/dist/packem_shared/reserved-words-CW1QFbTd.mjs +1 -0
  82. package/dist/packem_shared/schema-BgM8A3XV.mjs +1 -0
  83. package/dist/packem_shared/schemaFromIr-BWFnvCVg.mjs +1 -0
  84. package/dist/packem_shared/server-DAvi_bv_.mjs +368 -0
  85. package/dist/packem_shared/shard-BTj5Z44S.mjs +1446 -0
  86. package/dist/packem_shared/shard-runtime-BX0xmo0P.mjs +326 -0
  87. package/dist/packem_shared/shared-DnCokNcE.mjs +13 -0
  88. package/dist/packem_shared/unwrap-handler-return-CJrkfrSH.mjs +1 -0
  89. package/package.json +17 -8
  90. package/dist/packem_shared/CONTAINERS_FILENAME-DjpXMqhp.mjs +0 -224
  91. package/dist/packem_shared/CodegenDiagnosticError-DyQ5FwkM.mjs +0 -24
  92. package/dist/packem_shared/FLAGS_FILENAME-BjpS5w08.mjs +0 -139
  93. package/dist/packem_shared/GENERATED_HEADER-f6nMvllu.mjs +0 -3274
  94. package/dist/packem_shared/LUNORA_ERROR_CODES-CySpQPD3.mjs +0 -61
  95. package/dist/packem_shared/MUTATORS_FILENAME-BZOfUhlY.mjs +0 -81
  96. package/dist/packem_shared/OPENRPC_VERSION-u5SqDDGk.mjs +0 -60
  97. package/dist/packem_shared/QUEUES_FILENAME-BF0iUmx7.mjs +0 -119
  98. package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-Cpfn80SH.mjs +0 -3481
  99. package/dist/packem_shared/SCHEMA_SNAPSHOT_VERSION-D0ARY6rL.mjs +0 -249
  100. package/dist/packem_shared/SHAPES_FILENAME-DOhPGi-6.mjs +0 -94
  101. package/dist/packem_shared/WORKFLOWS_FILENAME-CCC_42o3.mjs +0 -124
  102. package/dist/packem_shared/buildOpenApiDocument-AgKWmlry.mjs +0 -183
  103. package/dist/packem_shared/discover-ast-CT6BgBr4.mjs +0 -13
  104. package/dist/packem_shared/discoverAuthApiCalls-URDoTADN.mjs +0 -62
  105. package/dist/packem_shared/discoverCrons-DdZOeroL.mjs +0 -257
  106. package/dist/packem_shared/discoverFunctions-BJdF7lRs.mjs +0 -514
  107. package/dist/packem_shared/discoverHttpRoutes-CcwP-Rkr.mjs +0 -131
  108. package/dist/packem_shared/discoverInserts-BpFhM32L.mjs +0 -61
  109. package/dist/packem_shared/discoverMaskProcedures-DT-v8wvj.mjs +0 -273
  110. package/dist/packem_shared/discoverMigrations-cG1idBVM.mjs +0 -97
  111. package/dist/packem_shared/discoverNondeterministicCalls-CEOjmfk4.mjs +0 -122
  112. package/dist/packem_shared/discoverQueries-DeVBQVAG.mjs +0 -62
  113. package/dist/packem_shared/discoverR2sqlCalls-CWCAU-xJ.mjs +0 -80
  114. package/dist/packem_shared/discoverRlsMetadata-BL0oukaK.mjs +0 -280
  115. package/dist/packem_shared/discoverSchema-CeXJWVKV.mjs +0 -874
  116. package/dist/packem_shared/discoverStorageRulesMetadata-CFHByjIl.mjs +0 -97
  117. package/dist/packem_shared/emitApp-DKt3rPtr.mjs +0 -675
  118. package/dist/packem_shared/formatAdvisories-C9wNBNvL.mjs +0 -113
  119. package/dist/packem_shared/parse-validator-D6zI2i85.mjs +0 -134
  120. package/dist/packem_shared/paths-BRd6JHuF.mjs +0 -11
  121. package/dist/packem_shared/redact-oTmsol5A.mjs +0 -33
  122. package/dist/packem_shared/schemaFromIr-DTYsLBaA.mjs +0 -57
@@ -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 { GENERATED_HEADER } from './GENERATED_HEADER-f6nMvllu.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 };
@@ -1,119 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { queueDefaultName, queueBindingName } from '@lunora/queue';
4
- import { SyntaxKind, Node } from 'ts-morph';
5
- import { diagnosticAt } from './CodegenDiagnosticError-DyQ5FwkM.mjs';
6
-
7
- const QUEUES_FILENAME = "queues.ts";
8
- const isDefineQueue = (identifier) => {
9
- const symbol = identifier.getSymbol();
10
- if (!symbol) {
11
- return identifier.getText() === "defineQueue";
12
- }
13
- for (const declaration of symbol.getDeclarations()) {
14
- if (!Node.isImportSpecifier(declaration)) {
15
- continue;
16
- }
17
- if (declaration.getImportDeclaration().getModuleSpecifierValue() !== "@lunora/queue") {
18
- return false;
19
- }
20
- return declaration.getNameNode().getText() === "defineQueue";
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
- `queue "${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
- `queue "${exportName}": \`${property}\` must be a static numeric literal — it is deploy configuration codegen writes into wrangler.jsonc`
40
- );
41
- };
42
- const queueNameOverride = (argument, exportName) => {
43
- const nameProperty = argument.getProperty("name");
44
- if (!nameProperty || !Node.isPropertyAssignment(nameProperty)) {
45
- return void 0;
46
- }
47
- const name = stringProperty(nameProperty.getInitializerOrThrow(), exportName, "name");
48
- if (name.length === 0) {
49
- throw diagnosticAt(nameProperty, `queue "${exportName}": \`name\` must be a non-empty string when provided`);
50
- }
51
- return name;
52
- };
53
- const queueFromCall = (call, exportName) => {
54
- const argument = call.getArguments()[0];
55
- if (!argument || !Node.isObjectLiteralExpression(argument)) {
56
- throw diagnosticAt(call, `queue "${exportName}": defineQueue must be passed an inline object literal`);
57
- }
58
- const ir = {
59
- bindingName: queueBindingName(exportName),
60
- exportName,
61
- mode: "push",
62
- name: queueNameOverride(argument, exportName) ?? queueDefaultName(exportName),
63
- tuning: {}
64
- };
65
- const modeProperty = argument.getProperty("mode");
66
- if (modeProperty && Node.isPropertyAssignment(modeProperty)) {
67
- const mode = stringProperty(modeProperty.getInitializerOrThrow(), exportName, "mode");
68
- if (mode !== "push" && mode !== "pull") {
69
- throw diagnosticAt(modeProperty, `queue "${exportName}": \`mode\` must be "push" or "pull" (got ${JSON.stringify(mode)})`);
70
- }
71
- ir.mode = mode;
72
- }
73
- const dlqProperty = argument.getProperty("deadLetterQueue");
74
- if (dlqProperty && Node.isPropertyAssignment(dlqProperty)) {
75
- ir.tuning.deadLetterQueue = stringProperty(dlqProperty.getInitializerOrThrow(), exportName, "deadLetterQueue");
76
- }
77
- for (const property of ["maxBatchSize", "maxBatchTimeout", "maxRetries", "retryDelay"]) {
78
- const node = argument.getProperty(property);
79
- if (node && Node.isPropertyAssignment(node)) {
80
- ir.tuning[property] = numberProperty(node.getInitializerOrThrow(), exportName, property);
81
- }
82
- }
83
- return ir;
84
- };
85
- const queuesFromSource = (source) => {
86
- const queues = [];
87
- for (const declaration of source.getVariableDeclarations()) {
88
- if (!declaration.isExported()) {
89
- continue;
90
- }
91
- const initializer = declaration.getInitializer();
92
- if (initializer?.getKind() !== SyntaxKind.CallExpression) {
93
- continue;
94
- }
95
- const call = initializer;
96
- const callee = call.getExpression();
97
- if (!Node.isIdentifier(callee) || !isDefineQueue(callee)) {
98
- continue;
99
- }
100
- const nameNode = declaration.getNameNode();
101
- if (!Node.isIdentifier(nameNode)) {
102
- throw diagnosticAt(nameNode, "defineQueue exports must be plain named exports (no destructuring)");
103
- }
104
- queues.push(queueFromCall(call, nameNode.getText()));
105
- }
106
- return queues;
107
- };
108
- const discoverQueues = (project, lunoraDirectory) => {
109
- const queuesPath = join(lunoraDirectory, QUEUES_FILENAME);
110
- if (!existsSync(queuesPath)) {
111
- return [];
112
- }
113
- const source = project.getSourceFile(queuesPath) ?? project.addSourceFileAtPath(queuesPath);
114
- const queues = queuesFromSource(source);
115
- queues.sort((a, b) => a.exportName.localeCompare(b.exportName));
116
- return queues;
117
- };
118
-
119
- export { QUEUES_FILENAME, discoverQueues };