@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 +6 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +2 -2
- package/dist/packem_shared/{SCHEMA_SNAPSHOT_FILENAME-OBXQBJV0.mjs → SCHEMA_SNAPSHOT_FILENAME-DnD-_HwA.mjs} +43 -138
- package/dist/packem_shared/{formatAdvisories-C9wNBNvL.mjs → formatAdvisories-DLIqHq5l.mjs} +2 -1
- package/package.json +8 -8
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-
|
|
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-
|
|
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-
|
|
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
|
|
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 (!
|
|
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
|
|
659
|
-
const method =
|
|
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
|
|
664
|
-
if (!
|
|
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
|
|
668
|
+
const accessesInSourceFile = (sourceFile, relativePath, config) => {
|
|
670
669
|
const found = [];
|
|
671
670
|
for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
672
|
-
const
|
|
673
|
-
if (
|
|
674
|
-
found.push(
|
|
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
|
|
680
|
-
const
|
|
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
|
-
|
|
682
|
+
accesses.push(...accessesInSourceFile(sourceFile, lunoraRelativePath(lunoraDirectory, filePath), config));
|
|
684
683
|
}
|
|
685
|
-
return
|
|
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
|
|
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
|
|
785
|
+
return false;
|
|
788
786
|
}
|
|
789
787
|
const remainder = receiver.slice(CONTAINER_ACCESSOR_PREFIX.length);
|
|
790
|
-
return remainder.length > 0 && !remainder.includes(".")
|
|
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
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
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
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
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.
|
|
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.
|
|
50
|
-
"@lunora/container": "1.0.0-alpha.
|
|
51
|
-
"@lunora/errors": "1.0.0-alpha.
|
|
52
|
-
"@lunora/queue": "1.0.0-alpha.
|
|
53
|
-
"@lunora/scheduler": "1.0.0-alpha.
|
|
54
|
-
"@lunora/values": "1.0.0-alpha.
|
|
55
|
-
"@lunora/workflow": "1.0.0-alpha.
|
|
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": {
|