@zeronsh/orbit 0.3.7 → 0.3.9

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-K4VPAXH7.js';
2
+ import { emitSchema } from './chunk-ZY5CVHC3.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-ZYDDINVC.js.map
131
- //# sourceMappingURL=chunk-ZYDDINVC.js.map
130
+ //# sourceMappingURL=chunk-5G6WSKDW.js.map
131
+ //# sourceMappingURL=chunk-5G6WSKDW.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-ZYDDINVC.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-5G6WSKDW.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"]}
@@ -1934,14 +1934,22 @@ var Orbit = class {
1934
1934
  if (this.#closed || this.#connecting) return;
1935
1935
  if (typeof WebSocket === "undefined") return;
1936
1936
  this.#connecting = true;
1937
- const token = typeof this.#opts.auth === "function" ? await this.#opts.auth() : this.#opts.auth;
1938
- if (this.#closed) {
1937
+ let ws;
1938
+ try {
1939
+ const token = typeof this.#opts.auth === "function" ? await this.#opts.auth() : this.#opts.auth;
1940
+ if (this.#closed) {
1941
+ this.#connecting = false;
1942
+ return;
1943
+ }
1944
+ let url = `${this.#opts.server}/sync/v51/connect?clientID=${encodeURIComponent(this.clientID)}`;
1945
+ if (this.#cookie != null) url += `&baseCookie=${encodeURIComponent(this.#cookie)}`;
1946
+ ws = token ? new WebSocket(url, [encodeSecProtocol(token)]) : new WebSocket(url);
1947
+ } catch (e) {
1939
1948
  this.#connecting = false;
1949
+ this.#onError?.({ kind: "connect-failed", message: String(e) });
1950
+ this.#scheduleReconnect();
1940
1951
  return;
1941
1952
  }
1942
- let url = `${this.#opts.server}/sync/v51/connect?clientID=${encodeURIComponent(this.clientID)}`;
1943
- if (this.#cookie != null) url += `&baseCookie=${encodeURIComponent(this.#cookie)}`;
1944
- const ws = token ? new WebSocket(url, [encodeSecProtocol(token)]) : new WebSocket(url);
1945
1953
  this.#ws = ws;
1946
1954
  ws.addEventListener("open", () => {
1947
1955
  this.#connecting = false;
@@ -2116,5 +2124,5 @@ var IDBKV = class {
2116
2124
  };
2117
2125
 
2118
2126
  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 };
2119
- //# sourceMappingURL=chunk-B575ZNM2.js.map
2120
- //# sourceMappingURL=chunk-B575ZNM2.js.map
2127
+ //# sourceMappingURL=chunk-MWXAE6PK.js.map
2128
+ //# sourceMappingURL=chunk-MWXAE6PK.js.map