@supalive/core 1.13.1 → 1.15.0

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.
Files changed (64) hide show
  1. package/README.md +1 -2
  2. package/dist/helper-CUSGbt2A.d.ts +15 -0
  3. package/dist/helper-CUSGbt2A.d.ts.map +1 -0
  4. package/dist/helper-CVcjwD3k.js +73 -0
  5. package/dist/helper-CVcjwD3k.js.map +1 -0
  6. package/dist/index-Ddr4NiPf.d.ts +2295 -0
  7. package/dist/index-Ddr4NiPf.d.ts.map +1 -0
  8. package/dist/index-f7mNbMhq.d.ts +2301 -0
  9. package/dist/index-f7mNbMhq.d.ts.map +1 -0
  10. package/dist/mysql-BX5hfgfE.d.ts +114 -0
  11. package/dist/mysql-BX5hfgfE.d.ts.map +1 -0
  12. package/dist/mysql-DWj2q3qR.d.ts +114 -0
  13. package/dist/mysql-DWj2q3qR.d.ts.map +1 -0
  14. package/dist/mysql-v_0U0NU4.js +623 -0
  15. package/dist/mysql-v_0U0NU4.js.map +1 -0
  16. package/dist/overlap-checker-DVbh0YC4.js +259 -0
  17. package/dist/overlap-checker-DVbh0YC4.js.map +1 -0
  18. package/dist/postgres-D0M1ri-C.d.ts +118 -0
  19. package/dist/postgres-D0M1ri-C.d.ts.map +1 -0
  20. package/dist/postgres-EUz8TYFn.d.ts +118 -0
  21. package/dist/postgres-EUz8TYFn.d.ts.map +1 -0
  22. package/dist/postgres-vYRyZJZd.js +868 -0
  23. package/dist/postgres-vYRyZJZd.js.map +1 -0
  24. package/dist/query-Bk2W-ynQ.js +730 -0
  25. package/dist/query-Bk2W-ynQ.js.map +1 -0
  26. package/dist/realtime_db-DnZKn_FZ.js +312 -0
  27. package/dist/realtime_db-DnZKn_FZ.js.map +1 -0
  28. package/dist/router-DP2ThAwh.js +274 -0
  29. package/dist/router-DP2ThAwh.js.map +1 -0
  30. package/dist/router-Dfnwka7K.js +337 -0
  31. package/dist/router-Dfnwka7K.js.map +1 -0
  32. package/dist/schema-DRtz5h5l.js +131 -0
  33. package/dist/schema-DRtz5h5l.js.map +1 -0
  34. package/dist/src/client/index.d.ts +1 -1
  35. package/dist/src/client/index.js +2 -2
  36. package/dist/src/exports/mysql.d.ts +1 -1
  37. package/dist/src/exports/postgres.d.ts +1 -1
  38. package/dist/src/exports/procedure.d.ts +12 -9
  39. package/dist/src/exports/procedure.d.ts.map +1 -1
  40. package/dist/src/exports/procedure.js +65 -6
  41. package/dist/src/exports/procedure.js.map +1 -1
  42. package/dist/src/exports/schema-sql.d.ts +2 -2
  43. package/dist/src/exports/schema-sql.js +3 -3
  44. package/dist/src/exports/schema-sql.js.map +1 -1
  45. package/dist/src/exports/server.d.ts +4 -4
  46. package/dist/src/exports/server.d.ts.map +1 -1
  47. package/dist/src/exports/server.js +4 -4
  48. package/dist/src/exports/server.js.map +1 -1
  49. package/dist/src/exports/sub-manager-worker-entry.js +1 -1
  50. package/dist/src/exports/types.d.ts +8 -3
  51. package/dist/src/exports/types.d.ts.map +1 -0
  52. package/dist/src/exports/types.js +20 -1
  53. package/dist/src/exports/types.js.map +1 -0
  54. package/dist/sub-worker-dispatch-CC0w_sx0.js +826 -0
  55. package/dist/sub-worker-dispatch-CC0w_sx0.js.map +1 -0
  56. package/dist/sub-worker-dispatch-UGC9vwQJ.js +826 -0
  57. package/dist/sub-worker-dispatch-UGC9vwQJ.js.map +1 -0
  58. package/dist/types_db-Dw2RHWrd.js +172 -0
  59. package/dist/types_db-Dw2RHWrd.js.map +1 -0
  60. package/dist/types_server-B7elBQyz.d.ts +523 -0
  61. package/dist/types_server-B7elBQyz.d.ts.map +1 -0
  62. package/dist/types_server-BSiGxbqb.d.ts +523 -0
  63. package/dist/types_server-BSiGxbqb.d.ts.map +1 -0
  64. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"schema-sql.js","names":["z"],"sources":["../../../src/db/core_tables.ts","../../../src/db/schema-sql.ts"],"sourcesContent":["import type { SqlDialect } from \"./schema-sql\";\n\n/**\n * DDL for the core, framework-owned database objects that every Supalive\n * database must have alongside the user's own tables:\n *\n * - `commit_logs` — the append-only OCC change log (+ its lookup indexes).\n * - `metadata` — the small key/value table holding the OCC watermarks\n * (`latest_committed_ts`, `min_retained_ts`) and the\n * core schema version (`core_version`).\n * - `global_commit_ts` — the monotonic commit-timestamp source: a SEQUENCE on\n * Postgres, a single-row `BIGINT` counter table on MySQL.\n *\n * These are all pure schema (DDL), so they belong in the generated `schema.sql`\n * (see {@link generateSchemaSql}, which prepends them by default) and get\n * migrated ahead of runtime by your normal migration pipeline — a single\n * generated file fully describes the database.\n *\n * Data seeding (the `metadata` rows and the MySQL counter's initial `0`) and\n * any runtime-only schema changes live in `initCore` — see\n * {@link file://./init_db.ts}.\n */\n\nexport interface CoreTablesSqlOptions {\n /** Emit `IF NOT EXISTS` on `CREATE TABLE`/`CREATE INDEX`/`CREATE SEQUENCE`. Default true. */\n ifNotExists?: boolean;\n /**\n * MySQL only: the SQL type of `commit_logs.id`, which stores the changed\n * row's primary key encoded as bytes. Defaults to `VARBINARY(255)`.\n * `generateSchemaSql` derives a tighter value from the app's largest id\n * column; an app with fixed-width binary ids can override to e.g.\n * `BINARY(16)` (but note: variable-length ids must use VARBINARY — a fixed\n * BINARY column zero-pads stored values, which would break the OCC id match).\n */\n commitLogIdType?: string;\n}\n\nexport function coreTablesSql(\n dialect: SqlDialect = \"postgres\",\n options?: CoreTablesSqlOptions,\n): string[] {\n const ifNotExists = options?.ifNotExists ?? true;\n const t = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const i = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const commitLogIdType = options?.commitLogIdType ?? \"VARBINARY(255)\";\n\n if (dialect === \"mysql\") {\n return [\n // MySQL has no sequences: a single-row counter table advanced via\n // LAST_INSERT_ID (see MySqlDatabase.getNextTimestamp). Seeded to 0\n // by initCore.\n `CREATE TABLE ${t}global_commit_ts (\\n` +\n ` id BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,\n // `id` holds the changed row's primary key encoded as bytes. Row ids\n // are variable-length (a prefixed string id can exceed 16 bytes), so\n // the default is VARBINARY, mirroring Postgres' flexible BYTEA — a\n // fixed BINARY column zero-pads stored values, breaking the OCC id\n // match. Sized via `commitLogIdType` (generateSchemaSql derives it\n // from the app's largest id column). `table_id` is a fixed 16-byte\n // table hash and stays BINARY(16).\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id ${commitLogIdType} NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BINARY(16) NOT NULL,\\n` +\n ` data LONGBLOB NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id),\\n` +\n ` INDEX commit_logs_by_table_and_id (table_id, id, ts)\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key VARCHAR(64) NOT NULL PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,\n ];\n }\n\n return [\n // Monotonic OCC commit-timestamp source (see PgDatabase.getNextTimestamp).\n `CREATE SEQUENCE ${t}global_commit_ts START 1 INCREMENT 1 NO CYCLE;`,\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id BYTEA NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BYTEA NOT NULL,\\n` +\n ` data BYTEA NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id)\\n` +\n `);`,\n `CREATE INDEX ${i}commit_logs_by_table_and_id ON commit_logs (table_id, id, ts);`,\n `CREATE INDEX ${i}commit_logs_by_table_ts_and_id ON commit_logs (table_id, ts, id);`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key TEXT PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `);`,\n ];\n}\n","import { z } from \"zod\";\nimport { SchemaDefinition, schemaRegistry } from \"./schema\";\nimport type { DeclarativeIndex } from \"./schema\";\nimport { unwrapZodType } from \"./codec\";\nimport { coreTablesSql } from \"./core_tables\";\n\nexport type SqlDialect = \"postgres\" | \"mysql\";\n\nfunction getFieldMeta(field: unknown): Record<string, unknown> | undefined {\n const f = field as any;\n const meta = typeof f.meta === \"function\" ? f.meta() : undefined;\n if (meta) return meta;\n\n const unwrapped = unwrapZodType(field);\n if (unwrapped !== field) {\n const innerMeta = typeof (unwrapped as any).meta === \"function\" ? (unwrapped as any).meta() : undefined;\n if (innerMeta) return innerMeta;\n }\n\n return undefined;\n}\n\nfunction getStringMaxLength(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks: any[] = (unwrapped as any).def?.checks ?? [];\n let maxLength: number | undefined;\n\n for (const check of checks) {\n const c = check._zod?.def ?? check.def ?? check;\n if (c.check === \"length_equals\" || c.check === \"size_equals\") {\n const len = c.length ?? c.size;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n if (c.check === \"max_length\" || c.check === \"max_size\") {\n const len = c.maximum ?? c.max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n\n return maxLength;\n}\n\nfunction isOptional(field: unknown): boolean {\n return (\n field instanceof z.ZodOptional ||\n field instanceof z.ZodNullable\n );\n}\n\nfunction escapeSQLString(s: string): string {\n return `'${s.replace(/'/g, \"''\")}'`;\n}\n\nfunction getDefaultFromZod(field: unknown): string | undefined {\n if (!(field instanceof z.ZodDefault)) return undefined;\n\n try {\n const f = field as any;\n let value = f.defaultValue;\n if (value === undefined) value = f.def?.defaultValue;\n if (typeof value === \"function\") value = value();\n\n if (value === undefined) return undefined;\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return escapeSQLString(value);\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nconst VARCHAR_MAX = 65535;\n\nfunction jsonType(dialect: SqlDialect): string {\n return dialect === \"mysql\" ? \"JSON\" : \"JSONB\";\n}\n\n// Extract the string literal values of a Zod enum across Zod v4 internal\n// shapes (`.options` array, or `.def.entries` object map).\nfunction getEnumValues(en: unknown): string[] {\n const e = en as any;\n if (Array.isArray(e?.options)) return e.options.filter((v: unknown): v is string => typeof v === \"string\");\n const entries = e?.def?.entries ?? e?._def?.entries ?? e?.def?.values;\n if (entries && typeof entries === \"object\") {\n return Object.values(entries).filter((v): v is string => typeof v === \"string\");\n }\n return [];\n}\n\n// Maps a scalar (non-collection) Zod type to a native SQL column type.\n// Returns undefined for types that don't have a simple scalar mapping\n// (objects, records, nested arrays, unknown types), so callers can decide\n// how to fall back. `field` is the original (possibly wrapped) node used to\n// read length constraints; `unwrapped` is the underlying scalar type.\nfunction getScalarSqlType(unwrapped: unknown, field: unknown, dialect: SqlDialect): string | undefined {\n if (unwrapped instanceof z.ZodString) {\n const maxLen = getStringMaxLength(field);\n if (maxLen !== undefined && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"TEXT\";\n }\n\n if (unwrapped instanceof z.ZodNumber) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodBoolean) {\n return dialect === \"mysql\" ? \"TINYINT(1)\" : \"BOOLEAN\";\n }\n\n if (unwrapped instanceof z.ZodDate) {\n return dialect === \"mysql\" ? \"DATETIME(3)\" : \"TIMESTAMPTZ\";\n }\n\n if (unwrapped instanceof z.ZodBigInt) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodEnum) {\n // Enums are a bounded set of short string literals, so size the column\n // to the longest literal (`VARCHAR(n)`) rather than `TEXT`. This is both\n // more efficient and, crucially, indexable on MySQL — status/type enums\n // are indexed and MySQL cannot index a `TEXT` column without a prefix\n // length. Adding a longer variant later is a normal migration.\n const values = getEnumValues(unwrapped);\n const maxLen = values.reduce((m, v) => Math.max(m, v.length), 0);\n if (maxLen > 0 && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"VARCHAR(30)\";\n }\n\n return undefined;\n}\n\nfunction getArrayElement(arr: z.ZodArray): unknown {\n return arr.element ?? arr.def?.element ?? arr.def?.type;\n}\n\n// Resolves the SQL type for an array field. MySQL has no native array column\n// type, so arrays are stored as JSON. Postgres supports native arrays of\n// scalar types (e.g. TEXT[], BIGINT[]); arrays of objects/records or nested\n// arrays fall back to JSONB.\nfunction getArraySqlType(arr: z.ZodArray, dialect: SqlDialect): string {\n if (dialect === \"mysql\") return \"JSON\";\n\n const rawElement = getArrayElement(arr);\n const element = unwrapZodType(rawElement);\n\n // Honor an explicit SQL type declared on the element's meta.\n const elementMeta = getFieldMeta(rawElement);\n if (elementMeta) {\n if (typeof elementMeta.pgType === \"string\") return `${elementMeta.pgType}[]`;\n }\n\n const scalar = getScalarSqlType(element, rawElement, dialect);\n if (scalar !== undefined) return `${scalar}[]`;\n\n return \"JSONB\";\n}\n\nfunction getSqlType(field: unknown, dialect: SqlDialect): string {\n const meta = getFieldMeta(field);\n if (meta) {\n const dialectKey = dialect === \"mysql\" ? \"mysqlType\" : \"pgType\";\n if (typeof meta[dialectKey] === \"string\") return meta[dialectKey] as string;\n }\n\n const unwrapped = unwrapZodType(field);\n\n if (unwrapped instanceof z.ZodArray) {\n return getArraySqlType(unwrapped, dialect);\n }\n\n if (unwrapped instanceof z.ZodObject || unwrapped instanceof z.ZodRecord) {\n return jsonType(dialect);\n }\n\n return getScalarSqlType(unwrapped, field, dialect) ?? \"TEXT\";\n}\n\nfunction isPrimaryKey(field: unknown): boolean {\n const meta = getFieldMeta(field);\n return meta?.primaryKey === true;\n}\n\nfunction getDefaultValue(field: unknown): string | undefined {\n const meta = getFieldMeta(field);\n if (meta && meta.defaultValue !== undefined) {\n // A string is treated as a raw SQL expression (e.g. \"now()\") for\n // backwards compatibility; other values are converted to SQL literals.\n if (typeof meta.defaultValue === \"string\") return meta.defaultValue;\n\n const value = meta.defaultValue;\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n }\n\n return getDefaultFromZod(field);\n}\n\n// Does `schema` already declare an index equivalent to the auto commit_ts one\n// (same generated name, or a single-column index on commit_ts)?\nfunction hasCommitTsIndex(schema: SchemaDefinition<string, any, any>): boolean {\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n return (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n}\n\n// MySQL CREATE INDEX has no IF NOT EXISTS and — more importantly — some\n// declarative schema tools (e.g. planetscale/schemadiff) only accept indexes\n// declared INLINE in CREATE TABLE, not as standalone CREATE INDEX statements.\n// So on MySQL we fold every declarative index (plus the auto commit_ts index)\n// into `KEY` / `UNIQUE KEY` lines inside the table body. Raw-string indexes\n// can't be folded and are left for the caller to emit separately.\nfunction mysqlInlineIndexLines(schema: SchemaDefinition<string, any, any>): string[] {\n const columns: Record<string, string> = schema.columns;\n const lines: string[] = [];\n\n for (const idx of schema.indexes ?? []) {\n if (typeof idx === \"string\") continue;\n const cols = idx.columns.map(c => columns[c] ?? c).join(\", \");\n lines.push(` ${idx.unique ? \"UNIQUE KEY\" : \"KEY\"} ${idx.name} (${cols})`);\n }\n\n if (!hasCommitTsIndex(schema)) {\n const commitCol = columns[\"commitTs\"] ?? \"commit_ts\";\n lines.push(` KEY ${schema.table}_commit_ts_idx (${commitCol})`);\n }\n\n return lines;\n}\n\nexport interface SchemaToCreateTableOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n}\n\nexport function schemaToCreateTable(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaToCreateTableOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const ifNotExists = options?.ifNotExists ?? true;\n\n const tableName = schema.table;\n const shape = schema.schema.shape;\n const columns: Record<string, string> = schema.columns;\n\n const userKeys = Object.keys(shape).filter(k => k !== \"id\" && k !== \"commitTs\");\n const orderedKeys = [\"id\", ...userKeys, \"commitTs\"];\n\n const lines: string[] = [];\n\n for (const fieldName of orderedKeys) {\n const field = shape[fieldName];\n if (!field) continue;\n\n const colName = columns[fieldName] ?? fieldName;\n if (!colName) continue;\n\n let sqlType = getSqlType(field, dialect);\n const notNull = !isOptional(field);\n const pk = isPrimaryKey(field);\n let defaultVal = fieldName === \"commitTs\" ? \"0\" : getDefaultValue(field);\n\n // MySQL cannot use a TEXT column as a PRIMARY KEY without a prefix\n // length. A primary key is always short and indexable, so fall back to a\n // bounded VARCHAR when no explicit length was declared.\n if (pk && dialect === \"mysql\" && sqlType === \"TEXT\") {\n sqlType = \"VARCHAR(255)\";\n }\n\n // MySQL never expresses a datetime/timestamp default as `now()` and\n // requires the default's fractional precision to match the column's. So\n // for any DATETIME/TIMESTAMP column with a now()/CURRENT_TIMESTAMP-style\n // default, emit `CURRENT_TIMESTAMP(p)` with the column's precision (or a\n // bare `CURRENT_TIMESTAMP` when the column has none) — honoring a custom\n // mysqlType (e.g. `TIMESTAMP`, `DATETIME(6)`) too. Postgres keeps `now()`.\n if (dialect === \"mysql\" && defaultVal) {\n const dt = /^(?:DATETIME|TIMESTAMP)(?:\\((\\d+)\\))?$/i.exec(sqlType.trim());\n const isNowLike = /^(?:now\\(\\s*\\d*\\s*\\)|current_timestamp(?:\\(\\s*\\d*\\s*\\))?)$/i.test(defaultVal.trim());\n if (dt && isNowLike) {\n const precision = dt[1];\n defaultVal = precision !== undefined ? `CURRENT_TIMESTAMP(${precision})` : \"CURRENT_TIMESTAMP\";\n }\n }\n\n // MySQL canonicalizes scalar column defaults as quoted strings in its\n // stored table definition (`DEFAULT '0'`, boolean → `'0'`/`'1'`). Emit\n // them the same way so a declarative diff against a live database is a\n // no-op instead of a spurious MODIFY on every run. CURRENT_TIMESTAMP(3),\n // NULL, and already-quoted string defaults are left untouched.\n if (dialect === \"mysql\" && defaultVal !== undefined) {\n const dv = defaultVal.trim();\n if (/^-?\\d+$/.test(dv)) defaultVal = `'${dv}'`;\n else if (/^true$/i.test(dv)) defaultVal = \"'1'\";\n else if (/^false$/i.test(dv)) defaultVal = \"'0'\";\n }\n\n let line = ` ${colName} ${sqlType}`;\n if (notNull) line += \" NOT NULL\";\n if (pk) line += \" PRIMARY KEY\";\n if (defaultVal !== undefined) line += ` DEFAULT ${defaultVal}`;\n\n lines.push(line);\n }\n\n // MySQL: fold indexes into the table body (see mysqlInlineIndexLines).\n if (dialect === \"mysql\") {\n lines.push(...mysqlInlineIndexLines(schema));\n }\n\n const ifNot = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n // MySQL stores an explicit ENGINE/charset in its canonical table definition;\n // emit them so a declarative diff against a live database doesn't report a\n // spurious charset change on every run (utf8mb4 is the MySQL 8 default).\n const tableOptions = dialect === \"mysql\" ? \" ENGINE=InnoDB DEFAULT CHARSET=utf8mb4\" : \"\";\n return `CREATE TABLE ${ifNot}${tableName} (\\n${lines.join(\",\\n\")}\\n)${tableOptions};`;\n}\n\nexport function formatDeclarativeIndex(\n idx: DeclarativeIndex,\n tableName: string,\n columns: Record<string, string>,\n options?: { ifNotExists?: boolean },\n): string {\n // MySQL's CREATE INDEX has no `IF NOT EXISTS`, so this must be omittable\n // (callers pass ifNotExists:false for MySQL / migration-tool input).\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n const colNames = idx.columns.map(c => columns[c] ?? c).join(\", \");\n let sql = `CREATE ${idx.unique ? \"UNIQUE \" : \"\"}INDEX ${ifNot}${idx.name} ON ${tableName}`;\n if (idx.type) sql += ` USING ${idx.type}`;\n sql += ` (${colNames})`;\n if (idx.where) sql += ` WHERE ${idx.where}`;\n return sql + \";\";\n}\n\nexport interface SchemaIndexesOptions {\n /** Emit `IF NOT EXISTS` on the auto-generated commit_ts index. Default true. */\n ifNotExists?: boolean;\n}\n\nexport function schemaIndexes(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaIndexesOptions,\n): string[] {\n const out = (schema.indexes ?? []).map(idx => {\n if (typeof idx === \"string\") return idx;\n return formatDeclarativeIndex(idx, schema.table, schema.columns, { ifNotExists: options?.ifNotExists });\n });\n\n // Every table has a `commit_ts` column (OCC) that is otherwise unindexed.\n // Auto-add an index on it unless the user already declared one covering\n // the commit_ts field or one with the same generated name.\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n const alreadyDeclared = (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n if (!alreadyDeclared) {\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n out.push(`CREATE INDEX ${ifNot}${autoName} ON ${schema.table} (${commitCol});`);\n }\n\n return out;\n}\n\nexport interface GenerateSchemaSqlOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n header?: boolean;\n /**\n * Prepend the framework-owned core tables (`commit_logs`, `metadata`) and\n * their indexes so the generated SQL fully describes the database. Default\n * true. Non-table core bootstrap (sequences, seed rows) is handled at\n * runtime by `initCore`, not emitted here.\n */\n includeCoreTables?: boolean;\n /**\n * MySQL only: override the SQL type of `commit_logs.id`. By default it is\n * auto-derived as `VARBINARY(max(32, largestIdColumnLength))` — wide enough\n * for the app's biggest primary key, with a 32-byte floor. Override for an\n * app with fixed-width binary ids (e.g. `\"BINARY(16)\"`). Ignored on Postgres\n * (always `BYTEA`).\n */\n commitLogIdType?: string;\n}\n\n/**\n * The largest declared primary-key string length across `schemas` (via the id\n * column's `.max(n)`), or undefined when none declare one. Used to size the\n * MySQL `commit_logs.id` column so it can hold any row's encoded id.\n */\nfunction maxPrimaryKeyLength(schemas: SchemaDefinition<string, any, any>[]): number | undefined {\n let max: number | undefined;\n for (const schema of schemas) {\n const idField = (schema.schema as any)?.shape?.id;\n const len = getStringMaxLength(idField);\n if (typeof len === \"number\") max = max === undefined ? len : Math.max(max, len);\n }\n return max;\n}\n\nexport function generateSchemaSql(\n schemas?: Map<string, SchemaDefinition<string, any, any>> | SchemaDefinition<string, any, any>[],\n options?: GenerateSchemaSqlOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const header = options?.header ?? true;\n const includeCoreTables = options?.includeCoreTables ?? true;\n\n let list: SchemaDefinition<string, any, any>[];\n\n if (schemas instanceof Map) {\n list = [...schemas.values()];\n } else if (Array.isArray(schemas)) {\n list = schemas;\n } else {\n list = [...schemaRegistry.values()];\n }\n\n list = list.filter(s => s?.table);\n list.sort((a, b) => a.table.localeCompare(b.table));\n\n const parts: string[] = [];\n\n if (header) {\n parts.push(\"-- Generated by Supalive Schema Generator\");\n parts.push(`-- Dialect: ${dialect}`);\n parts.push(`-- Tables: ${list.length}${includeCoreTables ? \" (+ core)\" : \"\"}`);\n parts.push(\"\");\n }\n\n if (includeCoreTables) {\n // MySQL: size commit_logs.id to the app's largest id column (32-byte\n // floor), unless the caller overrode the type. VARBINARY (not BINARY) so\n // variable-length ids aren't zero-padded, which would break the OCC id\n // match. Ignored on Postgres (BYTEA).\n const commitLogIdType = dialect === \"mysql\"\n ? (options?.commitLogIdType ?? `VARBINARY(${Math.max(32, maxPrimaryKeyLength(list) ?? 0)})`)\n : options?.commitLogIdType;\n\n parts.push(\"-- Core tables (framework-owned)\");\n for (const stmt of coreTablesSql(dialect, { ifNotExists: options?.ifNotExists, commitLogIdType })) {\n parts.push(stmt);\n }\n parts.push(\"\");\n }\n\n for (const schema of list) {\n parts.push(schemaToCreateTable(schema, { ...options, dialect }));\n if (dialect === \"mysql\") {\n // Declarative indexes and the auto commit_ts index are folded inline\n // into the CREATE TABLE above; only raw-string (verbatim SQL) indexes\n // remain to be emitted as separate statements.\n for (const idx of schema.indexes ?? []) {\n if (typeof idx === \"string\") parts.push(idx);\n }\n } else {\n const indexStmts = schemaIndexes(schema, { ifNotExists: options?.ifNotExists });\n for (const stmt of indexStmts) {\n parts.push(stmt);\n }\n }\n parts.push(\"\");\n }\n\n return parts.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema-sql.js","names":["z"],"sources":["../../../src/db/core_tables.ts","../../../src/db/schema-sql.ts"],"sourcesContent":["import type { SqlDialect } from \"./schema-sql\";\n\n/**\n * DDL for the core, framework-owned database objects that every Supalive\n * database must have alongside the user's own tables:\n *\n * - `commit_logs` — the append-only OCC change log (+ its lookup indexes).\n * - `metadata` — the small key/value table holding the OCC watermarks\n * (`latest_committed_ts`, `min_retained_ts`) and the\n * core schema version (`core_version`).\n * - `global_commit_ts` — the monotonic commit-timestamp source: a SEQUENCE on\n * Postgres, a single-row `BIGINT` counter table on MySQL.\n *\n * These are all pure schema (DDL), so they belong in the generated `schema.sql`\n * (see {@link generateSchemaSql}, which prepends them by default) and get\n * migrated ahead of runtime by your normal migration pipeline — a single\n * generated file fully describes the database.\n *\n * Data seeding (the `metadata` rows and the MySQL counter's initial `0`) and\n * any runtime-only schema changes live in `initCore` — see\n * {@link file://./init_db.ts}.\n */\n\nexport interface CoreTablesSqlOptions {\n /** Emit `IF NOT EXISTS` on `CREATE TABLE`/`CREATE INDEX`/`CREATE SEQUENCE`. Default true. */\n ifNotExists?: boolean;\n /**\n * MySQL only: the SQL type of `commit_logs.id`, which stores the changed\n * row's primary key encoded as bytes. Defaults to `VARBINARY(255)`.\n * `generateSchemaSql` derives a tighter value from the app's largest id\n * column; an app with fixed-width binary ids can override to e.g.\n * `BINARY(16)` (but note: variable-length ids must use VARBINARY — a fixed\n * BINARY column zero-pads stored values, which would break the OCC id match).\n */\n commitLogIdType?: string;\n}\n\nexport function coreTablesSql(\n dialect: SqlDialect = \"postgres\",\n options?: CoreTablesSqlOptions,\n): string[] {\n const ifNotExists = options?.ifNotExists ?? true;\n const t = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const i = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const commitLogIdType = options?.commitLogIdType ?? \"VARBINARY(255)\";\n\n if (dialect === \"mysql\") {\n return [\n // MySQL has no sequences: a single-row counter table advanced via\n // LAST_INSERT_ID (see MySqlDatabase.getNextTimestamp). Seeded to 0\n // by initCore.\n `CREATE TABLE ${t}global_commit_ts (\\n` +\n ` id BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,\n // `id` holds the changed row's primary key encoded as bytes. Row ids\n // are variable-length (a prefixed string id can exceed 16 bytes), so\n // the default is VARBINARY, mirroring Postgres' flexible BYTEA — a\n // fixed BINARY column zero-pads stored values, breaking the OCC id\n // match. Sized via `commitLogIdType` (generateSchemaSql derives it\n // from the app's largest id column). `table_id` is a fixed 16-byte\n // table hash and stays BINARY(16).\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id ${commitLogIdType} NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BINARY(16) NOT NULL,\\n` +\n ` data LONGBLOB NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id),\\n` +\n ` INDEX commit_logs_by_table_and_id (table_id, id, ts)\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key VARCHAR(64) NOT NULL PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,\n ];\n }\n\n return [\n // Monotonic OCC commit-timestamp source (see PgDatabase.getNextTimestamp).\n `CREATE SEQUENCE ${t}global_commit_ts START 1 INCREMENT 1 NO CYCLE;`,\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id BYTEA NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BYTEA NOT NULL,\\n` +\n ` data BYTEA NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id)\\n` +\n `);`,\n `CREATE INDEX ${i}commit_logs_by_table_and_id ON commit_logs (table_id, id, ts);`,\n `CREATE INDEX ${i}commit_logs_by_table_ts_and_id ON commit_logs (table_id, ts, id);`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key TEXT PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `);`,\n ];\n}\n","import { z } from \"zod\";\nimport { SchemaDefinition, schemaRegistry } from \"./schema\";\nimport type { DeclarativeIndex } from \"./schema\";\nimport { unwrapZodType } from \"./codec\";\nimport { coreTablesSql } from \"./core_tables\";\n\nexport type SqlDialect = \"postgres\" | \"mysql\";\n\nfunction getFieldMeta(field: unknown): Record<string, unknown> | undefined {\n const f = field as any;\n const meta = typeof f.meta === \"function\" ? f.meta() : undefined;\n if (meta) return meta;\n\n const unwrapped = unwrapZodType(field);\n if (unwrapped !== field) {\n const innerMeta = typeof (unwrapped as any).meta === \"function\" ? (unwrapped as any).meta() : undefined;\n if (innerMeta) return innerMeta;\n }\n\n return undefined;\n}\n\nfunction getStringMaxLength(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks: any[] = (unwrapped as any).def?.checks ?? [];\n let maxLength: number | undefined;\n\n for (const check of checks) {\n const c = check._zod?.def ?? check.def ?? check;\n if (c.check === \"length_equals\" || c.check === \"size_equals\") {\n const len = c.length ?? c.size;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n if (c.check === \"max_length\" || c.check === \"max_size\") {\n const len = c.maximum ?? c.max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n\n return maxLength;\n}\n\nfunction isOptional(field: unknown): boolean {\n return (\n field instanceof z.ZodOptional ||\n field instanceof z.ZodNullable\n );\n}\n\nfunction escapeSQLString(s: string): string {\n return `'${s.replace(/'/g, \"''\")}'`;\n}\n\nfunction getDefaultFromZod(field: unknown): string | undefined {\n if (!(field instanceof z.ZodDefault)) return undefined;\n\n try {\n const f = field as any;\n let value = f.defaultValue;\n if (value === undefined) value = f.def?.defaultValue;\n if (typeof value === \"function\") value = value();\n\n if (value === undefined) return undefined;\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return escapeSQLString(value);\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nconst VARCHAR_MAX = 65535;\n\nfunction jsonType(dialect: SqlDialect): string {\n return dialect === \"mysql\" ? \"JSON\" : \"JSONB\";\n}\n\n// Extract the string literal values of a Zod enum across Zod v4 internal\n// shapes (`.options` array, or `.def.entries` object map).\nfunction getEnumValues(en: unknown): string[] {\n const e = en as any;\n if (Array.isArray(e?.options)) return e.options.filter((v: unknown): v is string => typeof v === \"string\");\n const entries = e?.def?.entries ?? e?._def?.entries ?? e?.def?.values;\n if (entries && typeof entries === \"object\") {\n return Object.values(entries).filter((v): v is string => typeof v === \"string\");\n }\n return [];\n}\n\n// Maps a scalar (non-collection) Zod type to a native SQL column type.\n// Returns undefined for types that don't have a simple scalar mapping\n// (objects, records, nested arrays, unknown types), so callers can decide\n// how to fall back. `field` is the original (possibly wrapped) node used to\n// read length constraints; `unwrapped` is the underlying scalar type.\nfunction getScalarSqlType(unwrapped: unknown, field: unknown, dialect: SqlDialect): string | undefined {\n if (unwrapped instanceof z.ZodString) {\n const maxLen = getStringMaxLength(field);\n if (maxLen !== undefined && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"TEXT\";\n }\n\n if (unwrapped instanceof z.ZodNumber) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodBoolean) {\n return dialect === \"mysql\" ? \"TINYINT(1)\" : \"BOOLEAN\";\n }\n\n if (unwrapped instanceof z.ZodDate) {\n return dialect === \"mysql\" ? \"DATETIME(3)\" : \"TIMESTAMPTZ\";\n }\n\n if (unwrapped instanceof z.ZodBigInt) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodEnum) {\n // Enums are a bounded set of short string literals, so size the column\n // to the longest literal (`VARCHAR(n)`) rather than `TEXT`. This is both\n // more efficient and, crucially, indexable on MySQL — status/type enums\n // are indexed and MySQL cannot index a `TEXT` column without a prefix\n // length. Adding a longer variant later is a normal migration.\n const values = getEnumValues(unwrapped);\n const maxLen = values.reduce((m, v) => Math.max(m, v.length), 0);\n if (maxLen > 0 && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"VARCHAR(30)\";\n }\n\n return undefined;\n}\n\nfunction getArrayElement(arr: z.ZodArray): unknown {\n return arr.element ?? arr.def?.element ?? arr.def?.type;\n}\n\n// Resolves the SQL type for an array field. MySQL has no native array column\n// type, so arrays are stored as JSON. Postgres supports native arrays of\n// scalar types (e.g. TEXT[], BIGINT[]); arrays of objects/records or nested\n// arrays fall back to JSONB.\nfunction getArraySqlType(arr: z.ZodArray, dialect: SqlDialect): string {\n if (dialect === \"mysql\") return \"JSON\";\n\n const rawElement = getArrayElement(arr);\n const element = unwrapZodType(rawElement);\n\n // Honor an explicit SQL type declared on the element's meta.\n const elementMeta = getFieldMeta(rawElement);\n if (elementMeta) {\n if (typeof elementMeta.pgType === \"string\") return `${elementMeta.pgType}[]`;\n }\n\n const scalar = getScalarSqlType(element, rawElement, dialect);\n if (scalar !== undefined) return `${scalar}[]`;\n\n return \"JSONB\";\n}\n\nfunction getSqlType(field: unknown, dialect: SqlDialect): string {\n const meta = getFieldMeta(field);\n if (meta) {\n const dialectKey = dialect === \"mysql\" ? \"mysqlType\" : \"pgType\";\n if (typeof meta[dialectKey] === \"string\") return meta[dialectKey] as string;\n }\n\n const unwrapped = unwrapZodType(field);\n\n if (unwrapped instanceof z.ZodArray) {\n return getArraySqlType(unwrapped, dialect);\n }\n\n if (unwrapped instanceof z.ZodObject || unwrapped instanceof z.ZodRecord) {\n return jsonType(dialect);\n }\n\n return getScalarSqlType(unwrapped, field, dialect) ?? \"TEXT\";\n}\n\nfunction isPrimaryKey(field: unknown): boolean {\n const meta = getFieldMeta(field);\n return meta?.primaryKey === true;\n}\n\nfunction getDefaultValue(field: unknown): string | undefined {\n const meta = getFieldMeta(field);\n if (meta && meta.defaultValue !== undefined) {\n // A string is treated as a raw SQL expression (e.g. \"now()\") for\n // backwards compatibility; other values are converted to SQL literals.\n if (typeof meta.defaultValue === \"string\") return meta.defaultValue;\n\n const value = meta.defaultValue;\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n }\n\n return getDefaultFromZod(field);\n}\n\n// Does `schema` already declare an index equivalent to the auto commit_ts one\n// (same generated name, or a single-column index on commit_ts)?\nfunction hasCommitTsIndex(schema: SchemaDefinition<string, any, any>): boolean {\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n return (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n}\n\n// MySQL CREATE INDEX has no IF NOT EXISTS and — more importantly — some\n// declarative schema tools (e.g. planetscale/schemadiff) only accept indexes\n// declared INLINE in CREATE TABLE, not as standalone CREATE INDEX statements.\n// So on MySQL we fold every declarative index (plus the auto commit_ts index)\n// into `KEY` / `UNIQUE KEY` lines inside the table body. Raw-string indexes\n// can't be folded and are left for the caller to emit separately.\nfunction mysqlInlineIndexLines(schema: SchemaDefinition<string, any, any>): string[] {\n const columns: Record<string, string> = schema.columns;\n const lines: string[] = [];\n\n for (const idx of schema.indexes ?? []) {\n if (typeof idx === \"string\") continue;\n const cols = idx.columns.map(c => columns[c] ?? c).join(\", \");\n lines.push(` ${idx.unique ? \"UNIQUE KEY\" : \"KEY\"} ${idx.name} (${cols})`);\n }\n\n if (!hasCommitTsIndex(schema)) {\n const commitCol = columns[\"commitTs\"] ?? \"commit_ts\";\n lines.push(` KEY ${schema.table}_commit_ts_idx (${commitCol})`);\n }\n\n return lines;\n}\n\nexport interface SchemaToCreateTableOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n}\n\nexport function schemaToCreateTable(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaToCreateTableOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const ifNotExists = options?.ifNotExists ?? true;\n\n const tableName = schema.table;\n const shape = schema.schema.shape;\n const columns: Record<string, string> = schema.columns;\n\n const userKeys = Object.keys(shape).filter(k => k !== \"id\" && k !== \"commitTs\");\n const orderedKeys = [\"id\", ...userKeys, \"commitTs\"];\n\n const lines: string[] = [];\n\n for (const fieldName of orderedKeys) {\n const field = shape[fieldName];\n if (!field) continue;\n\n const colName = columns[fieldName] ?? fieldName;\n if (!colName) continue;\n\n let sqlType = getSqlType(field, dialect);\n const notNull = !isOptional(field);\n const pk = isPrimaryKey(field);\n let defaultVal = fieldName === \"commitTs\" ? \"0\" : getDefaultValue(field);\n\n // MySQL cannot use a TEXT column as a PRIMARY KEY without a prefix\n // length. A primary key is always short and indexable, so fall back to a\n // bounded VARCHAR when no explicit length was declared.\n if (pk && dialect === \"mysql\" && sqlType === \"TEXT\") {\n sqlType = \"VARCHAR(255)\";\n }\n\n // MySQL never expresses a datetime/timestamp default as `now()` and\n // requires the default's fractional precision to match the column's. So\n // for any DATETIME/TIMESTAMP column with a now()/CURRENT_TIMESTAMP-style\n // default, emit `CURRENT_TIMESTAMP(p)` with the column's precision (or a\n // bare `CURRENT_TIMESTAMP` when the column has none) — honoring a custom\n // mysqlType (e.g. `TIMESTAMP`, `DATETIME(6)`) too. Postgres keeps `now()`.\n if (dialect === \"mysql\" && defaultVal) {\n const dt = /^(?:DATETIME|TIMESTAMP)(?:\\((\\d+)\\))?$/i.exec(sqlType.trim());\n const isNowLike = /^(?:now\\(\\s*\\d*\\s*\\)|current_timestamp(?:\\(\\s*\\d*\\s*\\))?)$/i.test(defaultVal.trim());\n if (dt && isNowLike) {\n const precision = dt[1];\n defaultVal = precision !== undefined ? `CURRENT_TIMESTAMP(${precision})` : \"CURRENT_TIMESTAMP\";\n }\n }\n\n // MySQL canonicalizes scalar column defaults as quoted strings in its\n // stored table definition (`DEFAULT '0'`, boolean → `'0'`/`'1'`). Emit\n // them the same way so a declarative diff against a live database is a\n // no-op instead of a spurious MODIFY on every run. CURRENT_TIMESTAMP(3),\n // NULL, and already-quoted string defaults are left untouched.\n if (dialect === \"mysql\" && defaultVal !== undefined) {\n const dv = defaultVal.trim();\n if (/^-?\\d+$/.test(dv)) defaultVal = `'${dv}'`;\n else if (/^true$/i.test(dv)) defaultVal = \"'1'\";\n else if (/^false$/i.test(dv)) defaultVal = \"'0'\";\n }\n\n let line = ` ${colName} ${sqlType}`;\n if (notNull) line += \" NOT NULL\";\n if (pk) line += \" PRIMARY KEY\";\n if (defaultVal !== undefined) line += ` DEFAULT ${defaultVal}`;\n\n lines.push(line);\n }\n\n // MySQL: fold indexes into the table body (see mysqlInlineIndexLines).\n if (dialect === \"mysql\") {\n lines.push(...mysqlInlineIndexLines(schema));\n }\n\n const ifNot = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n // MySQL stores an explicit ENGINE/charset in its canonical table definition;\n // emit them so a declarative diff against a live database doesn't report a\n // spurious charset change on every run (utf8mb4 is the MySQL 8 default).\n const tableOptions = dialect === \"mysql\" ? \" ENGINE=InnoDB DEFAULT CHARSET=utf8mb4\" : \"\";\n return `CREATE TABLE ${ifNot}${tableName} (\\n${lines.join(\",\\n\")}\\n)${tableOptions};`;\n}\n\nexport function formatDeclarativeIndex(\n idx: DeclarativeIndex,\n tableName: string,\n columns: Record<string, string>,\n options?: { ifNotExists?: boolean },\n): string {\n // MySQL's CREATE INDEX has no `IF NOT EXISTS`, so this must be omittable\n // (callers pass ifNotExists:false for MySQL / migration-tool input).\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n const colNames = idx.columns.map(c => columns[c] ?? c).join(\", \");\n let sql = `CREATE ${idx.unique ? \"UNIQUE \" : \"\"}INDEX ${ifNot}${idx.name} ON ${tableName}`;\n if (idx.type) sql += ` USING ${idx.type}`;\n sql += ` (${colNames})`;\n if (idx.where) sql += ` WHERE ${idx.where}`;\n return sql + \";\";\n}\n\nexport interface SchemaIndexesOptions {\n /** Emit `IF NOT EXISTS` on the auto-generated commit_ts index. Default true. */\n ifNotExists?: boolean;\n}\n\nexport function schemaIndexes(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaIndexesOptions,\n): string[] {\n const out = (schema.indexes ?? []).map(idx => {\n if (typeof idx === \"string\") return idx;\n return formatDeclarativeIndex(idx, schema.table, schema.columns, { ifNotExists: options?.ifNotExists });\n });\n\n // Every table has a `commit_ts` column (OCC) that is otherwise unindexed.\n // Auto-add an index on it unless the user already declared one covering\n // the commit_ts field or one with the same generated name.\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n const alreadyDeclared = (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n if (!alreadyDeclared) {\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n out.push(`CREATE INDEX ${ifNot}${autoName} ON ${schema.table} (${commitCol});`);\n }\n\n return out;\n}\n\nexport interface GenerateSchemaSqlOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n header?: boolean;\n /**\n * Prepend the framework-owned core tables (`commit_logs`, `metadata`) and\n * their indexes so the generated SQL fully describes the database. Default\n * true. Non-table core bootstrap (sequences, seed rows) is handled at\n * runtime by `initCore`, not emitted here.\n */\n includeCoreTables?: boolean;\n /**\n * MySQL only: override the SQL type of `commit_logs.id`. By default it is\n * auto-derived as `VARBINARY(max(32, largestIdColumnLength))` — wide enough\n * for the app's biggest primary key, with a 32-byte floor. Override for an\n * app with fixed-width binary ids (e.g. `\"BINARY(16)\"`). Ignored on Postgres\n * (always `BYTEA`).\n */\n commitLogIdType?: string;\n}\n\n/**\n * The largest declared primary-key string length across `schemas` (via the id\n * column's `.max(n)`), or undefined when none declare one. Used to size the\n * MySQL `commit_logs.id` column so it can hold any row's encoded id.\n */\nfunction maxPrimaryKeyLength(schemas: SchemaDefinition<string, any, any>[]): number | undefined {\n let max: number | undefined;\n for (const schema of schemas) {\n const idField = (schema.schema as any)?.shape?.id;\n const len = getStringMaxLength(idField);\n if (typeof len === \"number\") max = max === undefined ? len : Math.max(max, len);\n }\n return max;\n}\n\nexport function generateSchemaSql(\n schemas?: Map<string, SchemaDefinition<string, any, any>> | SchemaDefinition<string, any, any>[],\n options?: GenerateSchemaSqlOptions,\n): string {\n const dialect = options?.dialect ?? \"mysql\";\n const header = options?.header ?? true;\n const includeCoreTables = options?.includeCoreTables ?? true;\n\n let list: SchemaDefinition<string, any, any>[];\n\n if (schemas instanceof Map) {\n list = [...schemas.values()];\n } else if (Array.isArray(schemas)) {\n list = schemas;\n } else {\n list = [...schemaRegistry.values()];\n }\n\n list = list.filter(s => s?.table);\n list.sort((a, b) => a.table.localeCompare(b.table));\n\n const parts: string[] = [];\n\n if (header) {\n parts.push(\"-- Generated by Supalive Schema Generator\");\n parts.push(`-- Dialect: ${dialect}`);\n parts.push(`-- Tables: ${list.length}${includeCoreTables ? \" (+ core)\" : \"\"}`);\n parts.push(\"\");\n }\n\n if (includeCoreTables) {\n // MySQL: size commit_logs.id to the app's largest id column (32-byte\n // floor), unless the caller overrode the type. VARBINARY (not BINARY) so\n // variable-length ids aren't zero-padded, which would break the OCC id\n // match. Ignored on Postgres (BYTEA).\n const commitLogIdType = dialect === \"mysql\"\n ? (options?.commitLogIdType ?? `VARBINARY(${Math.max(32, maxPrimaryKeyLength(list) ?? 0)})`)\n : options?.commitLogIdType;\n\n parts.push(\"-- Core tables (framework-owned)\");\n for (const stmt of coreTablesSql(dialect, { ifNotExists: options?.ifNotExists, commitLogIdType })) {\n parts.push(stmt);\n }\n parts.push(\"\");\n }\n\n for (const schema of list) {\n parts.push(schemaToCreateTable(schema, { ...options, dialect }));\n if (dialect === \"mysql\") {\n // Declarative indexes and the auto commit_ts index are folded inline\n // into the CREATE TABLE above; only raw-string (verbatim SQL) indexes\n // remain to be emitted as separate statements.\n for (const idx of schema.indexes ?? []) {\n if (typeof idx === \"string\") parts.push(idx);\n }\n } else {\n const indexStmts = schemaIndexes(schema, { ifNotExists: options?.ifNotExists });\n for (const stmt of indexStmts) {\n parts.push(stmt);\n }\n }\n parts.push(\"\");\n }\n\n return parts.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { $n as AffectedSubscription, Bt as ScheduleHandle, E as Context, Ft as IncomingJobRequest, Ht as SupaliveDb, It as JobClient, Lt as JobScheduler, Mt as DevScheduler, Nt as DevSchedulerOptions, Pt as EnqueueOptions, Qn as CacheLayer, Rt as QStashScheduler, Un as Database, Vt as ScheduledJobDef, ar as RegisterSubscriptionResult, cr as UnregisterSubscriptionResult, dr as UpdateSubscriptionReadSetParams, er as InvalidateWritesetParams, fr as UpdateSubscriptionReadSetParamsSchema, ir as RegisterSubscriptionParamsSchema, nr as InvalidateWritesetResult, or as UnregisterSubscriptionParams, pr as UpdateSubscriptionReadSetResult, rr as RegisterSubscriptionParams, rt as Router, sr as UnregisterSubscriptionParamsSchema, tr as InvalidateWritesetParamsSchema, zt as QStashSchedulerOptions } from "../../index-C_i3U4cd.js";
2
- import { t as MySqlDatabase } from "../../mysql-Di6iuKWT.js";
3
- import { t as PgDatabase } from "../../postgres-CkhK4DqZ.js";
4
- import { C as SubManagerLink, S as SubManagerClient, b as SupaliveServerConfig, p as DatabaseConfig, u as SubId, x as UpstashConfig, y as SubscriptionManagerConfig } from "../../types_server-CG453PHb.js";
1
+ import { $n as InvalidateWritesetResult, At as DevScheduler, Bn as Database, Bt as SupaliveDb, E as Context, Ft as JobScheduler, It as QStashScheduler, Lt as QStashSchedulerOptions, Mt as EnqueueOptions, Nt as IncomingJobRequest, Pt as JobClient, Qn as InvalidateWritesetParamsSchema, Rt as ScheduleHandle, Xn as AffectedSubscription, Yn as CacheLayer, Zn as InvalidateWritesetParams, ar as UnregisterSubscriptionResult, cr as UpdateSubscriptionReadSetParams, er as RegisterSubscriptionParams, ir as UnregisterSubscriptionParamsSchema, jt as DevSchedulerOptions, lr as UpdateSubscriptionReadSetParamsSchema, nr as RegisterSubscriptionResult, rr as UnregisterSubscriptionParams, rt as Router, tr as RegisterSubscriptionParamsSchema, ur as UpdateSubscriptionReadSetResult, zt as ScheduledJobDef } from "../../index-Ddr4NiPf.js";
2
+ import { t as MySqlDatabase } from "../../mysql-DWj2q3qR.js";
3
+ import { t as PgDatabase } from "../../postgres-D0M1ri-C.js";
4
+ import { C as SubManagerLink, S as SubManagerClient, b as SupaliveServerConfig, p as DatabaseConfig, u as SubId, x as UpstashConfig, y as SubscriptionManagerConfig } from "../../types_server-BSiGxbqb.js";
5
5
  import pino, { Level } from "pino";
6
6
  import Redis$1 from "ioredis";
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../../../src/server/supalive-server.ts","../../../src/logger.ts","../../../src/server/sub-manager.ts","../../../src/db/init_db.ts","../../../src/server/sub_hash.ts"],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../../../src/server/supalive-server.ts","../../../src/logger.ts","../../../src/server/sub-manager.ts","../../../src/db/init_db.ts","../../../src/server/sub_hash.ts"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { n as getContextRegistry, u as primaryOnlyConn } from "../../router-Kgrlci8X.js";
1
+ import { l as primaryOnlyConn, n as getContextRegistry } from "../../router-DP2ThAwh.js";
2
2
  import { n as stableStringify, r as supaliveStringify, t as groupByToMap } from "../../helper-zdJT5FUc.js";
3
3
  import { r as evaluateCacheFreshness } from "../../overlap-checker-Kz7B_jsp.js";
4
4
  import { i as AuthenticationError, o as ClientMessageSchema } from "../../types_client_rpc-ByGwoRCL.js";
5
5
  import { n as RemoteSubscriptionMessageSchema } from "../../types_server-BhC19R2a.js";
6
6
  import { n as sleep } from "../../realtime_db-CVze3gM0.js";
7
7
  import { n as resolveReadRouting, t as makeConnRouting } from "../../read-routing-BUcQAwnd.js";
8
- import { C as appInstanceId, D as serializeMapValue, E as logger, S as RetentionWatermark, T as logLevelOf, _ as UnregisterSubscriptionResultSchema, a as bootstrapDbTypes, b as UpdateSubscriptionReadSetResultSchema, c as initCore, d as InvalidateWritesetParamsSchema, f as InvalidateWritesetResultSchema, g as UnregisterSubscriptionParamsSchema, h as RegisterSubscriptionResultSchema, i as DB_QUERY_TIMEOUT_MS, l as initDatabase, m as RegisterSubscriptionParamsSchema, n as SubscriptionWorker, o as createDatabase, p as RegisterSubscriptionBatchResultSchema, r as CORE_VERSION, s as initCacheLayer, t as dispatchWorkerMessage, u as CacheLayer, v as UnregisterSubscriptionsResultSchema, w as isProduction, x as RETENTION_WATERMARK_CHANNEL, y as UpdateSubscriptionReadSetParamsSchema } from "../../sub-worker-dispatch-CzwVHQVi.js";
8
+ import { C as appInstanceId, D as serializeMapValue, E as logger, S as RetentionWatermark, T as logLevelOf, _ as UnregisterSubscriptionResultSchema, a as bootstrapDbTypes, b as UpdateSubscriptionReadSetResultSchema, c as initCore, d as InvalidateWritesetParamsSchema, f as InvalidateWritesetResultSchema, g as UnregisterSubscriptionParamsSchema, h as RegisterSubscriptionResultSchema, i as DB_QUERY_TIMEOUT_MS, l as initDatabase, m as RegisterSubscriptionParamsSchema, n as SubscriptionWorker, o as createDatabase, p as RegisterSubscriptionBatchResultSchema, r as CORE_VERSION, s as initCacheLayer, t as dispatchWorkerMessage, u as CacheLayer, v as UnregisterSubscriptionsResultSchema, w as isProduction, x as RETENTION_WATERMARK_CHANNEL, y as UpdateSubscriptionReadSetParamsSchema } from "../../sub-worker-dispatch-CC0w_sx0.js";
9
9
  import { v4 } from "uuid";
10
10
  import { createServer } from "http";
11
11
  import { WebSocket, WebSocketServer } from "ws";
@@ -738,7 +738,7 @@ var HttpRpcHandler = class {
738
738
  res.setHeader("access-control-allow-origin", origin);
739
739
  res.setHeader("vary", "Origin");
740
740
  } else return;
741
- res.setHeader("access-control-allow-methods", "POST, OPTIONS");
741
+ res.setHeader("access-control-allow-methods", "POST, GET, OPTIONS");
742
742
  res.setHeader("access-control-allow-headers", "authorization, content-type");
743
743
  res.setHeader("access-control-max-age", "86400");
744
744
  }
@@ -1050,7 +1050,7 @@ var SupaliveWebSocketServer = class {
1050
1050
  */
1051
1051
  async handleHttpRequest(req, res) {
1052
1052
  const path = (req.url ?? "/").split("?")[0];
1053
- if (req.method === "GET" && (path === "/_health" || path === `${this.jobPath}/_health`)) return sendJson(res, 200, {
1053
+ if (req.method === "GET" && path === "/_health") return sendJson(res, 200, {
1054
1054
  status: "ok",
1055
1055
  instanceId: this.instanceId
1056
1056
  });