@lunora/codegen 1.0.0-alpha.3 → 1.0.0-alpha.5

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/dist/index.mjs CHANGED
@@ -12,14 +12,14 @@ export { default as discoverNondeterministicCalls } from './packem_shared/discov
12
12
  export { default as discoverQueries } from './packem_shared/discoverQueries-BkIi0dBD.mjs';
13
13
  export { default as discoverR2sqlCalls } from './packem_shared/discoverR2sqlCalls-BpDqvcUn.mjs';
14
14
  export { discoverRlsMetadata, default as discoverRlsProcedures } from './packem_shared/discoverRlsMetadata-DpRB1HMe.mjs';
15
- export { default as discoverSchema } from './packem_shared/discoverSchema-BBulgGbH.mjs';
15
+ export { default as discoverSchema } from './packem_shared/discoverSchema-DB_QrIQe.mjs';
16
16
  export { default as discoverStorageRulesMetadata } from './packem_shared/discoverStorageRulesMetadata-DAqJUxUv.mjs';
17
17
  export { WORKFLOWS_FILENAME, discoverWorkflows } from './packem_shared/WORKFLOWS_FILENAME-DRDQdhfq.mjs';
18
- export { GENERATED_HEADER, emitApi, emitContainers, emitCrons, emitDataModel, emitDrizzleSchema, emitFunctions, emitServer, emitShard, emitVectors, emitWorkflows, emitWranglerCronTriggers } from './packem_shared/GENERATED_HEADER-CuLyj0WQ.mjs';
19
- export { emitApp } from './packem_shared/emitApp-CzSxVDaG.mjs';
20
- export { buildOpenApiDocument, emitOpenApi, emitOpenApiModule } from './packem_shared/buildOpenApiDocument-CXwnbp4b.mjs';
21
- export { OPENRPC_VERSION, buildOpenRpcDocument, emitOpenRpc, emitOpenRpcModule } from './packem_shared/OPENRPC_VERSION-BGUrsrt_.mjs';
22
- export { SCHEMA_SNAPSHOT_FILENAME, createCodegenProject, refreshCodegenProject, runCodegen } from './packem_shared/SCHEMA_SNAPSHOT_FILENAME-BQ_kCZ81.mjs';
18
+ export { GENERATED_HEADER, emitApi, emitContainers, emitCrons, emitDataModel, emitDrizzleSchema, emitFunctions, emitServer, emitShard, emitVectors, emitWorkflows, emitWranglerCronTriggers } from './packem_shared/GENERATED_HEADER-DF1hQcix.mjs';
19
+ export { emitApp } from './packem_shared/emitApp-Ci_hcJNO.mjs';
20
+ export { buildOpenApiDocument, emitOpenApi, emitOpenApiModule } from './packem_shared/buildOpenApiDocument-Cns1EkCQ.mjs';
21
+ export { OPENRPC_VERSION, buildOpenRpcDocument, emitOpenRpc, emitOpenRpcModule } from './packem_shared/OPENRPC_VERSION-C7zKVeKi.mjs';
22
+ export { SCHEMA_SNAPSHOT_FILENAME, createCodegenProject, refreshCodegenProject, runCodegen } from './packem_shared/SCHEMA_SNAPSHOT_FILENAME-BqOtU2lC.mjs';
23
23
  export { SCHEMA_SNAPSHOT_VERSION, SchemaSnapshotParseError, buildSchemaSnapshot, diffSchemaSnapshots, evaluateSchemaDrift, parseSchemaSnapshot, serializeSchemaSnapshot } from './packem_shared/SCHEMA_SNAPSHOT_VERSION-DzLDbWk3.mjs';
24
24
  export { schemaFromIr } from './packem_shared/schemaFromIr-DTYsLBaA.mjs';
25
25
  export { LUNORA_ERROR_CODES, validatorIrToJsonSchema } from './packem_shared/LUNORA_ERROR_CODES-CySpQPD3.mjs';
@@ -2209,6 +2209,14 @@ ${facadeBlock}${paymentsBuild}
2209
2209
  warn: (...args: unknown[]) => { this.recordUserLog(logFunctionPath, "warn", args, observability); },
2210
2210
  };
2211
2211
 
