@zeronsh/orbit 0.3.2 → 0.3.3

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.
@@ -1,5 +1,5 @@
1
1
  import { orbitTypeOf, drizzleToIR } from './chunk-2R6QPZNI.js';
2
- import { emitSchema } from './chunk-G6NWZNQR.js';
2
+ import { emitSchema } from './chunk-O43HYETA.js';
3
3
  import * as path from 'path';
4
4
  import * as fs from 'fs/promises';
5
5
  import { pathToFileURL } from 'url';
@@ -127,5 +127,5 @@ async function formatWithPrettier(source, filepath) {
127
127
  }
128
128
 
129
129
  export { generate, resolveCustomTypes };
130
- //# sourceMappingURL=chunk-PSGVTMOB.js.map
131
- //# sourceMappingURL=chunk-PSGVTMOB.js.map
130
+ //# sourceMappingURL=chunk-77GV6UT3.js.map
131
+ //# sourceMappingURL=chunk-77GV6UT3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../drizzle/src/cli/type-resolution.ts","../drizzle/src/cli/generate.ts"],"names":["path2"],"mappings":"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","file":"chunk-PSGVTMOB.js","sourcesContent":["// Resolve each column's *TypeScript* type with the compiler (via ts-morph), so a\n// Drizzle `.$type<...>()` and enum unions survive into the generated schema —\n// information that does not exist at runtime. For column `c` of table exported as\n// `user`, we resolve `InferSelectModel<typeof user>['c']` (the canonical Drizzle\n// row-type accessor), strip nullability (Orbit models it with `optional()`), and\n// keep the result as the column's custom type. Named types it references (e.g.\n// `PostMeta`, or `import(\"…/country\").Country`) are rewritten to bare names and\n// collected as `import type` lines for the generated file.\n\nimport * as path from 'node:path';\n\nexport interface ResolveColumn {\n readonly jsKey: string;\n readonly dbName: string;\n readonly baseType: 'string' | 'number' | 'boolean' | 'json';\n}\n\nexport interface ResolveTable {\n /** The export name of the table in the schema module (e.g. `user`). */\n readonly exportName: string;\n /** The Orbit/database table name. */\n readonly tableName: string;\n readonly columns: readonly ResolveColumn[];\n}\n\nexport interface ResolveOptions {\n /** Absolute path to the user's Drizzle schema module. */\n readonly schemaModulePath: string;\n /** Absolute path of the file being generated (for relative import specifiers). */\n readonly outputFilePath: string;\n /** Optional tsconfig for module resolution. */\n readonly tsConfigFilePath?: string;\n /** Append `.js` to emitted relative import specifiers (Node16/NodeNext). */\n readonly jsExtension?: boolean;\n}\n\nexport interface ResolvedTypes {\n /** `tableName → dbColumnName → TS type expression`. */\n readonly customTypes: Record<string, Record<string, string>>;\n /** `import type` lines the generated file needs for named custom types. */\n readonly typeImports: { module: string; names: string[] }[];\n}\n\nconst TRIVIAL = new Set(['string', 'number', 'boolean', 'unknown', 'any', 'never', '{}', 'object']);\nconst NS = '__orbitDrizzleSchema';\n\nfunction stripNull(text: string): string {\n return text\n .replace(/\\s*\\|\\s*null\\b/g, '')\n .replace(/\\bnull\\s*\\|\\s*/g, '')\n .replace(/\\s*\\|\\s*undefined\\b/g, '')\n .trim();\n}\n\n/** Module specifier from `from` (the generated file) to `to` (a TS module). */\nfunction relSpecifier(fromFile: string, toModule: string, jsExtension: boolean): string {\n let rel = path.relative(path.dirname(fromFile), toModule).replace(/\\\\/g, '/');\n if (!rel.startsWith('.')) rel = `./${rel}`;\n rel = rel.replace(/\\.tsx?$/, '');\n return jsExtension ? `${rel}.js` : rel;\n}\n\nexport async function resolveCustomTypes(tables: readonly ResolveTable[], options: ResolveOptions): Promise<ResolvedTypes> {\n // ts-morph is an optional peer dependency; import lazily so the runtime path\n // never needs it.\n const { Project, ts } = await import('ts-morph');\n\n const project = options.tsConfigFilePath\n ? new Project({ tsConfigFilePath: options.tsConfigFilePath, skipAddingFilesFromTsConfig: true })\n : new Project({\n compilerOptions: { strict: true, moduleResolution: ts.ModuleResolutionKind.Bundler, target: ts.ScriptTarget.ES2022 },\n skipAddingFilesFromTsConfig: true,\n });\n\n project.addSourceFileAtPath(options.schemaModulePath);\n\n const schemaDir = path.dirname(options.schemaModulePath);\n const schemaSpecifier = `./${path.basename(options.schemaModulePath).replace(/\\.tsx?$/, '')}`;\n\n // One type alias per column, plus an index so we can map back.\n const aliases: { name: string; tableName: string; dbName: string; baseType: ResolveColumn['baseType'] }[] = [];\n let body = `import type { InferSelectModel } from 'drizzle-orm';\\nimport type * as ${NS} from ${JSON.stringify(schemaSpecifier)};\\n`;\n let i = 0;\n for (const t of tables) {\n for (const c of t.columns) {\n const name = `C_${i++}`;\n body += `type ${name} = InferSelectModel<typeof ${NS}.${t.exportName}>[${JSON.stringify(c.jsKey)}];\\n`;\n aliases.push({ name, tableName: t.tableName, dbName: c.dbName, baseType: c.baseType });\n }\n }\n\n const probe = project.createSourceFile(path.join(schemaDir, '__orbit_drizzle_probe__.ts'), body, { overwrite: true });\n const flags = ts.TypeFormatFlags.NoTruncation;\n\n const customTypes: Record<string, Record<string, string>> = {};\n // module specifier → set of imported names\n const importsByModule = new Map<string, Set<string>>();\n const addImport = (moduleSpecifier: string, name: string) => {\n const set = importsByModule.get(moduleSpecifier) ?? new Set<string>();\n set.add(name);\n importsByModule.set(moduleSpecifier, set);\n };\n\n for (const a of aliases) {\n const alias = probe.getTypeAliasOrThrow(a.name);\n const fullType = alias.getType();\n const constituents = fullType.isUnion() ? fullType.getUnionTypes() : [fullType];\n const nonNull = constituents.filter((c) => !c.isNull() && !c.isUndefined());\n\n // Keep a custom type only when it's a genuine *subtype* of the column's Orbit\n // base type. Otherwise the base type is the right one (e.g. a `timestamp`\n // maps to `number`, even though its Drizzle TS type is `Date`).\n const compatible =\n a.baseType === 'json'\n ? true\n : nonNull.length > 0 &&\n nonNull.every((c) => {\n if (a.baseType === 'string') return c.isString() || c.isStringLiteral() || c.isTemplateLiteral();\n if (a.baseType === 'number') return c.isNumber() || c.isNumberLiteral();\n return c.isBoolean() || c.isBooleanLiteral();\n });\n if (!compatible) continue;\n\n let text = stripNull(fullType.getText(alias, flags));\n\n // Rewrite `import(\"ABS\").Name` → `Name`, collecting an import from ABS.\n text = text.replace(/import\\(\"([^\"]+)\"\\)\\.(\\w+)/g, (_m, abs: string, name: string) => {\n const spec = relSpecifier(options.outputFilePath, abs, Boolean(options.jsExtension));\n addImport(spec, name);\n return name;\n });\n\n // Rewrite `__orbitDrizzleSchema.Name` → `Name`, importing from the schema module.\n const schemaImportSpec = relSpecifier(options.outputFilePath, options.schemaModulePath, Boolean(options.jsExtension));\n text = text.replace(new RegExp(`${NS}\\\\.(\\\\w+)`, 'g'), (_m, name: string) => {\n addImport(schemaImportSpec, name);\n return name;\n });\n\n // Drop trivial types; for json keep only meaningful object/array/named types.\n if (TRIVIAL.has(text) || text === '') continue;\n if (a.baseType === 'json' && (text === 'unknown' || text === 'any')) continue;\n\n (customTypes[a.tableName] ??= {})[a.dbName] = text;\n }\n\n project.removeSourceFile(probe);\n\n const typeImports = [...importsByModule.entries()].map(([module, names]) => ({ module, names: [...names].sort() }));\n return { customTypes, typeImports };\n}\n","// The `orbit-drizzle generate` pipeline:\n// import schema (runtime) → resolve custom types (ts-morph) → IR → emit → write.\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { getTableColumns, getTableName, is, Table } from 'drizzle-orm';\nimport { emitSchema } from '../../../orm-core/src/index.ts';\nimport { drizzleToIR, type DrizzleAdapterConfig } from '../introspect.ts';\nimport { orbitTypeOf, type DrizzleColumnLike } from '../type-map.ts';\nimport { resolveCustomTypes, type ResolveTable } from './type-resolution.ts';\n\nexport interface GenerateOptions {\n /** Path to the Drizzle schema module (a single `.ts` file exporting tables + relations). */\n readonly schemaPath: string;\n /** Output path. Default `./orbit-schema.gen.ts`. */\n readonly outputPath?: string;\n /** tsconfig for type resolution + module resolution. */\n readonly tsConfigPath?: string;\n /** Run Prettier over the output if available. */\n readonly format?: boolean;\n /** Append `.js` to relative imports (Node16/NodeNext ESM). */\n readonly jsExtension?: boolean;\n /** Module the Orbit schema helpers are imported from. Default `@orbit/client`. */\n readonly importFrom?: string;\n /** Exported schema const name. Default `schema`. */\n readonly schemaName?: string;\n /** Table/column selection (see {@link DrizzleAdapterConfig.tables}). */\n readonly tables?: DrizzleAdapterConfig['tables'];\n readonly debug?: boolean;\n}\n\nexport interface GenerateResult {\n readonly outputPath: string;\n readonly source: string;\n}\n\n/** Generate an Orbit schema source file from a Drizzle schema. */\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const schemaModulePath = path.resolve(options.schemaPath);\n const outputPath = path.resolve(options.outputPath ?? './orbit-schema.gen.ts');\n\n // 1. Load the schema module at runtime (tables + relations).\n const moduleObj = (await import(pathToFileURL(schemaModulePath).href)) as Record<string, unknown>;\n\n // 2. Collect per-table resolution metadata (export name, jsKey ↔ dbName).\n const resolveTables: ResolveTable[] = [];\n for (const [exportName, value] of Object.entries(moduleObj)) {\n if (!is(value, Table)) continue;\n const table = value as Table;\n const tableName = getTableName(table);\n if (options.tables && options.tables[tableName] === false) continue;\n const cols = getTableColumns(table) as Record<string, DrizzleColumnLike & { name: string }>;\n const columns = Object.entries(cols)\n .map(([jsKey, col]) => {\n const base = orbitTypeOf(col);\n return base ? { jsKey, dbName: col.name, baseType: base } : null;\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n resolveTables.push({ exportName, tableName, columns });\n }\n\n // 3. Resolve custom `$type<>()` / enum types via the TypeScript compiler.\n const { customTypes, typeImports } = await resolveCustomTypes(resolveTables, {\n schemaModulePath,\n outputFilePath: outputPath,\n tsConfigFilePath: options.tsConfigPath,\n jsExtension: options.jsExtension,\n });\n\n // 4. Build the IR with the resolved custom types folded in.\n const ir = drizzleToIR(moduleObj, { customTypes, tables: options.tables, debug: options.debug });\n\n // 5. Emit the Orbit schema source.\n let source = emitSchema(ir, {\n importFrom: options.importFrom ?? '@zeronsh/orbit/client',\n schemaName: options.schemaName,\n jsExtension: options.jsExtension,\n typeImports,\n header: [\n `Generated by @orbit/drizzle from ${path.basename(schemaModulePath)} — do not edit by hand.`,\n `Re-run \\`orbit-drizzle generate\\` to update.`,\n ],\n });\n\n // 6. Optional Prettier.\n if (options.format) source = await formatWithPrettier(source, outputPath);\n\n await fs.writeFile(outputPath, source, 'utf8');\n return { outputPath, source };\n}\n\nasync function formatWithPrettier(source: string, filepath: string): Promise<string> {\n try {\n const prettier = await import('prettier');\n const config = (await prettier.resolveConfig(filepath)) ?? {};\n return prettier.format(source, { ...config, parser: 'typescript' });\n } catch {\n console.warn('⚠️ orbit-drizzle: prettier not found — skipping formatting.');\n return source;\n }\n}\n"]}
1
+ {"version":3,"sources":["../drizzle/src/cli/type-resolution.ts","../drizzle/src/cli/generate.ts"],"names":["path2"],"mappings":"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","file":"chunk-77GV6UT3.js","sourcesContent":["// Resolve each column's *TypeScript* type with the compiler (via ts-morph), so a\n// Drizzle `.$type<...>()` and enum unions survive into the generated schema —\n// information that does not exist at runtime. For column `c` of table exported as\n// `user`, we resolve `InferSelectModel<typeof user>['c']` (the canonical Drizzle\n// row-type accessor), strip nullability (Orbit models it with `optional()`), and\n// keep the result as the column's custom type. Named types it references (e.g.\n// `PostMeta`, or `import(\"…/country\").Country`) are rewritten to bare names and\n// collected as `import type` lines for the generated file.\n\nimport * as path from 'node:path';\n\nexport interface ResolveColumn {\n readonly jsKey: string;\n readonly dbName: string;\n readonly baseType: 'string' | 'number' | 'boolean' | 'json';\n}\n\nexport interface ResolveTable {\n /** The export name of the table in the schema module (e.g. `user`). */\n readonly exportName: string;\n /** The Orbit/database table name. */\n readonly tableName: string;\n readonly columns: readonly ResolveColumn[];\n}\n\nexport interface ResolveOptions {\n /** Absolute path to the user's Drizzle schema module. */\n readonly schemaModulePath: string;\n /** Absolute path of the file being generated (for relative import specifiers). */\n readonly outputFilePath: string;\n /** Optional tsconfig for module resolution. */\n readonly tsConfigFilePath?: string;\n /** Append `.js` to emitted relative import specifiers (Node16/NodeNext). */\n readonly jsExtension?: boolean;\n}\n\nexport interface ResolvedTypes {\n /** `tableName → dbColumnName → TS type expression`. */\n readonly customTypes: Record<string, Record<string, string>>;\n /** `import type` lines the generated file needs for named custom types. */\n readonly typeImports: { module: string; names: string[] }[];\n}\n\nconst TRIVIAL = new Set(['string', 'number', 'boolean', 'unknown', 'any', 'never', '{}', 'object']);\nconst NS = '__orbitDrizzleSchema';\n\nfunction stripNull(text: string): string {\n return text\n .replace(/\\s*\\|\\s*null\\b/g, '')\n .replace(/\\bnull\\s*\\|\\s*/g, '')\n .replace(/\\s*\\|\\s*undefined\\b/g, '')\n .trim();\n}\n\n/** Module specifier from `from` (the generated file) to `to` (a TS module). */\nfunction relSpecifier(fromFile: string, toModule: string, jsExtension: boolean): string {\n let rel = path.relative(path.dirname(fromFile), toModule).replace(/\\\\/g, '/');\n if (!rel.startsWith('.')) rel = `./${rel}`;\n rel = rel.replace(/\\.tsx?$/, '');\n return jsExtension ? `${rel}.js` : rel;\n}\n\nexport async function resolveCustomTypes(tables: readonly ResolveTable[], options: ResolveOptions): Promise<ResolvedTypes> {\n // ts-morph is an optional peer dependency; import lazily so the runtime path\n // never needs it.\n const { Project, ts } = await import('ts-morph');\n\n const project = options.tsConfigFilePath\n ? new Project({ tsConfigFilePath: options.tsConfigFilePath, skipAddingFilesFromTsConfig: true })\n : new Project({\n compilerOptions: { strict: true, moduleResolution: ts.ModuleResolutionKind.Bundler, target: ts.ScriptTarget.ES2022 },\n skipAddingFilesFromTsConfig: true,\n });\n\n project.addSourceFileAtPath(options.schemaModulePath);\n\n const schemaDir = path.dirname(options.schemaModulePath);\n const schemaSpecifier = `./${path.basename(options.schemaModulePath).replace(/\\.tsx?$/, '')}`;\n\n // One type alias per column, plus an index so we can map back.\n const aliases: { name: string; tableName: string; dbName: string; baseType: ResolveColumn['baseType'] }[] = [];\n let body = `import type { InferSelectModel } from 'drizzle-orm';\\nimport type * as ${NS} from ${JSON.stringify(schemaSpecifier)};\\n`;\n let i = 0;\n for (const t of tables) {\n for (const c of t.columns) {\n const name = `C_${i++}`;\n body += `type ${name} = InferSelectModel<typeof ${NS}.${t.exportName}>[${JSON.stringify(c.jsKey)}];\\n`;\n aliases.push({ name, tableName: t.tableName, dbName: c.dbName, baseType: c.baseType });\n }\n }\n\n const probe = project.createSourceFile(path.join(schemaDir, '__orbit_drizzle_probe__.ts'), body, { overwrite: true });\n const flags = ts.TypeFormatFlags.NoTruncation;\n\n const customTypes: Record<string, Record<string, string>> = {};\n // module specifier → set of imported names\n const importsByModule = new Map<string, Set<string>>();\n const addImport = (moduleSpecifier: string, name: string) => {\n const set = importsByModule.get(moduleSpecifier) ?? new Set<string>();\n set.add(name);\n importsByModule.set(moduleSpecifier, set);\n };\n\n for (const a of aliases) {\n const alias = probe.getTypeAliasOrThrow(a.name);\n const fullType = alias.getType();\n const constituents = fullType.isUnion() ? fullType.getUnionTypes() : [fullType];\n const nonNull = constituents.filter((c) => !c.isNull() && !c.isUndefined());\n\n // Keep a custom type only when it's a genuine *subtype* of the column's Orbit\n // base type. Otherwise the base type is the right one (e.g. a `timestamp`\n // maps to `number`, even though its Drizzle TS type is `Date`).\n const compatible =\n a.baseType === 'json'\n ? true\n : nonNull.length > 0 &&\n nonNull.every((c) => {\n if (a.baseType === 'string') return c.isString() || c.isStringLiteral() || c.isTemplateLiteral();\n if (a.baseType === 'number') return c.isNumber() || c.isNumberLiteral();\n return c.isBoolean() || c.isBooleanLiteral();\n });\n if (!compatible) continue;\n\n let text = stripNull(fullType.getText(alias, flags));\n\n // Rewrite `import(\"ABS\").Name` → `Name`, collecting an import from ABS.\n text = text.replace(/import\\(\"([^\"]+)\"\\)\\.(\\w+)/g, (_m, abs: string, name: string) => {\n const spec = relSpecifier(options.outputFilePath, abs, Boolean(options.jsExtension));\n addImport(spec, name);\n return name;\n });\n\n // Rewrite `__orbitDrizzleSchema.Name` → `Name`, importing from the schema module.\n const schemaImportSpec = relSpecifier(options.outputFilePath, options.schemaModulePath, Boolean(options.jsExtension));\n text = text.replace(new RegExp(`${NS}\\\\.(\\\\w+)`, 'g'), (_m, name: string) => {\n addImport(schemaImportSpec, name);\n return name;\n });\n\n // Drop trivial types; for json keep only meaningful object/array/named types.\n if (TRIVIAL.has(text) || text === '') continue;\n if (a.baseType === 'json' && (text === 'unknown' || text === 'any')) continue;\n\n (customTypes[a.tableName] ??= {})[a.dbName] = text;\n }\n\n project.removeSourceFile(probe);\n\n const typeImports = [...importsByModule.entries()].map(([module, names]) => ({ module, names: [...names].sort() }));\n return { customTypes, typeImports };\n}\n","// The `orbit-drizzle generate` pipeline:\n// import schema (runtime) → resolve custom types (ts-morph) → IR → emit → write.\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { getTableColumns, getTableName, is, Table } from 'drizzle-orm';\nimport { emitSchema } from '../../../orm-core/src/index.ts';\nimport { drizzleToIR, type DrizzleAdapterConfig } from '../introspect.ts';\nimport { orbitTypeOf, type DrizzleColumnLike } from '../type-map.ts';\nimport { resolveCustomTypes, type ResolveTable } from './type-resolution.ts';\n\nexport interface GenerateOptions {\n /** Path to the Drizzle schema module (a single `.ts` file exporting tables + relations). */\n readonly schemaPath: string;\n /** Output path. Default `./orbit-schema.gen.ts`. */\n readonly outputPath?: string;\n /** tsconfig for type resolution + module resolution. */\n readonly tsConfigPath?: string;\n /** Run Prettier over the output if available. */\n readonly format?: boolean;\n /** Append `.js` to relative imports (Node16/NodeNext ESM). */\n readonly jsExtension?: boolean;\n /** Module the Orbit schema helpers are imported from. Default `@orbit/client`. */\n readonly importFrom?: string;\n /** Exported schema const name. Default `schema`. */\n readonly schemaName?: string;\n /** Table/column selection (see {@link DrizzleAdapterConfig.tables}). */\n readonly tables?: DrizzleAdapterConfig['tables'];\n readonly debug?: boolean;\n}\n\nexport interface GenerateResult {\n readonly outputPath: string;\n readonly source: string;\n}\n\n/** Generate an Orbit schema source file from a Drizzle schema. */\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const schemaModulePath = path.resolve(options.schemaPath);\n const outputPath = path.resolve(options.outputPath ?? './orbit-schema.gen.ts');\n\n // 1. Load the schema module at runtime (tables + relations).\n const moduleObj = (await import(pathToFileURL(schemaModulePath).href)) as Record<string, unknown>;\n\n // 2. Collect per-table resolution metadata (export name, jsKey ↔ dbName).\n const resolveTables: ResolveTable[] = [];\n for (const [exportName, value] of Object.entries(moduleObj)) {\n if (!is(value, Table)) continue;\n const table = value as Table;\n const tableName = getTableName(table);\n if (options.tables && options.tables[tableName] === false) continue;\n const cols = getTableColumns(table) as Record<string, DrizzleColumnLike & { name: string }>;\n const columns = Object.entries(cols)\n .map(([jsKey, col]) => {\n const base = orbitTypeOf(col);\n return base ? { jsKey, dbName: col.name, baseType: base } : null;\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n resolveTables.push({ exportName, tableName, columns });\n }\n\n // 3. Resolve custom `$type<>()` / enum types via the TypeScript compiler.\n const { customTypes, typeImports } = await resolveCustomTypes(resolveTables, {\n schemaModulePath,\n outputFilePath: outputPath,\n tsConfigFilePath: options.tsConfigPath,\n jsExtension: options.jsExtension,\n });\n\n // 4. Build the IR with the resolved custom types folded in.\n const ir = drizzleToIR(moduleObj, { customTypes, tables: options.tables, debug: options.debug });\n\n // 5. Emit the Orbit schema source.\n let source = emitSchema(ir, {\n importFrom: options.importFrom ?? '@zeronsh/orbit/client',\n schemaName: options.schemaName,\n jsExtension: options.jsExtension,\n typeImports,\n header: [\n `Generated by @orbit/drizzle from ${path.basename(schemaModulePath)} — do not edit by hand.`,\n `Re-run \\`orbit-drizzle generate\\` to update.`,\n ],\n });\n\n // 6. Optional Prettier.\n if (options.format) source = await formatWithPrettier(source, outputPath);\n\n await fs.writeFile(outputPath, source, 'utf8');\n return { outputPath, source };\n}\n\nasync function formatWithPrettier(source: string, filepath: string): Promise<string> {\n try {\n const prettier = await import('prettier');\n const config = (await prettier.resolveConfig(filepath)) ?? {};\n return prettier.format(source, { ...config, parser: 'typescript' });\n } catch {\n console.warn('⚠️ orbit-drizzle: prettier not found — skipping formatting.');\n return source;\n }\n}\n"]}
@@ -411,6 +411,12 @@ var Store = class {
411
411
  #dirtyPending = /* @__PURE__ */ new Set();
412
412
  #cleared = false;
413
413
  #flushTimer;
414
+ /** Last server cookie (poke watermark). Persisted **after** the rows it covers
415
+ * (see `flush`) so a reload never restores a cookie ahead of the cached rows —
416
+ * which would make the server's delta-resume suppress rows the client never
417
+ * durably received (permanent divergence). */
418
+ #cookie;
419
+ #cookieDirty = false;
414
420
  /** Effective-row keys touched since the last notify (delivered to listeners). */
415
421
  #changed = [];
416
422
  constructor(pkByTable = {}) {
@@ -533,6 +539,18 @@ var Store = class {
533
539
  this.#listeners.add(fn);
534
540
  return () => this.#listeners.delete(fn);
535
541
  }
542
+ /** Record the server cookie for the rows applied so far. It is persisted only in
543
+ * `flush`, **after** the row writes — so the durable cookie is never ahead of the
544
+ * durable rows. */
545
+ setCookie(cookie) {
546
+ this.#cookie = cookie;
547
+ this.#cookieDirty = true;
548
+ this.#scheduleFlush();
549
+ }
550
+ /** The last persisted/applied cookie (for resume `baseCookie`). */
551
+ cookie() {
552
+ return this.#cookie;
553
+ }
536
554
  #notify() {
537
555
  const changed = this.#changed;
538
556
  this.#changed = [];
@@ -561,6 +579,8 @@ var Store = class {
561
579
  this.#pending.push(p);
562
580
  for (const op of p.ops) loaded.push({ table: op.tableName, key: this.#key(op.tableName, op.value) });
563
581
  }
582
+ const cookie = await kv.get("cookie");
583
+ if (typeof cookie === "string") this.#cookie = cookie;
564
584
  this.#changed.push(...loaded);
565
585
  this.#notify();
566
586
  }
@@ -594,6 +614,10 @@ var Store = class {
594
614
  }
595
615
  this.#dirtyPending.clear();
596
616
  await Promise.all(ps);
617
+ if (this.#cookieDirty && this.#cookie !== void 0) {
618
+ await kv.set("cookie", this.#cookie);
619
+ this.#cookieDirty = false;
620
+ }
597
621
  }
598
622
  };
599
623
 
@@ -1812,8 +1836,7 @@ var Orbit = class {
1812
1836
  if (typeof savedNextID === "number" && savedNextID > this.#nextMutationID) {
1813
1837
  this.#nextMutationID = savedNextID;
1814
1838
  }
1815
- const c = await this.#kv.get("cookie");
1816
- if (typeof c === "string") this.#cookie = c;
1839
+ this.#cookie = this.#store.cookie();
1817
1840
  } catch {
1818
1841
  }
1819
1842
  }
@@ -1903,7 +1926,7 @@ var Orbit = class {
1903
1926
  this.#store.confirmThrough(confirmed);
1904
1927
  }
1905
1928
  this.#cookie = body.cookie;
1906
- void this.#kv?.set("cookie", body.cookie);
1929
+ this.#store.setCookie(body.cookie);
1907
1930
  this.#reconnectMs = 500;
1908
1931
  return;
1909
1932
  }
@@ -1975,5 +1998,5 @@ var IDBKV = class {
1975
1998
  };
1976
1999
 
1977
2000
  export { IDBKV, MaterializedView, MemoryKV, MemorySource, MemorySourceProvider, Orbit, PROTOCOL_VERSION, Query, QueryManager, SchemaQuery, SourceConnection, Store, StoreProvider, TypedQuery, View, boolean, buildPipeline, buildSchemaQueries, collectOps, compareValues, createBuilder, createOrbitApi, createSchema, defineMutation, defineQuery, evaluate, hashAST, hashString, json, nodeToRow, number, optional, parseTTL, relationships, string, table, tablesOf, unwrapSingular, validateArgs, valuesEqual };
1978
- //# sourceMappingURL=chunk-EX4WSUC3.js.map
1979
- //# sourceMappingURL=chunk-EX4WSUC3.js.map
2001
+ //# sourceMappingURL=chunk-BJPEQCCN.js.map
2002
+ //# sourceMappingURL=chunk-BJPEQCCN.js.map