@storyshelf/db-sqlite 0.6.1 → 0.7.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.
- package/README.md +9 -9
- package/dist/better-sqlite3.mjs +14 -3
- package/dist/better-sqlite3.mjs.map +1 -1
- package/dist/bun-sqlite.mjs +14 -3
- package/dist/bun-sqlite.mjs.map +1 -1
- package/dist/d1.mjs +5 -3
- package/dist/d1.mjs.map +1 -1
- package/dist/ddl.d.mts +10 -2
- package/dist/ddl.mjs +226 -14
- package/dist/ddl.mjs.map +1 -1
- package/dist/ensure-db-dir.mjs +19 -0
- package/dist/ensure-db-dir.mjs.map +1 -0
- package/dist/index.mjs +9 -2
- package/dist/index.mjs.map +1 -1
- package/dist/schema/baseline.d.mts +57 -0
- package/dist/schema/baseline.mjs +4 -1
- package/dist/schema/baseline.mjs.map +1 -1
- package/dist/schema/{status-config.d.mts → build-component.d.mts} +40 -33
- package/dist/schema/build-component.mjs +22 -0
- package/dist/schema/build-component.mjs.map +1 -0
- package/dist/schema/build-review.d.mts +129 -0
- package/dist/schema/build-review.mjs +20 -0
- package/dist/schema/build-review.mjs.map +1 -0
- package/dist/schema/build.d.mts +40 -2
- package/dist/schema/build.mjs +3 -0
- package/dist/schema/build.mjs.map +1 -1
- package/dist/schema/capture-job.d.mts +359 -0
- package/dist/schema/capture-job.mjs +38 -0
- package/dist/schema/capture-job.mjs.map +1 -0
- package/dist/schema/capture-shard.d.mts +281 -0
- package/dist/schema/capture-shard.mjs +28 -0
- package/dist/schema/capture-shard.mjs.map +1 -0
- package/dist/schema/comment.d.mts +20 -0
- package/dist/schema/comment.mjs +3 -2
- package/dist/schema/comment.mjs.map +1 -1
- package/dist/schema/connection.d.mts +191 -0
- package/dist/schema/connection.mjs +26 -0
- package/dist/schema/connection.mjs.map +1 -0
- package/dist/schema/design.d.mts +649 -0
- package/dist/schema/design.mjs +49 -0
- package/dist/schema/design.mjs.map +1 -0
- package/dist/schema/insight.d.mts +689 -0
- package/dist/schema/insight.mjs +53 -0
- package/dist/schema/insight.mjs.map +1 -0
- package/dist/schema/notification.d.mts +40 -0
- package/dist/schema/notification.mjs +2 -0
- package/dist/schema/notification.mjs.map +1 -1
- package/dist/schema/project.d.mts +132 -0
- package/dist/schema/project.mjs +8 -1
- package/dist/schema/project.mjs.map +1 -1
- package/dist/schema/site-setting.d.mts +109 -0
- package/dist/schema/site-setting.mjs +17 -0
- package/dist/schema/site-setting.mjs.map +1 -0
- package/dist/schema/snapshot.d.mts +118 -0
- package/dist/schema/snapshot.mjs +11 -1
- package/dist/schema/snapshot.mjs.map +1 -1
- package/dist/schema/usage.d.mts +293 -0
- package/dist/schema/usage.mjs +30 -0
- package/dist/schema/usage.mjs.map +1 -0
- package/dist/schema.d.mts +24 -3
- package/dist/schema.mjs +25 -4
- package/dist/schema.mjs.map +1 -1
- package/dist/turso.d.mts +2 -2
- package/dist/turso.mjs +19 -6
- package/dist/turso.mjs.map +1 -1
- package/package.json +5 -2
- package/dist/schema/status-config.mjs +0 -20
- package/dist/schema/status-config.mjs.map +0 -1
package/dist/turso.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turso.mjs","names":[],"sources":["../src/turso.ts"],"sourcesContent":["/**\n * Turso/libSQL preset for the SQLite database adapter.\n *\n * Same schema, DDL, and Drizzle factory as the `node:sqlite` default;\n * only the transport differs (`@libsql/client`: `file:`, `libsql://`,\n * `wss://`, or embedded replica via `syncUrl`). Requires the optional\n * `@libsql/client` peer (`nub add @libsql/client`).\n */\nimport {
|
|
1
|
+
{"version":3,"file":"turso.mjs","names":[],"sources":["../src/turso.ts"],"sourcesContent":["import type { Client } from \"@libsql/client\";\nimport type { DatabaseAdapter } from \"@storyshelf/core/adapter/database\";\nimport * as drizzleLibsqlCore from \"drizzle-orm/libsql/driver-core\";\n/**\n * Turso/libSQL preset for the SQLite database adapter.\n *\n * Same schema, DDL, and Drizzle factory as the `node:sqlite` default;\n * only the transport differs (`@libsql/client`: `file:`, `libsql://`,\n * `wss://`, or embedded replica via `syncUrl`). Requires the optional\n * `@libsql/client` peer (`nub add @libsql/client`).\n */\nimport { createRequire } from \"node:module\";\nimport { DDL, IDENTITY_STATEMENTS, tableColumns } from \"./ddl.ts\";\nimport { createDrizzleAdapter } from \"./drizzle-factory.ts\";\nimport { schema } from \"./schema/index.ts\";\n\ndeclare const __PKG_VERSION__: string | undefined;\n\ntype LibsqlClient = Client;\ntype CreateClient = typeof import(\"@libsql/client\").createClient;\ntype Construct = (client: LibsqlClient, config: { schema: typeof schema }) => unknown;\n\n// `driver-core` exports `construct` at runtime but omits it from its typings.\nconst construct = (drizzleLibsqlCore as unknown as { construct: Construct }).construct;\n\n/**\n * Options for creating a Turso-backed DatabaseAdapter.\n *\n * When `client` is supplied, all other connection options are ignored and\n * the caller owns the lifecycle of the client (teardown is a no-op). This\n * is the hook for embedded replicas with custom sync loops and hermetic\n * tests.\n */\nexport interface TursoDatabaseOptions {\n url?: string;\n authToken?: string;\n syncUrl?: string;\n syncInterval?: number;\n client?: LibsqlClient;\n}\n\n/**\n * Create a Turso/libSQL-backed DatabaseAdapter using Drizzle ORM.\n *\n * @param options - Either a connection `url` (plus `authToken`/`syncUrl`/\n * `syncInterval`) or a preconfigured libSQL `client`.\n * @returns A DatabaseAdapter backed by the Turso database.\n */\nexport function createTursoDatabase(options: TursoDatabaseOptions): DatabaseAdapter {\n const { client, owned } = resolveClient(options);\n const db = construct(client, { schema });\n\n return createDrizzleAdapter(db, {\n metadata: {\n name: \"Turso\",\n version: typeof __PKG_VERSION__ === \"string\" ? __PKG_VERSION__ : \"0.0.0\",\n description: \"Turso/libSQL database adapter\",\n kind: \"turso\",\n category: \"database\",\n },\n tables: schema,\n migrate: async () => {\n await runMigrations(client);\n },\n close: () => {\n if (owned) {\n client.close();\n }\n },\n ping: async () => {\n await client.execute(\"SELECT 1\");\n },\n });\n}\n\nconst SUPPORTED_URL = /^(?<proto>libsql|https?|wss?):\\/\\/|^file:|^:memory:/u;\n\nfunction isSupportedUrl(url: string): boolean {\n return SUPPORTED_URL.test(url);\n}\n\n/** Resolve the libSQL client, distinguishing caller-owned from owned. */\nfunction resolveClient(options: TursoDatabaseOptions): { client: LibsqlClient; owned: boolean } {\n if (options.client) {\n return { client: options.client, owned: false };\n }\n const url = options.url?.trim();\n if (!url) {\n throw new Error(\n \"createTursoDatabase: provide `url` (or `syncUrl` with a `file:` url) or a preconfigured `client`\",\n );\n }\n if (!isSupportedUrl(url)) {\n throw new Error(\n `createTursoDatabase: unsupported url \"${url}\" (expected libsql://, https://, wss://, file:, or :memory:)`,\n );\n }\n return {\n client: createNodeClient({\n url,\n authToken: options.authToken,\n syncUrl: options.syncUrl,\n syncInterval: options.syncInterval,\n }),\n owned: true,\n };\n}\n\n/**\n * Load the default Node client only when a URL is used. Importing\n * `@libsql/client` at module load pulls in its native addon, which makes a\n * process that only injects a `sqlite3` client (tests, embedded replicas)\n * crash on teardown under some Node versions.\n */\nlet nodeCreateClient: CreateClient | undefined;\n\nfunction createNodeClient(config: Parameters<CreateClient>[0]): Client {\n nodeCreateClient ??= (\n createRequire(import.meta.url)(\"@libsql/client\") as { createClient: CreateClient }\n ).createClient;\n return nodeCreateClient(config);\n}\n\nconst WEBHOOK_SECRET_DROP = \"ALTER TABLE webhooks DROP COLUMN secret\";\n\nasync function runMigrations(client: LibsqlClient): Promise<void> {\n await client.executeMultiple(DDL);\n await ensureColumns(client, DDL);\n for (const statement of IDENTITY_STATEMENTS) {\n // oxlint-disable-next-line no-await-in-loop -- ordered: drop old indexes, then create new\n await execIgnore(client, statement);\n }\n await execIgnore(client, WEBHOOK_SECRET_DROP);\n await migrateCommentsTable(client);\n}\n\n/** Add any DDL column missing from a volume created before it shipped. */\nasync function ensureColumns(client: LibsqlClient, ddl: string): Promise<void> {\n const inspected = await Promise.all(\n [...tableColumns(ddl)].map(async ([table, columns]) => {\n const result = await client.execute(`PRAGMA table_info(${table})`);\n const rows = result.rows as unknown as { name: unknown }[];\n const existing = new Set(rows.map((row) => String(row.name)));\n return { table, columns, existing };\n }),\n );\n const statements = inspected.flatMap(({ table, columns, existing }) =>\n columns\n .filter((column) => isMissing(column, existing))\n .map((column) => [table, column] as const),\n );\n await Promise.all(\n statements.map(async ([table, column]) => {\n await execIgnore(client, `ALTER TABLE ${table} ADD COLUMN ${column}`);\n }),\n );\n}\n\nfunction isMissing(column: string, existing: Set<string>): boolean {\n const [name] = column.split(/\\s+/u);\n return name !== undefined && !existing.has(name);\n}\n\nasync function execIgnore(client: LibsqlClient, sql: string): Promise<void> {\n try {\n await client.execute(sql);\n } catch {\n // idempotent — already migrated\n }\n}\n\nasync function migrateCommentsTable(client: LibsqlClient): Promise<void> {\n try {\n const result = await client.execute(\n \"SELECT sql FROM sqlite_master WHERE type='table' AND name='comments'\",\n );\n const sql = (result.rows[0] as unknown as { sql: string } | undefined)?.sql;\n if (!sql?.includes(\"user_id TEXT NOT NULL REFERENCES users\")) {\n return;\n }\n await recreateCommentsTable(client);\n } catch {\n await execIgnore(client, \"PRAGMA foreign_keys = ON\");\n }\n}\n\nasync function recreateCommentsTable(client: LibsqlClient): Promise<void> {\n await client.execute(\"PRAGMA foreign_keys = OFF\");\n await client.execute(`\n CREATE TABLE comments_new (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n build_id TEXT NOT NULL REFERENCES builds(id) ON DELETE CASCADE,\n snapshot_id TEXT REFERENCES snapshots(id) ON DELETE CASCADE,\n user_id TEXT REFERENCES users(id) ON DELETE CASCADE,\n body TEXT NOT NULL,\n parent_id TEXT,\n resolved INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )\n `);\n await client.execute(\"INSERT INTO comments_new SELECT * FROM comments\");\n await client.execute(\"DROP TABLE comments\");\n await client.execute(\"ALTER TABLE comments_new RENAME TO comments\");\n await client.execute(\"CREATE INDEX IF NOT EXISTS comments_build_id_idx ON comments (build_id)\");\n await client.execute(\"PRAGMA foreign_keys = ON\");\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storyshelf/db-sqlite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "SQLite database adapter for StoryShelf (node:sqlite + Drizzle).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"database",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"prepublishOnly": "nub run build"
|
|
88
88
|
},
|
|
89
89
|
"dependencies": {
|
|
90
|
-
"@storyshelf/core": "0.
|
|
90
|
+
"@storyshelf/core": "0.7.0",
|
|
91
91
|
"drizzle-orm": "^0.44.0"
|
|
92
92
|
},
|
|
93
93
|
"devDependencies": {
|
|
@@ -114,6 +114,9 @@
|
|
|
114
114
|
"optional": true
|
|
115
115
|
}
|
|
116
116
|
},
|
|
117
|
+
"engines": {
|
|
118
|
+
"node": ">=24"
|
|
119
|
+
},
|
|
117
120
|
"jsr": {
|
|
118
121
|
"runtimeCompat": {
|
|
119
122
|
"node": true,
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { projects } from "./project.mjs";
|
|
5
|
-
import { sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
6
|
-
//#region src/schema/status-config.ts
|
|
7
|
-
/** Narrow `project_status_configs` table definition. */
|
|
8
|
-
const projectStatusConfigs = sqliteTable("project_status_configs", {
|
|
9
|
-
id: text("id").primaryKey(),
|
|
10
|
-
projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
|
|
11
|
-
provider: text("provider").notNull(),
|
|
12
|
-
config: text("config").notNull(),
|
|
13
|
-
tokenEncrypted: text("token_encrypted").notNull(),
|
|
14
|
-
createdAt: text("created_at").notNull(),
|
|
15
|
-
updatedAt: text("updated_at").notNull()
|
|
16
|
-
});
|
|
17
|
-
//#endregion
|
|
18
|
-
export { projectStatusConfigs };
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=status-config.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status-config.mjs","names":[],"sources":["../../src/schema/status-config.ts"],"sourcesContent":["import { sqliteTable, text } from \"drizzle-orm/sqlite-core\";\nimport { projects } from \"./project.ts\";\n\n/** Narrow `project_status_configs` table definition. */\nexport const projectStatusConfigs = sqliteTable(\"project_status_configs\", {\n id: text(\"id\").primaryKey(),\n projectId: text(\"project_id\")\n .notNull()\n .references(() => projects.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n config: text(\"config\").notNull(),\n tokenEncrypted: text(\"token_encrypted\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n});\n\n/** A project status-config row. */\nexport interface ProjectStatusConfig {\n id: string;\n projectId: string;\n provider: string;\n config: string;\n tokenEncrypted: string;\n createdAt: string;\n updatedAt: string;\n}\n"],"mappings":";;;;;;;AAIA,MAAa,uBAAuB,YAAY,0BAA0B;CACxE,IAAI,KAAK,IAAI,CAAC,CAAC,WAAW;CAC1B,WAAW,KAAK,YAAY,CAAC,CAC1B,QAAQ,CAAC,CACT,iBAAiB,SAAS,IAAI,EAAE,UAAU,UAAU,CAAC;CACxD,UAAU,KAAK,UAAU,CAAC,CAAC,QAAQ;CACnC,QAAQ,KAAK,QAAQ,CAAC,CAAC,QAAQ;CAC/B,gBAAgB,KAAK,iBAAiB,CAAC,CAAC,QAAQ;CAChD,WAAW,KAAK,YAAY,CAAC,CAAC,QAAQ;CACtC,WAAW,KAAK,YAAY,CAAC,CAAC,QAAQ;AACxC,CAAC"}
|