2212
+ // \`ctx.now\`: the wall-clock instant (epoch ms) this function began,
2213
+ // captured ONCE so the whole handler body sees a single stable value.
2214
+ // Query/mutation handlers must be deterministic (they may be re-run on
2215
+ // OCC retry / subscription re-eval), so they must read time through
2216
+ // \`ctx.now\` instead of \`Date.now()\` — the \`nondeterministic_query_mutation\`
2217
+ // advisor flags the latter. Actions may still use ambient \`Date.now()\`.
2218
+ const now = Date.now();
2219
+
2212
2220
  const ctx: Record<string, unknown> = {
2213
2221
  auth: {
2214
2222
  getIdentity: async () => identity ?? null,
@@ -2217,7 +2225,8 @@ ${facadeBlock}${paymentsBuild}
2217
2225
  db,
2218
2226
  fetch: globalThis.fetch.bind(globalThis),
2219
2227
  ip: this.getCurrentIp(),
2220
- log,${ormContextField}
2228
+ log,
2229
+ now,${ormContextField}
2221
2230
  scheduler,
2222
2231
  storage,${vectorsContextField}${aiContextField}${everyContextField}${paymentsContextField}${containersContextField}${workflowsContextField}
2223
2232
  };
@@ -1,4 +1,4 @@
1
- import { GENERATED_HEADER } from './GENERATED_HEADER-CuLyj0WQ.mjs';
1
+ import { GENERATED_HEADER } from './GENERATED_HEADER-DF1hQcix.mjs';
2
2
  import { s as sanitizeNamespace } from './paths-BRd6JHuF.mjs';
3
3
  import { argsObjectSchema, LUNORA_ERROR_CODES } from './LUNORA_ERROR_CODES-CySpQPD3.mjs';
4
4
 
@@ -14,14 +14,14 @@ import discoverNondeterministicCalls from './discoverNondeterministicCalls-4KiPQ
14
14
  import discoverQueries from './discoverQueries-BkIi0dBD.mjs';
15
15
  import discoverR2sqlCalls from './discoverR2sqlCalls-BpDqvcUn.mjs';
16
16
  import discoverRlsProcedures, { discoverRlsMetadata } from './discoverRlsMetadata-DpRB1HMe.mjs';
17
- import discoverSchema from './discoverSchema-BBulgGbH.mjs';
17
+ import discoverSchema from './discoverSchema-DB_QrIQe.mjs';
18
18
  import discoverStorageRulesMetadata from './discoverStorageRulesMetadata-DAqJUxUv.mjs';
19
19
  import { e as enclosingExportName$1 } from './discover-ast-CT6BgBr4.mjs';
20
20
  import { discoverWorkflows } from './WORKFLOWS_FILENAME-DRDQdhfq.mjs';
21
- import { buildStorageColumns, emitDataModel, emitApi, emitServer, emitFunctions, emitShard, emitContainers, emitWorkflows, emitCrons, emitVectors, emitDrizzleSchema, emitSeed, emitWranglerCronTriggers } from './GENERATED_HEADER-CuLyj0WQ.mjs';
22
- import { emitApp } from './emitApp-CzSxVDaG.mjs';
23
- import { buildOpenApiDocument, emitOpenApiModule } from './buildOpenApiDocument-CXwnbp4b.mjs';
24
- import { buildOpenRpcDocument, emitOpenRpcModule } from './OPENRPC_VERSION-BGUrsrt_.mjs';
21
+ import { buildStorageColumns, emitDataModel, emitApi, emitServer, emitFunctions, emitShard, emitContainers, emitWorkflows, emitCrons, emitVectors, emitDrizzleSchema, emitSeed, emitWranglerCronTriggers } from './GENERATED_HEADER-DF1hQcix.mjs';
22
+ import { emitApp } from './emitApp-Ci_hcJNO.mjs';
23
+ import { buildOpenApiDocument, emitOpenApiModule } from './buildOpenApiDocument-Cns1EkCQ.mjs';
24
+ import { buildOpenRpcDocument, emitOpenRpcModule } from './OPENRPC_VERSION-C7zKVeKi.mjs';
25
25
  import { buildSchemaSnapshot, serializeSchemaSnapshot } from './SCHEMA_SNAPSHOT_VERSION-DzLDbWk3.mjs';
26
26
 
27
27
  const HTTP_VERBS = /* @__PURE__ */ new Set(["delete", "get", "head", "options", "patch", "post", "put"]);
@@ -367,26 +367,45 @@ const protectPublicFlags = (call) => {
367
367
  }
368
368
  return { usesCaptcha: Boolean(argument.getProperty("captcha")), usesRateLimit: Boolean(argument.getProperty("rateLimit")) };
369
369
  };
