@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.
- package/dist/{chunk-PSGVTMOB.js → chunk-77GV6UT3.js} +3 -3
- package/dist/{chunk-PSGVTMOB.js.map → chunk-77GV6UT3.js.map} +1 -1
- package/dist/{chunk-EX4WSUC3.js → chunk-BJPEQCCN.js} +28 -5
- package/dist/chunk-BJPEQCCN.js.map +1 -0
- package/dist/{chunk-G6NWZNQR.js → chunk-O43HYETA.js} +3 -3
- package/dist/{chunk-G6NWZNQR.js.map → chunk-O43HYETA.js.map} +1 -1
- package/dist/client.d.ts +6 -0
- package/dist/client.js +1 -1
- package/dist/drizzle/cli/bin.js +3 -3
- package/dist/drizzle/cli.js +3 -3
- package/dist/drizzle.js +2 -2
- package/dist/orm-core.js +2 -2
- package/dist/server.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-EX4WSUC3.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { orbitTypeOf, drizzleToIR } from './chunk-2R6QPZNI.js';
|
|
2
|
-
import { emitSchema } from './chunk-
|
|
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-
|
|
131
|
-
//# sourceMappingURL=chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
1979
|
-
//# sourceMappingURL=chunk-
|
|
2001
|
+
//# sourceMappingURL=chunk-BJPEQCCN.js.map
|
|
2002
|
+
//# sourceMappingURL=chunk-BJPEQCCN.js.map
|