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

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.
package/LICENSE.md CHANGED
@@ -103,3 +103,9 @@ Unless required by applicable law or agreed to in writing, software distributed
103
103
  under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
104
  CONDITIONS OF ANY KIND, either express or implied. See the License for the
105
105
  specific language governing permissions and limitations under the License.
106
+
107
+ <!-- DEPENDENCIES -->
108
+ <!-- /DEPENDENCIES -->
109
+
110
+ <!-- TYPE_DEPENDENCIES -->
111
+ <!-- /TYPE_DEPENDENCIES -->
package/dist/index.d.mts CHANGED
@@ -1597,7 +1597,7 @@ interface ProjectIR {
1597
1597
  * pass straight through without conversion. Returns the findings; surfacing them
1598
1598
  * (console, error overlay, studio Advisors table) is the caller's choice.
1599
1599
  */
1600
- declare const lintSchema: (schema: SchemaIR, queries?: ReadonlyArray<QueryReadIR>, inserts?: ReadonlyArray<InsertWriteIR>, authApiCalls?: ReadonlyArray<AuthApiCallIR>, rlsProcedures?: ReadonlyArray<RlsProcedureIR>, containers?: ReadonlyArray<ContainerIR>, workflows?: ReadonlyArray<WorkflowIR>, workflowCalls?: ReadonlyArray<WorkflowCallIR>, maskProcedures?: ReadonlyArray<MaskProcedureIR>, nondeterministicCalls?: ReadonlyArray<NondeterministicCallIR>, procedureProtections?: ReadonlyArray<ProcedureMiddlewareIR>, argumentValidators?: ReadonlyArray<ArgumentValidatorIR>, secretLiterals?: ReadonlyArray<SecretLiteralIR>, sqlInterpolations?: ReadonlyArray<SqlInterpolationIR>, adminRoutes?: ReadonlyArray<AdminRouteIR>, r2sqlCalls?: ReadonlyArray<R2sqlCallIR>, shapes?: ReadonlyArray<ShapeIR>, mutatorWrites?: ReadonlyArray<MutatorWriteIR>, configCalls?: ReadonlyArray<ConfigCallIR>, argumentDerivedFetches?: ReadonlyArray<ArgumentDerivedFetchIR>, kvKeyAccesses?: ReadonlyArray<KvKeyAccessIR>, ownerFieldWrites?: ReadonlyArray<OwnerFieldWriteIR>, storageKeyAccesses?: ReadonlyArray<StorageKeyAccessIR>, aiRawRuns?: ReadonlyArray<AiRawRunIR>, containerKeyAccesses?: ReadonlyArray<ContainerKeyAccessIR>, mailRecipientAccesses?: ReadonlyArray<MailRecipientAccessIR>, vectorNamespaceAccesses?: ReadonlyArray<VectorNamespaceAccessIR>, browserUrlAccesses?: ReadonlyArray<BrowserUrlAccessIR>, privilegedDispatches?: ReadonlyArray<PrivilegedDispatchIR>, containerOverrides?: ReadonlyArray<ContainerOverrideIR>, authConfigs?: ReadonlyArray<AuthConfigIR>, maskStrategies?: ReadonlyArray<MaskStrategyIR>, imageDeliveryUrlAccesses?: ReadonlyArray<ImageDeliveryUrlAccessIR>, ratelimitKeySelectors?: ReadonlyArray<RatelimitKeySelectorIR>, storageUploads?: ReadonlyArray<StorageUploadIR>, httpActionGuards?: ReadonlyArray<HttpActionGuardIR>, httpHeaderWrites?: ReadonlyArray<HttpHeaderWriteIR>, failOpenGuards?: ReadonlyArray<FailOpenGuardIR>, flagSecurityDefaults?: ReadonlyArray<FlagSecurityDefaultIR>, aiToolSideEffects?: ReadonlyArray<AiToolSideEffectIR>, identityClaimReads?: ReadonlyArray<IdentityClaimReadIR>, paymentWebhooks?: ReadonlyArray<PaymentWebhookIR>, softDeleteReads?: ReadonlyArray<SoftDeleteReadIR>, relationLoads?: ReadonlyArray<RelationLoadIR>, rawRowReturns?: ReadonlyArray<RawRowReturnIR>, normalizeIdAuthorizations?: ReadonlyArray<NormalizeIdAuthorizationIR>, wranglerVariables?: ReadonlyArray<WranglerVariableIR>) => Finding[];
1600
+ declare const lintSchema: (schema: SchemaIR, queries?: ReadonlyArray<QueryReadIR>, inserts?: ReadonlyArray<InsertWriteIR>, authApiCalls?: ReadonlyArray<AuthApiCallIR>, rlsProcedures?: ReadonlyArray<RlsProcedureIR>, containers?: ReadonlyArray<ContainerIR>, workflows?: ReadonlyArray<WorkflowIR>, workflowCalls?: ReadonlyArray<WorkflowCallIR>, maskProcedures?: ReadonlyArray<MaskProcedureIR>, nondeterministicCalls?: ReadonlyArray<NondeterministicCallIR>, procedureProtections?: ReadonlyArray<ProcedureMiddlewareIR>, argumentValidators?: ReadonlyArray<ArgumentValidatorIR>, secretLiterals?: ReadonlyArray<SecretLiteralIR>, sqlInterpolations?: ReadonlyArray<SqlInterpolationIR>, adminRoutes?: ReadonlyArray<AdminRouteIR>, r2sqlCalls?: ReadonlyArray<R2sqlCallIR>, shapes?: ReadonlyArray<ShapeIR>, mutatorWrites?: ReadonlyArray<MutatorWriteIR>, configCalls?: ReadonlyArray<ConfigCallIR>, argumentDerivedFetches?: ReadonlyArray<ArgumentDerivedFetchIR>, kvKeyAccesses?: ReadonlyArray<KvKeyAccessIR>, ownerFieldWrites?: ReadonlyArray<OwnerFieldWriteIR>, storageKeyAccesses?: ReadonlyArray<StorageKeyAccessIR>, aiRawRuns?: ReadonlyArray<AiRawRunIR>, containerKeyAccesses?: ReadonlyArray<ContainerKeyAccessIR>, mailRecipientAccesses?: ReadonlyArray<MailRecipientAccessIR>, vectorNamespaceAccesses?: ReadonlyArray<VectorNamespaceAccessIR>, browserUrlAccesses?: ReadonlyArray<BrowserUrlAccessIR>, privilegedDispatches?: ReadonlyArray<PrivilegedDispatchIR>, containerOverrides?: ReadonlyArray<ContainerOverrideIR>, authConfigs?: ReadonlyArray<AuthConfigIR>, maskStrategies?: ReadonlyArray<MaskStrategyIR>, imageDeliveryUrlAccesses?: ReadonlyArray<ImageDeliveryUrlAccessIR>, ratelimitKeySelectors?: ReadonlyArray<RatelimitKeySelectorIR>, storageUploads?: ReadonlyArray<StorageUploadIR>, httpActionGuards?: ReadonlyArray<HttpActionGuardIR>, httpHeaderWrites?: ReadonlyArray<HttpHeaderWriteIR>, failOpenGuards?: ReadonlyArray<FailOpenGuardIR>, flagSecurityDefaults?: ReadonlyArray<FlagSecurityDefaultIR>, aiToolSideEffects?: ReadonlyArray<AiToolSideEffectIR>, identityClaimReads?: ReadonlyArray<IdentityClaimReadIR>, paymentWebhooks?: ReadonlyArray<PaymentWebhookIR>, softDeleteReads?: ReadonlyArray<SoftDeleteReadIR>, relationLoads?: ReadonlyArray<RelationLoadIR>, rawRowReturns?: ReadonlyArray<RawRowReturnIR>, normalizeIdAuthorizations?: ReadonlyArray<NormalizeIdAuthorizationIR>, wranglerVariables?: ReadonlyArray<WranglerVariableIR>, queues?: ReadonlyArray<QueueIR>) => Finding[];
1601
1601
  /**
1602
1602
  * Render advisor findings as a single multi-line string for console surfacing:
1603
1603
  * a one-line summary header followed by one `[LEVEL] name: detail` line per
package/dist/index.d.ts CHANGED
@@ -1597,7 +1597,7 @@ interface ProjectIR {
1597
1597
  * pass straight through without conversion. Returns the findings; surfacing them
1598
1598
  * (console, error overlay, studio Advisors table) is the caller's choice.
1599
1599
  */
1600
- declare const lintSchema: (schema: SchemaIR, queries?: ReadonlyArray<QueryReadIR>, inserts?: ReadonlyArray<InsertWriteIR>, authApiCalls?: ReadonlyArray<AuthApiCallIR>, rlsProcedures?: ReadonlyArray<RlsProcedureIR>, containers?: ReadonlyArray<ContainerIR>, workflows?: ReadonlyArray<WorkflowIR>, workflowCalls?: ReadonlyArray<WorkflowCallIR>, maskProcedures?: ReadonlyArray<MaskProcedureIR>, nondeterministicCalls?: ReadonlyArray<NondeterministicCallIR>, procedureProtections?: ReadonlyArray<ProcedureMiddlewareIR>, argumentValidators?: ReadonlyArray<ArgumentValidatorIR>, secretLiterals?: ReadonlyArray<SecretLiteralIR>, sqlInterpolations?: ReadonlyArray<SqlInterpolationIR>, adminRoutes?: ReadonlyArray<AdminRouteIR>, r2sqlCalls?: ReadonlyArray<R2sqlCallIR>, shapes?: ReadonlyArray<ShapeIR>, mutatorWrites?: ReadonlyArray<MutatorWriteIR>, configCalls?: ReadonlyArray<ConfigCallIR>, argumentDerivedFetches?: ReadonlyArray<ArgumentDerivedFetchIR>, kvKeyAccesses?: ReadonlyArray<KvKeyAccessIR>, ownerFieldWrites?: ReadonlyArray<OwnerFieldWriteIR>, storageKeyAccesses?: ReadonlyArray<StorageKeyAccessIR>, aiRawRuns?: ReadonlyArray<AiRawRunIR>, containerKeyAccesses?: ReadonlyArray<ContainerKeyAccessIR>, mailRecipientAccesses?: ReadonlyArray<MailRecipientAccessIR>, vectorNamespaceAccesses?: ReadonlyArray<VectorNamespaceAccessIR>, browserUrlAccesses?: ReadonlyArray<BrowserUrlAccessIR>, privilegedDispatches?: ReadonlyArray<PrivilegedDispatchIR>, containerOverrides?: ReadonlyArray<ContainerOverrideIR>, authConfigs?: ReadonlyArray<AuthConfigIR>, maskStrategies?: ReadonlyArray<MaskStrategyIR>, imageDeliveryUrlAccesses?: ReadonlyArray<ImageDeliveryUrlAccessIR>, ratelimitKeySelectors?: ReadonlyArray<RatelimitKeySelectorIR>, storageUploads?: ReadonlyArray<StorageUploadIR>, httpActionGuards?: ReadonlyArray<HttpActionGuardIR>, httpHeaderWrites?: ReadonlyArray<HttpHeaderWriteIR>, failOpenGuards?: ReadonlyArray<FailOpenGuardIR>, flagSecurityDefaults?: ReadonlyArray<FlagSecurityDefaultIR>, aiToolSideEffects?: ReadonlyArray<AiToolSideEffectIR>, identityClaimReads?: ReadonlyArray<IdentityClaimReadIR>, paymentWebhooks?: ReadonlyArray<PaymentWebhookIR>, softDeleteReads?: ReadonlyArray<SoftDeleteReadIR>, relationLoads?: ReadonlyArray<RelationLoadIR>, rawRowReturns?: ReadonlyArray<RawRowReturnIR>, normalizeIdAuthorizations?: ReadonlyArray<NormalizeIdAuthorizationIR>, wranglerVariables?: ReadonlyArray<WranglerVariableIR>) => Finding[];
1600
+ declare const lintSchema: (schema: SchemaIR, queries?: ReadonlyArray<QueryReadIR>, inserts?: ReadonlyArray<InsertWriteIR>, authApiCalls?: ReadonlyArray<AuthApiCallIR>, rlsProcedures?: ReadonlyArray<RlsProcedureIR>, containers?: ReadonlyArray<ContainerIR>, workflows?: ReadonlyArray<WorkflowIR>, workflowCalls?: ReadonlyArray<WorkflowCallIR>, maskProcedures?: ReadonlyArray<MaskProcedureIR>, nondeterministicCalls?: ReadonlyArray<NondeterministicCallIR>, procedureProtections?: ReadonlyArray<ProcedureMiddlewareIR>, argumentValidators?: ReadonlyArray<ArgumentValidatorIR>, secretLiterals?: ReadonlyArray<SecretLiteralIR>, sqlInterpolations?: ReadonlyArray<SqlInterpolationIR>, adminRoutes?: ReadonlyArray<AdminRouteIR>, r2sqlCalls?: ReadonlyArray<R2sqlCallIR>, shapes?: ReadonlyArray<ShapeIR>, mutatorWrites?: ReadonlyArray<MutatorWriteIR>, configCalls?: ReadonlyArray<ConfigCallIR>, argumentDerivedFetches?: ReadonlyArray<ArgumentDerivedFetchIR>, kvKeyAccesses?: ReadonlyArray<KvKeyAccessIR>, ownerFieldWrites?: ReadonlyArray<OwnerFieldWriteIR>, storageKeyAccesses?: ReadonlyArray<StorageKeyAccessIR>, aiRawRuns?: ReadonlyArray<AiRawRunIR>, containerKeyAccesses?: ReadonlyArray<ContainerKeyAccessIR>, mailRecipientAccesses?: ReadonlyArray<MailRecipientAccessIR>, vectorNamespaceAccesses?: ReadonlyArray<VectorNamespaceAccessIR>, browserUrlAccesses?: ReadonlyArray<BrowserUrlAccessIR>, privilegedDispatches?: ReadonlyArray<PrivilegedDispatchIR>, containerOverrides?: ReadonlyArray<ContainerOverrideIR>, authConfigs?: ReadonlyArray<AuthConfigIR>, maskStrategies?: ReadonlyArray<MaskStrategyIR>, imageDeliveryUrlAccesses?: ReadonlyArray<ImageDeliveryUrlAccessIR>, ratelimitKeySelectors?: ReadonlyArray<RatelimitKeySelectorIR>, storageUploads?: ReadonlyArray<StorageUploadIR>, httpActionGuards?: ReadonlyArray<HttpActionGuardIR>, httpHeaderWrites?: ReadonlyArray<HttpHeaderWriteIR>, failOpenGuards?: ReadonlyArray<FailOpenGuardIR>, flagSecurityDefaults?: ReadonlyArray<FlagSecurityDefaultIR>, aiToolSideEffects?: ReadonlyArray<AiToolSideEffectIR>, identityClaimReads?: ReadonlyArray<IdentityClaimReadIR>, paymentWebhooks?: ReadonlyArray<PaymentWebhookIR>, softDeleteReads?: ReadonlyArray<SoftDeleteReadIR>, relationLoads?: ReadonlyArray<RelationLoadIR>, rawRowReturns?: ReadonlyArray<RawRowReturnIR>, normalizeIdAuthorizations?: ReadonlyArray<NormalizeIdAuthorizationIR>, wranglerVariables?: ReadonlyArray<WranglerVariableIR>, queues?: ReadonlyArray<QueueIR>) => Finding[];
1601
1601
  /**
1602
1602
  * Render advisor findings as a single multi-line string for console surfacing:
1603
1603
  * a one-line summary header followed by one `[LEVEL] name: detail` line per
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { formatAdvisories, lintSchema } from './packem_shared/formatAdvisories-C9wNBNvL.mjs';
1
+ export { formatAdvisories, lintSchema } from './packem_shared/formatAdvisories-DLIqHq5l.mjs';
2
2
  export { CodegenDiagnosticError, diagnosticAt } from './packem_shared/CodegenDiagnosticError-DyQ5FwkM.mjs';
3
3
  export { default as discoverAuthApiCalls } from './packem_shared/discoverAuthApiCalls-URDoTADN.mjs';
4
4
  export { CONTAINERS_FILENAME, discoverContainers } from './packem_shared/CONTAINERS_FILENAME-DjpXMqhp.mjs';
@@ -23,7 +23,7 @@ export { G as GENERATED_HEADER, e as emitApi, a as emitCollections, b as emitCon
23
23
  export { emitApp } from './packem_shared/emitApp-nQ2oC-8G.mjs';
24
24
  export { buildOpenApiDocument, emitOpenApi, emitOpenApiModule } from './packem_shared/buildOpenApiDocument-bp1pYSV6.mjs';
25
25
  export { OPENRPC_VERSION, buildOpenRpcDocument, emitOpenRpc, emitOpenRpcModule } from './packem_shared/OPENRPC_VERSION-4YIeMkOI.mjs';
26
- export { SCHEMA_SNAPSHOT_FILENAME, createCodegenProject, refreshCodegenProject, runCodegen } from './packem_shared/SCHEMA_SNAPSHOT_FILENAME-OBXQBJV0.mjs';
26
+ export { SCHEMA_SNAPSHOT_FILENAME, createCodegenProject, refreshCodegenProject, runCodegen } from './packem_shared/SCHEMA_SNAPSHOT_FILENAME-DnD-_HwA.mjs';
27
27
  export { SCHEMA_SNAPSHOT_VERSION, SchemaSnapshotParseError, buildSchemaSnapshot, diffSchemaSnapshots, evaluateSchemaDrift, parseSchemaSnapshot, serializeSchemaSnapshot } from './packem_shared/SCHEMA_SNAPSHOT_VERSION-D0ARY6rL.mjs';
28
28
  export { schemaFromIr } from './packem_shared/schemaFromIr-DTYsLBaA.mjs';
29
29
  export { LUNORA_ERROR_CODES, validatorIrToJsonSchema } from './packem_shared/LUNORA_ERROR_CODES-CySpQPD3.mjs';
@@ -3,7 +3,7 @@ import { join, dirname } from 'node:path';
3
3
  import { performance } from 'node:perf_hooks';
4
4
  import { LunoraError } from '@lunora/errors';
5
5
  import { Node, SyntaxKind, Project } from 'ts-morph';
6
- import { lintSchema } from './formatAdvisories-C9wNBNvL.mjs';
6
+ import { lintSchema } from './formatAdvisories-DLIqHq5l.mjs';
7
7
  import { listLunoraSourceFiles, lunoraRelativePath, classifyProcedureCall, inlineHandler as inlineHandler$1, procedureHandler, chainUsesWrappedCall, isDatabaseAccessor, chainHasStep, discoverFunctions } from './discoverFunctions-BJdF7lRs.mjs';
8
8
  import discoverAuthApiCalls from './discoverAuthApiCalls-URDoTADN.mjs';
9
9
  import { discoverContainers } from './CONTAINERS_FILENAME-DjpXMqhp.mjs';
@@ -644,47 +644,53 @@ const discoverAuthConfig = (project, lunoraDirectory) => {
644
644
  return rows;
645
645
  };
646
646
 
647
- const BROWSER_URL_METHODS = /* @__PURE__ */ new Set(["content", "pdf", "scrape", "screenshot"]);
648
- const browserUrlMethod = (node) => {
647
+ const sinkMethod = (node, config) => {
649
648
  if (!Node.isPropertyAccessExpression(node)) {
650
649
  return void 0;
651
650
  }
652
651
  const method = node.getName();
653
- if (!BROWSER_URL_METHODS.has(method) || node.getExpression().getText() !== "ctx.browser") {
652
+ if (!config.methods.has(method)) {
654
653
  return void 0;
655
654
  }
656
- return method;
655
+ return config.matchReceiver(node.getExpression().getText()) ? method : void 0;
657
656
  };
658
- const browserUrlAccessInCall = (call, relativePath) => {
659
- const method = browserUrlMethod(call.getExpression());
657
+ const accessInCall = (call, relativePath, config) => {
658
+ const method = sinkMethod(call.getExpression(), config);
660
659
  if (method === void 0) {
661
660
  return void 0;
662
661
  }
663
- const url = call.getArguments()[0];
664
- if (!url || !isArgumentDerived(url) || isScopedByContext(url)) {
662
+ const key = call.getArguments()[config.argIndex];
663
+ if (!key || !isArgumentDerived(key) || isScopedByContext(key)) {
665
664
  return void 0;
666
665
  }
667
666
  return { exportName: enclosingExportName$1(call), file: relativePath, line: call.getStartLineNumber(), method };
668
667
  };
669
- const browserUrlAccessesInSourceFile = (sourceFile, relativePath) => {
668
+ const accessesInSourceFile = (sourceFile, relativePath, config) => {
670
669
  const found = [];
671
670
  for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
672
- const row = browserUrlAccessInCall(call, relativePath);
673
- if (row) {
674
- found.push(row);
671
+ const access = accessInCall(call, relativePath, config);
672
+ if (access) {
673
+ found.push(access);
675
674
  }
676
675
  }
677
676
  return found;
678
677
  };
679
- const discoverBrowserUrlAccesses = (project, lunoraDirectory) => {
680
- const rows = [];
678
+ const discoverArgumentDerivedAccesses = (project, lunoraDirectory, config) => {
679
+ const accesses = [];
681
680
  for (const filePath of listLunoraSourceFiles(lunoraDirectory)) {
682
681
  const sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
683
- rows.push(...browserUrlAccessesInSourceFile(sourceFile, lunoraRelativePath(lunoraDirectory, filePath)));
682
+ accesses.push(...accessesInSourceFile(sourceFile, lunoraRelativePath(lunoraDirectory, filePath), config));
684
683
  }
685
- return rows;
684
+ return accesses;
686
685
  };
687
686
 
687
+ const BROWSER_URL_METHODS = /* @__PURE__ */ new Set(["content", "pdf", "scrape", "screenshot"]);
688
+ const discoverBrowserUrlAccesses = (project, lunoraDirectory) => discoverArgumentDerivedAccesses(project, lunoraDirectory, {
689
+ argIndex: 0,
690
+ matchReceiver: (receiver) => receiver === "ctx.browser",
691
+ methods: BROWSER_URL_METHODS
692
+ });
693
+
688
694
  const FUNCTION_CALLEES = /* @__PURE__ */ new Set(["createBrowser", "createInboundEmailHandler", "createPayment"]);
689
695
  const CONSTRUCTOR_CALLEES = /* @__PURE__ */ new Set(["RateLimiter"]);
690
696
  const CALLBACK_CALLEES = /* @__PURE__ */ new Set(["extend"]);
@@ -774,50 +780,18 @@ const discoverConfigCalls = (project, lunoraDirectory) => {
774
780
  };
775
781
 
776
782
  const CONTAINER_ACCESSOR_PREFIX = "ctx.containers.";
777
- const containerGetMethod = (node) => {
778
- if (!Node.isPropertyAccessExpression(node)) {
779
- return void 0;
780
- }
781
- const method = node.getName();
782
- if (method !== "get") {
783
- return void 0;
784
- }
785
- const receiver = node.getExpression().getText();
783
+ const isContainerInstanceReceiver = (receiver) => {
786
784
  if (!receiver.startsWith(CONTAINER_ACCESSOR_PREFIX)) {
787
- return void 0;
785
+ return false;
788
786
  }
789
787
  const remainder = receiver.slice(CONTAINER_ACCESSOR_PREFIX.length);
790
- return remainder.length > 0 && !remainder.includes(".") ? method : void 0;
791
- };
792
- const containerAccessInCall = (call, relativePath) => {
793
- const method = containerGetMethod(call.getExpression());
794
- if (method === void 0) {
795
- return void 0;
796
- }
797
- const key = call.getArguments()[0];
798
- if (!key || !isArgumentDerived(key) || isScopedByContext(key)) {
799
- return void 0;
800
- }
801
- return { exportName: enclosingExportName$1(call), file: relativePath, line: call.getStartLineNumber(), method };
802
- };
803
- const containerAccessesInSourceFile = (sourceFile, relativePath) => {
804
- const found = [];
805
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
806
- const access = containerAccessInCall(call, relativePath);
807
- if (access) {
808
- found.push(access);
809
- }
810
- }
811
- return found;
812
- };
813
- const discoverContainerKeyAccesses = (project, lunoraDirectory) => {
814
- const accesses = [];
815
- for (const filePath of listLunoraSourceFiles(lunoraDirectory)) {
816
- const sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
817
- accesses.push(...containerAccessesInSourceFile(sourceFile, lunoraRelativePath(lunoraDirectory, filePath)));
818
- }
819
- return accesses;
788
+ return remainder.length > 0 && !remainder.includes(".");
820
789
  };
790
+ const discoverContainerKeyAccesses = (project, lunoraDirectory) => discoverArgumentDerivedAccesses(project, lunoraDirectory, {
791
+ argIndex: 0,
792
+ matchReceiver: isContainerInstanceReceiver,
793
+ methods: /* @__PURE__ */ new Set(["get"])
794
+ });
821
795
 
822
796
  const EGRESS_MUTATING_METHODS = /* @__PURE__ */ new Set(["allow", "deny", "setAllowed"]);
823
797
  const hasEnableInternetTrue = (call) => {
@@ -1646,46 +1620,11 @@ const discoverImageDeliveryUrlAccesses = (project, lunoraDirectory) => {
1646
1620
  };
1647
1621
 
1648
1622
  const KV_KEY_METHODS = /* @__PURE__ */ new Set(["delete", "get", "getRaw", "getWithMetadata", "put"]);
1649
- const kvKeyMethod = (node) => {
1650
- if (!Node.isPropertyAccessExpression(node)) {
1651
- return void 0;
1652
- }
1653
- const method = node.getName();
1654
- if (!KV_KEY_METHODS.has(method)) {
1655
- return void 0;
1656
- }
1657
- const receiver = node.getExpression().getText();
1658
- return receiver === "ctx.kv" || receiver.startsWith("ctx.kv.") ? method : void 0;
1659
- };
1660
- const kvAccessInCall = (call, relativePath) => {
1661
- const method = kvKeyMethod(call.getExpression());
1662
- if (method === void 0) {
1663
- return void 0;
1664
- }
1665
- const key = call.getArguments()[0];
1666
- if (!key || !isArgumentDerived(key) || isScopedByContext(key)) {
1667
- return void 0;
1668
- }
1669
- return { exportName: enclosingExportName$1(call), file: relativePath, line: call.getStartLineNumber(), method };
1670
- };
1671
- const kvAccessesInSourceFile = (sourceFile, relativePath) => {
1672
- const found = [];
1673
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
1674
- const access = kvAccessInCall(call, relativePath);
1675
- if (access) {
1676
- found.push(access);
1677
- }
1678
- }
1679
- return found;
1680
- };
1681
- const discoverKvKeyAccesses = (project, lunoraDirectory) => {
1682
- const accesses = [];
1683
- for (const filePath of listLunoraSourceFiles(lunoraDirectory)) {
1684
- const sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
1685
- accesses.push(...kvAccessesInSourceFile(sourceFile, lunoraRelativePath(lunoraDirectory, filePath)));
1686
- }
1687
- return accesses;
1688
- };
1623
+ const discoverKvKeyAccesses = (project, lunoraDirectory) => discoverArgumentDerivedAccesses(project, lunoraDirectory, {
1624
+ argIndex: 0,
1625
+ matchReceiver: (receiver) => receiver === "ctx.kv" || receiver.startsWith("ctx.kv."),
1626
+ methods: KV_KEY_METHODS
1627
+ });
1689
1628
 
1690
1629
  const MAIL_METHODS = /* @__PURE__ */ new Set(["queue", "send"]);
1691
1630
  const RECIPIENT_FIELDS = /* @__PURE__ */ new Set(["bcc", "cc", "to"]);
@@ -2949,46 +2888,11 @@ const KEY_TAKING_METHODS = /* @__PURE__ */ new Set([
2949
2888
  "store",
2950
2889
  "upload"
2951
2890
  ]);
2952
- const storageKeyMethod = (node) => {
2953
- if (!Node.isPropertyAccessExpression(node)) {
2954
- return void 0;
2955
- }
2956
- const method = node.getName();
2957
- if (!KEY_TAKING_METHODS.has(method)) {
2958
- return void 0;
2959
- }
2960
- const receiver = node.getExpression().getText();
2961
- return receiver === "ctx.storage" || receiver.startsWith("ctx.storage.") ? method : void 0;
2962
- };
2963
- const storageKeyInCall = (call, relativePath) => {
2964
- const method = storageKeyMethod(call.getExpression());
2965
- if (method === void 0) {
2966
- return void 0;
2967
- }
2968
- const key = call.getArguments()[0];
2969
- if (!key || !isArgumentDerived(key) || isScopedByContext(key)) {
2970
- return void 0;
2971
- }
2972
- return { exportName: enclosingExportName$1(call), file: relativePath, line: call.getStartLineNumber(), method };
2973
- };
2974
- const storageKeyAccessesInSourceFile = (sourceFile, relativePath) => {
2975
- const found = [];
2976
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
2977
- const access = storageKeyInCall(call, relativePath);
2978
- if (access) {
2979
- found.push(access);
2980
- }
2981
- }
2982
- return found;
2983
- };
2984
- const discoverStorageKeyAccesses = (project, lunoraDirectory) => {
2985
- const accesses = [];
2986
- for (const filePath of listLunoraSourceFiles(lunoraDirectory)) {
2987
- const sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
2988
- accesses.push(...storageKeyAccessesInSourceFile(sourceFile, lunoraRelativePath(lunoraDirectory, filePath)));
2989
- }
2990
- return accesses;
2991
- };
2891
+ const discoverStorageKeyAccesses = (project, lunoraDirectory) => discoverArgumentDerivedAccesses(project, lunoraDirectory, {
2892
+ argIndex: 0,
2893
+ matchReceiver: (receiver) => receiver === "ctx.storage" || receiver.startsWith("ctx.storage."),
2894
+ methods: KEY_TAKING_METHODS
2895
+ });
2992
2896
 
2993
2897
  const OPTIONS_ARGUMENT_INDEX = /* @__PURE__ */ new Map([
2994
2898
  ["generateUploadUrl", 1],
@@ -3298,7 +3202,8 @@ const runCodegen = (options) => {
3298
3202
  discoverRelationLoads(project, lunoraDirectory),
3299
3203
  discoverRawRowReturns(project, lunoraDirectory),
3300
3204
  discoverNormalizeIdAuthorization(project, lunoraDirectory),
3301
- options.wranglerVariables
3205
+ options.wranglerVariables,
3206
+ queues
3302
3207
  );
3303
3208
  const rlsMetadata = discoverRlsMetadata(project, lunoraDirectory);
3304
3209
  const maskMetadata = discoverMaskMetadata(project, lunoraDirectory);
@@ -49,7 +49,7 @@ const toAdvisorSchema = (schema) => {
49
49
  const toAdvisorShapes = (shapes) => shapes.map((shape) => {
50
50
  return { exportName: shape.exportName, file: `lunora/${shape.filePath}.ts`, table: shape.table };
51
51
  });
52
- const lintSchema = (schema, queries = [], inserts, authApiCalls, rlsProcedures, containers, workflows, workflowCalls, maskProcedures, nondeterministicCalls, procedureProtections, argumentValidators, secretLiterals, sqlInterpolations, adminRoutes, r2sqlCalls, shapes, mutatorWrites, configCalls, argumentDerivedFetches, kvKeyAccesses, ownerFieldWrites, storageKeyAccesses, aiRawRuns, containerKeyAccesses, mailRecipientAccesses, vectorNamespaceAccesses, browserUrlAccesses, privilegedDispatches, containerOverrides, authConfigs, maskStrategies, imageDeliveryUrlAccesses, ratelimitKeySelectors, storageUploads, httpActionGuards, httpHeaderWrites, failOpenGuards, flagSecurityDefaults, aiToolSideEffects, identityClaimReads, paymentWebhooks, softDeleteReads, relationLoads, rawRowReturns, normalizeIdAuthorizations, wranglerVariables) => runAdvisor(
52
+ const lintSchema = (schema, queries = [], inserts, authApiCalls, rlsProcedures, containers, workflows, workflowCalls, maskProcedures, nondeterministicCalls, procedureProtections, argumentValidators, secretLiterals, sqlInterpolations, adminRoutes, r2sqlCalls, shapes, mutatorWrites, configCalls, argumentDerivedFetches, kvKeyAccesses, ownerFieldWrites, storageKeyAccesses, aiRawRuns, containerKeyAccesses, mailRecipientAccesses, vectorNamespaceAccesses, browserUrlAccesses, privilegedDispatches, containerOverrides, authConfigs, maskStrategies, imageDeliveryUrlAccesses, ratelimitKeySelectors, storageUploads, httpActionGuards, httpHeaderWrites, failOpenGuards, flagSecurityDefaults, aiToolSideEffects, identityClaimReads, paymentWebhooks, softDeleteReads, relationLoads, rawRowReturns, normalizeIdAuthorizations, wranglerVariables, queues) => runAdvisor(
53
53
  {
54
54
  adminRoutes,
55
55
  aiRawRuns,
@@ -82,6 +82,7 @@ const lintSchema = (schema, queries = [], inserts, authApiCalls, rlsProcedures,
82
82
  privilegedDispatches,
83
83
  procedureProtections,
84
84
  queries,
85
+ queues,
85
86
  r2sqlCalls,
86
87
  ratelimitKeySelectors,
87
88
  rawRowReturns,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/codegen",
3
- "version": "1.0.0-alpha.32",
3
+ "version": "1.0.0-alpha.34",
4
4
  "description": "Code generator for Lunora: emits _generated/{api,server,dataModel}.ts from your schema",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -46,13 +46,13 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@lunora/advisor": "1.0.0-alpha.18",
50
- "@lunora/container": "1.0.0-alpha.6",
51
- "@lunora/errors": "1.0.0-alpha.1",
52
- "@lunora/queue": "1.0.0-alpha.4",
53
- "@lunora/scheduler": "1.0.0-alpha.5",
54
- "@lunora/values": "1.0.0-alpha.4",
55
- "@lunora/workflow": "1.0.0-alpha.6",
49
+ "@lunora/advisor": "1.0.0-alpha.20",
50
+ "@lunora/container": "1.0.0-alpha.7",
51
+ "@lunora/errors": "1.0.0-alpha.2",
52
+ "@lunora/queue": "1.0.0-alpha.5",
53
+ "@lunora/scheduler": "1.0.0-alpha.6",
54
+ "@lunora/values": "1.0.0-alpha.5",
55
+ "@lunora/workflow": "1.0.0-alpha.7",
56
56
  "ts-morph": "^28.0.0"
57
57
  },
58
58
  "engines": {