370
+ const resolveUseArgumentCall = (argument) => {
371
+ if (Node.isCallExpression(argument)) {
372
+ return argument;
373
+ }
374
+ if (!Node.isIdentifier(argument)) {
375
+ return void 0;
376
+ }
377
+ const declaration = argument.getSourceFile().getVariableDeclaration(argument.getText());
378
+ const initializer = declaration?.getInitializer();
379
+ return initializer && Node.isCallExpression(initializer) ? initializer : void 0;
380
+ };
381
+ const NO_PROTECTIONS = { usesCaptcha: false, usesMask: false, usesRateLimit: false, usesRls: false };
382
+ const useStepProtections = (useArgument) => {
383
+ const argument = resolveUseArgumentCall(useArgument);
384
+ const name = argument ? calleeNameOf(argument) : void 0;
385
+ if (argument && name === "protectPublic") {
386
+ const bundle = protectPublicFlags(argument);
387
+ return { ...NO_PROTECTIONS, usesCaptcha: bundle.usesCaptcha, usesRateLimit: bundle.usesRateLimit };
388
+ }
389
+ if (name !== void 0 && name in MIDDLEWARE_FLAGS) {
390
+ return { ...NO_PROTECTIONS, [MIDDLEWARE_FLAGS[name]]: true };
391
+ }
392
+ return NO_PROTECTIONS;
393
+ };
370
394
  const protectionsInChain = (receiver) => {
371
- const protections = { usesCaptcha: false, usesMask: false, usesRateLimit: false, usesRls: false };
395
+ const protections = { ...NO_PROTECTIONS };
372
396
  let node = receiver;
373
397
  while (Node.isCallExpression(node)) {
374
398
  const chainCallee = node.getExpression();
375
399
  if (!Node.isPropertyAccessExpression(chainCallee)) {
376
400
  break;
377
401
  }
378
- if (chainCallee.getName() === "use") {
379
- const argument = node.getArguments()[0];
380
- if (argument && Node.isCallExpression(argument)) {
381
- const name = calleeNameOf(argument);
382
- if (name === "protectPublic") {
383
- const bundle = protectPublicFlags(argument);
384
- protections.usesRateLimit ||= bundle.usesRateLimit;
385
- protections.usesCaptcha ||= bundle.usesCaptcha;
386
- } else if (name !== void 0 && name in MIDDLEWARE_FLAGS) {
387
- protections[MIDDLEWARE_FLAGS[name]] = true;
388
- }
389
- }
402
+ const useArgument = chainCallee.getName() === "use" ? node.getArguments()[0] : void 0;
403
+ if (useArgument) {
404
+ const step = useStepProtections(useArgument);
405
+ protections.usesCaptcha ||= step.usesCaptcha;
406
+ protections.usesMask ||= step.usesMask;
407
+ protections.usesRateLimit ||= step.usesRateLimit;
408
+ protections.usesRls ||= step.usesRls;
390
409
  }
391
410
  node = chainCallee.getExpression();
392
411
  }
@@ -1,4 +1,4 @@
1
- import { GENERATED_HEADER } from './GENERATED_HEADER-CuLyj0WQ.mjs';
1
+ import { GENERATED_HEADER } from './GENERATED_HEADER-DF1hQcix.mjs';
2
2
  import { s as sanitizeNamespace } from './paths-BRd6JHuF.mjs';
3
3
  import { LUNORA_ERROR_CODES, objectSchema, argsObjectSchema, validatorIrToJsonSchema } from './LUNORA_ERROR_CODES-CySpQPD3.mjs';
4
4
 
@@ -354,7 +354,27 @@ const extensionTargetIdentifier = (argument) => {
354
354
  return argument;
355
355
  }
356
356
  if (Node.isPropertyAccessExpression(argument)) {
357
- return argument.getNameNode();
357
+ const receiver = argument.getExpression();
358
+ return Node.isIdentifier(receiver) ? receiver : void 0;
359
+ }
360
+ return void 0;
361
+ };
362
+ const pluginConfigObject = (expression) => {
363
+ if (Node.isObjectLiteralExpression(expression)) {
364
+ return expression;
365
+ }
366
+ if (Node.isCallExpression(expression)) {
367
+ const callee = expression.getExpression();
368
+ let name;
369
+ if (Node.isIdentifier(callee)) {
370
+ name = callee.getText();
371
+ } else if (Node.isPropertyAccessExpression(callee)) {
372
+ name = callee.getName();
373
+ }
374
+ if (name === "definePlugin") {
375
+ const configArgument = expression.getArguments()[1];
376
+ return configArgument && Node.isObjectLiteralExpression(configArgument) ? configArgument : void 0;
377
+ }
358
378
  }
359
379
  return void 0;
360
380
  };
@@ -363,8 +383,9 @@ const nextExpressionFromDeclaration = (declaration, argument) => {
363
383
  if (!initializer) {
364
384
  return void 0;
365
385
  }
366
- if (Node.isPropertyAccessExpression(argument) && Node.isObjectLiteralExpression(initializer)) {
367
- return objectPropertyInitializer(initializer, argument.getName());
386
+ if (Node.isPropertyAccessExpression(argument)) {
387
+ const configObject = pluginConfigObject(initializer);
388
+ return configObject ? objectPropertyInitializer(configObject, argument.getName()) : void 0;
368
389
  }
369
390
  return initializer;
370
391
  };
@@ -1,4 +1,4 @@
1
- import { GENERATED_HEADER } from './GENERATED_HEADER-CuLyj0WQ.mjs';
1
+ import { GENERATED_HEADER } from './GENERATED_HEADER-DF1hQcix.mjs';
2
2
 
3
3
  const LONG_TAIL = [
4
4
  ["hasAi", "ai", "ai", "Override the Workers AI binding backing `ctx.ai` (defaults to `env.AI`)."],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/codegen",
3
- "version": "1.0.0-alpha.3",
3
+ "version": "1.0.0-alpha.5",
4
4
  "description": "Code generator for Lunora: emits _generated/{api,server,dataModel}.ts from your schema",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -46,7 +46,7 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@lunora/advisor": "1.0.0-alpha.2",
49
+ "@lunora/advisor": "1.0.0-alpha.3",
50
50
  "@lunora/container": "1.0.0-alpha.1",
51
51
  "@lunora/scheduler": "1.0.0-alpha.1",
52
52
  "@lunora/values": "1.0.0-alpha.1",