@sylphx/flow 0.2.12 → 1.0.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/CHANGELOG.md +185 -0
- package/LOOP_MODE.md +446 -0
- package/package.json +44 -93
- package/README.md +0 -625
- package/assets/agents/coder.md +0 -32
- package/assets/agents/orchestrator.md +0 -36
- package/assets/agents/reviewer.md +0 -30
- package/assets/agents/writer.md +0 -30
- package/assets/knowledge/data/sql.md +0 -216
- package/assets/knowledge/guides/saas-template.md +0 -85
- package/assets/knowledge/guides/system-prompt.md +0 -344
- package/assets/knowledge/guides/tech-stack.md +0 -92
- package/assets/knowledge/guides/ui-ux.md +0 -44
- package/assets/knowledge/stacks/nextjs-app.md +0 -165
- package/assets/knowledge/stacks/node-api.md +0 -220
- package/assets/knowledge/stacks/react-app.md +0 -232
- package/assets/knowledge/universal/deployment.md +0 -109
- package/assets/knowledge/universal/performance.md +0 -121
- package/assets/knowledge/universal/security.md +0 -79
- package/assets/knowledge/universal/testing.md +0 -111
- package/assets/output-styles/silent.md +0 -23
- package/assets/rules/core.md +0 -144
- package/assets/slash-commands/commit.md +0 -23
- package/assets/slash-commands/context.md +0 -112
- package/assets/slash-commands/explain.md +0 -35
- package/assets/slash-commands/mep.md +0 -63
- package/assets/slash-commands/review.md +0 -39
- package/assets/slash-commands/test.md +0 -30
- package/dist/assets/agents/coder.md +0 -32
- package/dist/assets/agents/orchestrator.md +0 -36
- package/dist/assets/agents/reviewer.md +0 -30
- package/dist/assets/agents/writer.md +0 -30
- package/dist/assets/knowledge/data/sql.md +0 -216
- package/dist/assets/knowledge/guides/saas-template.md +0 -85
- package/dist/assets/knowledge/guides/system-prompt.md +0 -344
- package/dist/assets/knowledge/guides/tech-stack.md +0 -92
- package/dist/assets/knowledge/guides/ui-ux.md +0 -44
- package/dist/assets/knowledge/stacks/nextjs-app.md +0 -165
- package/dist/assets/knowledge/stacks/node-api.md +0 -220
- package/dist/assets/knowledge/stacks/react-app.md +0 -232
- package/dist/assets/knowledge/universal/deployment.md +0 -109
- package/dist/assets/knowledge/universal/performance.md +0 -121
- package/dist/assets/knowledge/universal/security.md +0 -79
- package/dist/assets/knowledge/universal/testing.md +0 -111
- package/dist/assets/output-styles/silent.md +0 -23
- package/dist/assets/rules/core.md +0 -144
- package/dist/assets/slash-commands/commit.md +0 -23
- package/dist/assets/slash-commands/context.md +0 -112
- package/dist/assets/slash-commands/explain.md +0 -35
- package/dist/assets/slash-commands/mep.md +0 -63
- package/dist/assets/slash-commands/review.md +0 -39
- package/dist/assets/slash-commands/test.md +0 -30
- package/dist/chunk-01gv4qey.js +0 -4
- package/dist/chunk-01gv4qey.js.map +0 -11
- package/dist/chunk-3m9whg4q.js +0 -4
- package/dist/chunk-3m9whg4q.js.map +0 -9
- package/dist/chunk-3w6pd43t.js +0 -25
- package/dist/chunk-3w6pd43t.js.map +0 -61
- package/dist/chunk-4nm4ere4.js +0 -4
- package/dist/chunk-4nm4ere4.js.map +0 -11
- package/dist/chunk-4vrj3f8r.js +0 -26
- package/dist/chunk-4vrj3f8r.js.map +0 -75
- package/dist/chunk-5njgv5k5.js +0 -161
- package/dist/chunk-5njgv5k5.js.map +0 -83
- package/dist/chunk-67n29s4q.js +0 -7
- package/dist/chunk-67n29s4q.js.map +0 -10
- package/dist/chunk-86ce45n6.js +0 -3
- package/dist/chunk-86ce45n6.js.map +0 -10
- package/dist/chunk-99pz5wm0.js +0 -75
- package/dist/chunk-99pz5wm0.js.map +0 -12
- package/dist/chunk-cv1nhr27.js +0 -2
- package/dist/chunk-cv1nhr27.js.map +0 -9
- package/dist/chunk-d409xn8f.js +0 -6
- package/dist/chunk-d409xn8f.js.map +0 -11
- package/dist/chunk-g0qpndpd.js +0 -23
- package/dist/chunk-g0qpndpd.js.map +0 -132
- package/dist/chunk-g4baca7p.js +0 -10
- package/dist/chunk-g4baca7p.js.map +0 -23
- package/dist/chunk-gc66xe7z.js +0 -4
- package/dist/chunk-gc66xe7z.js.map +0 -11
- package/dist/chunk-hj6qtsqp.js +0 -15
- package/dist/chunk-hj6qtsqp.js.map +0 -10
- package/dist/chunk-jbd95k1f.js +0 -14
- package/dist/chunk-jbd95k1f.js.map +0 -20
- package/dist/chunk-kn908zkk.js +0 -4
- package/dist/chunk-kn908zkk.js.map +0 -10
- package/dist/chunk-mw13a082.js +0 -4
- package/dist/chunk-mw13a082.js.map +0 -10
- package/dist/chunk-nke51f3c.js +0 -4
- package/dist/chunk-nke51f3c.js.map +0 -10
- package/dist/chunk-ns5atzyz.js +0 -3
- package/dist/chunk-ns5atzyz.js.map +0 -10
- package/dist/chunk-pp4r3hp4.js +0 -105
- package/dist/chunk-pp4r3hp4.js.map +0 -27
- package/dist/chunk-q4nh3vst.js +0 -54
- package/dist/chunk-q4nh3vst.js.map +0 -53
- package/dist/chunk-q5gqgs0p.js +0 -4
- package/dist/chunk-q5gqgs0p.js.map +0 -10
- package/dist/chunk-s9bsh0gp.js +0 -4
- package/dist/chunk-s9bsh0gp.js.map +0 -10
- package/dist/chunk-ss51dw5h.js +0 -27
- package/dist/chunk-ss51dw5h.js.map +0 -23
- package/dist/chunk-waemzsf4.js +0 -4
- package/dist/chunk-waemzsf4.js.map +0 -10
- package/dist/chunk-xs370t8p.js +0 -119
- package/dist/chunk-xs370t8p.js.map +0 -26
- package/dist/chunk-xtrn4wn0.js +0 -3
- package/dist/chunk-xtrn4wn0.js.map +0 -10
- package/dist/chunk-xvfz960r.js +0 -4
- package/dist/chunk-xvfz960r.js.map +0 -12
- package/dist/chunk-xytc0fks.js +0 -27
- package/dist/chunk-xytc0fks.js.map +0 -14
- package/dist/chunk-yxv7hqse.js +0 -23
- package/dist/chunk-yxv7hqse.js.map +0 -11
- package/dist/chunk-zv5y8yfq.js +0 -19
- package/dist/chunk-zv5y8yfq.js.map +0 -11
- package/dist/index.js +0 -854
- package/dist/index.js.map +0 -903
- package/drizzle/0000_wooden_lady_bullseye.sql +0 -52
- package/drizzle/0001_material_pyro.sql +0 -85
- package/drizzle/0002_lyrical_random.sql +0 -2
- package/drizzle/0003_romantic_lockjaw.sql +0 -4
- package/drizzle/0004_blushing_meteorite.sql +0 -6
- package/drizzle/meta/0000_snapshot.json +0 -310
- package/drizzle/meta/0001_snapshot.json +0 -906
- package/drizzle/meta/0002_snapshot.json +0 -920
- package/drizzle/meta/0003_snapshot.json +0 -920
- package/drizzle/meta/0004_snapshot.json +0 -921
- package/drizzle/meta/_journal.json +0 -41
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/@neon-rs/load/dist/index.js", "../node_modules/libsql/node_modules/detect-libc/lib/process.js", "../node_modules/libsql/node_modules/detect-libc/lib/filesystem.js", "../node_modules/libsql/node_modules/detect-libc/lib/detect-libc.js", "../node_modules/libsql/auth.js", "../node_modules/libsql/sqlite-error.js", "../node_modules/libsql/index.js", "../node_modules/promise-limit/index.js", "../src/db/database.ts", "../node_modules/drizzle-orm/entity.js", "../node_modules/drizzle-orm/column.js", "../node_modules/drizzle-orm/column-builder.js", "../node_modules/drizzle-orm/table.utils.js", "../node_modules/drizzle-orm/tracing-utils.js", "../node_modules/drizzle-orm/pg-core/unique-constraint.js", "../node_modules/drizzle-orm/pg-core/columns/common.js", "../node_modules/drizzle-orm/pg-core/columns/enum.js", "../node_modules/drizzle-orm/subquery.js", "../node_modules/drizzle-orm/version.js", "../node_modules/drizzle-orm/tracing.js", "../node_modules/drizzle-orm/view-common.js", "../node_modules/drizzle-orm/table.js", "../node_modules/drizzle-orm/sql/sql.js", "../node_modules/drizzle-orm/alias.js", "../node_modules/drizzle-orm/errors.js", "../node_modules/drizzle-orm/logger.js", "../node_modules/drizzle-orm/query-promise.js", "../node_modules/drizzle-orm/utils.js", "../node_modules/drizzle-orm/pg-core/table.js", "../node_modules/drizzle-orm/pg-core/primary-keys.js", "../node_modules/drizzle-orm/sql/expressions/conditions.js", "../node_modules/drizzle-orm/sql/expressions/select.js", "../node_modules/drizzle-orm/relations.js", "../src/db/session-repository.ts", "../node_modules/drizzle-orm/sqlite-core/foreign-keys.js", "../node_modules/drizzle-orm/sqlite-core/unique-constraint.js", "../node_modules/drizzle-orm/sqlite-core/columns/common.js", "../node_modules/drizzle-orm/sqlite-core/columns/blob.js", "../node_modules/drizzle-orm/sqlite-core/columns/custom.js", "../node_modules/drizzle-orm/sqlite-core/columns/integer.js", "../node_modules/drizzle-orm/sqlite-core/columns/numeric.js", "../node_modules/drizzle-orm/sqlite-core/columns/real.js", "../node_modules/drizzle-orm/sqlite-core/columns/text.js", "../node_modules/drizzle-orm/selection-proxy.js", "../node_modules/drizzle-orm/sqlite-core/columns/all.js", "../node_modules/drizzle-orm/sqlite-core/table.js", "../node_modules/drizzle-orm/sqlite-core/indexes.js", "../node_modules/drizzle-orm/sqlite-core/primary-keys.js", "../node_modules/drizzle-orm/sqlite-core/utils.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/delete.js", "../node_modules/drizzle-orm/casing.js", "../node_modules/drizzle-orm/sqlite-core/view-base.js", "../node_modules/drizzle-orm/sqlite-core/dialect.js", "../node_modules/drizzle-orm/query-builders/query-builder.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/select.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/insert.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/update.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/count.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/query.js", "../node_modules/drizzle-orm/sqlite-core/query-builders/raw.js", "../node_modules/drizzle-orm/sqlite-core/db.js", "../node_modules/drizzle-orm/cache/core/cache.js", "../node_modules/drizzle-orm/sqlite-core/session.js", "../src/db/schema.ts", "../src/db/auto-migrate.ts", "../node_modules/@libsql/core/lib-esm/api.js", "../node_modules/@libsql/core/lib-esm/uri.js", "../node_modules/js-base64/base64.mjs", "../node_modules/@libsql/core/lib-esm/util.js", "../node_modules/@libsql/core/lib-esm/config.js", "../node_modules/@libsql/client/lib-esm/sqlite3.js", "../node_modules/@libsql/hrana-client/lib-esm/client.js", "../node_modules/@libsql/hrana-client/lib-esm/errors.js", "../node_modules/@libsql/hrana-client/lib-esm/encoding/json/decode.js", "../node_modules/@libsql/hrana-client/lib-esm/encoding/json/encode.js", "../node_modules/@libsql/hrana-client/lib-esm/encoding/protobuf/util.js", "../node_modules/@libsql/hrana-client/lib-esm/encoding/protobuf/decode.js", "../node_modules/@libsql/hrana-client/lib-esm/encoding/protobuf/encode.js", "../node_modules/@libsql/hrana-client/lib-esm/id_alloc.js", "../node_modules/@libsql/hrana-client/lib-esm/util.js", "../node_modules/@libsql/hrana-client/lib-esm/value.js", "../node_modules/@libsql/hrana-client/lib-esm/result.js", "../node_modules/@libsql/hrana-client/lib-esm/sql.js", "../node_modules/@libsql/hrana-client/lib-esm/queue.js", "../node_modules/@libsql/hrana-client/lib-esm/stmt.js", "../node_modules/@libsql/hrana-client/lib-esm/batch.js", "../node_modules/@libsql/hrana-client/lib-esm/describe.js", "../node_modules/@libsql/hrana-client/lib-esm/stream.js", "../node_modules/@libsql/hrana-client/lib-esm/cursor.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/cursor.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/stream.js", "../node_modules/@libsql/hrana-client/lib-esm/shared/json_encode.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/json_encode.js", "../node_modules/@libsql/hrana-client/lib-esm/shared/protobuf_encode.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/protobuf_encode.js", "../node_modules/@libsql/hrana-client/lib-esm/shared/json_decode.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/json_decode.js", "../node_modules/@libsql/hrana-client/lib-esm/shared/protobuf_decode.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/protobuf_decode.js", "../node_modules/@libsql/hrana-client/lib-esm/ws/client.js", "../node_modules/@libsql/isomorphic-fetch/node.js", "../node_modules/@libsql/hrana-client/lib-esm/queue_microtask.js", "../node_modules/@libsql/hrana-client/lib-esm/byte_queue.js", "../node_modules/@libsql/hrana-client/lib-esm/http/json_decode.js", "../node_modules/@libsql/hrana-client/lib-esm/http/protobuf_decode.js", "../node_modules/@libsql/hrana-client/lib-esm/http/cursor.js", "../node_modules/@libsql/hrana-client/lib-esm/http/json_encode.js", "../node_modules/@libsql/hrana-client/lib-esm/http/protobuf_encode.js", "../node_modules/@libsql/hrana-client/lib-esm/http/stream.js", "../node_modules/@libsql/hrana-client/lib-esm/http/client.js", "../node_modules/@libsql/hrana-client/lib-esm/index.js", "../node_modules/@libsql/client/lib-esm/hrana.js", "../node_modules/@libsql/client/lib-esm/sql_cache.js", "../node_modules/@libsql/client/lib-esm/ws.js", "../node_modules/@libsql/client/lib-esm/http.js", "../node_modules/@libsql/client/lib-esm/node.js", "../node_modules/drizzle-orm/libsql/session.js", "../node_modules/drizzle-orm/libsql/driver-core.js", "../node_modules/drizzle-orm/libsql/driver.js", "../node_modules/drizzle-orm/migrator.js", "../node_modules/drizzle-orm/libsql/migrator.js", "../src/utils/session-manager.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.load = exports.currentTarget = void 0;\nconst path = __importStar(require(\"path\"));\nconst fs = __importStar(require(\"fs\"));\nfunction currentTarget() {\n let os = null;\n switch (process.platform) {\n case 'android':\n switch (process.arch) {\n case 'arm':\n return 'android-arm-eabi';\n case 'arm64':\n return 'android-arm64';\n }\n os = 'Android';\n break;\n case 'win32':\n switch (process.arch) {\n case 'x64':\n return 'win32-x64-msvc';\n case 'arm64':\n return 'win32-arm64-msvc';\n case 'ia32':\n return 'win32-ia32-msvc';\n }\n os = 'Windows';\n break;\n case 'darwin':\n switch (process.arch) {\n case 'x64':\n return 'darwin-x64';\n case 'arm64':\n return 'darwin-arm64';\n }\n os = 'macOS';\n break;\n case 'linux':\n switch (process.arch) {\n case 'x64':\n case 'arm64':\n return isGlibc()\n ? `linux-${process.arch}-gnu`\n : `linux-${process.arch}-musl`;\n case 'arm':\n return 'linux-arm-gnueabihf';\n }\n os = 'Linux';\n break;\n case 'freebsd':\n if (process.arch === 'x64') {\n return 'freebsd-x64';\n }\n os = 'FreeBSD';\n break;\n }\n if (os) {\n throw new Error(`Neon: unsupported ${os} architecture: ${process.arch}`);\n }\n throw new Error(`Neon: unsupported system: ${process.platform}`);\n}\nexports.currentTarget = currentTarget;\nfunction isGlibc() {\n // Cast to unknown to work around a bug in the type definition:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/40140\n const report = process.report?.getReport();\n if ((typeof report !== 'object') || !report || (!('header' in report))) {\n return false;\n }\n const header = report.header;\n return (typeof header === 'object') &&\n !!header &&\n ('glibcVersionRuntime' in header);\n}\nfunction load(dirname) {\n const m = path.join(dirname, \"index.node\");\n return fs.existsSync(m) ? require(m) : null;\n}\nexports.load = load;\n",
|
|
6
|
-
"// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst isLinux = () => process.platform === 'linux';\n\nlet report = null;\nconst getReport = () => {\n if (!report) {\n /* istanbul ignore next */\n report = isLinux() && process.report\n ? process.report.getReport()\n : {};\n }\n return report;\n};\n\nmodule.exports = { isLinux, getReport };\n",
|
|
7
|
-
"// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst fs = require('fs');\n\n/**\n * The path where we can find the ldd\n */\nconst LDD_PATH = '/usr/bin/ldd';\n\n/**\n * Read the content of a file synchronous\n *\n * @param {string} path\n * @returns {string}\n */\nconst readFileSync = (path) => fs.readFileSync(path, 'utf-8');\n\n/**\n * Read the content of a file\n *\n * @param {string} path\n * @returns {Promise<string>}\n */\nconst readFile = (path) => new Promise((resolve, reject) => {\n fs.readFile(path, 'utf-8', (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n });\n});\n\nmodule.exports = {\n LDD_PATH,\n readFileSync,\n readFile\n};\n",
|
|
8
|
-
"// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst childProcess = require('child_process');\nconst { isLinux, getReport } = require('./process');\nconst { LDD_PATH, readFile, readFileSync } = require('./filesystem');\n\nlet cachedFamilyFilesystem;\nlet cachedVersionFilesystem;\n\nconst command = 'getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true';\nlet commandOut = '';\n\nconst safeCommand = () => {\n if (!commandOut) {\n return new Promise((resolve) => {\n childProcess.exec(command, (err, out) => {\n commandOut = err ? ' ' : out;\n resolve(commandOut);\n });\n });\n }\n return commandOut;\n};\n\nconst safeCommandSync = () => {\n if (!commandOut) {\n try {\n commandOut = childProcess.execSync(command, { encoding: 'utf8' });\n } catch (_err) {\n commandOut = ' ';\n }\n }\n return commandOut;\n};\n\n/**\n * A String constant containing the value `glibc`.\n * @type {string}\n * @public\n */\nconst GLIBC = 'glibc';\n\n/**\n * A Regexp constant to get the GLIBC Version.\n * @type {string}\n */\nconst RE_GLIBC_VERSION = /GLIBC\\s(\\d+\\.\\d+)/;\n\n/**\n * A String constant containing the value `musl`.\n * @type {string}\n * @public\n */\nconst MUSL = 'musl';\n\n/**\n * This string is used to find if the {@link LDD_PATH} is GLIBC\n * @type {string}\n */\nconst GLIBC_ON_LDD = GLIBC.toUpperCase();\n\n/**\n * This string is used to find if the {@link LDD_PATH} is musl\n * @type {string}\n */\nconst MUSL_ON_LDD = MUSL.toLowerCase();\n\nconst isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-');\n\nconst familyFromReport = () => {\n const report = getReport();\n if (report.header && report.header.glibcVersionRuntime) {\n return GLIBC;\n }\n if (Array.isArray(report.sharedObjects)) {\n if (report.sharedObjects.some(isFileMusl)) {\n return MUSL;\n }\n }\n return null;\n};\n\nconst familyFromCommand = (out) => {\n const [getconf, ldd1] = out.split(/[\\r\\n]+/);\n if (getconf && getconf.includes(GLIBC)) {\n return GLIBC;\n }\n if (ldd1 && ldd1.includes(MUSL)) {\n return MUSL;\n }\n return null;\n};\n\nconst getFamilyFromLddContent = (content) => {\n if (content.includes(MUSL_ON_LDD)) {\n return MUSL;\n }\n if (content.includes(GLIBC_ON_LDD)) {\n return GLIBC;\n }\n return null;\n};\n\nconst familyFromFilesystem = async () => {\n if (cachedFamilyFilesystem !== undefined) {\n return cachedFamilyFilesystem;\n }\n cachedFamilyFilesystem = null;\n try {\n const lddContent = await readFile(LDD_PATH);\n cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);\n } catch (e) {}\n return cachedFamilyFilesystem;\n};\n\nconst familyFromFilesystemSync = () => {\n if (cachedFamilyFilesystem !== undefined) {\n return cachedFamilyFilesystem;\n }\n cachedFamilyFilesystem = null;\n try {\n const lddContent = readFileSync(LDD_PATH);\n cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);\n } catch (e) {}\n return cachedFamilyFilesystem;\n};\n\n/**\n * Resolves with the libc family when it can be determined, `null` otherwise.\n * @returns {Promise<?string>}\n */\nconst family = async () => {\n let family = null;\n if (isLinux()) {\n family = await familyFromFilesystem();\n if (!family) {\n family = familyFromReport();\n }\n if (!family) {\n const out = await safeCommand();\n family = familyFromCommand(out);\n }\n }\n return family;\n};\n\n/**\n * Returns the libc family when it can be determined, `null` otherwise.\n * @returns {?string}\n */\nconst familySync = () => {\n let family = null;\n if (isLinux()) {\n family = familyFromFilesystemSync();\n if (!family) {\n family = familyFromReport();\n }\n if (!family) {\n const out = safeCommandSync();\n family = familyFromCommand(out);\n }\n }\n return family;\n};\n\n/**\n * Resolves `true` only when the platform is Linux and the libc family is not `glibc`.\n * @returns {Promise<boolean>}\n */\nconst isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;\n\n/**\n * Returns `true` only when the platform is Linux and the libc family is not `glibc`.\n * @returns {boolean}\n */\nconst isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;\n\nconst versionFromFilesystem = async () => {\n if (cachedVersionFilesystem !== undefined) {\n return cachedVersionFilesystem;\n }\n cachedVersionFilesystem = null;\n try {\n const lddContent = await readFile(LDD_PATH);\n const versionMatch = lddContent.match(RE_GLIBC_VERSION);\n if (versionMatch) {\n cachedVersionFilesystem = versionMatch[1];\n }\n } catch (e) {}\n return cachedVersionFilesystem;\n};\n\nconst versionFromFilesystemSync = () => {\n if (cachedVersionFilesystem !== undefined) {\n return cachedVersionFilesystem;\n }\n cachedVersionFilesystem = null;\n try {\n const lddContent = readFileSync(LDD_PATH);\n const versionMatch = lddContent.match(RE_GLIBC_VERSION);\n if (versionMatch) {\n cachedVersionFilesystem = versionMatch[1];\n }\n } catch (e) {}\n return cachedVersionFilesystem;\n};\n\nconst versionFromReport = () => {\n const report = getReport();\n if (report.header && report.header.glibcVersionRuntime) {\n return report.header.glibcVersionRuntime;\n }\n return null;\n};\n\nconst versionSuffix = (s) => s.trim().split(/\\s+/)[1];\n\nconst versionFromCommand = (out) => {\n const [getconf, ldd1, ldd2] = out.split(/[\\r\\n]+/);\n if (getconf && getconf.includes(GLIBC)) {\n return versionSuffix(getconf);\n }\n if (ldd1 && ldd2 && ldd1.includes(MUSL)) {\n return versionSuffix(ldd2);\n }\n return null;\n};\n\n/**\n * Resolves with the libc version when it can be determined, `null` otherwise.\n * @returns {Promise<?string>}\n */\nconst version = async () => {\n let version = null;\n if (isLinux()) {\n version = await versionFromFilesystem();\n if (!version) {\n version = versionFromReport();\n }\n if (!version) {\n const out = await safeCommand();\n version = versionFromCommand(out);\n }\n }\n return version;\n};\n\n/**\n * Returns the libc version when it can be determined, `null` otherwise.\n * @returns {?string}\n */\nconst versionSync = () => {\n let version = null;\n if (isLinux()) {\n version = versionFromFilesystemSync();\n if (!version) {\n version = versionFromReport();\n }\n if (!version) {\n const out = safeCommandSync();\n version = versionFromCommand(out);\n }\n }\n return version;\n};\n\nmodule.exports = {\n GLIBC,\n MUSL,\n family,\n familySync,\n isNonGlibcLinux,\n isNonGlibcLinuxSync,\n version,\n versionSync\n};\n",
|
|
9
|
-
"/**\n * Authorization outcome.\n *\n * @readonly\n * @enum {number}\n * @property {number} ALLOW - Allow access to a resource.\n * @property {number} DENY - Deny access to a resource and throw an error.\n */\nconst Authorization = {\n /**\n * Allow access to a resource.\n * @type {number}\n */\n ALLOW: 0,\n\n /**\n * Deny access to a resource and throw an error in `prepare()`.\n * @type {number}\n */\n DENY: 1,\n};\nmodule.exports = Authorization;\n",
|
|
10
|
-
"'use strict';\nconst descriptor = { value: 'SqliteError', writable: true, enumerable: false, configurable: true };\n\nfunction SqliteError(message, code, rawCode) {\n if (new.target !== SqliteError) {\n return new SqliteError(message, code);\n }\n if (typeof code !== 'string') {\n throw new TypeError('Expected second argument to be a string');\n }\n Error.call(this, message);\n descriptor.value = '' + message;\n Object.defineProperty(this, 'message', descriptor);\n Error.captureStackTrace(this, SqliteError);\n this.code = code;\n this.rawCode = rawCode\n}\nObject.setPrototypeOf(SqliteError, Error);\nObject.setPrototypeOf(SqliteError.prototype, Error.prototype);\nObject.defineProperty(SqliteError.prototype, 'name', descriptor);\nmodule.exports = SqliteError;\n",
|
|
11
|
-
"\"use strict\";\n\nconst { load, currentTarget } = require(\"@neon-rs/load\");\nconst { familySync, GLIBC, MUSL } = require(\"detect-libc\");\n\nfunction requireNative() {\n if (process.env.LIBSQL_JS_DEV) {\n return load(__dirname)\n }\n let target = currentTarget();\n // Workaround for Bun, which reports a musl target, but really wants glibc...\n if (familySync() == GLIBC) {\n switch (target) {\n case \"linux-x64-musl\":\n target = \"linux-x64-gnu\";\n break;\n case \"linux-arm64-musl\":\n target = \"linux-arm64-gnu\";\n break;\n }\n }\n // @neon-rs/load doesn't detect arm musl\n if (target === \"linux-arm-gnueabihf\" && familySync() == MUSL) {\n target = \"linux-arm-musleabihf\";\n }\n return require(`@libsql/${target}`);\n}\n\nconst {\n databaseOpen,\n databaseOpenWithSync,\n databaseInTransaction,\n databaseInterrupt,\n databaseClose,\n databaseSyncSync,\n databaseSyncUntilSync,\n databaseExecSync,\n databasePrepareSync,\n databaseDefaultSafeIntegers,\n databaseAuthorizer,\n databaseLoadExtension,\n databaseMaxWriteReplicationIndex,\n statementRaw,\n statementIsReader,\n statementGet,\n statementRun,\n statementInterrupt,\n statementRowsSync,\n statementColumns,\n statementSafeIntegers,\n rowsNext,\n} = requireNative();\n\nconst Authorization = require(\"./auth\");\nconst SqliteError = require(\"./sqlite-error\");\n\nfunction convertError(err) {\n if (err.libsqlError) {\n return new SqliteError(err.message, err.code, err.rawCode);\n }\n return err;\n}\n\n/**\n * Database represents a connection that can prepare and execute SQL statements.\n */\nclass Database {\n /**\n * Creates a new database connection. If the database file pointed to by `path` does not exists, it will be created.\n *\n * @constructor\n * @param {string} path - Path to the database file.\n */\n constructor(path, opts) {\n const encryptionCipher = opts?.encryptionCipher ?? \"aes256cbc\";\n if (opts && opts.syncUrl) {\n var authToken = \"\";\n if (opts.syncAuth) {\n console.warn(\"Warning: The `syncAuth` option is deprecated, please use `authToken` option instead.\");\n authToken = opts.syncAuth;\n } else if (opts.authToken) {\n authToken = opts.authToken;\n }\n const encryptionKey = opts?.encryptionKey ?? \"\";\n const syncPeriod = opts?.syncPeriod ?? 0.0;\n const readYourWrites = opts?.readYourWrites ?? true;\n const offline = opts?.offline ?? false;\n const remoteEncryptionKey = opts?.remoteEncryptionKey ?? \"\";\n this.db = databaseOpenWithSync(path, opts.syncUrl, authToken, encryptionCipher, encryptionKey, syncPeriod, readYourWrites, offline, remoteEncryptionKey);\n } else {\n const authToken = opts?.authToken ?? \"\";\n const encryptionKey = opts?.encryptionKey ?? \"\";\n const timeout = opts?.timeout ?? 0.0;\n const remoteEncryptionKey = opts?.remoteEncryptionKey ?? \"\";\n this.db = databaseOpen(path, authToken, encryptionCipher, encryptionKey, timeout, remoteEncryptionKey);\n }\n // TODO: Use a libSQL API for this?\n this.memory = path === \":memory:\";\n this.readonly = false;\n this.name = \"\";\n this.open = true;\n\n const db = this.db;\n Object.defineProperties(this, {\n inTransaction: {\n get() {\n return databaseInTransaction(db);\n }\n },\n });\n }\n\n sync() {\n return databaseSyncSync.call(this.db);\n }\n\n syncUntil(replicationIndex) {\n return databaseSyncUntilSync.call(this.db, replicationIndex);\n }\n\n /**\n * Prepares a SQL statement for execution.\n *\n * @param {string} sql - The SQL statement string to prepare.\n */\n prepare(sql) {\n try {\n const stmt = databasePrepareSync.call(this.db, sql);\n return new Statement(stmt);\n } catch (err) {\n throw convertError(err);\n }\n }\n\n /**\n * Returns a function that executes the given function in a transaction.\n *\n * @param {function} fn - The function to wrap in a transaction.\n */\n transaction(fn) {\n if (typeof fn !== \"function\")\n throw new TypeError(\"Expected first argument to be a function\");\n\n const db = this;\n const wrapTxn = (mode) => {\n return (...bindParameters) => {\n db.exec(\"BEGIN \" + mode);\n try {\n const result = fn(...bindParameters);\n db.exec(\"COMMIT\");\n return result;\n } catch (err) {\n db.exec(\"ROLLBACK\");\n throw err;\n }\n };\n };\n const properties = {\n default: { value: wrapTxn(\"\") },\n deferred: { value: wrapTxn(\"DEFERRED\") },\n immediate: { value: wrapTxn(\"IMMEDIATE\") },\n exclusive: { value: wrapTxn(\"EXCLUSIVE\") },\n database: { value: this, enumerable: true },\n };\n Object.defineProperties(properties.default.value, properties);\n Object.defineProperties(properties.deferred.value, properties);\n Object.defineProperties(properties.immediate.value, properties);\n Object.defineProperties(properties.exclusive.value, properties);\n return properties.default.value;\n }\n\n pragma(source, options) {\n if (options == null) options = {};\n if (typeof source !== 'string') throw new TypeError('Expected first argument to be a string');\n if (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n const simple = options['simple'];\n const stmt = this.prepare(`PRAGMA ${source}`, this, true);\n return simple ? stmt.pluck().get() : stmt.all();\n }\n\n backup(filename, options) {\n throw new Error(\"not implemented\");\n }\n\n serialize(options) {\n throw new Error(\"not implemented\");\n }\n\n function(name, options, fn) {\n // Apply defaults\n if (options == null) options = {};\n if (typeof options === \"function\") {\n fn = options;\n options = {};\n }\n\n // Validate arguments\n if (typeof name !== \"string\")\n throw new TypeError(\"Expected first argument to be a string\");\n if (typeof fn !== \"function\")\n throw new TypeError(\"Expected last argument to be a function\");\n if (typeof options !== \"object\")\n throw new TypeError(\"Expected second argument to be an options object\");\n if (!name)\n throw new TypeError(\n \"User-defined function name cannot be an empty string\"\n );\n\n throw new Error(\"not implemented\");\n }\n\n aggregate(name, options) {\n // Validate arguments\n if (typeof name !== \"string\")\n throw new TypeError(\"Expected first argument to be a string\");\n if (typeof options !== \"object\" || options === null)\n throw new TypeError(\"Expected second argument to be an options object\");\n if (!name)\n throw new TypeError(\n \"User-defined function name cannot be an empty string\"\n );\n\n throw new Error(\"not implemented\");\n }\n\n table(name, factory) {\n // Validate arguments\n if (typeof name !== \"string\")\n throw new TypeError(\"Expected first argument to be a string\");\n if (!name)\n throw new TypeError(\n \"Virtual table module name cannot be an empty string\"\n );\n\n throw new Error(\"not implemented\");\n }\n\n authorizer(rules) {\n databaseAuthorizer.call(this.db, rules);\n }\n\n loadExtension(...args) {\n databaseLoadExtension.call(this.db, ...args);\n }\n\n maxWriteReplicationIndex() {\n return databaseMaxWriteReplicationIndex.call(this.db)\n }\n\n /**\n * Executes a SQL statement.\n *\n * @param {string} sql - The SQL statement string to execute.\n */\n exec(sql) {\n try {\n databaseExecSync.call(this.db, sql);\n } catch (err) {\n throw convertError(err);\n }\n }\n\n /**\n * Interrupts the database connection.\n */\n interrupt() {\n databaseInterrupt.call(this.db);\n }\n\n /**\n * Closes the database connection.\n */\n close() {\n databaseClose.call(this.db);\n this.open = false;\n }\n\n /**\n * Toggle 64-bit integer support.\n */\n defaultSafeIntegers(toggle) {\n databaseDefaultSafeIntegers.call(this.db, toggle ?? true);\n return this;\n }\n\n unsafeMode(...args) {\n throw new Error(\"not implemented\");\n }\n}\n\n/**\n * Statement represents a prepared SQL statement that can be executed.\n */\nclass Statement {\n constructor(stmt) {\n this.stmt = stmt;\n this.pluckMode = false;\n }\n\n /**\n * Toggle raw mode.\n *\n * @param raw Enable or disable raw mode. If you don't pass the parameter, raw mode is enabled.\n */\n raw(raw) {\n statementRaw.call(this.stmt, raw ?? true);\n return this;\n }\n\n /**\n * Toggle pluck mode.\n *\n * @param pluckMode Enable or disable pluck mode. If you don't pass the parameter, pluck mode is enabled.\n */\n pluck(pluckMode) {\n this.pluckMode = pluckMode ?? true;\n return this;\n }\n\n get reader() {\n return statementIsReader.call(this.stmt);\n }\n\n /**\n * Executes the SQL statement and returns an info object.\n */\n run(...bindParameters) {\n try {\n if (bindParameters.length == 1 && typeof bindParameters[0] === \"object\") {\n return statementRun.call(this.stmt, bindParameters[0]);\n } else {\n return statementRun.call(this.stmt, bindParameters.flat());\n }\n } catch (err) {\n throw convertError(err);\n }\n }\n\n /**\n * Executes the SQL statement and returns the first row.\n *\n * @param bindParameters - The bind parameters for executing the statement.\n */\n get(...bindParameters) {\n try {\n if (bindParameters.length == 1 && typeof bindParameters[0] === \"object\") {\n return statementGet.call(this.stmt, bindParameters[0]);\n } else {\n return statementGet.call(this.stmt, bindParameters.flat());\n }\n } catch (err) {\n throw convertError(err);\n }\n }\n\n /**\n * Executes the SQL statement and returns an iterator to the resulting rows.\n *\n * @param bindParameters - The bind parameters for executing the statement.\n */\n iterate(...bindParameters) {\n var rows = undefined;\n if (bindParameters.length == 1 && typeof bindParameters[0] === \"object\") {\n rows = statementRowsSync.call(this.stmt, bindParameters[0]);\n } else {\n rows = statementRowsSync.call(this.stmt, bindParameters.flat());\n }\n const iter = {\n nextRows: Array(100),\n nextRowIndex: 100,\n next() {\n try {\n if (this.nextRowIndex === 100) {\n rowsNext.call(rows, this.nextRows);\n this.nextRowIndex = 0;\n }\n const row = this.nextRows[this.nextRowIndex];\n this.nextRows[this.nextRowIndex] = undefined;\n if (!row) {\n return { done: true };\n }\n this.nextRowIndex++;\n return { value: row, done: false };\n } catch (err) {\n throw convertError(err);\n }\n },\n [Symbol.iterator]() {\n return this;\n },\n };\n return iter;\n }\n\n /**\n * Executes the SQL statement and returns an array of the resulting rows.\n *\n * @param bindParameters - The bind parameters for executing the statement.\n */\n all(...bindParameters) {\n try {\n const result = [];\n for (const row of this.iterate(...bindParameters)) {\n if (this.pluckMode) {\n result.push(row[Object.keys(row)[0]]);\n } else {\n result.push(row);\n }\n }\n return result;\n } catch (err) {\n throw convertError(err);\n }\n }\n\n /**\n * Interrupts the statement.\n */\n interrupt() {\n statementInterrupt.call(this.stmt);\n }\n\n /**\n * Returns the columns in the result set returned by this prepared statement.\n */\n columns() {\n return statementColumns.call(this.stmt);\n }\n\n /**\n * Toggle 64-bit integer support.\n */\n safeIntegers(toggle) {\n statementSafeIntegers.call(this.stmt, toggle ?? true);\n return this;\n }\n}\n\nmodule.exports = Database;\nmodule.exports.Authorization = Authorization;\nmodule.exports.SqliteError = SqliteError;\n",
|
|
12
|
-
"function limiter (count) {\n var outstanding = 0\n var jobs = []\n\n function remove () {\n outstanding--\n\n if (outstanding < count) {\n dequeue()\n }\n }\n\n function dequeue () {\n var job = jobs.shift()\n semaphore.queue = jobs.length\n\n if (job) {\n run(job.fn).then(job.resolve).catch(job.reject)\n }\n }\n\n function queue (fn) {\n return new Promise(function (resolve, reject) {\n jobs.push({fn: fn, resolve: resolve, reject: reject})\n semaphore.queue = jobs.length\n })\n }\n\n function run (fn) {\n outstanding++\n try {\n return Promise.resolve(fn()).then(function (result) {\n remove()\n return result\n }, function (error) {\n remove()\n throw error\n })\n } catch (err) {\n remove()\n return Promise.reject(err)\n }\n }\n\n var semaphore = function (fn) {\n if (outstanding >= count) {\n return queue(fn)\n } else {\n return run(fn)\n }\n }\n\n return semaphore\n}\n\nfunction map (items, mapper) {\n var failed = false\n\n var limit = this\n\n return Promise.all(items.map(function () {\n var args = arguments\n return limit(function () {\n if (!failed) {\n return mapper.apply(undefined, args).catch(function (e) {\n failed = true\n throw e\n })\n }\n })\n }))\n}\n\nfunction addExtras (fn) {\n fn.queue = 0\n fn.map = map\n return fn\n}\n\nmodule.exports = function (count) {\n if (count) {\n return addExtras(limiter(count))\n } else {\n return addExtras(function (fn) {\n return fn()\n })\n }\n}\n",
|
|
13
|
-
"/**\n * Database Singleton\n * Global database instance and repository access\n */\n\nimport { createClient } from '@libsql/client';\nimport { drizzle } from 'drizzle-orm/libsql';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { SessionRepository } from './session-repository.js';\nimport { initializeDatabase } from './auto-migrate.js';\n\nconst DB_PATH = join(homedir(), '.sylphx-flow', 'memory.db');\nconst DATABASE_URL = process.env.DATABASE_URL || `file:${DB_PATH}`;\n\n// Global database instance\nlet dbInstance: any = null;\nlet repositoryInstance: SessionRepository | null = null;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Get database instance (lazy initialization with auto-migration)\n * Ensures database is initialized only once\n */\nexport async function getDatabase(): Promise<any> {\n if (dbInstance) {\n return dbInstance;\n }\n\n // If initialization in progress, wait for it\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = initializeDatabase((progress) => {\n if (process.env.DEBUG) {\n console.log(`[DB] ${progress.current}/${progress.total}: ${progress.status}`);\n }\n });\n\n dbInstance = await initPromise;\n initPromise = null;\n\n return dbInstance;\n}\n\n/**\n * Get session repository instance\n * Ensures repository uses initialized database\n */\nexport async function getSessionRepository(): Promise<SessionRepository> {\n if (repositoryInstance) {\n return repositoryInstance;\n }\n\n const db = await getDatabase();\n repositoryInstance = new SessionRepository(db);\n\n return repositoryInstance;\n}\n\n/**\n * Reset database instance (for testing)\n */\nexport function resetDatabase(): void {\n dbInstance = null;\n repositoryInstance = null;\n initPromise = null;\n}\n",
|
|
14
|
-
"const entityKind = Symbol.for(\"drizzle:entityKind\");\nconst hasOwnEntityKind = Symbol.for(\"drizzle:hasOwnEntityKind\");\nfunction is(value, type) {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n if (value instanceof type) {\n return true;\n }\n if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n throw new Error(\n `Class \"${type.name ?? \"<unknown>\"}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`\n );\n }\n let cls = Object.getPrototypeOf(value).constructor;\n if (cls) {\n while (cls) {\n if (entityKind in cls && cls[entityKind] === type[entityKind]) {\n return true;\n }\n cls = Object.getPrototypeOf(cls);\n }\n }\n return false;\n}\nexport {\n entityKind,\n hasOwnEntityKind,\n is\n};\n//# sourceMappingURL=entity.js.map",
|
|
15
|
-
"import { entityKind } from \"./entity.js\";\nclass Column {\n constructor(table, config) {\n this.table = table;\n this.config = config;\n this.name = config.name;\n this.keyAsName = config.keyAsName;\n this.notNull = config.notNull;\n this.default = config.default;\n this.defaultFn = config.defaultFn;\n this.onUpdateFn = config.onUpdateFn;\n this.hasDefault = config.hasDefault;\n this.primary = config.primaryKey;\n this.isUnique = config.isUnique;\n this.uniqueName = config.uniqueName;\n this.uniqueType = config.uniqueType;\n this.dataType = config.dataType;\n this.columnType = config.columnType;\n this.generated = config.generated;\n this.generatedIdentity = config.generatedIdentity;\n }\n static [entityKind] = \"Column\";\n name;\n keyAsName;\n primary;\n notNull;\n default;\n defaultFn;\n onUpdateFn;\n hasDefault;\n isUnique;\n uniqueName;\n uniqueType;\n dataType;\n columnType;\n enumValues = void 0;\n generated = void 0;\n generatedIdentity = void 0;\n config;\n mapFromDriverValue(value) {\n return value;\n }\n mapToDriverValue(value) {\n return value;\n }\n // ** @internal */\n shouldDisableInsert() {\n return this.config.generated !== void 0 && this.config.generated.type !== \"byDefault\";\n }\n}\nexport {\n Column\n};\n//# sourceMappingURL=column.js.map",
|
|
16
|
-
"import { entityKind } from \"./entity.js\";\nclass ColumnBuilder {\n static [entityKind] = \"ColumnBuilder\";\n config;\n constructor(name, dataType, columnType) {\n this.config = {\n name,\n keyAsName: name === \"\",\n notNull: false,\n default: void 0,\n hasDefault: false,\n primaryKey: false,\n isUnique: false,\n uniqueName: void 0,\n uniqueType: void 0,\n dataType,\n columnType,\n generated: void 0\n };\n }\n /**\n * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n *\n * @example\n * ```ts\n * const users = pgTable('users', {\n * \tid: integer('id').$type<UserId>().primaryKey(),\n * \tdetails: json('details').$type<UserDetails>().notNull(),\n * });\n * ```\n */\n $type() {\n return this;\n }\n /**\n * Adds a `not null` clause to the column definition.\n *\n * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n */\n notNull() {\n this.config.notNull = true;\n return this;\n }\n /**\n * Adds a `default <value>` clause to the column definition.\n *\n * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n *\n * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n */\n default(value) {\n this.config.default = value;\n this.config.hasDefault = true;\n return this;\n }\n /**\n * Adds a dynamic default value to the column.\n * The function will be called when the row is inserted, and the returned value will be used as the column value.\n *\n * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n */\n $defaultFn(fn) {\n this.config.defaultFn = fn;\n this.config.hasDefault = true;\n return this;\n }\n /**\n * Alias for {@link $defaultFn}.\n */\n $default = this.$defaultFn;\n /**\n * Adds a dynamic update value to the column.\n * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n *\n * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n */\n $onUpdateFn(fn) {\n this.config.onUpdateFn = fn;\n this.config.hasDefault = true;\n return this;\n }\n /**\n * Alias for {@link $onUpdateFn}.\n */\n $onUpdate = this.$onUpdateFn;\n /**\n * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n *\n * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n */\n primaryKey() {\n this.config.primaryKey = true;\n this.config.notNull = true;\n return this;\n }\n /** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n setName(name) {\n if (this.config.name !== \"\") return;\n this.config.name = name;\n }\n}\nexport {\n ColumnBuilder\n};\n//# sourceMappingURL=column-builder.js.map",
|
|
17
|
-
"const TableName = Symbol.for(\"drizzle:Name\");\nexport {\n TableName\n};\n//# sourceMappingURL=table.utils.js.map",
|
|
18
|
-
"function iife(fn, ...args) {\n return fn(...args);\n}\nexport {\n iife\n};\n//# sourceMappingURL=tracing-utils.js.map",
|
|
19
|
-
"import { entityKind } from \"../entity.js\";\nimport { TableName } from \"../table.utils.js\";\nfunction unique(name) {\n return new UniqueOnConstraintBuilder(name);\n}\nfunction uniqueKeyName(table, columns) {\n return `${table[TableName]}_${columns.join(\"_\")}_unique`;\n}\nclass UniqueConstraintBuilder {\n constructor(columns, name) {\n this.name = name;\n this.columns = columns;\n }\n static [entityKind] = \"PgUniqueConstraintBuilder\";\n /** @internal */\n columns;\n /** @internal */\n nullsNotDistinctConfig = false;\n nullsNotDistinct() {\n this.nullsNotDistinctConfig = true;\n return this;\n }\n /** @internal */\n build(table) {\n return new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n }\n}\nclass UniqueOnConstraintBuilder {\n static [entityKind] = \"PgUniqueOnConstraintBuilder\";\n /** @internal */\n name;\n constructor(name) {\n this.name = name;\n }\n on(...columns) {\n return new UniqueConstraintBuilder(columns, this.name);\n }\n}\nclass UniqueConstraint {\n constructor(table, columns, nullsNotDistinct, name) {\n this.table = table;\n this.columns = columns;\n this.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n this.nullsNotDistinct = nullsNotDistinct;\n }\n static [entityKind] = \"PgUniqueConstraint\";\n columns;\n name;\n nullsNotDistinct = false;\n getName() {\n return this.name;\n }\n}\nexport {\n UniqueConstraint,\n UniqueConstraintBuilder,\n UniqueOnConstraintBuilder,\n unique,\n uniqueKeyName\n};\n//# sourceMappingURL=unique-constraint.js.map",
|
|
20
|
-
"import { ColumnBuilder } from \"../../column-builder.js\";\nimport { Column } from \"../../column.js\";\nimport { entityKind, is } from \"../../entity.js\";\nimport { ForeignKeyBuilder } from \"../foreign-keys.js\";\nimport { iife } from \"../../tracing-utils.js\";\nimport { uniqueKeyName } from \"../unique-constraint.js\";\nimport { makePgArray, parsePgArray } from \"../utils/array.js\";\nclass PgColumnBuilder extends ColumnBuilder {\n foreignKeyConfigs = [];\n static [entityKind] = \"PgColumnBuilder\";\n array(size) {\n return new PgArrayBuilder(this.config.name, this, size);\n }\n references(ref, actions = {}) {\n this.foreignKeyConfigs.push({ ref, actions });\n return this;\n }\n unique(name, config) {\n this.config.isUnique = true;\n this.config.uniqueName = name;\n this.config.uniqueType = config?.nulls;\n return this;\n }\n generatedAlwaysAs(as) {\n this.config.generated = {\n as,\n type: \"always\",\n mode: \"stored\"\n };\n return this;\n }\n /** @internal */\n buildForeignKeys(column, table) {\n return this.foreignKeyConfigs.map(({ ref, actions }) => {\n return iife(\n (ref2, actions2) => {\n const builder = new ForeignKeyBuilder(() => {\n const foreignColumn = ref2();\n return { columns: [column], foreignColumns: [foreignColumn] };\n });\n if (actions2.onUpdate) {\n builder.onUpdate(actions2.onUpdate);\n }\n if (actions2.onDelete) {\n builder.onDelete(actions2.onDelete);\n }\n return builder.build(table);\n },\n ref,\n actions\n );\n });\n }\n /** @internal */\n buildExtraConfigColumn(table) {\n return new ExtraConfigColumn(table, this.config);\n }\n}\nclass PgColumn extends Column {\n constructor(table, config) {\n if (!config.uniqueName) {\n config.uniqueName = uniqueKeyName(table, [config.name]);\n }\n super(table, config);\n this.table = table;\n }\n static [entityKind] = \"PgColumn\";\n}\nclass ExtraConfigColumn extends PgColumn {\n static [entityKind] = \"ExtraConfigColumn\";\n getSQLType() {\n return this.getSQLType();\n }\n indexConfig = {\n order: this.config.order ?? \"asc\",\n nulls: this.config.nulls ?? \"last\",\n opClass: this.config.opClass\n };\n defaultConfig = {\n order: \"asc\",\n nulls: \"last\",\n opClass: void 0\n };\n asc() {\n this.indexConfig.order = \"asc\";\n return this;\n }\n desc() {\n this.indexConfig.order = \"desc\";\n return this;\n }\n nullsFirst() {\n this.indexConfig.nulls = \"first\";\n return this;\n }\n nullsLast() {\n this.indexConfig.nulls = \"last\";\n return this;\n }\n /**\n * ### PostgreSQL documentation quote\n *\n * > An operator class with optional parameters can be specified for each column of an index.\n * The operator class identifies the operators to be used by the index for that column.\n * For example, a B-tree index on four-byte integers would use the int4_ops class;\n * this operator class includes comparison functions for four-byte integers.\n * In practice the default operator class for the column's data type is usually sufficient.\n * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n * More information about operator classes check:\n *\n * ### Useful links\n * https://www.postgresql.org/docs/current/sql-createindex.html\n *\n * https://www.postgresql.org/docs/current/indexes-opclass.html\n *\n * https://www.postgresql.org/docs/current/xindex.html\n *\n * ### Additional types\n * If you have the `pg_vector` extension installed in your database, you can use the\n * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n *\n * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n *\n * @param opClass\n * @returns\n */\n op(opClass) {\n this.indexConfig.opClass = opClass;\n return this;\n }\n}\nclass IndexedColumn {\n static [entityKind] = \"IndexedColumn\";\n constructor(name, keyAsName, type, indexConfig) {\n this.name = name;\n this.keyAsName = keyAsName;\n this.type = type;\n this.indexConfig = indexConfig;\n }\n name;\n keyAsName;\n type;\n indexConfig;\n}\nclass PgArrayBuilder extends PgColumnBuilder {\n static [entityKind] = \"PgArrayBuilder\";\n constructor(name, baseBuilder, size) {\n super(name, \"array\", \"PgArray\");\n this.config.baseBuilder = baseBuilder;\n this.config.size = size;\n }\n /** @internal */\n build(table) {\n const baseColumn = this.config.baseBuilder.build(table);\n return new PgArray(\n table,\n this.config,\n baseColumn\n );\n }\n}\nclass PgArray extends PgColumn {\n constructor(table, config, baseColumn, range) {\n super(table, config);\n this.baseColumn = baseColumn;\n this.range = range;\n this.size = config.size;\n }\n size;\n static [entityKind] = \"PgArray\";\n getSQLType() {\n return `${this.baseColumn.getSQLType()}[${typeof this.size === \"number\" ? this.size : \"\"}]`;\n }\n mapFromDriverValue(value) {\n if (typeof value === \"string\") {\n value = parsePgArray(value);\n }\n return value.map((v) => this.baseColumn.mapFromDriverValue(v));\n }\n mapToDriverValue(value, isNestedArray = false) {\n const a = value.map(\n (v) => v === null ? null : is(this.baseColumn, PgArray) ? this.baseColumn.mapToDriverValue(v, true) : this.baseColumn.mapToDriverValue(v)\n );\n if (isNestedArray) return a;\n return makePgArray(a);\n }\n}\nexport {\n ExtraConfigColumn,\n IndexedColumn,\n PgArray,\n PgArrayBuilder,\n PgColumn,\n PgColumnBuilder\n};\n//# sourceMappingURL=common.js.map",
|
|
21
|
-
"import { entityKind } from \"../../entity.js\";\nimport { PgColumn, PgColumnBuilder } from \"./common.js\";\nclass PgEnumObjectColumnBuilder extends PgColumnBuilder {\n static [entityKind] = \"PgEnumObjectColumnBuilder\";\n constructor(name, enumInstance) {\n super(name, \"string\", \"PgEnumObjectColumn\");\n this.config.enum = enumInstance;\n }\n /** @internal */\n build(table) {\n return new PgEnumObjectColumn(\n table,\n this.config\n );\n }\n}\nclass PgEnumObjectColumn extends PgColumn {\n static [entityKind] = \"PgEnumObjectColumn\";\n enum;\n enumValues = this.config.enum.enumValues;\n constructor(table, config) {\n super(table, config);\n this.enum = config.enum;\n }\n getSQLType() {\n return this.enum.enumName;\n }\n}\nconst isPgEnumSym = Symbol.for(\"drizzle:isPgEnum\");\nfunction isPgEnum(obj) {\n return !!obj && typeof obj === \"function\" && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\nclass PgEnumColumnBuilder extends PgColumnBuilder {\n static [entityKind] = \"PgEnumColumnBuilder\";\n constructor(name, enumInstance) {\n super(name, \"string\", \"PgEnumColumn\");\n this.config.enum = enumInstance;\n }\n /** @internal */\n build(table) {\n return new PgEnumColumn(\n table,\n this.config\n );\n }\n}\nclass PgEnumColumn extends PgColumn {\n static [entityKind] = \"PgEnumColumn\";\n enum = this.config.enum;\n enumValues = this.config.enum.enumValues;\n constructor(table, config) {\n super(table, config);\n this.enum = config.enum;\n }\n getSQLType() {\n return this.enum.enumName;\n }\n}\nfunction pgEnum(enumName, input) {\n return Array.isArray(input) ? pgEnumWithSchema(enumName, [...input], void 0) : pgEnumObjectWithSchema(enumName, input, void 0);\n}\nfunction pgEnumWithSchema(enumName, values, schema) {\n const enumInstance = Object.assign(\n (name) => new PgEnumColumnBuilder(name ?? \"\", enumInstance),\n {\n enumName,\n enumValues: values,\n schema,\n [isPgEnumSym]: true\n }\n );\n return enumInstance;\n}\nfunction pgEnumObjectWithSchema(enumName, values, schema) {\n const enumInstance = Object.assign(\n (name) => new PgEnumObjectColumnBuilder(name ?? \"\", enumInstance),\n {\n enumName,\n enumValues: Object.values(values),\n schema,\n [isPgEnumSym]: true\n }\n );\n return enumInstance;\n}\nexport {\n PgEnumColumn,\n PgEnumColumnBuilder,\n PgEnumObjectColumn,\n PgEnumObjectColumnBuilder,\n isPgEnum,\n pgEnum,\n pgEnumObjectWithSchema,\n pgEnumWithSchema\n};\n//# sourceMappingURL=enum.js.map",
|
|
22
|
-
"import { entityKind } from \"./entity.js\";\nclass Subquery {\n static [entityKind] = \"Subquery\";\n constructor(sql, fields, alias, isWith = false, usedTables = []) {\n this._ = {\n brand: \"Subquery\",\n sql,\n selectedFields: fields,\n alias,\n isWith,\n usedTables\n };\n }\n // getSQL(): SQL<unknown> {\n // \treturn new SQL([this]);\n // }\n}\nclass WithSubquery extends Subquery {\n static [entityKind] = \"WithSubquery\";\n}\nexport {\n Subquery,\n WithSubquery\n};\n//# sourceMappingURL=subquery.js.map",
|
|
23
|
-
"// package.json\nvar version = \"0.44.7\";\n\n// src/version.ts\nvar compatibilityVersion = 10;\nexport {\n compatibilityVersion,\n version as npmVersion\n};\n",
|
|
24
|
-
"import { iife } from \"./tracing-utils.js\";\nimport { npmVersion } from \"./version.js\";\nlet otel;\nlet rawTracer;\nconst tracer = {\n startActiveSpan(name, fn) {\n if (!otel) {\n return fn();\n }\n if (!rawTracer) {\n rawTracer = otel.trace.getTracer(\"drizzle-orm\", npmVersion);\n }\n return iife(\n (otel2, rawTracer2) => rawTracer2.startActiveSpan(\n name,\n (span) => {\n try {\n return fn(span);\n } catch (e) {\n span.setStatus({\n code: otel2.SpanStatusCode.ERROR,\n message: e instanceof Error ? e.message : \"Unknown error\"\n // eslint-disable-line no-instanceof/no-instanceof\n });\n throw e;\n } finally {\n span.end();\n }\n }\n ),\n otel,\n rawTracer\n );\n }\n};\nexport {\n tracer\n};\n//# sourceMappingURL=tracing.js.map",
|
|
25
|
-
"const ViewBaseConfig = Symbol.for(\"drizzle:ViewBaseConfig\");\nexport {\n ViewBaseConfig\n};\n//# sourceMappingURL=view-common.js.map",
|
|
26
|
-
"import { entityKind } from \"./entity.js\";\nimport { TableName } from \"./table.utils.js\";\nconst Schema = Symbol.for(\"drizzle:Schema\");\nconst Columns = Symbol.for(\"drizzle:Columns\");\nconst ExtraConfigColumns = Symbol.for(\"drizzle:ExtraConfigColumns\");\nconst OriginalName = Symbol.for(\"drizzle:OriginalName\");\nconst BaseName = Symbol.for(\"drizzle:BaseName\");\nconst IsAlias = Symbol.for(\"drizzle:IsAlias\");\nconst ExtraConfigBuilder = Symbol.for(\"drizzle:ExtraConfigBuilder\");\nconst IsDrizzleTable = Symbol.for(\"drizzle:IsDrizzleTable\");\nclass Table {\n static [entityKind] = \"Table\";\n /** @internal */\n static Symbol = {\n Name: TableName,\n Schema,\n OriginalName,\n Columns,\n ExtraConfigColumns,\n BaseName,\n IsAlias,\n ExtraConfigBuilder\n };\n /**\n * @internal\n * Can be changed if the table is aliased.\n */\n [TableName];\n /**\n * @internal\n * Used to store the original name of the table, before any aliasing.\n */\n [OriginalName];\n /** @internal */\n [Schema];\n /** @internal */\n [Columns];\n /** @internal */\n [ExtraConfigColumns];\n /**\n * @internal\n * Used to store the table name before the transformation via the `tableCreator` functions.\n */\n [BaseName];\n /** @internal */\n [IsAlias] = false;\n /** @internal */\n [IsDrizzleTable] = true;\n /** @internal */\n [ExtraConfigBuilder] = void 0;\n constructor(name, schema, baseName) {\n this[TableName] = this[OriginalName] = name;\n this[Schema] = schema;\n this[BaseName] = baseName;\n }\n}\nfunction isTable(table) {\n return typeof table === \"object\" && table !== null && IsDrizzleTable in table;\n}\nfunction getTableName(table) {\n return table[TableName];\n}\nfunction getTableUniqueName(table) {\n return `${table[Schema] ?? \"public\"}.${table[TableName]}`;\n}\nexport {\n BaseName,\n Columns,\n ExtraConfigBuilder,\n ExtraConfigColumns,\n IsAlias,\n OriginalName,\n Schema,\n Table,\n getTableName,\n getTableUniqueName,\n isTable\n};\n//# sourceMappingURL=table.js.map",
|
|
27
|
-
"import { entityKind, is } from \"../entity.js\";\nimport { isPgEnum } from \"../pg-core/columns/enum.js\";\nimport { Subquery } from \"../subquery.js\";\nimport { tracer } from \"../tracing.js\";\nimport { ViewBaseConfig } from \"../view-common.js\";\nimport { Column } from \"../column.js\";\nimport { IsAlias, Table } from \"../table.js\";\nclass FakePrimitiveParam {\n static [entityKind] = \"FakePrimitiveParam\";\n}\nfunction isSQLWrapper(value) {\n return value !== null && value !== void 0 && typeof value.getSQL === \"function\";\n}\nfunction mergeQueries(queries) {\n const result = { sql: \"\", params: [] };\n for (const query of queries) {\n result.sql += query.sql;\n result.params.push(...query.params);\n if (query.typings?.length) {\n if (!result.typings) {\n result.typings = [];\n }\n result.typings.push(...query.typings);\n }\n }\n return result;\n}\nclass StringChunk {\n static [entityKind] = \"StringChunk\";\n value;\n constructor(value) {\n this.value = Array.isArray(value) ? value : [value];\n }\n getSQL() {\n return new SQL([this]);\n }\n}\nclass SQL {\n constructor(queryChunks) {\n this.queryChunks = queryChunks;\n for (const chunk of queryChunks) {\n if (is(chunk, Table)) {\n const schemaName = chunk[Table.Symbol.Schema];\n this.usedTables.push(\n schemaName === void 0 ? chunk[Table.Symbol.Name] : schemaName + \".\" + chunk[Table.Symbol.Name]\n );\n }\n }\n }\n static [entityKind] = \"SQL\";\n /** @internal */\n decoder = noopDecoder;\n shouldInlineParams = false;\n /** @internal */\n usedTables = [];\n append(query) {\n this.queryChunks.push(...query.queryChunks);\n return this;\n }\n toQuery(config) {\n return tracer.startActiveSpan(\"drizzle.buildSQL\", (span) => {\n const query = this.buildQueryFromSourceParams(this.queryChunks, config);\n span?.setAttributes({\n \"drizzle.query.text\": query.sql,\n \"drizzle.query.params\": JSON.stringify(query.params)\n });\n return query;\n });\n }\n buildQueryFromSourceParams(chunks, _config) {\n const config = Object.assign({}, _config, {\n inlineParams: _config.inlineParams || this.shouldInlineParams,\n paramStartIndex: _config.paramStartIndex || { value: 0 }\n });\n const {\n casing,\n escapeName,\n escapeParam,\n prepareTyping,\n inlineParams,\n paramStartIndex\n } = config;\n return mergeQueries(chunks.map((chunk) => {\n if (is(chunk, StringChunk)) {\n return { sql: chunk.value.join(\"\"), params: [] };\n }\n if (is(chunk, Name)) {\n return { sql: escapeName(chunk.value), params: [] };\n }\n if (chunk === void 0) {\n return { sql: \"\", params: [] };\n }\n if (Array.isArray(chunk)) {\n const result = [new StringChunk(\"(\")];\n for (const [i, p] of chunk.entries()) {\n result.push(p);\n if (i < chunk.length - 1) {\n result.push(new StringChunk(\", \"));\n }\n }\n result.push(new StringChunk(\")\"));\n return this.buildQueryFromSourceParams(result, config);\n }\n if (is(chunk, SQL)) {\n return this.buildQueryFromSourceParams(chunk.queryChunks, {\n ...config,\n inlineParams: inlineParams || chunk.shouldInlineParams\n });\n }\n if (is(chunk, Table)) {\n const schemaName = chunk[Table.Symbol.Schema];\n const tableName = chunk[Table.Symbol.Name];\n return {\n sql: schemaName === void 0 || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + \".\" + escapeName(tableName),\n params: []\n };\n }\n if (is(chunk, Column)) {\n const columnName = casing.getColumnCasing(chunk);\n if (_config.invokeSource === \"indexes\") {\n return { sql: escapeName(columnName), params: [] };\n }\n const schemaName = chunk.table[Table.Symbol.Schema];\n return {\n sql: chunk.table[IsAlias] || schemaName === void 0 ? escapeName(chunk.table[Table.Symbol.Name]) + \".\" + escapeName(columnName) : escapeName(schemaName) + \".\" + escapeName(chunk.table[Table.Symbol.Name]) + \".\" + escapeName(columnName),\n params: []\n };\n }\n if (is(chunk, View)) {\n const schemaName = chunk[ViewBaseConfig].schema;\n const viewName = chunk[ViewBaseConfig].name;\n return {\n sql: schemaName === void 0 || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + \".\" + escapeName(viewName),\n params: []\n };\n }\n if (is(chunk, Param)) {\n if (is(chunk.value, Placeholder)) {\n return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: [\"none\"] };\n }\n const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n if (is(mappedValue, SQL)) {\n return this.buildQueryFromSourceParams([mappedValue], config);\n }\n if (inlineParams) {\n return { sql: this.mapInlineParam(mappedValue, config), params: [] };\n }\n let typings = [\"none\"];\n if (prepareTyping) {\n typings = [prepareTyping(chunk.encoder)];\n }\n return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n }\n if (is(chunk, Placeholder)) {\n return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: [\"none\"] };\n }\n if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== void 0) {\n return { sql: escapeName(chunk.fieldAlias), params: [] };\n }\n if (is(chunk, Subquery)) {\n if (chunk._.isWith) {\n return { sql: escapeName(chunk._.alias), params: [] };\n }\n return this.buildQueryFromSourceParams([\n new StringChunk(\"(\"),\n chunk._.sql,\n new StringChunk(\") \"),\n new Name(chunk._.alias)\n ], config);\n }\n if (isPgEnum(chunk)) {\n if (chunk.schema) {\n return { sql: escapeName(chunk.schema) + \".\" + escapeName(chunk.enumName), params: [] };\n }\n return { sql: escapeName(chunk.enumName), params: [] };\n }\n if (isSQLWrapper(chunk)) {\n if (chunk.shouldOmitSQLParens?.()) {\n return this.buildQueryFromSourceParams([chunk.getSQL()], config);\n }\n return this.buildQueryFromSourceParams([\n new StringChunk(\"(\"),\n chunk.getSQL(),\n new StringChunk(\")\")\n ], config);\n }\n if (inlineParams) {\n return { sql: this.mapInlineParam(chunk, config), params: [] };\n }\n return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: [\"none\"] };\n }));\n }\n mapInlineParam(chunk, { escapeString }) {\n if (chunk === null) {\n return \"null\";\n }\n if (typeof chunk === \"number\" || typeof chunk === \"boolean\") {\n return chunk.toString();\n }\n if (typeof chunk === \"string\") {\n return escapeString(chunk);\n }\n if (typeof chunk === \"object\") {\n const mappedValueAsString = chunk.toString();\n if (mappedValueAsString === \"[object Object]\") {\n return escapeString(JSON.stringify(chunk));\n }\n return escapeString(mappedValueAsString);\n }\n throw new Error(\"Unexpected param value: \" + chunk);\n }\n getSQL() {\n return this;\n }\n as(alias) {\n if (alias === void 0) {\n return this;\n }\n return new SQL.Aliased(this, alias);\n }\n mapWith(decoder) {\n this.decoder = typeof decoder === \"function\" ? { mapFromDriverValue: decoder } : decoder;\n return this;\n }\n inlineParams() {\n this.shouldInlineParams = true;\n return this;\n }\n /**\n * This method is used to conditionally include a part of the query.\n *\n * @param condition - Condition to check\n * @returns itself if the condition is `true`, otherwise `undefined`\n */\n if(condition) {\n return condition ? this : void 0;\n }\n}\nclass Name {\n constructor(value) {\n this.value = value;\n }\n static [entityKind] = \"Name\";\n brand;\n getSQL() {\n return new SQL([this]);\n }\n}\nfunction name(value) {\n return new Name(value);\n}\nfunction isDriverValueEncoder(value) {\n return typeof value === \"object\" && value !== null && \"mapToDriverValue\" in value && typeof value.mapToDriverValue === \"function\";\n}\nconst noopDecoder = {\n mapFromDriverValue: (value) => value\n};\nconst noopEncoder = {\n mapToDriverValue: (value) => value\n};\nconst noopMapper = {\n ...noopDecoder,\n ...noopEncoder\n};\nclass Param {\n /**\n * @param value - Parameter value\n * @param encoder - Encoder to convert the value to a driver parameter\n */\n constructor(value, encoder = noopEncoder) {\n this.value = value;\n this.encoder = encoder;\n }\n static [entityKind] = \"Param\";\n brand;\n getSQL() {\n return new SQL([this]);\n }\n}\nfunction param(value, encoder) {\n return new Param(value, encoder);\n}\nfunction sql(strings, ...params) {\n const queryChunks = [];\n if (params.length > 0 || strings.length > 0 && strings[0] !== \"\") {\n queryChunks.push(new StringChunk(strings[0]));\n }\n for (const [paramIndex, param2] of params.entries()) {\n queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));\n }\n return new SQL(queryChunks);\n}\n((sql2) => {\n function empty() {\n return new SQL([]);\n }\n sql2.empty = empty;\n function fromList(list) {\n return new SQL(list);\n }\n sql2.fromList = fromList;\n function raw(str) {\n return new SQL([new StringChunk(str)]);\n }\n sql2.raw = raw;\n function join(chunks, separator) {\n const result = [];\n for (const [i, chunk] of chunks.entries()) {\n if (i > 0 && separator !== void 0) {\n result.push(separator);\n }\n result.push(chunk);\n }\n return new SQL(result);\n }\n sql2.join = join;\n function identifier(value) {\n return new Name(value);\n }\n sql2.identifier = identifier;\n function placeholder2(name2) {\n return new Placeholder(name2);\n }\n sql2.placeholder = placeholder2;\n function param2(value, encoder) {\n return new Param(value, encoder);\n }\n sql2.param = param2;\n})(sql || (sql = {}));\n((SQL2) => {\n class Aliased {\n constructor(sql2, fieldAlias) {\n this.sql = sql2;\n this.fieldAlias = fieldAlias;\n }\n static [entityKind] = \"SQL.Aliased\";\n /** @internal */\n isSelectionField = false;\n getSQL() {\n return this.sql;\n }\n /** @internal */\n clone() {\n return new Aliased(this.sql, this.fieldAlias);\n }\n }\n SQL2.Aliased = Aliased;\n})(SQL || (SQL = {}));\nclass Placeholder {\n constructor(name2) {\n this.name = name2;\n }\n static [entityKind] = \"Placeholder\";\n getSQL() {\n return new SQL([this]);\n }\n}\nfunction placeholder(name2) {\n return new Placeholder(name2);\n}\nfunction fillPlaceholders(params, values) {\n return params.map((p) => {\n if (is(p, Placeholder)) {\n if (!(p.name in values)) {\n throw new Error(`No value for placeholder \"${p.name}\" was provided`);\n }\n return values[p.name];\n }\n if (is(p, Param) && is(p.value, Placeholder)) {\n if (!(p.value.name in values)) {\n throw new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n }\n return p.encoder.mapToDriverValue(values[p.value.name]);\n }\n return p;\n });\n}\nconst IsDrizzleView = Symbol.for(\"drizzle:IsDrizzleView\");\nclass View {\n static [entityKind] = \"View\";\n /** @internal */\n [ViewBaseConfig];\n /** @internal */\n [IsDrizzleView] = true;\n constructor({ name: name2, schema, selectedFields, query }) {\n this[ViewBaseConfig] = {\n name: name2,\n originalName: name2,\n schema,\n selectedFields,\n query,\n isExisting: !query,\n isAlias: false\n };\n }\n getSQL() {\n return new SQL([this]);\n }\n}\nfunction isView(view) {\n return typeof view === \"object\" && view !== null && IsDrizzleView in view;\n}\nfunction getViewName(view) {\n return view[ViewBaseConfig].name;\n}\nColumn.prototype.getSQL = function() {\n return new SQL([this]);\n};\nTable.prototype.getSQL = function() {\n return new SQL([this]);\n};\nSubquery.prototype.getSQL = function() {\n return new SQL([this]);\n};\nexport {\n FakePrimitiveParam,\n Name,\n Param,\n Placeholder,\n SQL,\n StringChunk,\n View,\n fillPlaceholders,\n getViewName,\n isDriverValueEncoder,\n isSQLWrapper,\n isView,\n name,\n noopDecoder,\n noopEncoder,\n noopMapper,\n param,\n placeholder,\n sql\n};\n//# sourceMappingURL=sql.js.map",
|
|
28
|
-
"import { Column } from \"./column.js\";\nimport { entityKind, is } from \"./entity.js\";\nimport { SQL, sql } from \"./sql/sql.js\";\nimport { Table } from \"./table.js\";\nimport { ViewBaseConfig } from \"./view-common.js\";\nclass ColumnAliasProxyHandler {\n constructor(table) {\n this.table = table;\n }\n static [entityKind] = \"ColumnAliasProxyHandler\";\n get(columnObj, prop) {\n if (prop === \"table\") {\n return this.table;\n }\n return columnObj[prop];\n }\n}\nclass TableAliasProxyHandler {\n constructor(alias, replaceOriginalName) {\n this.alias = alias;\n this.replaceOriginalName = replaceOriginalName;\n }\n static [entityKind] = \"TableAliasProxyHandler\";\n get(target, prop) {\n if (prop === Table.Symbol.IsAlias) {\n return true;\n }\n if (prop === Table.Symbol.Name) {\n return this.alias;\n }\n if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {\n return this.alias;\n }\n if (prop === ViewBaseConfig) {\n return {\n ...target[ViewBaseConfig],\n name: this.alias,\n isAlias: true\n };\n }\n if (prop === Table.Symbol.Columns) {\n const columns = target[Table.Symbol.Columns];\n if (!columns) {\n return columns;\n }\n const proxiedColumns = {};\n Object.keys(columns).map((key) => {\n proxiedColumns[key] = new Proxy(\n columns[key],\n new ColumnAliasProxyHandler(new Proxy(target, this))\n );\n });\n return proxiedColumns;\n }\n const value = target[prop];\n if (is(value, Column)) {\n return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));\n }\n return value;\n }\n}\nclass RelationTableAliasProxyHandler {\n constructor(alias) {\n this.alias = alias;\n }\n static [entityKind] = \"RelationTableAliasProxyHandler\";\n get(target, prop) {\n if (prop === \"sourceTable\") {\n return aliasedTable(target.sourceTable, this.alias);\n }\n return target[prop];\n }\n}\nfunction aliasedTable(table, tableAlias) {\n return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));\n}\nfunction aliasedRelation(relation, tableAlias) {\n return new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));\n}\nfunction aliasedTableColumn(column, tableAlias) {\n return new Proxy(\n column,\n new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false)))\n );\n}\nfunction mapColumnsInAliasedSQLToAlias(query, alias) {\n return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);\n}\nfunction mapColumnsInSQLToAlias(query, alias) {\n return sql.join(query.queryChunks.map((c) => {\n if (is(c, Column)) {\n return aliasedTableColumn(c, alias);\n }\n if (is(c, SQL)) {\n return mapColumnsInSQLToAlias(c, alias);\n }\n if (is(c, SQL.Aliased)) {\n return mapColumnsInAliasedSQLToAlias(c, alias);\n }\n return c;\n }));\n}\nexport {\n ColumnAliasProxyHandler,\n RelationTableAliasProxyHandler,\n TableAliasProxyHandler,\n aliasedRelation,\n aliasedTable,\n aliasedTableColumn,\n mapColumnsInAliasedSQLToAlias,\n mapColumnsInSQLToAlias\n};\n//# sourceMappingURL=alias.js.map",
|
|
29
|
-
"import { entityKind } from \"./entity.js\";\nclass DrizzleError extends Error {\n static [entityKind] = \"DrizzleError\";\n constructor({ message, cause }) {\n super(message);\n this.name = \"DrizzleError\";\n this.cause = cause;\n }\n}\nclass DrizzleQueryError extends Error {\n constructor(query, params, cause) {\n super(`Failed query: ${query}\nparams: ${params}`);\n this.query = query;\n this.params = params;\n this.cause = cause;\n Error.captureStackTrace(this, DrizzleQueryError);\n if (cause) this.cause = cause;\n }\n}\nclass TransactionRollbackError extends DrizzleError {\n static [entityKind] = \"TransactionRollbackError\";\n constructor() {\n super({ message: \"Rollback\" });\n }\n}\nexport {\n DrizzleError,\n DrizzleQueryError,\n TransactionRollbackError\n};\n//# sourceMappingURL=errors.js.map",
|
|
30
|
-
"import { entityKind } from \"./entity.js\";\nclass ConsoleLogWriter {\n static [entityKind] = \"ConsoleLogWriter\";\n write(message) {\n console.log(message);\n }\n}\nclass DefaultLogger {\n static [entityKind] = \"DefaultLogger\";\n writer;\n constructor(config) {\n this.writer = config?.writer ?? new ConsoleLogWriter();\n }\n logQuery(query, params) {\n const stringifiedParams = params.map((p) => {\n try {\n return JSON.stringify(p);\n } catch {\n return String(p);\n }\n });\n const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(\", \")}]` : \"\";\n this.writer.write(`Query: ${query}${paramsStr}`);\n }\n}\nclass NoopLogger {\n static [entityKind] = \"NoopLogger\";\n logQuery() {\n }\n}\nexport {\n ConsoleLogWriter,\n DefaultLogger,\n NoopLogger\n};\n//# sourceMappingURL=logger.js.map",
|
|
31
|
-
"import { entityKind } from \"./entity.js\";\nclass QueryPromise {\n static [entityKind] = \"QueryPromise\";\n [Symbol.toStringTag] = \"QueryPromise\";\n catch(onRejected) {\n return this.then(void 0, onRejected);\n }\n finally(onFinally) {\n return this.then(\n (value) => {\n onFinally?.();\n return value;\n },\n (reason) => {\n onFinally?.();\n throw reason;\n }\n );\n }\n then(onFulfilled, onRejected) {\n return this.execute().then(onFulfilled, onRejected);\n }\n}\nexport {\n QueryPromise\n};\n//# sourceMappingURL=query-promise.js.map",
|
|
32
|
-
"import { Column } from \"./column.js\";\nimport { is } from \"./entity.js\";\nimport { Param, SQL, View } from \"./sql/sql.js\";\nimport { Subquery } from \"./subquery.js\";\nimport { getTableName, Table } from \"./table.js\";\nimport { ViewBaseConfig } from \"./view-common.js\";\nfunction mapResultRow(columns, row, joinsNotNullableMap) {\n const nullifyMap = {};\n const result = columns.reduce(\n (result2, { path, field }, columnIndex) => {\n let decoder;\n if (is(field, Column)) {\n decoder = field;\n } else if (is(field, SQL)) {\n decoder = field.decoder;\n } else {\n decoder = field.sql.decoder;\n }\n let node = result2;\n for (const [pathChunkIndex, pathChunk] of path.entries()) {\n if (pathChunkIndex < path.length - 1) {\n if (!(pathChunk in node)) {\n node[pathChunk] = {};\n }\n node = node[pathChunk];\n } else {\n const rawValue = row[columnIndex];\n const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n if (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n const objectName = path[0];\n if (!(objectName in nullifyMap)) {\n nullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n } else if (typeof nullifyMap[objectName] === \"string\" && nullifyMap[objectName] !== getTableName(field.table)) {\n nullifyMap[objectName] = false;\n }\n }\n }\n }\n return result2;\n },\n {}\n );\n if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n for (const [objectName, tableName] of Object.entries(nullifyMap)) {\n if (typeof tableName === \"string\" && !joinsNotNullableMap[tableName]) {\n result[objectName] = null;\n }\n }\n }\n return result;\n}\nfunction orderSelectedFields(fields, pathPrefix) {\n return Object.entries(fields).reduce((result, [name, field]) => {\n if (typeof name !== \"string\") {\n return result;\n }\n const newPath = pathPrefix ? [...pathPrefix, name] : [name];\n if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n result.push({ path: newPath, field });\n } else if (is(field, Table)) {\n result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n } else {\n result.push(...orderSelectedFields(field, newPath));\n }\n return result;\n }, []);\n}\nfunction haveSameKeys(left, right) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n for (const [index, key] of leftKeys.entries()) {\n if (key !== rightKeys[index]) {\n return false;\n }\n }\n return true;\n}\nfunction mapUpdateSet(table, values) {\n const entries = Object.entries(values).filter(([, value]) => value !== void 0).map(([key, value]) => {\n if (is(value, SQL) || is(value, Column)) {\n return [key, value];\n } else {\n return [key, new Param(value, table[Table.Symbol.Columns][key])];\n }\n });\n if (entries.length === 0) {\n throw new Error(\"No values to set\");\n }\n return Object.fromEntries(entries);\n}\nfunction applyMixins(baseClass, extendedClasses) {\n for (const extendedClass of extendedClasses) {\n for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n if (name === \"constructor\") continue;\n Object.defineProperty(\n baseClass.prototype,\n name,\n Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null)\n );\n }\n }\n}\nfunction getTableColumns(table) {\n return table[Table.Symbol.Columns];\n}\nfunction getViewSelectedFields(view) {\n return view[ViewBaseConfig].selectedFields;\n}\nfunction getTableLikeName(table) {\n return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? void 0 : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];\n}\nfunction getColumnNameAndConfig(a, b) {\n return {\n name: typeof a === \"string\" && a.length > 0 ? a : \"\",\n config: typeof a === \"object\" ? a : b\n };\n}\nconst _ = {};\nconst __ = {};\nfunction isConfig(data) {\n if (typeof data !== \"object\" || data === null) return false;\n if (data.constructor.name !== \"Object\") return false;\n if (\"logger\" in data) {\n const type = typeof data[\"logger\"];\n if (type !== \"boolean\" && (type !== \"object\" || typeof data[\"logger\"][\"logQuery\"] !== \"function\") && type !== \"undefined\") return false;\n return true;\n }\n if (\"schema\" in data) {\n const type = typeof data[\"schema\"];\n if (type !== \"object\" && type !== \"undefined\") return false;\n return true;\n }\n if (\"casing\" in data) {\n const type = typeof data[\"casing\"];\n if (type !== \"string\" && type !== \"undefined\") return false;\n return true;\n }\n if (\"mode\" in data) {\n if (data[\"mode\"] !== \"default\" || data[\"mode\"] !== \"planetscale\" || data[\"mode\"] !== void 0) return false;\n return true;\n }\n if (\"connection\" in data) {\n const type = typeof data[\"connection\"];\n if (type !== \"string\" && type !== \"object\" && type !== \"undefined\") return false;\n return true;\n }\n if (\"client\" in data) {\n const type = typeof data[\"client\"];\n if (type !== \"object\" && type !== \"function\" && type !== \"undefined\") return false;\n return true;\n }\n if (Object.keys(data).length === 0) return true;\n return false;\n}\nconst textDecoder = typeof TextDecoder === \"undefined\" ? null : new TextDecoder();\nexport {\n applyMixins,\n getColumnNameAndConfig,\n getTableColumns,\n getTableLikeName,\n getViewSelectedFields,\n haveSameKeys,\n isConfig,\n mapResultRow,\n mapUpdateSet,\n orderSelectedFields,\n textDecoder\n};\n//# sourceMappingURL=utils.js.map",
|
|
33
|
-
"import { entityKind } from \"../entity.js\";\nimport { Table } from \"../table.js\";\nimport { getPgColumnBuilders } from \"./columns/all.js\";\nconst InlineForeignKeys = Symbol.for(\"drizzle:PgInlineForeignKeys\");\nconst EnableRLS = Symbol.for(\"drizzle:EnableRLS\");\nclass PgTable extends Table {\n static [entityKind] = \"PgTable\";\n /** @internal */\n static Symbol = Object.assign({}, Table.Symbol, {\n InlineForeignKeys,\n EnableRLS\n });\n /**@internal */\n [InlineForeignKeys] = [];\n /** @internal */\n [EnableRLS] = false;\n /** @internal */\n [Table.Symbol.ExtraConfigBuilder] = void 0;\n /** @internal */\n [Table.Symbol.ExtraConfigColumns] = {};\n}\nfunction pgTableWithSchema(name, columns, extraConfig, schema, baseName = name) {\n const rawTable = new PgTable(name, schema, baseName);\n const parsedColumns = typeof columns === \"function\" ? columns(getPgColumnBuilders()) : columns;\n const builtColumns = Object.fromEntries(\n Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {\n const colBuilder = colBuilderBase;\n colBuilder.setName(name2);\n const column = colBuilder.build(rawTable);\n rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n return [name2, column];\n })\n );\n const builtColumnsForExtraConfig = Object.fromEntries(\n Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {\n const colBuilder = colBuilderBase;\n colBuilder.setName(name2);\n const column = colBuilder.buildExtraConfigColumn(rawTable);\n return [name2, column];\n })\n );\n const table = Object.assign(rawTable, builtColumns);\n table[Table.Symbol.Columns] = builtColumns;\n table[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n if (extraConfig) {\n table[PgTable.Symbol.ExtraConfigBuilder] = extraConfig;\n }\n return Object.assign(table, {\n enableRLS: () => {\n table[PgTable.Symbol.EnableRLS] = true;\n return table;\n }\n });\n}\nconst pgTable = (name, columns, extraConfig) => {\n return pgTableWithSchema(name, columns, extraConfig, void 0);\n};\nfunction pgTableCreator(customizeTableName) {\n return (name, columns, extraConfig) => {\n return pgTableWithSchema(customizeTableName(name), columns, extraConfig, void 0, name);\n };\n}\nexport {\n EnableRLS,\n InlineForeignKeys,\n PgTable,\n pgTable,\n pgTableCreator,\n pgTableWithSchema\n};\n//# sourceMappingURL=table.js.map",
|
|
34
|
-
"import { entityKind } from \"../entity.js\";\nimport { PgTable } from \"./table.js\";\nfunction primaryKey(...config) {\n if (config[0].columns) {\n return new PrimaryKeyBuilder(config[0].columns, config[0].name);\n }\n return new PrimaryKeyBuilder(config);\n}\nclass PrimaryKeyBuilder {\n static [entityKind] = \"PgPrimaryKeyBuilder\";\n /** @internal */\n columns;\n /** @internal */\n name;\n constructor(columns, name) {\n this.columns = columns;\n this.name = name;\n }\n /** @internal */\n build(table) {\n return new PrimaryKey(table, this.columns, this.name);\n }\n}\nclass PrimaryKey {\n constructor(table, columns, name) {\n this.table = table;\n this.columns = columns;\n this.name = name;\n }\n static [entityKind] = \"PgPrimaryKey\";\n columns;\n name;\n getName() {\n return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join(\"_\")}_pk`;\n }\n}\nexport {\n PrimaryKey,\n PrimaryKeyBuilder,\n primaryKey\n};\n//# sourceMappingURL=primary-keys.js.map",
|
|
35
|
-
"import { Column } from \"../../column.js\";\nimport { is } from \"../../entity.js\";\nimport { Table } from \"../../table.js\";\nimport {\n isDriverValueEncoder,\n isSQLWrapper,\n Param,\n Placeholder,\n SQL,\n sql,\n StringChunk,\n View\n} from \"../sql.js\";\nfunction bindIfParam(value, column) {\n if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {\n return new Param(value, column);\n }\n return value;\n}\nconst eq = (left, right) => {\n return sql`${left} = ${bindIfParam(right, left)}`;\n};\nconst ne = (left, right) => {\n return sql`${left} <> ${bindIfParam(right, left)}`;\n};\nfunction and(...unfilteredConditions) {\n const conditions = unfilteredConditions.filter(\n (c) => c !== void 0\n );\n if (conditions.length === 0) {\n return void 0;\n }\n if (conditions.length === 1) {\n return new SQL(conditions);\n }\n return new SQL([\n new StringChunk(\"(\"),\n sql.join(conditions, new StringChunk(\" and \")),\n new StringChunk(\")\")\n ]);\n}\nfunction or(...unfilteredConditions) {\n const conditions = unfilteredConditions.filter(\n (c) => c !== void 0\n );\n if (conditions.length === 0) {\n return void 0;\n }\n if (conditions.length === 1) {\n return new SQL(conditions);\n }\n return new SQL([\n new StringChunk(\"(\"),\n sql.join(conditions, new StringChunk(\" or \")),\n new StringChunk(\")\")\n ]);\n}\nfunction not(condition) {\n return sql`not ${condition}`;\n}\nconst gt = (left, right) => {\n return sql`${left} > ${bindIfParam(right, left)}`;\n};\nconst gte = (left, right) => {\n return sql`${left} >= ${bindIfParam(right, left)}`;\n};\nconst lt = (left, right) => {\n return sql`${left} < ${bindIfParam(right, left)}`;\n};\nconst lte = (left, right) => {\n return sql`${left} <= ${bindIfParam(right, left)}`;\n};\nfunction inArray(column, values) {\n if (Array.isArray(values)) {\n if (values.length === 0) {\n return sql`false`;\n }\n return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n }\n return sql`${column} in ${bindIfParam(values, column)}`;\n}\nfunction notInArray(column, values) {\n if (Array.isArray(values)) {\n if (values.length === 0) {\n return sql`true`;\n }\n return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n }\n return sql`${column} not in ${bindIfParam(values, column)}`;\n}\nfunction isNull(value) {\n return sql`${value} is null`;\n}\nfunction isNotNull(value) {\n return sql`${value} is not null`;\n}\nfunction exists(subquery) {\n return sql`exists ${subquery}`;\n}\nfunction notExists(subquery) {\n return sql`not exists ${subquery}`;\n}\nfunction between(column, min, max) {\n return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(\n max,\n column\n )}`;\n}\nfunction notBetween(column, min, max) {\n return sql`${column} not between ${bindIfParam(\n min,\n column\n )} and ${bindIfParam(max, column)}`;\n}\nfunction like(column, value) {\n return sql`${column} like ${value}`;\n}\nfunction notLike(column, value) {\n return sql`${column} not like ${value}`;\n}\nfunction ilike(column, value) {\n return sql`${column} ilike ${value}`;\n}\nfunction notIlike(column, value) {\n return sql`${column} not ilike ${value}`;\n}\nfunction arrayContains(column, values) {\n if (Array.isArray(values)) {\n if (values.length === 0) {\n throw new Error(\"arrayContains requires at least one value\");\n }\n const array = sql`${bindIfParam(values, column)}`;\n return sql`${column} @> ${array}`;\n }\n return sql`${column} @> ${bindIfParam(values, column)}`;\n}\nfunction arrayContained(column, values) {\n if (Array.isArray(values)) {\n if (values.length === 0) {\n throw new Error(\"arrayContained requires at least one value\");\n }\n const array = sql`${bindIfParam(values, column)}`;\n return sql`${column} <@ ${array}`;\n }\n return sql`${column} <@ ${bindIfParam(values, column)}`;\n}\nfunction arrayOverlaps(column, values) {\n if (Array.isArray(values)) {\n if (values.length === 0) {\n throw new Error(\"arrayOverlaps requires at least one value\");\n }\n const array = sql`${bindIfParam(values, column)}`;\n return sql`${column} && ${array}`;\n }\n return sql`${column} && ${bindIfParam(values, column)}`;\n}\nexport {\n and,\n arrayContained,\n arrayContains,\n arrayOverlaps,\n between,\n bindIfParam,\n eq,\n exists,\n gt,\n gte,\n ilike,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n notBetween,\n notExists,\n notIlike,\n notInArray,\n notLike,\n or\n};\n//# sourceMappingURL=conditions.js.map",
|
|
36
|
-
"import { sql } from \"../sql.js\";\nfunction asc(column) {\n return sql`${column} asc`;\n}\nfunction desc(column) {\n return sql`${column} desc`;\n}\nexport {\n asc,\n desc\n};\n//# sourceMappingURL=select.js.map",
|
|
37
|
-
"import { getTableUniqueName, Table } from \"./table.js\";\nimport { Column } from \"./column.js\";\nimport { entityKind, is } from \"./entity.js\";\nimport { PrimaryKeyBuilder } from \"./pg-core/primary-keys.js\";\nimport {\n and,\n asc,\n between,\n desc,\n eq,\n exists,\n gt,\n gte,\n ilike,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n notBetween,\n notExists,\n notIlike,\n notInArray,\n notLike,\n or\n} from \"./sql/expressions/index.js\";\nimport { SQL, sql } from \"./sql/sql.js\";\nclass Relation {\n constructor(sourceTable, referencedTable, relationName) {\n this.sourceTable = sourceTable;\n this.referencedTable = referencedTable;\n this.relationName = relationName;\n this.referencedTableName = referencedTable[Table.Symbol.Name];\n }\n static [entityKind] = \"Relation\";\n referencedTableName;\n fieldName;\n}\nclass Relations {\n constructor(table, config) {\n this.table = table;\n this.config = config;\n }\n static [entityKind] = \"Relations\";\n}\nclass One extends Relation {\n constructor(sourceTable, referencedTable, config, isNullable) {\n super(sourceTable, referencedTable, config?.relationName);\n this.config = config;\n this.isNullable = isNullable;\n }\n static [entityKind] = \"One\";\n withFieldName(fieldName) {\n const relation = new One(\n this.sourceTable,\n this.referencedTable,\n this.config,\n this.isNullable\n );\n relation.fieldName = fieldName;\n return relation;\n }\n}\nclass Many extends Relation {\n constructor(sourceTable, referencedTable, config) {\n super(sourceTable, referencedTable, config?.relationName);\n this.config = config;\n }\n static [entityKind] = \"Many\";\n withFieldName(fieldName) {\n const relation = new Many(\n this.sourceTable,\n this.referencedTable,\n this.config\n );\n relation.fieldName = fieldName;\n return relation;\n }\n}\nfunction getOperators() {\n return {\n and,\n between,\n eq,\n exists,\n gt,\n gte,\n ilike,\n inArray,\n isNull,\n isNotNull,\n like,\n lt,\n lte,\n ne,\n not,\n notBetween,\n notExists,\n notLike,\n notIlike,\n notInArray,\n or,\n sql\n };\n}\nfunction getOrderByOperators() {\n return {\n sql,\n asc,\n desc\n };\n}\nfunction extractTablesRelationalConfig(schema, configHelpers) {\n if (Object.keys(schema).length === 1 && \"default\" in schema && !is(schema[\"default\"], Table)) {\n schema = schema[\"default\"];\n }\n const tableNamesMap = {};\n const relationsBuffer = {};\n const tablesConfig = {};\n for (const [key, value] of Object.entries(schema)) {\n if (is(value, Table)) {\n const dbName = getTableUniqueName(value);\n const bufferedRelations = relationsBuffer[dbName];\n tableNamesMap[dbName] = key;\n tablesConfig[key] = {\n tsName: key,\n dbName: value[Table.Symbol.Name],\n schema: value[Table.Symbol.Schema],\n columns: value[Table.Symbol.Columns],\n relations: bufferedRelations?.relations ?? {},\n primaryKey: bufferedRelations?.primaryKey ?? []\n };\n for (const column of Object.values(\n value[Table.Symbol.Columns]\n )) {\n if (column.primary) {\n tablesConfig[key].primaryKey.push(column);\n }\n }\n const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);\n if (extraConfig) {\n for (const configEntry of Object.values(extraConfig)) {\n if (is(configEntry, PrimaryKeyBuilder)) {\n tablesConfig[key].primaryKey.push(...configEntry.columns);\n }\n }\n }\n } else if (is(value, Relations)) {\n const dbName = getTableUniqueName(value.table);\n const tableName = tableNamesMap[dbName];\n const relations2 = value.config(\n configHelpers(value.table)\n );\n let primaryKey;\n for (const [relationName, relation] of Object.entries(relations2)) {\n if (tableName) {\n const tableConfig = tablesConfig[tableName];\n tableConfig.relations[relationName] = relation;\n if (primaryKey) {\n tableConfig.primaryKey.push(...primaryKey);\n }\n } else {\n if (!(dbName in relationsBuffer)) {\n relationsBuffer[dbName] = {\n relations: {},\n primaryKey\n };\n }\n relationsBuffer[dbName].relations[relationName] = relation;\n }\n }\n }\n }\n return { tables: tablesConfig, tableNamesMap };\n}\nfunction relations(table, relations2) {\n return new Relations(\n table,\n (helpers) => Object.fromEntries(\n Object.entries(relations2(helpers)).map(([key, value]) => [\n key,\n value.withFieldName(key)\n ])\n )\n );\n}\nfunction createOne(sourceTable) {\n return function one(table, config) {\n return new One(\n sourceTable,\n table,\n config,\n config?.fields.reduce((res, f) => res && f.notNull, true) ?? false\n );\n };\n}\nfunction createMany(sourceTable) {\n return function many(referencedTable, config) {\n return new Many(sourceTable, referencedTable, config);\n };\n}\nfunction normalizeRelation(schema, tableNamesMap, relation) {\n if (is(relation, One) && relation.config) {\n return {\n fields: relation.config.fields,\n references: relation.config.references\n };\n }\n const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];\n if (!referencedTableTsName) {\n throw new Error(\n `Table \"${relation.referencedTable[Table.Symbol.Name]}\" not found in schema`\n );\n }\n const referencedTableConfig = schema[referencedTableTsName];\n if (!referencedTableConfig) {\n throw new Error(`Table \"${referencedTableTsName}\" not found in schema`);\n }\n const sourceTable = relation.sourceTable;\n const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];\n if (!sourceTableTsName) {\n throw new Error(\n `Table \"${sourceTable[Table.Symbol.Name]}\" not found in schema`\n );\n }\n const reverseRelations = [];\n for (const referencedTableRelation of Object.values(\n referencedTableConfig.relations\n )) {\n if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {\n reverseRelations.push(referencedTableRelation);\n }\n }\n if (reverseRelations.length > 1) {\n throw relation.relationName ? new Error(\n `There are multiple relations with name \"${relation.relationName}\" in table \"${referencedTableTsName}\"`\n ) : new Error(\n `There are multiple relations between \"${referencedTableTsName}\" and \"${relation.sourceTable[Table.Symbol.Name]}\". Please specify relation name`\n );\n }\n if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {\n return {\n fields: reverseRelations[0].config.references,\n references: reverseRelations[0].config.fields\n };\n }\n throw new Error(\n `There is not enough information to infer relation \"${sourceTableTsName}.${relation.fieldName}\"`\n );\n}\nfunction createTableRelationsHelpers(sourceTable) {\n return {\n one: createOne(sourceTable),\n many: createMany(sourceTable)\n };\n}\nfunction mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {\n const result = {};\n for (const [\n selectionItemIndex,\n selectionItem\n ] of buildQueryResultSelection.entries()) {\n if (selectionItem.isJson) {\n const relation = tableConfig.relations[selectionItem.tsKey];\n const rawSubRows = row[selectionItemIndex];\n const subRows = typeof rawSubRows === \"string\" ? JSON.parse(rawSubRows) : rawSubRows;\n result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(\n tablesConfig,\n tablesConfig[selectionItem.relationTableTsKey],\n subRows,\n selectionItem.selection,\n mapColumnValue\n ) : subRows.map(\n (subRow) => mapRelationalRow(\n tablesConfig,\n tablesConfig[selectionItem.relationTableTsKey],\n subRow,\n selectionItem.selection,\n mapColumnValue\n )\n );\n } else {\n const value = mapColumnValue(row[selectionItemIndex]);\n const field = selectionItem.field;\n let decoder;\n if (is(field, Column)) {\n decoder = field;\n } else if (is(field, SQL)) {\n decoder = field.decoder;\n } else {\n decoder = field.sql.decoder;\n }\n result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n }\n }\n return result;\n}\nexport {\n Many,\n One,\n Relation,\n Relations,\n createMany,\n createOne,\n createTableRelationsHelpers,\n extractTablesRelationalConfig,\n getOperators,\n getOrderByOperators,\n mapRelationalRow,\n normalizeRelation,\n relations\n};\n//# sourceMappingURL=relations.js.map",
|
|
38
|
-
"/**\n * Session Repository\n * Database operations for chat sessions using Drizzle ORM\n *\n * Advantages over file-based storage:\n * - Indexed queries: Fast search by title, provider, date\n * - Pagination: Load only needed sessions (no memory bloat)\n * - Aggregations: Count messages without loading full session\n * - Transactions: Data consistency for complex operations\n * - Concurrent access: Proper locking and consistency\n * - Efficient updates: Update specific fields without rewriting entire file\n */\n\nimport { eq, desc, and, like, sql, inArray } from 'drizzle-orm';\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql';\nimport { randomUUID } from 'node:crypto';\nimport {\n sessions,\n messages,\n messageParts,\n messageAttachments,\n messageUsage,\n todos,\n messageTodoSnapshots,\n type Session,\n type NewSession,\n type Message,\n type NewMessage,\n} from './schema.js';\nimport type {\n Session as SessionType,\n SessionMessage,\n MessagePart,\n FileAttachment,\n TokenUsage,\n MessageMetadata,\n StreamingPart,\n} from '../types/session.types.js';\nimport type { Todo as TodoType } from '../types/todo.types.js';\nimport type { ProviderId } from '../config/ai-config.js';\n\n/**\n * Retry helper for handling SQLITE_BUSY errors\n * Exponential backoff: 50ms, 100ms, 200ms, 400ms, 800ms\n */\nasync function retryOnBusy<T>(\n operation: () => Promise<T>,\n maxRetries = 5\n): Promise<T> {\n let lastError: any;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error: any) {\n lastError = error;\n\n // Only retry on SQLITE_BUSY errors\n if (error.message?.includes('SQLITE_BUSY') || error.code === 'SQLITE_BUSY') {\n const delay = 50 * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // Other errors: throw immediately\n throw error;\n }\n }\n\n // Max retries exceeded\n throw lastError;\n}\n\nexport class SessionRepository {\n constructor(private db: LibSQLDatabase) {}\n\n /**\n * Create a new session\n */\n async createSession(provider: ProviderId, model: string): Promise<SessionType> {\n const now = Date.now();\n const sessionId = `session-${now}`;\n\n const newSession: NewSession = {\n id: sessionId,\n provider,\n model,\n nextTodoId: 1,\n created: now,\n updated: now,\n };\n\n await this.db.insert(sessions).values(newSession);\n\n return {\n id: sessionId,\n provider,\n model,\n messages: [],\n todos: [],\n nextTodoId: 1,\n created: now,\n updated: now,\n };\n }\n\n /**\n * Create session with specific ID and timestamps (for migration)\n */\n async createSessionFromData(sessionData: {\n id: string;\n provider: ProviderId;\n model: string;\n title?: string;\n nextTodoId: number;\n created: number;\n updated: number;\n }): Promise<void> {\n await retryOnBusy(async () => {\n const newSession: NewSession = {\n id: sessionData.id,\n title: sessionData.title || null,\n provider: sessionData.provider,\n model: sessionData.model,\n nextTodoId: sessionData.nextTodoId,\n created: sessionData.created,\n updated: sessionData.updated,\n };\n\n await this.db.insert(sessions).values(newSession);\n });\n }\n\n /**\n * Get recent sessions with pagination\n * HUGE performance improvement: Only load 20 recent sessions instead of all\n */\n async getRecentSessions(limit = 20, offset = 0): Promise<SessionType[]> {\n // Get session metadata only (no messages yet - lazy loading!)\n const sessionRecords = await this.db\n .select()\n .from(sessions)\n .orderBy(desc(sessions.updated))\n .limit(limit)\n .offset(offset);\n\n // For each session, load messages, todos, etc.\n const fullSessions = await Promise.all(\n sessionRecords.map((session) => this.getSessionById(session.id))\n );\n\n return fullSessions.filter((s): s is SessionType => s !== null);\n }\n\n /**\n * Get session by ID with all related data\n */\n async getSessionById(sessionId: string): Promise<SessionType | null> {\n // Get session metadata\n const [session] = await this.db\n .select()\n .from(sessions)\n .where(eq(sessions.id, sessionId))\n .limit(1);\n\n if (!session) {\n return null;\n }\n\n // Get messages with all parts, attachments, usage\n const sessionMessages = await this.getSessionMessages(sessionId);\n\n // Get todos\n const sessionTodos = await this.getSessionTodos(sessionId);\n\n // Build return object\n const result: SessionType = {\n id: session.id,\n title: session.title || undefined,\n provider: session.provider as ProviderId,\n model: session.model,\n messages: sessionMessages,\n todos: sessionTodos,\n nextTodoId: session.nextTodoId,\n created: session.created,\n updated: session.updated,\n };\n\n return result;\n }\n\n /**\n * Get messages for a session\n * Assembles message parts, attachments, usage into SessionMessage format\n * OPTIMIZED: Batch queries instead of N+1 queries\n */\n private async getSessionMessages(sessionId: string): Promise<SessionMessage[]> {\n // Get all messages for session\n const messageRecords = await this.db\n .select()\n .from(messages)\n .where(eq(messages.sessionId, sessionId))\n .orderBy(messages.ordering);\n\n if (messageRecords.length === 0) {\n return [];\n }\n\n // Batch fetch all related data (MASSIVE performance improvement!)\n const messageIds = messageRecords.map((m) => m.id);\n\n // Fetch all parts, attachments, usage, snapshots in parallel (OPTIMIZED!)\n const [allParts, allAttachments, allUsage, allSnapshots] = await Promise.all([\n // Get all message parts for all messages\n this.db\n .select()\n .from(messageParts)\n .where(inArray(messageParts.messageId, messageIds))\n .orderBy(messageParts.ordering),\n\n // Get all attachments for all messages\n this.db\n .select()\n .from(messageAttachments)\n .where(inArray(messageAttachments.messageId, messageIds)),\n\n // Get all usage for all messages\n this.db\n .select()\n .from(messageUsage)\n .where(inArray(messageUsage.messageId, messageIds)),\n\n // Get all todo snapshots for all messages\n this.db\n .select()\n .from(messageTodoSnapshots)\n .where(inArray(messageTodoSnapshots.messageId, messageIds))\n .orderBy(messageTodoSnapshots.ordering),\n ]);\n\n // Group by message ID for O(1) lookup\n const partsByMessage = new Map<string, typeof allParts>();\n const attachmentsByMessage = new Map<string, typeof allAttachments>();\n const usageByMessage = new Map<string, (typeof allUsage)[0]>();\n const snapshotsByMessage = new Map<string, typeof allSnapshots>();\n\n for (const part of allParts) {\n if (!partsByMessage.has(part.messageId)) {\n partsByMessage.set(part.messageId, []);\n }\n partsByMessage.get(part.messageId)!.push(part);\n }\n\n for (const attachment of allAttachments) {\n if (!attachmentsByMessage.has(attachment.messageId)) {\n attachmentsByMessage.set(attachment.messageId, []);\n }\n attachmentsByMessage.get(attachment.messageId)!.push(attachment);\n }\n\n for (const usage of allUsage) {\n usageByMessage.set(usage.messageId, usage);\n }\n\n for (const snapshot of allSnapshots) {\n if (!snapshotsByMessage.has(snapshot.messageId)) {\n snapshotsByMessage.set(snapshot.messageId, []);\n }\n snapshotsByMessage.get(snapshot.messageId)!.push(snapshot);\n }\n\n // Assemble messages using grouped data\n const fullMessages = messageRecords.map((msg) => {\n const parts = partsByMessage.get(msg.id) || [];\n const attachments = attachmentsByMessage.get(msg.id) || [];\n const usage = usageByMessage.get(msg.id);\n const todoSnap = snapshotsByMessage.get(msg.id) || [];\n\n const sessionMessage: SessionMessage = {\n role: msg.role as 'user' | 'assistant',\n content: parts.map((p) => JSON.parse(p.content) as MessagePart),\n timestamp: msg.timestamp,\n status: (msg.status as 'active' | 'completed' | 'error' | 'abort') || 'completed',\n };\n\n if (msg.metadata) {\n sessionMessage.metadata = JSON.parse(msg.metadata) as MessageMetadata;\n }\n\n // Self-healing: Normalize attachments on read\n // Old/corrupted data might have invalid entries - filter them out\n if (attachments.length > 0) {\n const validAttachments = attachments.filter((a) =>\n a && typeof a === 'object' && a.path && a.relativePath\n );\n\n if (validAttachments.length > 0) {\n sessionMessage.attachments = validAttachments.map((a) => ({\n path: a.path,\n relativePath: a.relativePath,\n size: a.size || undefined,\n }));\n }\n // If all invalid, leave attachments undefined (no broken data in memory)\n }\n\n if (usage) {\n sessionMessage.usage = {\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n };\n }\n\n if (msg.finishReason) {\n sessionMessage.finishReason = msg.finishReason;\n }\n\n if (todoSnap.length > 0) {\n sessionMessage.todoSnapshot = todoSnap.map((t) => ({\n id: t.todoId,\n content: t.content,\n activeForm: t.activeForm,\n status: t.status as 'pending' | 'in_progress' | 'completed',\n ordering: t.ordering,\n }));\n }\n\n return sessionMessage;\n });\n\n return fullMessages;\n }\n\n /**\n * Get todos for a session\n */\n private async getSessionTodos(sessionId: string): Promise<TodoType[]> {\n const todoRecords = await this.db\n .select()\n .from(todos)\n .where(eq(todos.sessionId, sessionId))\n .orderBy(todos.ordering);\n\n return todoRecords.map((t) => ({\n id: t.id,\n content: t.content,\n activeForm: t.activeForm,\n status: t.status as 'pending' | 'in_progress' | 'completed',\n ordering: t.ordering,\n }));\n }\n\n /**\n * Add message to session\n * Atomically inserts message with all parts, attachments, usage\n */\n async addMessage(\n sessionId: string,\n role: 'user' | 'assistant',\n content: MessagePart[],\n attachments?: FileAttachment[],\n usage?: TokenUsage,\n finishReason?: string,\n metadata?: MessageMetadata,\n todoSnapshot?: TodoType[],\n status?: 'active' | 'completed' | 'error' | 'abort'\n ): Promise<string> {\n return await retryOnBusy(async () => {\n const messageId = randomUUID();\n const now = Date.now();\n\n // Get current message count for ordering\n const [{ count }] = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(messages)\n .where(eq(messages.sessionId, sessionId));\n\n const ordering = count;\n\n // Insert in transaction\n await this.db.transaction(async (tx) => {\n // Insert message\n await tx.insert(messages).values({\n id: messageId,\n sessionId,\n role,\n timestamp: now,\n ordering,\n finishReason: finishReason || null,\n status: status || 'completed',\n metadata: metadata ? JSON.stringify(metadata) : null,\n });\n\n // Insert message parts\n for (let i = 0; i < content.length; i++) {\n await tx.insert(messageParts).values({\n id: randomUUID(),\n messageId,\n ordering: i,\n type: content[i].type,\n content: JSON.stringify(content[i]),\n });\n }\n\n // Insert attachments\n if (attachments && attachments.length > 0) {\n for (const att of attachments) {\n await tx.insert(messageAttachments).values({\n id: randomUUID(),\n messageId,\n path: att.path,\n relativePath: att.relativePath,\n size: att.size || null,\n });\n }\n }\n\n // Insert usage\n if (usage) {\n await tx.insert(messageUsage).values({\n messageId,\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n });\n }\n\n // Insert todo snapshot\n if (todoSnapshot && todoSnapshot.length > 0) {\n for (const todo of todoSnapshot) {\n await tx.insert(messageTodoSnapshots).values({\n id: randomUUID(),\n messageId,\n todoId: todo.id,\n content: todo.content,\n activeForm: todo.activeForm,\n status: todo.status,\n ordering: todo.ordering,\n });\n }\n }\n\n // Update session timestamp\n await tx\n .update(sessions)\n .set({ updated: now })\n .where(eq(sessions.id, sessionId));\n });\n\n return messageId;\n });\n }\n\n /**\n * Update session title\n */\n async updateSessionTitle(sessionId: string, title: string): Promise<void> {\n await this.db\n .update(sessions)\n .set({ title, updated: Date.now() })\n .where(eq(sessions.id, sessionId));\n }\n\n /**\n * Update session model\n */\n async updateSessionModel(sessionId: string, model: string): Promise<void> {\n await this.db\n .update(sessions)\n .set({ model, updated: Date.now() })\n .where(eq(sessions.id, sessionId));\n }\n\n /**\n * Update session provider and model\n */\n async updateSessionProvider(sessionId: string, provider: ProviderId, model: string): Promise<void> {\n await this.db\n .update(sessions)\n .set({ provider, model, updated: Date.now() })\n .where(eq(sessions.id, sessionId));\n }\n\n /**\n * Update message parts (used during streaming)\n * Replaces all parts for a message atomically\n */\n async updateMessageParts(messageId: string, parts: MessagePart[]): Promise<void> {\n await retryOnBusy(async () => {\n await this.db.transaction(async (tx) => {\n // Delete existing parts\n await tx.delete(messageParts).where(eq(messageParts.messageId, messageId));\n\n // Insert new parts\n for (let i = 0; i < parts.length; i++) {\n await tx.insert(messageParts).values({\n id: randomUUID(),\n messageId,\n ordering: i,\n type: parts[i].type,\n content: JSON.stringify(parts[i]),\n });\n }\n });\n });\n }\n\n /**\n * Update message status (used when streaming completes/aborts)\n */\n async updateMessageStatus(\n messageId: string,\n status: 'active' | 'completed' | 'error' | 'abort',\n finishReason?: string\n ): Promise<void> {\n await retryOnBusy(async () => {\n // Only update finishReason if explicitly provided\n const updates: {\n status: 'active' | 'completed' | 'error' | 'abort';\n finishReason?: string | null;\n } = { status };\n\n if (finishReason !== undefined) {\n updates.finishReason = finishReason || null;\n }\n\n await this.db\n .update(messages)\n .set(updates)\n .where(eq(messages.id, messageId));\n });\n }\n\n /**\n * Update message usage (used when streaming completes)\n * Inserts or replaces usage data for a message\n */\n async updateMessageUsage(messageId: string, usage: TokenUsage): Promise<void> {\n await retryOnBusy(async () => {\n // Check if usage already exists\n const [existing] = await this.db\n .select()\n .from(messageUsage)\n .where(eq(messageUsage.messageId, messageId))\n .limit(1);\n\n if (existing) {\n // Update existing usage\n await this.db\n .update(messageUsage)\n .set({\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n })\n .where(eq(messageUsage.messageId, messageId));\n } else {\n // Insert new usage\n await this.db.insert(messageUsage).values({\n messageId,\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n });\n }\n });\n }\n\n /**\n * Delete session (CASCADE will delete all related data)\n */\n async deleteSession(sessionId: string): Promise<void> {\n await this.db.delete(sessions).where(eq(sessions.id, sessionId));\n }\n\n /**\n * Search sessions by title\n * HUGE performance improvement: Uses index, no need to load all sessions\n */\n async searchSessionsByTitle(query: string, limit = 20): Promise<SessionType[]> {\n const sessionRecords = await this.db\n .select()\n .from(sessions)\n .where(like(sessions.title, `%${query}%`))\n .orderBy(desc(sessions.updated))\n .limit(limit);\n\n const fullSessions = await Promise.all(\n sessionRecords.map((session) => this.getSessionById(session.id))\n );\n\n return fullSessions.filter((s): s is SessionType => s !== null);\n }\n\n /**\n * Get session count\n * Efficient: No need to load sessions into memory\n */\n async getSessionCount(): Promise<number> {\n const [{ count }] = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(sessions);\n\n return count;\n }\n\n /**\n * Get message count for session\n * Efficient: No need to load messages\n */\n async getMessageCount(sessionId: string): Promise<number> {\n const [{ count }] = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(messages)\n .where(eq(messages.sessionId, sessionId));\n\n return count;\n }\n\n /**\n * Get most recently updated session (for headless mode continuation)\n * Returns the last active session\n */\n async getLastSession(): Promise<SessionType | null> {\n // Get most recent session by updated timestamp\n const [lastSession] = await this.db\n .select()\n .from(sessions)\n .orderBy(desc(sessions.updated))\n .limit(1);\n\n if (!lastSession) {\n return null;\n }\n\n // Load full session data\n return this.getSessionById(lastSession.id);\n }\n\n /**\n * Update todos for session\n */\n async updateTodos(sessionId: string, newTodos: TodoType[], nextTodoId: number): Promise<void> {\n await retryOnBusy(async () => {\n await this.db.transaction(async (tx) => {\n // Delete existing todos\n await tx.delete(todos).where(eq(todos.sessionId, sessionId));\n\n // Insert new todos\n for (const todo of newTodos) {\n await tx.insert(todos).values({\n id: todo.id,\n sessionId,\n content: todo.content,\n activeForm: todo.activeForm,\n status: todo.status,\n ordering: todo.ordering,\n });\n }\n\n // Update nextTodoId and timestamp\n await tx\n .update(sessions)\n .set({ nextTodoId, updated: Date.now() })\n .where(eq(sessions.id, sessionId));\n });\n });\n }\n}\n",
|
|
39
|
-
"import { entityKind } from \"../entity.js\";\nimport { TableName } from \"../table.utils.js\";\nclass ForeignKeyBuilder {\n static [entityKind] = \"SQLiteForeignKeyBuilder\";\n /** @internal */\n reference;\n /** @internal */\n _onUpdate;\n /** @internal */\n _onDelete;\n constructor(config, actions) {\n this.reference = () => {\n const { name, columns, foreignColumns } = config();\n return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };\n };\n if (actions) {\n this._onUpdate = actions.onUpdate;\n this._onDelete = actions.onDelete;\n }\n }\n onUpdate(action) {\n this._onUpdate = action;\n return this;\n }\n onDelete(action) {\n this._onDelete = action;\n return this;\n }\n /** @internal */\n build(table) {\n return new ForeignKey(table, this);\n }\n}\nclass ForeignKey {\n constructor(table, builder) {\n this.table = table;\n this.reference = builder.reference;\n this.onUpdate = builder._onUpdate;\n this.onDelete = builder._onDelete;\n }\n static [entityKind] = \"SQLiteForeignKey\";\n reference;\n onUpdate;\n onDelete;\n getName() {\n const { name, columns, foreignColumns } = this.reference();\n const columnNames = columns.map((column) => column.name);\n const foreignColumnNames = foreignColumns.map((column) => column.name);\n const chunks = [\n this.table[TableName],\n ...columnNames,\n foreignColumns[0].table[TableName],\n ...foreignColumnNames\n ];\n return name ?? `${chunks.join(\"_\")}_fk`;\n }\n}\nfunction foreignKey(config) {\n function mappedConfig() {\n if (typeof config === \"function\") {\n const { name, columns, foreignColumns } = config();\n return {\n name,\n columns,\n foreignColumns\n };\n }\n return config;\n }\n return new ForeignKeyBuilder(mappedConfig);\n}\nexport {\n ForeignKey,\n ForeignKeyBuilder,\n foreignKey\n};\n//# sourceMappingURL=foreign-keys.js.map",
|
|
40
|
-
"import { entityKind } from \"../entity.js\";\nimport { TableName } from \"../table.utils.js\";\nfunction uniqueKeyName(table, columns) {\n return `${table[TableName]}_${columns.join(\"_\")}_unique`;\n}\nfunction unique(name) {\n return new UniqueOnConstraintBuilder(name);\n}\nclass UniqueConstraintBuilder {\n constructor(columns, name) {\n this.name = name;\n this.columns = columns;\n }\n static [entityKind] = \"SQLiteUniqueConstraintBuilder\";\n /** @internal */\n columns;\n /** @internal */\n build(table) {\n return new UniqueConstraint(table, this.columns, this.name);\n }\n}\nclass UniqueOnConstraintBuilder {\n static [entityKind] = \"SQLiteUniqueOnConstraintBuilder\";\n /** @internal */\n name;\n constructor(name) {\n this.name = name;\n }\n on(...columns) {\n return new UniqueConstraintBuilder(columns, this.name);\n }\n}\nclass UniqueConstraint {\n constructor(table, columns, name) {\n this.table = table;\n this.columns = columns;\n this.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n }\n static [entityKind] = \"SQLiteUniqueConstraint\";\n columns;\n name;\n getName() {\n return this.name;\n }\n}\nexport {\n UniqueConstraint,\n UniqueConstraintBuilder,\n UniqueOnConstraintBuilder,\n unique,\n uniqueKeyName\n};\n//# sourceMappingURL=unique-constraint.js.map",
|
|
41
|
-
"import { ColumnBuilder } from \"../../column-builder.js\";\nimport { Column } from \"../../column.js\";\nimport { entityKind } from \"../../entity.js\";\nimport { ForeignKeyBuilder } from \"../foreign-keys.js\";\nimport { uniqueKeyName } from \"../unique-constraint.js\";\nclass SQLiteColumnBuilder extends ColumnBuilder {\n static [entityKind] = \"SQLiteColumnBuilder\";\n foreignKeyConfigs = [];\n references(ref, actions = {}) {\n this.foreignKeyConfigs.push({ ref, actions });\n return this;\n }\n unique(name) {\n this.config.isUnique = true;\n this.config.uniqueName = name;\n return this;\n }\n generatedAlwaysAs(as, config) {\n this.config.generated = {\n as,\n type: \"always\",\n mode: config?.mode ?? \"virtual\"\n };\n return this;\n }\n /** @internal */\n buildForeignKeys(column, table) {\n return this.foreignKeyConfigs.map(({ ref, actions }) => {\n return ((ref2, actions2) => {\n const builder = new ForeignKeyBuilder(() => {\n const foreignColumn = ref2();\n return { columns: [column], foreignColumns: [foreignColumn] };\n });\n if (actions2.onUpdate) {\n builder.onUpdate(actions2.onUpdate);\n }\n if (actions2.onDelete) {\n builder.onDelete(actions2.onDelete);\n }\n return builder.build(table);\n })(ref, actions);\n });\n }\n}\nclass SQLiteColumn extends Column {\n constructor(table, config) {\n if (!config.uniqueName) {\n config.uniqueName = uniqueKeyName(table, [config.name]);\n }\n super(table, config);\n this.table = table;\n }\n static [entityKind] = \"SQLiteColumn\";\n}\nexport {\n SQLiteColumn,\n SQLiteColumnBuilder\n};\n//# sourceMappingURL=common.js.map",
|
|
42
|
-
"import { entityKind } from \"../../entity.js\";\nimport { getColumnNameAndConfig, textDecoder } from \"../../utils.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nclass SQLiteBigIntBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteBigIntBuilder\";\n constructor(name) {\n super(name, \"bigint\", \"SQLiteBigInt\");\n }\n /** @internal */\n build(table) {\n return new SQLiteBigInt(table, this.config);\n }\n}\nclass SQLiteBigInt extends SQLiteColumn {\n static [entityKind] = \"SQLiteBigInt\";\n getSQLType() {\n return \"blob\";\n }\n mapFromDriverValue(value) {\n if (typeof Buffer !== \"undefined\" && Buffer.from) {\n const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);\n return BigInt(buf.toString(\"utf8\"));\n }\n return BigInt(textDecoder.decode(value));\n }\n mapToDriverValue(value) {\n return Buffer.from(value.toString());\n }\n}\nclass SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteBlobJsonBuilder\";\n constructor(name) {\n super(name, \"json\", \"SQLiteBlobJson\");\n }\n /** @internal */\n build(table) {\n return new SQLiteBlobJson(\n table,\n this.config\n );\n }\n}\nclass SQLiteBlobJson extends SQLiteColumn {\n static [entityKind] = \"SQLiteBlobJson\";\n getSQLType() {\n return \"blob\";\n }\n mapFromDriverValue(value) {\n if (typeof Buffer !== \"undefined\" && Buffer.from) {\n const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);\n return JSON.parse(buf.toString(\"utf8\"));\n }\n return JSON.parse(textDecoder.decode(value));\n }\n mapToDriverValue(value) {\n return Buffer.from(JSON.stringify(value));\n }\n}\nclass SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteBlobBufferBuilder\";\n constructor(name) {\n super(name, \"buffer\", \"SQLiteBlobBuffer\");\n }\n /** @internal */\n build(table) {\n return new SQLiteBlobBuffer(table, this.config);\n }\n}\nclass SQLiteBlobBuffer extends SQLiteColumn {\n static [entityKind] = \"SQLiteBlobBuffer\";\n mapFromDriverValue(value) {\n if (Buffer.isBuffer(value)) {\n return value;\n }\n return Buffer.from(value);\n }\n getSQLType() {\n return \"blob\";\n }\n}\nfunction blob(a, b) {\n const { name, config } = getColumnNameAndConfig(a, b);\n if (config?.mode === \"json\") {\n return new SQLiteBlobJsonBuilder(name);\n }\n if (config?.mode === \"bigint\") {\n return new SQLiteBigIntBuilder(name);\n }\n return new SQLiteBlobBufferBuilder(name);\n}\nexport {\n SQLiteBigInt,\n SQLiteBigIntBuilder,\n SQLiteBlobBuffer,\n SQLiteBlobBufferBuilder,\n SQLiteBlobJson,\n SQLiteBlobJsonBuilder,\n blob\n};\n//# sourceMappingURL=blob.js.map",
|
|
43
|
-
"import { entityKind } from \"../../entity.js\";\nimport { getColumnNameAndConfig } from \"../../utils.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nclass SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteCustomColumnBuilder\";\n constructor(name, fieldConfig, customTypeParams) {\n super(name, \"custom\", \"SQLiteCustomColumn\");\n this.config.fieldConfig = fieldConfig;\n this.config.customTypeParams = customTypeParams;\n }\n /** @internal */\n build(table) {\n return new SQLiteCustomColumn(\n table,\n this.config\n );\n }\n}\nclass SQLiteCustomColumn extends SQLiteColumn {\n static [entityKind] = \"SQLiteCustomColumn\";\n sqlName;\n mapTo;\n mapFrom;\n constructor(table, config) {\n super(table, config);\n this.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n this.mapTo = config.customTypeParams.toDriver;\n this.mapFrom = config.customTypeParams.fromDriver;\n }\n getSQLType() {\n return this.sqlName;\n }\n mapFromDriverValue(value) {\n return typeof this.mapFrom === \"function\" ? this.mapFrom(value) : value;\n }\n mapToDriverValue(value) {\n return typeof this.mapTo === \"function\" ? this.mapTo(value) : value;\n }\n}\nfunction customType(customTypeParams) {\n return (a, b) => {\n const { name, config } = getColumnNameAndConfig(a, b);\n return new SQLiteCustomColumnBuilder(\n name,\n config,\n customTypeParams\n );\n };\n}\nexport {\n SQLiteCustomColumn,\n SQLiteCustomColumnBuilder,\n customType\n};\n//# sourceMappingURL=custom.js.map",
|
|
44
|
-
"import { entityKind } from \"../../entity.js\";\nimport { sql } from \"../../sql/sql.js\";\nimport { getColumnNameAndConfig } from \"../../utils.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nclass SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteBaseIntegerBuilder\";\n constructor(name, dataType, columnType) {\n super(name, dataType, columnType);\n this.config.autoIncrement = false;\n }\n primaryKey(config) {\n if (config?.autoIncrement) {\n this.config.autoIncrement = true;\n }\n this.config.hasDefault = true;\n return super.primaryKey();\n }\n}\nclass SQLiteBaseInteger extends SQLiteColumn {\n static [entityKind] = \"SQLiteBaseInteger\";\n autoIncrement = this.config.autoIncrement;\n getSQLType() {\n return \"integer\";\n }\n}\nclass SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {\n static [entityKind] = \"SQLiteIntegerBuilder\";\n constructor(name) {\n super(name, \"number\", \"SQLiteInteger\");\n }\n build(table) {\n return new SQLiteInteger(\n table,\n this.config\n );\n }\n}\nclass SQLiteInteger extends SQLiteBaseInteger {\n static [entityKind] = \"SQLiteInteger\";\n}\nclass SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {\n static [entityKind] = \"SQLiteTimestampBuilder\";\n constructor(name, mode) {\n super(name, \"date\", \"SQLiteTimestamp\");\n this.config.mode = mode;\n }\n /**\n * @deprecated Use `default()` with your own expression instead.\n *\n * Adds `DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer))` to the column, which is the current epoch timestamp in milliseconds.\n */\n defaultNow() {\n return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);\n }\n build(table) {\n return new SQLiteTimestamp(\n table,\n this.config\n );\n }\n}\nclass SQLiteTimestamp extends SQLiteBaseInteger {\n static [entityKind] = \"SQLiteTimestamp\";\n mode = this.config.mode;\n mapFromDriverValue(value) {\n if (this.config.mode === \"timestamp\") {\n return new Date(value * 1e3);\n }\n return new Date(value);\n }\n mapToDriverValue(value) {\n const unix = value.getTime();\n if (this.config.mode === \"timestamp\") {\n return Math.floor(unix / 1e3);\n }\n return unix;\n }\n}\nclass SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {\n static [entityKind] = \"SQLiteBooleanBuilder\";\n constructor(name, mode) {\n super(name, \"boolean\", \"SQLiteBoolean\");\n this.config.mode = mode;\n }\n build(table) {\n return new SQLiteBoolean(\n table,\n this.config\n );\n }\n}\nclass SQLiteBoolean extends SQLiteBaseInteger {\n static [entityKind] = \"SQLiteBoolean\";\n mode = this.config.mode;\n mapFromDriverValue(value) {\n return Number(value) === 1;\n }\n mapToDriverValue(value) {\n return value ? 1 : 0;\n }\n}\nfunction integer(a, b) {\n const { name, config } = getColumnNameAndConfig(a, b);\n if (config?.mode === \"timestamp\" || config?.mode === \"timestamp_ms\") {\n return new SQLiteTimestampBuilder(name, config.mode);\n }\n if (config?.mode === \"boolean\") {\n return new SQLiteBooleanBuilder(name, config.mode);\n }\n return new SQLiteIntegerBuilder(name);\n}\nconst int = integer;\nexport {\n SQLiteBaseInteger,\n SQLiteBaseIntegerBuilder,\n SQLiteBoolean,\n SQLiteBooleanBuilder,\n SQLiteInteger,\n SQLiteIntegerBuilder,\n SQLiteTimestamp,\n SQLiteTimestampBuilder,\n int,\n integer\n};\n//# sourceMappingURL=integer.js.map",
|
|
45
|
-
"import { entityKind } from \"../../entity.js\";\nimport { getColumnNameAndConfig } from \"../../utils.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nclass SQLiteNumericBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteNumericBuilder\";\n constructor(name) {\n super(name, \"string\", \"SQLiteNumeric\");\n }\n /** @internal */\n build(table) {\n return new SQLiteNumeric(\n table,\n this.config\n );\n }\n}\nclass SQLiteNumeric extends SQLiteColumn {\n static [entityKind] = \"SQLiteNumeric\";\n mapFromDriverValue(value) {\n if (typeof value === \"string\") return value;\n return String(value);\n }\n getSQLType() {\n return \"numeric\";\n }\n}\nclass SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteNumericNumberBuilder\";\n constructor(name) {\n super(name, \"number\", \"SQLiteNumericNumber\");\n }\n /** @internal */\n build(table) {\n return new SQLiteNumericNumber(\n table,\n this.config\n );\n }\n}\nclass SQLiteNumericNumber extends SQLiteColumn {\n static [entityKind] = \"SQLiteNumericNumber\";\n mapFromDriverValue(value) {\n if (typeof value === \"number\") return value;\n return Number(value);\n }\n mapToDriverValue = String;\n getSQLType() {\n return \"numeric\";\n }\n}\nclass SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteNumericBigIntBuilder\";\n constructor(name) {\n super(name, \"bigint\", \"SQLiteNumericBigInt\");\n }\n /** @internal */\n build(table) {\n return new SQLiteNumericBigInt(\n table,\n this.config\n );\n }\n}\nclass SQLiteNumericBigInt extends SQLiteColumn {\n static [entityKind] = \"SQLiteNumericBigInt\";\n mapFromDriverValue = BigInt;\n mapToDriverValue = String;\n getSQLType() {\n return \"numeric\";\n }\n}\nfunction numeric(a, b) {\n const { name, config } = getColumnNameAndConfig(a, b);\n const mode = config?.mode;\n return mode === \"number\" ? new SQLiteNumericNumberBuilder(name) : mode === \"bigint\" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);\n}\nexport {\n SQLiteNumeric,\n SQLiteNumericBigInt,\n SQLiteNumericBigIntBuilder,\n SQLiteNumericBuilder,\n SQLiteNumericNumber,\n SQLiteNumericNumberBuilder,\n numeric\n};\n//# sourceMappingURL=numeric.js.map",
|
|
46
|
-
"import { entityKind } from \"../../entity.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nclass SQLiteRealBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteRealBuilder\";\n constructor(name) {\n super(name, \"number\", \"SQLiteReal\");\n }\n /** @internal */\n build(table) {\n return new SQLiteReal(table, this.config);\n }\n}\nclass SQLiteReal extends SQLiteColumn {\n static [entityKind] = \"SQLiteReal\";\n getSQLType() {\n return \"real\";\n }\n}\nfunction real(name) {\n return new SQLiteRealBuilder(name ?? \"\");\n}\nexport {\n SQLiteReal,\n SQLiteRealBuilder,\n real\n};\n//# sourceMappingURL=real.js.map",
|
|
47
|
-
"import { entityKind } from \"../../entity.js\";\nimport { getColumnNameAndConfig } from \"../../utils.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nclass SQLiteTextBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteTextBuilder\";\n constructor(name, config) {\n super(name, \"string\", \"SQLiteText\");\n this.config.enumValues = config.enum;\n this.config.length = config.length;\n }\n /** @internal */\n build(table) {\n return new SQLiteText(\n table,\n this.config\n );\n }\n}\nclass SQLiteText extends SQLiteColumn {\n static [entityKind] = \"SQLiteText\";\n enumValues = this.config.enumValues;\n length = this.config.length;\n constructor(table, config) {\n super(table, config);\n }\n getSQLType() {\n return `text${this.config.length ? `(${this.config.length})` : \"\"}`;\n }\n}\nclass SQLiteTextJsonBuilder extends SQLiteColumnBuilder {\n static [entityKind] = \"SQLiteTextJsonBuilder\";\n constructor(name) {\n super(name, \"json\", \"SQLiteTextJson\");\n }\n /** @internal */\n build(table) {\n return new SQLiteTextJson(\n table,\n this.config\n );\n }\n}\nclass SQLiteTextJson extends SQLiteColumn {\n static [entityKind] = \"SQLiteTextJson\";\n getSQLType() {\n return \"text\";\n }\n mapFromDriverValue(value) {\n return JSON.parse(value);\n }\n mapToDriverValue(value) {\n return JSON.stringify(value);\n }\n}\nfunction text(a, b = {}) {\n const { name, config } = getColumnNameAndConfig(a, b);\n if (config.mode === \"json\") {\n return new SQLiteTextJsonBuilder(name);\n }\n return new SQLiteTextBuilder(name, config);\n}\nexport {\n SQLiteText,\n SQLiteTextBuilder,\n SQLiteTextJson,\n SQLiteTextJsonBuilder,\n text\n};\n//# sourceMappingURL=text.js.map",
|
|
48
|
-
"import { ColumnAliasProxyHandler, TableAliasProxyHandler } from \"./alias.js\";\nimport { Column } from \"./column.js\";\nimport { entityKind, is } from \"./entity.js\";\nimport { SQL, View } from \"./sql/sql.js\";\nimport { Subquery } from \"./subquery.js\";\nimport { ViewBaseConfig } from \"./view-common.js\";\nclass SelectionProxyHandler {\n static [entityKind] = \"SelectionProxyHandler\";\n config;\n constructor(config) {\n this.config = { ...config };\n }\n get(subquery, prop) {\n if (prop === \"_\") {\n return {\n ...subquery[\"_\"],\n selectedFields: new Proxy(\n subquery._.selectedFields,\n this\n )\n };\n }\n if (prop === ViewBaseConfig) {\n return {\n ...subquery[ViewBaseConfig],\n selectedFields: new Proxy(\n subquery[ViewBaseConfig].selectedFields,\n this\n )\n };\n }\n if (typeof prop === \"symbol\") {\n return subquery[prop];\n }\n const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;\n const value = columns[prop];\n if (is(value, SQL.Aliased)) {\n if (this.config.sqlAliasedBehavior === \"sql\" && !value.isSelectionField) {\n return value.sql;\n }\n const newValue = value.clone();\n newValue.isSelectionField = true;\n return newValue;\n }\n if (is(value, SQL)) {\n if (this.config.sqlBehavior === \"sql\") {\n return value;\n }\n throw new Error(\n `You tried to reference \"${prop}\" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using \".as('alias')\" method.`\n );\n }\n if (is(value, Column)) {\n if (this.config.alias) {\n return new Proxy(\n value,\n new ColumnAliasProxyHandler(\n new Proxy(\n value.table,\n new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false)\n )\n )\n );\n }\n return value;\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n return new Proxy(value, new SelectionProxyHandler(this.config));\n }\n}\nexport {\n SelectionProxyHandler\n};\n//# sourceMappingURL=selection-proxy.js.map",
|
|
49
|
-
"import { blob } from \"./blob.js\";\nimport { customType } from \"./custom.js\";\nimport { integer } from \"./integer.js\";\nimport { numeric } from \"./numeric.js\";\nimport { real } from \"./real.js\";\nimport { text } from \"./text.js\";\nfunction getSQLiteColumnBuilders() {\n return {\n blob,\n customType,\n integer,\n numeric,\n real,\n text\n };\n}\nexport {\n getSQLiteColumnBuilders\n};\n//# sourceMappingURL=all.js.map",
|
|
50
|
-
"import { entityKind } from \"../entity.js\";\nimport { Table } from \"../table.js\";\nimport { getSQLiteColumnBuilders } from \"./columns/all.js\";\nconst InlineForeignKeys = Symbol.for(\"drizzle:SQLiteInlineForeignKeys\");\nclass SQLiteTable extends Table {\n static [entityKind] = \"SQLiteTable\";\n /** @internal */\n static Symbol = Object.assign({}, Table.Symbol, {\n InlineForeignKeys\n });\n /** @internal */\n [Table.Symbol.Columns];\n /** @internal */\n [InlineForeignKeys] = [];\n /** @internal */\n [Table.Symbol.ExtraConfigBuilder] = void 0;\n}\nfunction sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {\n const rawTable = new SQLiteTable(name, schema, baseName);\n const parsedColumns = typeof columns === \"function\" ? columns(getSQLiteColumnBuilders()) : columns;\n const builtColumns = Object.fromEntries(\n Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {\n const colBuilder = colBuilderBase;\n colBuilder.setName(name2);\n const column = colBuilder.build(rawTable);\n rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n return [name2, column];\n })\n );\n const table = Object.assign(rawTable, builtColumns);\n table[Table.Symbol.Columns] = builtColumns;\n table[Table.Symbol.ExtraConfigColumns] = builtColumns;\n if (extraConfig) {\n table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;\n }\n return table;\n}\nconst sqliteTable = (name, columns, extraConfig) => {\n return sqliteTableBase(name, columns, extraConfig);\n};\nfunction sqliteTableCreator(customizeTableName) {\n return (name, columns, extraConfig) => {\n return sqliteTableBase(customizeTableName(name), columns, extraConfig, void 0, name);\n };\n}\nexport {\n InlineForeignKeys,\n SQLiteTable,\n sqliteTable,\n sqliteTableCreator\n};\n//# sourceMappingURL=table.js.map",
|
|
51
|
-
"import { entityKind } from \"../entity.js\";\nclass IndexBuilderOn {\n constructor(name, unique) {\n this.name = name;\n this.unique = unique;\n }\n static [entityKind] = \"SQLiteIndexBuilderOn\";\n on(...columns) {\n return new IndexBuilder(this.name, columns, this.unique);\n }\n}\nclass IndexBuilder {\n static [entityKind] = \"SQLiteIndexBuilder\";\n /** @internal */\n config;\n constructor(name, columns, unique) {\n this.config = {\n name,\n columns,\n unique,\n where: void 0\n };\n }\n /**\n * Condition for partial index.\n */\n where(condition) {\n this.config.where = condition;\n return this;\n }\n /** @internal */\n build(table) {\n return new Index(this.config, table);\n }\n}\nclass Index {\n static [entityKind] = \"SQLiteIndex\";\n config;\n constructor(config, table) {\n this.config = { ...config, table };\n }\n}\nfunction index(name) {\n return new IndexBuilderOn(name, false);\n}\nfunction uniqueIndex(name) {\n return new IndexBuilderOn(name, true);\n}\nexport {\n Index,\n IndexBuilder,\n IndexBuilderOn,\n index,\n uniqueIndex\n};\n//# sourceMappingURL=indexes.js.map",
|
|
52
|
-
"import { entityKind } from \"../entity.js\";\nimport { SQLiteTable } from \"./table.js\";\nfunction primaryKey(...config) {\n if (config[0].columns) {\n return new PrimaryKeyBuilder(config[0].columns, config[0].name);\n }\n return new PrimaryKeyBuilder(config);\n}\nclass PrimaryKeyBuilder {\n static [entityKind] = \"SQLitePrimaryKeyBuilder\";\n /** @internal */\n columns;\n /** @internal */\n name;\n constructor(columns, name) {\n this.columns = columns;\n this.name = name;\n }\n /** @internal */\n build(table) {\n return new PrimaryKey(table, this.columns, this.name);\n }\n}\nclass PrimaryKey {\n constructor(table, columns, name) {\n this.table = table;\n this.columns = columns;\n this.name = name;\n }\n static [entityKind] = \"SQLitePrimaryKey\";\n columns;\n name;\n getName() {\n return this.name ?? `${this.table[SQLiteTable.Symbol.Name]}_${this.columns.map((column) => column.name).join(\"_\")}_pk`;\n }\n}\nexport {\n PrimaryKey,\n PrimaryKeyBuilder,\n primaryKey\n};\n//# sourceMappingURL=primary-keys.js.map",
|
|
53
|
-
"import { is } from \"../entity.js\";\nimport { SQL } from \"../sql/sql.js\";\nimport { Subquery } from \"../subquery.js\";\nimport { Table } from \"../table.js\";\nimport { ViewBaseConfig } from \"../view-common.js\";\nimport { CheckBuilder } from \"./checks.js\";\nimport { ForeignKeyBuilder } from \"./foreign-keys.js\";\nimport { IndexBuilder } from \"./indexes.js\";\nimport { PrimaryKeyBuilder } from \"./primary-keys.js\";\nimport { SQLiteTable } from \"./table.js\";\nimport { UniqueConstraintBuilder } from \"./unique-constraint.js\";\nfunction getTableConfig(table) {\n const columns = Object.values(table[SQLiteTable.Symbol.Columns]);\n const indexes = [];\n const checks = [];\n const primaryKeys = [];\n const uniqueConstraints = [];\n const foreignKeys = Object.values(table[SQLiteTable.Symbol.InlineForeignKeys]);\n const name = table[Table.Symbol.Name];\n const extraConfigBuilder = table[SQLiteTable.Symbol.ExtraConfigBuilder];\n if (extraConfigBuilder !== void 0) {\n const extraConfig = extraConfigBuilder(table[SQLiteTable.Symbol.Columns]);\n const extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) : Object.values(extraConfig);\n for (const builder of Object.values(extraValues)) {\n if (is(builder, IndexBuilder)) {\n indexes.push(builder.build(table));\n } else if (is(builder, CheckBuilder)) {\n checks.push(builder.build(table));\n } else if (is(builder, UniqueConstraintBuilder)) {\n uniqueConstraints.push(builder.build(table));\n } else if (is(builder, PrimaryKeyBuilder)) {\n primaryKeys.push(builder.build(table));\n } else if (is(builder, ForeignKeyBuilder)) {\n foreignKeys.push(builder.build(table));\n }\n }\n }\n return {\n columns,\n indexes,\n foreignKeys,\n checks,\n primaryKeys,\n uniqueConstraints,\n name\n };\n}\nfunction extractUsedTable(table) {\n if (is(table, SQLiteTable)) {\n return [`${table[Table.Symbol.BaseName]}`];\n }\n if (is(table, Subquery)) {\n return table._.usedTables ?? [];\n }\n if (is(table, SQL)) {\n return table.usedTables ?? [];\n }\n return [];\n}\nfunction getViewConfig(view) {\n return {\n ...view[ViewBaseConfig]\n // ...view[SQLiteViewConfig],\n };\n}\nexport {\n extractUsedTable,\n getTableConfig,\n getViewConfig\n};\n//# sourceMappingURL=utils.js.map",
|
|
54
|
-
"import { entityKind } from \"../../entity.js\";\nimport { QueryPromise } from \"../../query-promise.js\";\nimport { SelectionProxyHandler } from \"../../selection-proxy.js\";\nimport { SQLiteTable } from \"../table.js\";\nimport { Table } from \"../../table.js\";\nimport { orderSelectedFields } from \"../../utils.js\";\nimport { extractUsedTable } from \"../utils.js\";\nclass SQLiteDeleteBase extends QueryPromise {\n constructor(table, session, dialect, withList) {\n super();\n this.table = table;\n this.session = session;\n this.dialect = dialect;\n this.config = { table, withList };\n }\n static [entityKind] = \"SQLiteDelete\";\n /** @internal */\n config;\n /**\n * Adds a `where` clause to the query.\n *\n * Calling this method will delete only those rows that fulfill a specified condition.\n *\n * See docs: {@link https://orm.drizzle.team/docs/delete}\n *\n * @param where the `where` clause.\n *\n * @example\n * You can use conditional operators and `sql function` to filter the rows to be deleted.\n *\n * ```ts\n * // Delete all cars with green color\n * db.delete(cars).where(eq(cars.color, 'green'));\n * // or\n * db.delete(cars).where(sql`${cars.color} = 'green'`)\n * ```\n *\n * You can logically combine conditional operators with `and()` and `or()` operators:\n *\n * ```ts\n * // Delete all BMW cars with a green color\n * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n *\n * // Delete all cars with the green or blue color\n * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n * ```\n */\n where(where) {\n this.config.where = where;\n return this;\n }\n orderBy(...columns) {\n if (typeof columns[0] === \"function\") {\n const orderBy = columns[0](\n new Proxy(\n this.config.table[Table.Symbol.Columns],\n new SelectionProxyHandler({ sqlAliasedBehavior: \"alias\", sqlBehavior: \"sql\" })\n )\n );\n const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n this.config.orderBy = orderByArray;\n } else {\n const orderByArray = columns;\n this.config.orderBy = orderByArray;\n }\n return this;\n }\n limit(limit) {\n this.config.limit = limit;\n return this;\n }\n returning(fields = this.table[SQLiteTable.Symbol.Columns]) {\n this.config.returning = orderSelectedFields(fields);\n return this;\n }\n /** @internal */\n getSQL() {\n return this.dialect.buildDeleteQuery(this.config);\n }\n toSQL() {\n const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n return rest;\n }\n /** @internal */\n _prepare(isOneTimeQuery = true) {\n return this.session[isOneTimeQuery ? \"prepareOneTimeQuery\" : \"prepareQuery\"](\n this.dialect.sqlToQuery(this.getSQL()),\n this.config.returning,\n this.config.returning ? \"all\" : \"run\",\n true,\n void 0,\n {\n type: \"delete\",\n tables: extractUsedTable(this.config.table)\n }\n );\n }\n prepare() {\n return this._prepare(false);\n }\n run = (placeholderValues) => {\n return this._prepare().run(placeholderValues);\n };\n all = (placeholderValues) => {\n return this._prepare().all(placeholderValues);\n };\n get = (placeholderValues) => {\n return this._prepare().get(placeholderValues);\n };\n values = (placeholderValues) => {\n return this._prepare().values(placeholderValues);\n };\n async execute(placeholderValues) {\n return this._prepare().execute(placeholderValues);\n }\n $dynamic() {\n return this;\n }\n}\nexport {\n SQLiteDeleteBase\n};\n//# sourceMappingURL=delete.js.map",
|
|
55
|
-
"import { entityKind } from \"./entity.js\";\nimport { Table } from \"./table.js\";\nfunction toSnakeCase(input) {\n const words = input.replace(/['\\u2019]/g, \"\").match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n return words.map((word) => word.toLowerCase()).join(\"_\");\n}\nfunction toCamelCase(input) {\n const words = input.replace(/['\\u2019]/g, \"\").match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n return words.reduce((acc, word, i) => {\n const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;\n return acc + formattedWord;\n }, \"\");\n}\nfunction noopCase(input) {\n return input;\n}\nclass CasingCache {\n static [entityKind] = \"CasingCache\";\n /** @internal */\n cache = {};\n cachedTables = {};\n convert;\n constructor(casing) {\n this.convert = casing === \"snake_case\" ? toSnakeCase : casing === \"camelCase\" ? toCamelCase : noopCase;\n }\n getColumnCasing(column) {\n if (!column.keyAsName) return column.name;\n const schema = column.table[Table.Symbol.Schema] ?? \"public\";\n const tableName = column.table[Table.Symbol.OriginalName];\n const key = `${schema}.${tableName}.${column.name}`;\n if (!this.cache[key]) {\n this.cacheTable(column.table);\n }\n return this.cache[key];\n }\n cacheTable(table) {\n const schema = table[Table.Symbol.Schema] ?? \"public\";\n const tableName = table[Table.Symbol.OriginalName];\n const tableKey = `${schema}.${tableName}`;\n if (!this.cachedTables[tableKey]) {\n for (const column of Object.values(table[Table.Symbol.Columns])) {\n const columnKey = `${tableKey}.${column.name}`;\n this.cache[columnKey] = this.convert(column.name);\n }\n this.cachedTables[tableKey] = true;\n }\n }\n clearCache() {\n this.cache = {};\n this.cachedTables = {};\n }\n}\nexport {\n CasingCache,\n toCamelCase,\n toSnakeCase\n};\n//# sourceMappingURL=casing.js.map",
|
|
56
|
-
"import { entityKind } from \"../entity.js\";\nimport { View } from \"../sql/sql.js\";\nclass SQLiteViewBase extends View {\n static [entityKind] = \"SQLiteViewBase\";\n}\nexport {\n SQLiteViewBase\n};\n//# sourceMappingURL=view-base.js.map",
|
|
57
|
-
"import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from \"../alias.js\";\nimport { CasingCache } from \"../casing.js\";\nimport { Column } from \"../column.js\";\nimport { entityKind, is } from \"../entity.js\";\nimport { DrizzleError } from \"../errors.js\";\nimport {\n getOperators,\n getOrderByOperators,\n Many,\n normalizeRelation,\n One\n} from \"../relations.js\";\nimport { and, eq } from \"../sql/index.js\";\nimport { Param, SQL, sql } from \"../sql/sql.js\";\nimport { SQLiteColumn } from \"./columns/index.js\";\nimport { SQLiteTable } from \"./table.js\";\nimport { Subquery } from \"../subquery.js\";\nimport { getTableName, getTableUniqueName, Table } from \"../table.js\";\nimport { orderSelectedFields } from \"../utils.js\";\nimport { ViewBaseConfig } from \"../view-common.js\";\nimport { SQLiteViewBase } from \"./view-base.js\";\nclass SQLiteDialect {\n static [entityKind] = \"SQLiteDialect\";\n /** @internal */\n casing;\n constructor(config) {\n this.casing = new CasingCache(config?.casing);\n }\n escapeName(name) {\n return `\"${name}\"`;\n }\n escapeParam(_num) {\n return \"?\";\n }\n escapeString(str) {\n return `'${str.replace(/'/g, \"''\")}'`;\n }\n buildWithCTE(queries) {\n if (!queries?.length) return void 0;\n const withSqlChunks = [sql`with `];\n for (const [i, w] of queries.entries()) {\n withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n if (i < queries.length - 1) {\n withSqlChunks.push(sql`, `);\n }\n }\n withSqlChunks.push(sql` `);\n return sql.join(withSqlChunks);\n }\n buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {\n const withSql = this.buildWithCTE(withList);\n const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0;\n const whereSql = where ? sql` where ${where}` : void 0;\n const orderBySql = this.buildOrderBy(orderBy);\n const limitSql = this.buildLimit(limit);\n return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n }\n buildUpdateSet(table, set) {\n const tableColumns = table[Table.Symbol.Columns];\n const columnNames = Object.keys(tableColumns).filter(\n (colName) => set[colName] !== void 0 || tableColumns[colName]?.onUpdateFn !== void 0\n );\n const setSize = columnNames.length;\n return sql.join(columnNames.flatMap((colName, i) => {\n const col = tableColumns[colName];\n const value = set[colName] ?? sql.param(col.onUpdateFn(), col);\n const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n if (i < setSize - 1) {\n return [res, sql.raw(\", \")];\n }\n return [res];\n }));\n }\n buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {\n const withSql = this.buildWithCTE(withList);\n const setSql = this.buildUpdateSet(table, set);\n const fromSql = from && sql.join([sql.raw(\" from \"), this.buildFromTable(from)]);\n const joinsSql = this.buildJoins(joins);\n const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0;\n const whereSql = where ? sql` where ${where}` : void 0;\n const orderBySql = this.buildOrderBy(orderBy);\n const limitSql = this.buildLimit(limit);\n return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n }\n /**\n * Builds selection SQL with provided fields/expressions\n *\n * Examples:\n *\n * `select <selection> from`\n *\n * `insert ... returning <selection>`\n *\n * If `isSingleTable` is true, then columns won't be prefixed with table name\n */\n buildSelection(fields, { isSingleTable = false } = {}) {\n const columnsLen = fields.length;\n const chunks = fields.flatMap(({ field }, i) => {\n const chunk = [];\n if (is(field, SQL.Aliased) && field.isSelectionField) {\n chunk.push(sql.identifier(field.fieldAlias));\n } else if (is(field, SQL.Aliased) || is(field, SQL)) {\n const query = is(field, SQL.Aliased) ? field.sql : field;\n if (isSingleTable) {\n chunk.push(\n new SQL(\n query.queryChunks.map((c) => {\n if (is(c, Column)) {\n return sql.identifier(this.casing.getColumnCasing(c));\n }\n return c;\n })\n )\n );\n } else {\n chunk.push(query);\n }\n if (is(field, SQL.Aliased)) {\n chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n }\n } else if (is(field, Column)) {\n const tableName = field.table[Table.Symbol.Name];\n if (field.columnType === \"SQLiteNumericBigInt\") {\n if (isSingleTable) {\n chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);\n } else {\n chunk.push(\n sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`\n );\n }\n } else {\n if (isSingleTable) {\n chunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n } else {\n chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);\n }\n }\n }\n if (i < columnsLen - 1) {\n chunk.push(sql`, `);\n }\n return chunk;\n });\n return sql.join(chunks);\n }\n buildJoins(joins) {\n if (!joins || joins.length === 0) {\n return void 0;\n }\n const joinsArray = [];\n if (joins) {\n for (const [index, joinMeta] of joins.entries()) {\n if (index === 0) {\n joinsArray.push(sql` `);\n }\n const table = joinMeta.table;\n const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : void 0;\n if (is(table, SQLiteTable)) {\n const tableName = table[SQLiteTable.Symbol.Name];\n const tableSchema = table[SQLiteTable.Symbol.Schema];\n const origTableName = table[SQLiteTable.Symbol.OriginalName];\n const alias = tableName === origTableName ? void 0 : joinMeta.alias;\n joinsArray.push(\n sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : void 0}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`\n );\n } else {\n joinsArray.push(\n sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`\n );\n }\n if (index < joins.length - 1) {\n joinsArray.push(sql` `);\n }\n }\n }\n return sql.join(joinsArray);\n }\n buildLimit(limit) {\n return typeof limit === \"object\" || typeof limit === \"number\" && limit >= 0 ? sql` limit ${limit}` : void 0;\n }\n buildOrderBy(orderBy) {\n const orderByList = [];\n if (orderBy) {\n for (const [index, orderByValue] of orderBy.entries()) {\n orderByList.push(orderByValue);\n if (index < orderBy.length - 1) {\n orderByList.push(sql`, `);\n }\n }\n }\n return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : void 0;\n }\n buildFromTable(table) {\n if (is(table, Table) && table[Table.Symbol.IsAlias]) {\n return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? \"\")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;\n }\n return table;\n }\n buildSelectQuery({\n withList,\n fields,\n fieldsFlat,\n where,\n having,\n table,\n joins,\n orderBy,\n groupBy,\n limit,\n offset,\n distinct,\n setOperators\n }) {\n const fieldsList = fieldsFlat ?? orderSelectedFields(fields);\n for (const f of fieldsList) {\n if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? void 0 : getTableName(table)) && !((table2) => joins?.some(\n ({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])\n ))(f.field.table)) {\n const tableName = getTableName(f.field.table);\n throw new Error(\n `Your \"${f.path.join(\"->\")}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`\n );\n }\n }\n const isSingleTable = !joins || joins.length === 0;\n const withSql = this.buildWithCTE(withList);\n const distinctSql = distinct ? sql` distinct` : void 0;\n const selection = this.buildSelection(fieldsList, { isSingleTable });\n const tableSql = this.buildFromTable(table);\n const joinsSql = this.buildJoins(joins);\n const whereSql = where ? sql` where ${where}` : void 0;\n const havingSql = having ? sql` having ${having}` : void 0;\n const groupByList = [];\n if (groupBy) {\n for (const [index, groupByValue] of groupBy.entries()) {\n groupByList.push(groupByValue);\n if (index < groupBy.length - 1) {\n groupByList.push(sql`, `);\n }\n }\n }\n const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : void 0;\n const orderBySql = this.buildOrderBy(orderBy);\n const limitSql = this.buildLimit(limit);\n const offsetSql = offset ? sql` offset ${offset}` : void 0;\n const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n if (setOperators.length > 0) {\n return this.buildSetOperations(finalQuery, setOperators);\n }\n return finalQuery;\n }\n buildSetOperations(leftSelect, setOperators) {\n const [setOperator, ...rest] = setOperators;\n if (!setOperator) {\n throw new Error(\"Cannot pass undefined values to any set operator\");\n }\n if (rest.length === 0) {\n return this.buildSetOperationQuery({ leftSelect, setOperator });\n }\n return this.buildSetOperations(\n this.buildSetOperationQuery({ leftSelect, setOperator }),\n rest\n );\n }\n buildSetOperationQuery({\n leftSelect,\n setOperator: { type, isAll, rightSelect, limit, orderBy, offset }\n }) {\n const leftChunk = sql`${leftSelect.getSQL()} `;\n const rightChunk = sql`${rightSelect.getSQL()}`;\n let orderBySql;\n if (orderBy && orderBy.length > 0) {\n const orderByValues = [];\n for (const singleOrderBy of orderBy) {\n if (is(singleOrderBy, SQLiteColumn)) {\n orderByValues.push(sql.identifier(singleOrderBy.name));\n } else if (is(singleOrderBy, SQL)) {\n for (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n const chunk = singleOrderBy.queryChunks[i];\n if (is(chunk, SQLiteColumn)) {\n singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n }\n }\n orderByValues.push(sql`${singleOrderBy}`);\n } else {\n orderByValues.push(sql`${singleOrderBy}`);\n }\n }\n orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n }\n const limitSql = typeof limit === \"object\" || typeof limit === \"number\" && limit >= 0 ? sql` limit ${limit}` : void 0;\n const operatorChunk = sql.raw(`${type} ${isAll ? \"all \" : \"\"}`);\n const offsetSql = offset ? sql` offset ${offset}` : void 0;\n return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n }\n buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {\n const valuesSqlList = [];\n const columns = table[Table.Symbol.Columns];\n const colEntries = Object.entries(columns).filter(\n ([_, col]) => !col.shouldDisableInsert()\n );\n const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n if (select) {\n const select2 = valuesOrSelect;\n if (is(select2, SQL)) {\n valuesSqlList.push(select2);\n } else {\n valuesSqlList.push(select2.getSQL());\n }\n } else {\n const values = valuesOrSelect;\n valuesSqlList.push(sql.raw(\"values \"));\n for (const [valueIndex, value] of values.entries()) {\n const valueList = [];\n for (const [fieldName, col] of colEntries) {\n const colValue = value[fieldName];\n if (colValue === void 0 || is(colValue, Param) && colValue.value === void 0) {\n let defaultValue;\n if (col.default !== null && col.default !== void 0) {\n defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);\n } else if (col.defaultFn !== void 0) {\n const defaultFnResult = col.defaultFn();\n defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n } else if (!col.default && col.onUpdateFn !== void 0) {\n const onUpdateFnResult = col.onUpdateFn();\n defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n } else {\n defaultValue = sql`null`;\n }\n valueList.push(defaultValue);\n } else {\n valueList.push(colValue);\n }\n }\n valuesSqlList.push(valueList);\n if (valueIndex < values.length - 1) {\n valuesSqlList.push(sql`, `);\n }\n }\n }\n const withSql = this.buildWithCTE(withList);\n const valuesSql = sql.join(valuesSqlList);\n const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0;\n const onConflictSql = onConflict?.length ? sql.join(onConflict) : void 0;\n return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n }\n sqlToQuery(sql2, invokeSource) {\n return sql2.toQuery({\n casing: this.casing,\n escapeName: this.escapeName,\n escapeParam: this.escapeParam,\n escapeString: this.escapeString,\n invokeSource\n });\n }\n buildRelationalQuery({\n fullSchema,\n schema,\n tableNamesMap,\n table,\n tableConfig,\n queryConfig: config,\n tableAlias,\n nestedQueryRelation,\n joinOn\n }) {\n let selection = [];\n let limit, offset, orderBy = [], where;\n const joins = [];\n if (config === true) {\n const selectionEntries = Object.entries(tableConfig.columns);\n selection = selectionEntries.map(([key, value]) => ({\n dbKey: value.name,\n tsKey: key,\n field: aliasedTableColumn(value, tableAlias),\n relationTableTsKey: void 0,\n isJson: false,\n selection: []\n }));\n } else {\n const aliasedColumns = Object.fromEntries(\n Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)])\n );\n if (config.where) {\n const whereSql = typeof config.where === \"function\" ? config.where(aliasedColumns, getOperators()) : config.where;\n where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n }\n const fieldsSelection = [];\n let selectedColumns = [];\n if (config.columns) {\n let isIncludeMode = false;\n for (const [field, value] of Object.entries(config.columns)) {\n if (value === void 0) {\n continue;\n }\n if (field in tableConfig.columns) {\n if (!isIncludeMode && value === true) {\n isIncludeMode = true;\n }\n selectedColumns.push(field);\n }\n }\n if (selectedColumns.length > 0) {\n selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n }\n } else {\n selectedColumns = Object.keys(tableConfig.columns);\n }\n for (const field of selectedColumns) {\n const column = tableConfig.columns[field];\n fieldsSelection.push({ tsKey: field, value: column });\n }\n let selectedRelations = [];\n if (config.with) {\n selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));\n }\n let extras;\n if (config.extras) {\n extras = typeof config.extras === \"function\" ? config.extras(aliasedColumns, { sql }) : config.extras;\n for (const [tsKey, value] of Object.entries(extras)) {\n fieldsSelection.push({\n tsKey,\n value: mapColumnsInAliasedSQLToAlias(value, tableAlias)\n });\n }\n }\n for (const { tsKey, value } of fieldsSelection) {\n selection.push({\n dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,\n tsKey,\n field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n relationTableTsKey: void 0,\n isJson: false,\n selection: []\n });\n }\n let orderByOrig = typeof config.orderBy === \"function\" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];\n if (!Array.isArray(orderByOrig)) {\n orderByOrig = [orderByOrig];\n }\n orderBy = orderByOrig.map((orderByValue) => {\n if (is(orderByValue, Column)) {\n return aliasedTableColumn(orderByValue, tableAlias);\n }\n return mapColumnsInSQLToAlias(orderByValue, tableAlias);\n });\n limit = config.limit;\n offset = config.offset;\n for (const {\n tsKey: selectedRelationTsKey,\n queryConfig: selectedRelationConfigValue,\n relation\n } of selectedRelations) {\n const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n const relationTableName = getTableUniqueName(relation.referencedTable);\n const relationTableTsName = tableNamesMap[relationTableName];\n const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n const joinOn2 = and(\n ...normalizedRelation.fields.map(\n (field2, i) => eq(\n aliasedTableColumn(normalizedRelation.references[i], relationTableAlias),\n aliasedTableColumn(field2, tableAlias)\n )\n )\n );\n const builtRelation = this.buildRelationalQuery({\n fullSchema,\n schema,\n tableNamesMap,\n table: fullSchema[relationTableTsName],\n tableConfig: schema[relationTableTsName],\n queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,\n tableAlias: relationTableAlias,\n joinOn: joinOn2,\n nestedQueryRelation: relation\n });\n const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);\n selection.push({\n dbKey: selectedRelationTsKey,\n tsKey: selectedRelationTsKey,\n field,\n relationTableTsKey: relationTableTsName,\n isJson: true,\n selection: builtRelation.selection\n });\n }\n }\n if (selection.length === 0) {\n throw new DrizzleError({\n message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`\n });\n }\n let result;\n where = and(joinOn, where);\n if (nestedQueryRelation) {\n let field = sql`json_array(${sql.join(\n selection.map(\n ({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2\n ),\n sql`, `\n )})`;\n if (is(nestedQueryRelation, Many)) {\n field = sql`coalesce(json_group_array(${field}), json_array())`;\n }\n const nestedSelection = [{\n dbKey: \"data\",\n tsKey: \"data\",\n field: field.as(\"data\"),\n isJson: true,\n relationTableTsKey: tableConfig.tsName,\n selection\n }];\n const needsSubquery = limit !== void 0 || offset !== void 0 || orderBy.length > 0;\n if (needsSubquery) {\n result = this.buildSelectQuery({\n table: aliasedTable(table, tableAlias),\n fields: {},\n fieldsFlat: [\n {\n path: [],\n field: sql.raw(\"*\")\n }\n ],\n where,\n limit,\n offset,\n orderBy,\n setOperators: []\n });\n where = void 0;\n limit = void 0;\n offset = void 0;\n orderBy = void 0;\n } else {\n result = aliasedTable(table, tableAlias);\n }\n result = this.buildSelectQuery({\n table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),\n fields: {},\n fieldsFlat: nestedSelection.map(({ field: field2 }) => ({\n path: [],\n field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2\n })),\n joins,\n where,\n limit,\n offset,\n orderBy,\n setOperators: []\n });\n } else {\n result = this.buildSelectQuery({\n table: aliasedTable(table, tableAlias),\n fields: {},\n fieldsFlat: selection.map(({ field }) => ({\n path: [],\n field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field\n })),\n joins,\n where,\n limit,\n offset,\n orderBy,\n setOperators: []\n });\n }\n return {\n tableTsKey: tableConfig.tsName,\n sql: result,\n selection\n };\n }\n}\nclass SQLiteSyncDialect extends SQLiteDialect {\n static [entityKind] = \"SQLiteSyncDialect\";\n migrate(migrations, session, config) {\n const migrationsTable = config === void 0 ? \"__drizzle_migrations\" : typeof config === \"string\" ? \"__drizzle_migrations\" : config.migrationsTable ?? \"__drizzle_migrations\";\n const migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n session.run(migrationTableCreate);\n const dbMigrations = session.values(\n sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`\n );\n const lastDbMigration = dbMigrations[0] ?? void 0;\n session.run(sql`BEGIN`);\n try {\n for (const migration of migrations) {\n if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {\n for (const stmt of migration.sql) {\n session.run(sql.raw(stmt));\n }\n session.run(\n sql`INSERT INTO ${sql.identifier(migrationsTable)} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`\n );\n }\n }\n session.run(sql`COMMIT`);\n } catch (e) {\n session.run(sql`ROLLBACK`);\n throw e;\n }\n }\n}\nclass SQLiteAsyncDialect extends SQLiteDialect {\n static [entityKind] = \"SQLiteAsyncDialect\";\n async migrate(migrations, session, config) {\n const migrationsTable = config === void 0 ? \"__drizzle_migrations\" : typeof config === \"string\" ? \"__drizzle_migrations\" : config.migrationsTable ?? \"__drizzle_migrations\";\n const migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n await session.run(migrationTableCreate);\n const dbMigrations = await session.values(\n sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`\n );\n const lastDbMigration = dbMigrations[0] ?? void 0;\n await session.transaction(async (tx) => {\n for (const migration of migrations) {\n if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {\n for (const stmt of migration.sql) {\n await tx.run(sql.raw(stmt));\n }\n await tx.run(\n sql`INSERT INTO ${sql.identifier(migrationsTable)} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`\n );\n }\n }\n });\n }\n}\nexport {\n SQLiteAsyncDialect,\n SQLiteDialect,\n SQLiteSyncDialect\n};\n//# sourceMappingURL=dialect.js.map",
|
|
58
|
-
"import { entityKind } from \"../entity.js\";\nclass TypedQueryBuilder {\n static [entityKind] = \"TypedQueryBuilder\";\n /** @internal */\n getSelectedFields() {\n return this._.selectedFields;\n }\n}\nexport {\n TypedQueryBuilder\n};\n//# sourceMappingURL=query-builder.js.map",
|
|
59
|
-
"import { entityKind, is } from \"../../entity.js\";\nimport { TypedQueryBuilder } from \"../../query-builders/query-builder.js\";\nimport { QueryPromise } from \"../../query-promise.js\";\nimport { SelectionProxyHandler } from \"../../selection-proxy.js\";\nimport { SQL, View } from \"../../sql/sql.js\";\nimport { Subquery } from \"../../subquery.js\";\nimport { Table } from \"../../table.js\";\nimport {\n applyMixins,\n getTableColumns,\n getTableLikeName,\n haveSameKeys,\n orderSelectedFields\n} from \"../../utils.js\";\nimport { ViewBaseConfig } from \"../../view-common.js\";\nimport { extractUsedTable } from \"../utils.js\";\nimport { SQLiteViewBase } from \"../view-base.js\";\nclass SQLiteSelectBuilder {\n static [entityKind] = \"SQLiteSelectBuilder\";\n fields;\n session;\n dialect;\n withList;\n distinct;\n constructor(config) {\n this.fields = config.fields;\n this.session = config.session;\n this.dialect = config.dialect;\n this.withList = config.withList;\n this.distinct = config.distinct;\n }\n from(source) {\n const isPartialSelect = !!this.fields;\n let fields;\n if (this.fields) {\n fields = this.fields;\n } else if (is(source, Subquery)) {\n fields = Object.fromEntries(\n Object.keys(source._.selectedFields).map((key) => [key, source[key]])\n );\n } else if (is(source, SQLiteViewBase)) {\n fields = source[ViewBaseConfig].selectedFields;\n } else if (is(source, SQL)) {\n fields = {};\n } else {\n fields = getTableColumns(source);\n }\n return new SQLiteSelectBase({\n table: source,\n fields,\n isPartialSelect,\n session: this.session,\n dialect: this.dialect,\n withList: this.withList,\n distinct: this.distinct\n });\n }\n}\nclass SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {\n static [entityKind] = \"SQLiteSelectQueryBuilder\";\n _;\n /** @internal */\n config;\n joinsNotNullableMap;\n tableName;\n isPartialSelect;\n session;\n dialect;\n cacheConfig = void 0;\n usedTables = /* @__PURE__ */ new Set();\n constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {\n super();\n this.config = {\n withList,\n table,\n fields: { ...fields },\n distinct,\n setOperators: []\n };\n this.isPartialSelect = isPartialSelect;\n this.session = session;\n this.dialect = dialect;\n this._ = {\n selectedFields: fields,\n config: this.config\n };\n this.tableName = getTableLikeName(table);\n this.joinsNotNullableMap = typeof this.tableName === \"string\" ? { [this.tableName]: true } : {};\n for (const item of extractUsedTable(table)) this.usedTables.add(item);\n }\n /** @internal */\n getUsedTables() {\n return [...this.usedTables];\n }\n createJoin(joinType) {\n return (table, on) => {\n const baseTableName = this.tableName;\n const tableName = getTableLikeName(table);\n for (const item of extractUsedTable(table)) this.usedTables.add(item);\n if (typeof tableName === \"string\" && this.config.joins?.some((join) => join.alias === tableName)) {\n throw new Error(`Alias \"${tableName}\" is already used in this query`);\n }\n if (!this.isPartialSelect) {\n if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === \"string\") {\n this.config.fields = {\n [baseTableName]: this.config.fields\n };\n }\n if (typeof tableName === \"string\" && !is(table, SQL)) {\n const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];\n this.config.fields[tableName] = selection;\n }\n }\n if (typeof on === \"function\") {\n on = on(\n new Proxy(\n this.config.fields,\n new SelectionProxyHandler({ sqlAliasedBehavior: \"sql\", sqlBehavior: \"sql\" })\n )\n );\n }\n if (!this.config.joins) {\n this.config.joins = [];\n }\n this.config.joins.push({ on, table, joinType, alias: tableName });\n if (typeof tableName === \"string\") {\n switch (joinType) {\n case \"left\": {\n this.joinsNotNullableMap[tableName] = false;\n break;\n }\n case \"right\": {\n this.joinsNotNullableMap = Object.fromEntries(\n Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false])\n );\n this.joinsNotNullableMap[tableName] = true;\n break;\n }\n case \"cross\":\n case \"inner\": {\n this.joinsNotNullableMap[tableName] = true;\n break;\n }\n case \"full\": {\n this.joinsNotNullableMap = Object.fromEntries(\n Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false])\n );\n this.joinsNotNullableMap[tableName] = false;\n break;\n }\n }\n }\n return this;\n };\n }\n /**\n * Executes a `left join` operation by adding another table to the current query.\n *\n * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n *\n * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n *\n * @param table the table to join.\n * @param on the `on` clause.\n *\n * @example\n *\n * ```ts\n * // Select all users and their pets\n * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n * .from(users)\n * .leftJoin(pets, eq(users.id, pets.ownerId))\n *\n * // Select userId and petId\n * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n * userId: users.id,\n * petId: pets.id,\n * })\n * .from(users)\n * .leftJoin(pets, eq(users.id, pets.ownerId))\n * ```\n */\n leftJoin = this.createJoin(\"left\");\n /**\n * Executes a `right join` operation by adding another table to the current query.\n *\n * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n *\n * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n *\n * @param table the table to join.\n * @param on the `on` clause.\n *\n * @example\n *\n * ```ts\n * // Select all users and their pets\n * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n * .from(users)\n * .rightJoin(pets, eq(users.id, pets.ownerId))\n *\n * // Select userId and petId\n * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n * userId: users.id,\n * petId: pets.id,\n * })\n * .from(users)\n * .rightJoin(pets, eq(users.id, pets.ownerId))\n * ```\n */\n rightJoin = this.createJoin(\"right\");\n /**\n * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n *\n * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n *\n * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n *\n * @param table the table to join.\n * @param on the `on` clause.\n *\n * @example\n *\n * ```ts\n * // Select all users and their pets\n * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n * .from(users)\n * .innerJoin(pets, eq(users.id, pets.ownerId))\n *\n * // Select userId and petId\n * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n * userId: users.id,\n * petId: pets.id,\n * })\n * .from(users)\n * .innerJoin(pets, eq(users.id, pets.ownerId))\n * ```\n */\n innerJoin = this.createJoin(\"inner\");\n /**\n * Executes a `full join` operation by combining rows from two tables into a new table.\n *\n * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n *\n * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n *\n * @param table the table to join.\n * @param on the `on` clause.\n *\n * @example\n *\n * ```ts\n * // Select all users and their pets\n * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n * .from(users)\n * .fullJoin(pets, eq(users.id, pets.ownerId))\n *\n * // Select userId and petId\n * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n * userId: users.id,\n * petId: pets.id,\n * })\n * .from(users)\n * .fullJoin(pets, eq(users.id, pets.ownerId))\n * ```\n */\n fullJoin = this.createJoin(\"full\");\n /**\n * Executes a `cross join` operation by combining rows from two tables into a new table.\n *\n * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n *\n * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n *\n * @param table the table to join.\n *\n * @example\n *\n * ```ts\n * // Select all users, each user with every pet\n * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n * .from(users)\n * .crossJoin(pets)\n *\n * // Select userId and petId\n * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n * userId: users.id,\n * petId: pets.id,\n * })\n * .from(users)\n * .crossJoin(pets)\n * ```\n */\n crossJoin = this.createJoin(\"cross\");\n createSetOperator(type, isAll) {\n return (rightSelection) => {\n const rightSelect = typeof rightSelection === \"function\" ? rightSelection(getSQLiteSetOperators()) : rightSelection;\n if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n throw new Error(\n \"Set operator error (union / intersect / except): selected fields are not the same or are in a different order\"\n );\n }\n this.config.setOperators.push({ type, isAll, rightSelect });\n return this;\n };\n }\n /**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * await db.select({ name: users.name })\n * .from(users)\n * .union(\n * db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * import { union } from 'drizzle-orm/sqlite-core'\n *\n * await union(\n * db.select({ name: users.name }).from(users),\n * db.select({ name: customers.name }).from(customers)\n * );\n * ```\n */\n union = this.createSetOperator(\"union\", false);\n /**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * await db.select({ transaction: onlineSales.transactionId })\n * .from(onlineSales)\n * .unionAll(\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * import { unionAll } from 'drizzle-orm/sqlite-core'\n *\n * await unionAll(\n * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * ```\n */\n unionAll = this.createSetOperator(\"union\", true);\n /**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .intersect(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * import { intersect } from 'drizzle-orm/sqlite-core'\n *\n * await intersect(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\n intersect = this.createSetOperator(\"intersect\", false);\n /**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .except(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * import { except } from 'drizzle-orm/sqlite-core'\n *\n * await except(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\n except = this.createSetOperator(\"except\", false);\n /** @internal */\n addSetOperators(setOperators) {\n this.config.setOperators.push(...setOperators);\n return this;\n }\n /**\n * Adds a `where` clause to the query.\n *\n * Calling this method will select only those rows that fulfill a specified condition.\n *\n * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n *\n * @param where the `where` clause.\n *\n * @example\n * You can use conditional operators and `sql function` to filter the rows to be selected.\n *\n * ```ts\n * // Select all cars with green color\n * await db.select().from(cars).where(eq(cars.color, 'green'));\n * // or\n * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n * ```\n *\n * You can logically combine conditional operators with `and()` and `or()` operators:\n *\n * ```ts\n * // Select all BMW cars with a green color\n * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n *\n * // Select all cars with the green or blue color\n * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n * ```\n */\n where(where) {\n if (typeof where === \"function\") {\n where = where(\n new Proxy(\n this.config.fields,\n new SelectionProxyHandler({ sqlAliasedBehavior: \"sql\", sqlBehavior: \"sql\" })\n )\n );\n }\n this.config.where = where;\n return this;\n }\n /**\n * Adds a `having` clause to the query.\n *\n * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n *\n * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n *\n * @param having the `having` clause.\n *\n * @example\n *\n * ```ts\n * // Select all brands with more than one car\n * await db.select({\n * \tbrand: cars.brand,\n * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n * })\n * .from(cars)\n * .groupBy(cars.brand)\n * .having(({ count }) => gt(count, 1));\n * ```\n */\n having(having) {\n if (typeof having === \"function\") {\n having = having(\n new Proxy(\n this.config.fields,\n new SelectionProxyHandler({ sqlAliasedBehavior: \"sql\", sqlBehavior: \"sql\" })\n )\n );\n }\n this.config.having = having;\n return this;\n }\n groupBy(...columns) {\n if (typeof columns[0] === \"function\") {\n const groupBy = columns[0](\n new Proxy(\n this.config.fields,\n new SelectionProxyHandler({ sqlAliasedBehavior: \"alias\", sqlBehavior: \"sql\" })\n )\n );\n this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n } else {\n this.config.groupBy = columns;\n }\n return this;\n }\n orderBy(...columns) {\n if (typeof columns[0] === \"function\") {\n const orderBy = columns[0](\n new Proxy(\n this.config.fields,\n new SelectionProxyHandler({ sqlAliasedBehavior: \"alias\", sqlBehavior: \"sql\" })\n )\n );\n const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n if (this.config.setOperators.length > 0) {\n this.config.setOperators.at(-1).orderBy = orderByArray;\n } else {\n this.config.orderBy = orderByArray;\n }\n } else {\n const orderByArray = columns;\n if (this.config.setOperators.length > 0) {\n this.config.setOperators.at(-1).orderBy = orderByArray;\n } else {\n this.config.orderBy = orderByArray;\n }\n }\n return this;\n }\n /**\n * Adds a `limit` clause to the query.\n *\n * Calling this method will set the maximum number of rows that will be returned by this query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n *\n * @param limit the `limit` clause.\n *\n * @example\n *\n * ```ts\n * // Get the first 10 people from this query.\n * await db.select().from(people).limit(10);\n * ```\n */\n limit(limit) {\n if (this.config.setOperators.length > 0) {\n this.config.setOperators.at(-1).limit = limit;\n } else {\n this.config.limit = limit;\n }\n return this;\n }\n /**\n * Adds an `offset` clause to the query.\n *\n * Calling this method will skip a number of rows when returning results from this query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n *\n * @param offset the `offset` clause.\n *\n * @example\n *\n * ```ts\n * // Get the 10th-20th people from this query.\n * await db.select().from(people).offset(10).limit(10);\n * ```\n */\n offset(offset) {\n if (this.config.setOperators.length > 0) {\n this.config.setOperators.at(-1).offset = offset;\n } else {\n this.config.offset = offset;\n }\n return this;\n }\n /** @internal */\n getSQL() {\n return this.dialect.buildSelectQuery(this.config);\n }\n toSQL() {\n const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n return rest;\n }\n as(alias) {\n const usedTables = [];\n usedTables.push(...extractUsedTable(this.config.table));\n if (this.config.joins) {\n for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table));\n }\n return new Proxy(\n new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n new SelectionProxyHandler({ alias, sqlAliasedBehavior: \"alias\", sqlBehavior: \"error\" })\n );\n }\n /** @internal */\n getSelectedFields() {\n return new Proxy(\n this.config.fields,\n new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: \"alias\", sqlBehavior: \"error\" })\n );\n }\n $dynamic() {\n return this;\n }\n}\nclass SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {\n static [entityKind] = \"SQLiteSelect\";\n /** @internal */\n _prepare(isOneTimeQuery = true) {\n if (!this.session) {\n throw new Error(\"Cannot execute a query on a query builder. Please use a database instance instead.\");\n }\n const fieldsList = orderSelectedFields(this.config.fields);\n const query = this.session[isOneTimeQuery ? \"prepareOneTimeQuery\" : \"prepareQuery\"](\n this.dialect.sqlToQuery(this.getSQL()),\n fieldsList,\n \"all\",\n true,\n void 0,\n {\n type: \"select\",\n tables: [...this.usedTables]\n },\n this.cacheConfig\n );\n query.joinsNotNullableMap = this.joinsNotNullableMap;\n return query;\n }\n $withCache(config) {\n this.cacheConfig = config === void 0 ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };\n return this;\n }\n prepare() {\n return this._prepare(false);\n }\n run = (placeholderValues) => {\n return this._prepare().run(placeholderValues);\n };\n all = (placeholderValues) => {\n return this._prepare().all(placeholderValues);\n };\n get = (placeholderValues) => {\n return this._prepare().get(placeholderValues);\n };\n values = (placeholderValues) => {\n return this._prepare().values(placeholderValues);\n };\n async execute() {\n return this.all();\n }\n}\napplyMixins(SQLiteSelectBase, [QueryPromise]);\nfunction createSetOperator(type, isAll) {\n return (leftSelect, rightSelect, ...restSelects) => {\n const setOperators = [rightSelect, ...restSelects].map((select) => ({\n type,\n isAll,\n rightSelect: select\n }));\n for (const setOperator of setOperators) {\n if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n throw new Error(\n \"Set operator error (union / intersect / except): selected fields are not the same or are in a different order\"\n );\n }\n }\n return leftSelect.addSetOperators(setOperators);\n };\n}\nconst getSQLiteSetOperators = () => ({\n union,\n unionAll,\n intersect,\n except\n});\nconst union = createSetOperator(\"union\", false);\nconst unionAll = createSetOperator(\"union\", true);\nconst intersect = createSetOperator(\"intersect\", false);\nconst except = createSetOperator(\"except\", false);\nexport {\n SQLiteSelectBase,\n SQLiteSelectBuilder,\n SQLiteSelectQueryBuilderBase,\n except,\n intersect,\n union,\n unionAll\n};\n//# sourceMappingURL=select.js.map",
|
|
60
|
-
"import { entityKind, is } from \"../../entity.js\";\nimport { SelectionProxyHandler } from \"../../selection-proxy.js\";\nimport { SQLiteDialect, SQLiteSyncDialect } from \"../dialect.js\";\nimport { WithSubquery } from \"../../subquery.js\";\nimport { SQLiteSelectBuilder } from \"./select.js\";\nclass QueryBuilder {\n static [entityKind] = \"SQLiteQueryBuilder\";\n dialect;\n dialectConfig;\n constructor(dialect) {\n this.dialect = is(dialect, SQLiteDialect) ? dialect : void 0;\n this.dialectConfig = is(dialect, SQLiteDialect) ? void 0 : dialect;\n }\n $with = (alias, selection) => {\n const queryBuilder = this;\n const as = (qb) => {\n if (typeof qb === \"function\") {\n qb = qb(queryBuilder);\n }\n return new Proxy(\n new WithSubquery(\n qb.getSQL(),\n selection ?? (\"getSelectedFields\" in qb ? qb.getSelectedFields() ?? {} : {}),\n alias,\n true\n ),\n new SelectionProxyHandler({ alias, sqlAliasedBehavior: \"alias\", sqlBehavior: \"error\" })\n );\n };\n return { as };\n };\n with(...queries) {\n const self = this;\n function select(fields) {\n return new SQLiteSelectBuilder({\n fields: fields ?? void 0,\n session: void 0,\n dialect: self.getDialect(),\n withList: queries\n });\n }\n function selectDistinct(fields) {\n return new SQLiteSelectBuilder({\n fields: fields ?? void 0,\n session: void 0,\n dialect: self.getDialect(),\n withList: queries,\n distinct: true\n });\n }\n return { select, selectDistinct };\n }\n select(fields) {\n return new SQLiteSelectBuilder({ fields: fields ?? void 0, session: void 0, dialect: this.getDialect() });\n }\n selectDistinct(fields) {\n return new SQLiteSelectBuilder({\n fields: fields ?? void 0,\n session: void 0,\n dialect: this.getDialect(),\n distinct: true\n });\n }\n // Lazy load dialect to avoid circular dependency\n getDialect() {\n if (!this.dialect) {\n this.dialect = new SQLiteSyncDialect(this.dialectConfig);\n }\n return this.dialect;\n }\n}\nexport {\n QueryBuilder\n};\n//# sourceMappingURL=query-builder.js.map",
|
|
61
|
-
"import { entityKind, is } from \"../../entity.js\";\nimport { QueryPromise } from \"../../query-promise.js\";\nimport { Param, SQL, sql } from \"../../sql/sql.js\";\nimport { SQLiteTable } from \"../table.js\";\nimport { Columns, Table } from \"../../table.js\";\nimport { haveSameKeys, mapUpdateSet, orderSelectedFields } from \"../../utils.js\";\nimport { extractUsedTable } from \"../utils.js\";\nimport { QueryBuilder } from \"./query-builder.js\";\nclass SQLiteInsertBuilder {\n constructor(table, session, dialect, withList) {\n this.table = table;\n this.session = session;\n this.dialect = dialect;\n this.withList = withList;\n }\n static [entityKind] = \"SQLiteInsertBuilder\";\n values(values) {\n values = Array.isArray(values) ? values : [values];\n if (values.length === 0) {\n throw new Error(\"values() must be called with at least one value\");\n }\n const mappedValues = values.map((entry) => {\n const result = {};\n const cols = this.table[Table.Symbol.Columns];\n for (const colKey of Object.keys(entry)) {\n const colValue = entry[colKey];\n result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n }\n return result;\n });\n return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);\n }\n select(selectQuery) {\n const select = typeof selectQuery === \"function\" ? selectQuery(new QueryBuilder()) : selectQuery;\n if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {\n throw new Error(\n \"Insert select error: selected fields are not the same or are in a different order compared to the table definition\"\n );\n }\n return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n }\n}\nclass SQLiteInsertBase extends QueryPromise {\n constructor(table, values, session, dialect, withList, select) {\n super();\n this.session = session;\n this.dialect = dialect;\n this.config = { table, values, withList, select };\n }\n static [entityKind] = \"SQLiteInsert\";\n /** @internal */\n config;\n returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {\n this.config.returning = orderSelectedFields(fields);\n return this;\n }\n /**\n * Adds an `on conflict do nothing` clause to the query.\n *\n * Calling this method simply avoids inserting a row as its alternative action.\n *\n * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n *\n * @param config The `target` and `where` clauses.\n *\n * @example\n * ```ts\n * // Insert one row and cancel the insert if there's a conflict\n * await db.insert(cars)\n * .values({ id: 1, brand: 'BMW' })\n * .onConflictDoNothing();\n *\n * // Explicitly specify conflict target\n * await db.insert(cars)\n * .values({ id: 1, brand: 'BMW' })\n * .onConflictDoNothing({ target: cars.id });\n * ```\n */\n onConflictDoNothing(config = {}) {\n if (!this.config.onConflict) this.config.onConflict = [];\n if (config.target === void 0) {\n this.config.onConflict.push(sql` on conflict do nothing`);\n } else {\n const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n const whereSql = config.where ? sql` where ${config.where}` : sql``;\n this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);\n }\n return this;\n }\n /**\n * Adds an `on conflict do update` clause to the query.\n *\n * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n *\n * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n *\n * @param config The `target`, `set` and `where` clauses.\n *\n * @example\n * ```ts\n * // Update the row if there's a conflict\n * await db.insert(cars)\n * .values({ id: 1, brand: 'BMW' })\n * .onConflictDoUpdate({\n * target: cars.id,\n * set: { brand: 'Porsche' }\n * });\n *\n * // Upsert with 'where' clause\n * await db.insert(cars)\n * .values({ id: 1, brand: 'BMW' })\n * .onConflictDoUpdate({\n * target: cars.id,\n * set: { brand: 'newBMW' },\n * where: sql`${cars.createdAt} > '2023-01-01'::date`,\n * });\n * ```\n */\n onConflictDoUpdate(config) {\n if (config.where && (config.targetWhere || config.setWhere)) {\n throw new Error(\n 'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.'\n );\n }\n if (!this.config.onConflict) this.config.onConflict = [];\n const whereSql = config.where ? sql` where ${config.where}` : void 0;\n const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : void 0;\n const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : void 0;\n const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n this.config.onConflict.push(\n sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`\n );\n return this;\n }\n /** @internal */\n getSQL() {\n return this.dialect.buildInsertQuery(this.config);\n }\n toSQL() {\n const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n return rest;\n }\n /** @internal */\n _prepare(isOneTimeQuery = true) {\n return this.session[isOneTimeQuery ? \"prepareOneTimeQuery\" : \"prepareQuery\"](\n this.dialect.sqlToQuery(this.getSQL()),\n this.config.returning,\n this.config.returning ? \"all\" : \"run\",\n true,\n void 0,\n {\n type: \"insert\",\n tables: extractUsedTable(this.config.table)\n }\n );\n }\n prepare() {\n return this._prepare(false);\n }\n run = (placeholderValues) => {\n return this._prepare().run(placeholderValues);\n };\n all = (placeholderValues) => {\n return this._prepare().all(placeholderValues);\n };\n get = (placeholderValues) => {\n return this._prepare().get(placeholderValues);\n };\n values = (placeholderValues) => {\n return this._prepare().values(placeholderValues);\n };\n async execute() {\n return this.config.returning ? this.all() : this.run();\n }\n $dynamic() {\n return this;\n }\n}\nexport {\n SQLiteInsertBase,\n SQLiteInsertBuilder\n};\n//# sourceMappingURL=insert.js.map",
|
|
62
|
-
"import { entityKind, is } from \"../../entity.js\";\nimport { QueryPromise } from \"../../query-promise.js\";\nimport { SelectionProxyHandler } from \"../../selection-proxy.js\";\nimport { SQLiteTable } from \"../table.js\";\nimport { Subquery } from \"../../subquery.js\";\nimport { Table } from \"../../table.js\";\nimport {\n getTableLikeName,\n mapUpdateSet,\n orderSelectedFields\n} from \"../../utils.js\";\nimport { ViewBaseConfig } from \"../../view-common.js\";\nimport { extractUsedTable } from \"../utils.js\";\nimport { SQLiteViewBase } from \"../view-base.js\";\nclass SQLiteUpdateBuilder {\n constructor(table, session, dialect, withList) {\n this.table = table;\n this.session = session;\n this.dialect = dialect;\n this.withList = withList;\n }\n static [entityKind] = \"SQLiteUpdateBuilder\";\n set(values) {\n return new SQLiteUpdateBase(\n this.table,\n mapUpdateSet(this.table, values),\n this.session,\n this.dialect,\n this.withList\n );\n }\n}\nclass SQLiteUpdateBase extends QueryPromise {\n constructor(table, set, session, dialect, withList) {\n super();\n this.session = session;\n this.dialect = dialect;\n this.config = { set, table, withList, joins: [] };\n }\n static [entityKind] = \"SQLiteUpdate\";\n /** @internal */\n config;\n from(source) {\n this.config.from = source;\n return this;\n }\n createJoin(joinType) {\n return (table, on) => {\n const tableName = getTableLikeName(table);\n if (typeof tableName === \"string\" && this.config.joins.some((join) => join.alias === tableName)) {\n throw new Error(`Alias \"${tableName}\" is already used in this query`);\n }\n if (typeof on === \"function\") {\n const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : void 0 : void 0;\n on = on(\n new Proxy(\n this.config.table[Table.Symbol.Columns],\n new SelectionProxyHandler({ sqlAliasedBehavior: \"sql\", sqlBehavior: \"sql\" })\n ),\n from && new Proxy(\n from,\n new SelectionProxyHandler({ sqlAliasedBehavior: \"sql\", sqlBehavior: \"sql\" })\n )\n );\n }\n this.config.joins.push({ on, table, joinType, alias: tableName });\n return this;\n };\n }\n leftJoin = this.createJoin(\"left\");\n rightJoin = this.createJoin(\"right\");\n innerJoin = this.createJoin(\"inner\");\n fullJoin = this.createJoin(\"full\");\n /**\n * Adds a 'where' clause to the query.\n *\n * Calling this method will update only those rows that fulfill a specified condition.\n *\n * See docs: {@link https://orm.drizzle.team/docs/update}\n *\n * @param where the 'where' clause.\n *\n * @example\n * You can use conditional operators and `sql function` to filter the rows to be updated.\n *\n * ```ts\n * // Update all cars with green color\n * db.update(cars).set({ color: 'red' })\n * .where(eq(cars.color, 'green'));\n * // or\n * db.update(cars).set({ color: 'red' })\n * .where(sql`${cars.color} = 'green'`)\n * ```\n *\n * You can logically combine conditional operators with `and()` and `or()` operators:\n *\n * ```ts\n * // Update all BMW cars with a green color\n * db.update(cars).set({ color: 'red' })\n * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n *\n * // Update all cars with the green or blue color\n * db.update(cars).set({ color: 'red' })\n * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n * ```\n */\n where(where) {\n this.config.where = where;\n return this;\n }\n orderBy(...columns) {\n if (typeof columns[0] === \"function\") {\n const orderBy = columns[0](\n new Proxy(\n this.config.table[Table.Symbol.Columns],\n new SelectionProxyHandler({ sqlAliasedBehavior: \"alias\", sqlBehavior: \"sql\" })\n )\n );\n const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n this.config.orderBy = orderByArray;\n } else {\n const orderByArray = columns;\n this.config.orderBy = orderByArray;\n }\n return this;\n }\n limit(limit) {\n this.config.limit = limit;\n return this;\n }\n returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {\n this.config.returning = orderSelectedFields(fields);\n return this;\n }\n /** @internal */\n getSQL() {\n return this.dialect.buildUpdateQuery(this.config);\n }\n toSQL() {\n const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n return rest;\n }\n /** @internal */\n _prepare(isOneTimeQuery = true) {\n return this.session[isOneTimeQuery ? \"prepareOneTimeQuery\" : \"prepareQuery\"](\n this.dialect.sqlToQuery(this.getSQL()),\n this.config.returning,\n this.config.returning ? \"all\" : \"run\",\n true,\n void 0,\n {\n type: \"insert\",\n tables: extractUsedTable(this.config.table)\n }\n );\n }\n prepare() {\n return this._prepare(false);\n }\n run = (placeholderValues) => {\n return this._prepare().run(placeholderValues);\n };\n all = (placeholderValues) => {\n return this._prepare().all(placeholderValues);\n };\n get = (placeholderValues) => {\n return this._prepare().get(placeholderValues);\n };\n values = (placeholderValues) => {\n return this._prepare().values(placeholderValues);\n };\n async execute() {\n return this.config.returning ? this.all() : this.run();\n }\n $dynamic() {\n return this;\n }\n}\nexport {\n SQLiteUpdateBase,\n SQLiteUpdateBuilder\n};\n//# sourceMappingURL=update.js.map",
|
|
63
|
-
"import { entityKind } from \"../../entity.js\";\nimport { SQL, sql } from \"../../sql/sql.js\";\nclass SQLiteCountBuilder extends SQL {\n constructor(params) {\n super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n this.params = params;\n this.session = params.session;\n this.sql = SQLiteCountBuilder.buildCount(\n params.source,\n params.filters\n );\n }\n sql;\n static [entityKind] = \"SQLiteCountBuilderAsync\";\n [Symbol.toStringTag] = \"SQLiteCountBuilderAsync\";\n session;\n static buildEmbeddedCount(source, filters) {\n return sql`(select count(*) from ${source}${sql.raw(\" where \").if(filters)}${filters})`;\n }\n static buildCount(source, filters) {\n return sql`select count(*) from ${source}${sql.raw(\" where \").if(filters)}${filters}`;\n }\n then(onfulfilled, onrejected) {\n return Promise.resolve(this.session.count(this.sql)).then(\n onfulfilled,\n onrejected\n );\n }\n catch(onRejected) {\n return this.then(void 0, onRejected);\n }\n finally(onFinally) {\n return this.then(\n (value) => {\n onFinally?.();\n return value;\n },\n (reason) => {\n onFinally?.();\n throw reason;\n }\n );\n }\n}\nexport {\n SQLiteCountBuilder\n};\n//# sourceMappingURL=count.js.map",
|
|
64
|
-
"import { entityKind } from \"../../entity.js\";\nimport { QueryPromise } from \"../../query-promise.js\";\nimport {\n mapRelationalRow\n} from \"../../relations.js\";\nclass RelationalQueryBuilder {\n constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {\n this.mode = mode;\n this.fullSchema = fullSchema;\n this.schema = schema;\n this.tableNamesMap = tableNamesMap;\n this.table = table;\n this.tableConfig = tableConfig;\n this.dialect = dialect;\n this.session = session;\n }\n static [entityKind] = \"SQLiteAsyncRelationalQueryBuilder\";\n findMany(config) {\n return this.mode === \"sync\" ? new SQLiteSyncRelationalQuery(\n this.fullSchema,\n this.schema,\n this.tableNamesMap,\n this.table,\n this.tableConfig,\n this.dialect,\n this.session,\n config ? config : {},\n \"many\"\n ) : new SQLiteRelationalQuery(\n this.fullSchema,\n this.schema,\n this.tableNamesMap,\n this.table,\n this.tableConfig,\n this.dialect,\n this.session,\n config ? config : {},\n \"many\"\n );\n }\n findFirst(config) {\n return this.mode === \"sync\" ? new SQLiteSyncRelationalQuery(\n this.fullSchema,\n this.schema,\n this.tableNamesMap,\n this.table,\n this.tableConfig,\n this.dialect,\n this.session,\n config ? { ...config, limit: 1 } : { limit: 1 },\n \"first\"\n ) : new SQLiteRelationalQuery(\n this.fullSchema,\n this.schema,\n this.tableNamesMap,\n this.table,\n this.tableConfig,\n this.dialect,\n this.session,\n config ? { ...config, limit: 1 } : { limit: 1 },\n \"first\"\n );\n }\n}\nclass SQLiteRelationalQuery extends QueryPromise {\n constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {\n super();\n this.fullSchema = fullSchema;\n this.schema = schema;\n this.tableNamesMap = tableNamesMap;\n this.table = table;\n this.tableConfig = tableConfig;\n this.dialect = dialect;\n this.session = session;\n this.config = config;\n this.mode = mode;\n }\n static [entityKind] = \"SQLiteAsyncRelationalQuery\";\n /** @internal */\n mode;\n /** @internal */\n getSQL() {\n return this.dialect.buildRelationalQuery({\n fullSchema: this.fullSchema,\n schema: this.schema,\n tableNamesMap: this.tableNamesMap,\n table: this.table,\n tableConfig: this.tableConfig,\n queryConfig: this.config,\n tableAlias: this.tableConfig.tsName\n }).sql;\n }\n /** @internal */\n _prepare(isOneTimeQuery = false) {\n const { query, builtQuery } = this._toSQL();\n return this.session[isOneTimeQuery ? \"prepareOneTimeQuery\" : \"prepareQuery\"](\n builtQuery,\n void 0,\n this.mode === \"first\" ? \"get\" : \"all\",\n true,\n (rawRows, mapColumnValue) => {\n const rows = rawRows.map(\n (row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n );\n if (this.mode === \"first\") {\n return rows[0];\n }\n return rows;\n }\n );\n }\n prepare() {\n return this._prepare(false);\n }\n _toSQL() {\n const query = this.dialect.buildRelationalQuery({\n fullSchema: this.fullSchema,\n schema: this.schema,\n tableNamesMap: this.tableNamesMap,\n table: this.table,\n tableConfig: this.tableConfig,\n queryConfig: this.config,\n tableAlias: this.tableConfig.tsName\n });\n const builtQuery = this.dialect.sqlToQuery(query.sql);\n return { query, builtQuery };\n }\n toSQL() {\n return this._toSQL().builtQuery;\n }\n /** @internal */\n executeRaw() {\n if (this.mode === \"first\") {\n return this._prepare(false).get();\n }\n return this._prepare(false).all();\n }\n async execute() {\n return this.executeRaw();\n }\n}\nclass SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {\n static [entityKind] = \"SQLiteSyncRelationalQuery\";\n sync() {\n return this.executeRaw();\n }\n}\nexport {\n RelationalQueryBuilder,\n SQLiteRelationalQuery,\n SQLiteSyncRelationalQuery\n};\n//# sourceMappingURL=query.js.map",
|
|
65
|
-
"import { entityKind } from \"../../entity.js\";\nimport { QueryPromise } from \"../../query-promise.js\";\nclass SQLiteRaw extends QueryPromise {\n constructor(execute, getSQL, action, dialect, mapBatchResult) {\n super();\n this.execute = execute;\n this.getSQL = getSQL;\n this.dialect = dialect;\n this.mapBatchResult = mapBatchResult;\n this.config = { action };\n }\n static [entityKind] = \"SQLiteRaw\";\n /** @internal */\n config;\n getQuery() {\n return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };\n }\n mapResult(result, isFromBatch) {\n return isFromBatch ? this.mapBatchResult(result) : result;\n }\n _prepare() {\n return this;\n }\n /** @internal */\n isResponseInArrayMode() {\n return false;\n }\n}\nexport {\n SQLiteRaw\n};\n//# sourceMappingURL=raw.js.map",
|
|
66
|
-
"import { entityKind } from \"../entity.js\";\nimport { SelectionProxyHandler } from \"../selection-proxy.js\";\nimport { sql } from \"../sql/sql.js\";\nimport {\n QueryBuilder,\n SQLiteDeleteBase,\n SQLiteInsertBuilder,\n SQLiteSelectBuilder,\n SQLiteUpdateBuilder\n} from \"./query-builders/index.js\";\nimport { WithSubquery } from \"../subquery.js\";\nimport { SQLiteCountBuilder } from \"./query-builders/count.js\";\nimport { RelationalQueryBuilder } from \"./query-builders/query.js\";\nimport { SQLiteRaw } from \"./query-builders/raw.js\";\nclass BaseSQLiteDatabase {\n constructor(resultKind, dialect, session, schema) {\n this.resultKind = resultKind;\n this.dialect = dialect;\n this.session = session;\n this._ = schema ? {\n schema: schema.schema,\n fullSchema: schema.fullSchema,\n tableNamesMap: schema.tableNamesMap\n } : {\n schema: void 0,\n fullSchema: {},\n tableNamesMap: {}\n };\n this.query = {};\n const query = this.query;\n if (this._.schema) {\n for (const [tableName, columns] of Object.entries(this._.schema)) {\n query[tableName] = new RelationalQueryBuilder(\n resultKind,\n schema.fullSchema,\n this._.schema,\n this._.tableNamesMap,\n schema.fullSchema[tableName],\n columns,\n dialect,\n session\n );\n }\n }\n this.$cache = { invalidate: async (_params) => {\n } };\n }\n static [entityKind] = \"BaseSQLiteDatabase\";\n query;\n /**\n * Creates a subquery that defines a temporary named result set as a CTE.\n *\n * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n *\n * @param alias The alias for the subquery.\n *\n * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n *\n * @example\n *\n * ```ts\n * // Create a subquery with alias 'sq' and use it in the select query\n * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n *\n * const result = await db.with(sq).select().from(sq);\n * ```\n *\n * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n *\n * ```ts\n * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n * const sq = db.$with('sq').as(db.select({\n * name: sql<string>`upper(${users.name})`.as('name'),\n * })\n * .from(users));\n *\n * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n * ```\n */\n $with = (alias, selection) => {\n const self = this;\n const as = (qb) => {\n if (typeof qb === \"function\") {\n qb = qb(new QueryBuilder(self.dialect));\n }\n return new Proxy(\n new WithSubquery(\n qb.getSQL(),\n selection ?? (\"getSelectedFields\" in qb ? qb.getSelectedFields() ?? {} : {}),\n alias,\n true\n ),\n new SelectionProxyHandler({ alias, sqlAliasedBehavior: \"alias\", sqlBehavior: \"error\" })\n );\n };\n return { as };\n };\n $count(source, filters) {\n return new SQLiteCountBuilder({ source, filters, session: this.session });\n }\n /**\n * Incorporates a previously defined CTE (using `$with`) into the main query.\n *\n * This method allows the main query to reference a temporary named result set.\n *\n * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n *\n * @param queries The CTEs to incorporate into the main query.\n *\n * @example\n *\n * ```ts\n * // Define a subquery 'sq' as a CTE using $with\n * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n *\n * // Incorporate the CTE 'sq' into the main query and select from it\n * const result = await db.with(sq).select().from(sq);\n * ```\n */\n with(...queries) {\n const self = this;\n function select(fields) {\n return new SQLiteSelectBuilder({\n fields: fields ?? void 0,\n session: self.session,\n dialect: self.dialect,\n withList: queries\n });\n }\n function selectDistinct(fields) {\n return new SQLiteSelectBuilder({\n fields: fields ?? void 0,\n session: self.session,\n dialect: self.dialect,\n withList: queries,\n distinct: true\n });\n }\n function update(table) {\n return new SQLiteUpdateBuilder(table, self.session, self.dialect, queries);\n }\n function insert(into) {\n return new SQLiteInsertBuilder(into, self.session, self.dialect, queries);\n }\n function delete_(from) {\n return new SQLiteDeleteBase(from, self.session, self.dialect, queries);\n }\n return { select, selectDistinct, update, insert, delete: delete_ };\n }\n select(fields) {\n return new SQLiteSelectBuilder({ fields: fields ?? void 0, session: this.session, dialect: this.dialect });\n }\n selectDistinct(fields) {\n return new SQLiteSelectBuilder({\n fields: fields ?? void 0,\n session: this.session,\n dialect: this.dialect,\n distinct: true\n });\n }\n /**\n * Creates an update query.\n *\n * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n *\n * Use `.set()` method to specify which values to update.\n *\n * See docs: {@link https://orm.drizzle.team/docs/update}\n *\n * @param table The table to update.\n *\n * @example\n *\n * ```ts\n * // Update all rows in the 'cars' table\n * await db.update(cars).set({ color: 'red' });\n *\n * // Update rows with filters and conditions\n * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n *\n * // Update with returning clause\n * const updatedCar: Car[] = await db.update(cars)\n * .set({ color: 'red' })\n * .where(eq(cars.id, 1))\n * .returning();\n * ```\n */\n update(table) {\n return new SQLiteUpdateBuilder(table, this.session, this.dialect);\n }\n $cache;\n /**\n * Creates an insert query.\n *\n * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n *\n * See docs: {@link https://orm.drizzle.team/docs/insert}\n *\n * @param table The table to insert into.\n *\n * @example\n *\n * ```ts\n * // Insert one row\n * await db.insert(cars).values({ brand: 'BMW' });\n *\n * // Insert multiple rows\n * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n *\n * // Insert with returning clause\n * const insertedCar: Car[] = await db.insert(cars)\n * .values({ brand: 'BMW' })\n * .returning();\n * ```\n */\n insert(into) {\n return new SQLiteInsertBuilder(into, this.session, this.dialect);\n }\n /**\n * Creates a delete query.\n *\n * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n *\n * See docs: {@link https://orm.drizzle.team/docs/delete}\n *\n * @param table The table to delete from.\n *\n * @example\n *\n * ```ts\n * // Delete all rows in the 'cars' table\n * await db.delete(cars);\n *\n * // Delete rows with filters and conditions\n * await db.delete(cars).where(eq(cars.color, 'green'));\n *\n * // Delete with returning clause\n * const deletedCar: Car[] = await db.delete(cars)\n * .where(eq(cars.id, 1))\n * .returning();\n * ```\n */\n delete(from) {\n return new SQLiteDeleteBase(from, this.session, this.dialect);\n }\n run(query) {\n const sequel = typeof query === \"string\" ? sql.raw(query) : query.getSQL();\n if (this.resultKind === \"async\") {\n return new SQLiteRaw(\n async () => this.session.run(sequel),\n () => sequel,\n \"run\",\n this.dialect,\n this.session.extractRawRunValueFromBatchResult.bind(this.session)\n );\n }\n return this.session.run(sequel);\n }\n all(query) {\n const sequel = typeof query === \"string\" ? sql.raw(query) : query.getSQL();\n if (this.resultKind === \"async\") {\n return new SQLiteRaw(\n async () => this.session.all(sequel),\n () => sequel,\n \"all\",\n this.dialect,\n this.session.extractRawAllValueFromBatchResult.bind(this.session)\n );\n }\n return this.session.all(sequel);\n }\n get(query) {\n const sequel = typeof query === \"string\" ? sql.raw(query) : query.getSQL();\n if (this.resultKind === \"async\") {\n return new SQLiteRaw(\n async () => this.session.get(sequel),\n () => sequel,\n \"get\",\n this.dialect,\n this.session.extractRawGetValueFromBatchResult.bind(this.session)\n );\n }\n return this.session.get(sequel);\n }\n values(query) {\n const sequel = typeof query === \"string\" ? sql.raw(query) : query.getSQL();\n if (this.resultKind === \"async\") {\n return new SQLiteRaw(\n async () => this.session.values(sequel),\n () => sequel,\n \"values\",\n this.dialect,\n this.session.extractRawValuesValueFromBatchResult.bind(this.session)\n );\n }\n return this.session.values(sequel);\n }\n transaction(transaction, config) {\n return this.session.transaction(transaction, config);\n }\n}\nconst withReplicas = (primary, replicas, getReplica = () => replicas[Math.floor(Math.random() * replicas.length)]) => {\n const select = (...args) => getReplica(replicas).select(...args);\n const selectDistinct = (...args) => getReplica(replicas).selectDistinct(...args);\n const $count = (...args) => getReplica(replicas).$count(...args);\n const $with = (...args) => getReplica(replicas).with(...args);\n const update = (...args) => primary.update(...args);\n const insert = (...args) => primary.insert(...args);\n const $delete = (...args) => primary.delete(...args);\n const run = (...args) => primary.run(...args);\n const all = (...args) => primary.all(...args);\n const get = (...args) => primary.get(...args);\n const values = (...args) => primary.values(...args);\n const transaction = (...args) => primary.transaction(...args);\n return {\n ...primary,\n update,\n insert,\n delete: $delete,\n run,\n all,\n get,\n values,\n transaction,\n $primary: primary,\n $replicas: replicas,\n select,\n selectDistinct,\n $count,\n with: $with,\n get query() {\n return getReplica(replicas).query;\n }\n };\n};\nexport {\n BaseSQLiteDatabase,\n withReplicas\n};\n//# sourceMappingURL=db.js.map",
|
|
67
|
-
"import { entityKind } from \"../../entity.js\";\nclass Cache {\n static [entityKind] = \"Cache\";\n}\nclass NoopCache extends Cache {\n strategy() {\n return \"all\";\n }\n static [entityKind] = \"NoopCache\";\n async get(_key) {\n return void 0;\n }\n async put(_hashedQuery, _response, _tables, _config) {\n }\n async onMutate(_params) {\n }\n}\nasync function hashQuery(sql, params) {\n const dataToHash = `${sql}-${JSON.stringify(params)}`;\n const encoder = new TextEncoder();\n const data = encoder.encode(dataToHash);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = [...new Uint8Array(hashBuffer)];\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return hashHex;\n}\nexport {\n Cache,\n NoopCache,\n hashQuery\n};\n//# sourceMappingURL=cache.js.map",
|
|
68
|
-
"import { hashQuery, NoopCache } from \"../cache/core/cache.js\";\nimport { entityKind, is } from \"../entity.js\";\nimport { DrizzleError, DrizzleQueryError, TransactionRollbackError } from \"../errors.js\";\nimport { QueryPromise } from \"../query-promise.js\";\nimport { BaseSQLiteDatabase } from \"./db.js\";\nclass ExecuteResultSync extends QueryPromise {\n constructor(resultCb) {\n super();\n this.resultCb = resultCb;\n }\n static [entityKind] = \"ExecuteResultSync\";\n async execute() {\n return this.resultCb();\n }\n sync() {\n return this.resultCb();\n }\n}\nclass SQLitePreparedQuery {\n constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {\n this.mode = mode;\n this.executeMethod = executeMethod;\n this.query = query;\n this.cache = cache;\n this.queryMetadata = queryMetadata;\n this.cacheConfig = cacheConfig;\n if (cache && cache.strategy() === \"all\" && cacheConfig === void 0) {\n this.cacheConfig = { enable: true, autoInvalidate: true };\n }\n if (!this.cacheConfig?.enable) {\n this.cacheConfig = void 0;\n }\n }\n static [entityKind] = \"PreparedQuery\";\n /** @internal */\n joinsNotNullableMap;\n /** @internal */\n async queryWithCache(queryString, params, query) {\n if (this.cache === void 0 || is(this.cache, NoopCache) || this.queryMetadata === void 0) {\n try {\n return await query();\n } catch (e) {\n throw new DrizzleQueryError(queryString, params, e);\n }\n }\n if (this.cacheConfig && !this.cacheConfig.enable) {\n try {\n return await query();\n } catch (e) {\n throw new DrizzleQueryError(queryString, params, e);\n }\n }\n if ((this.queryMetadata.type === \"insert\" || this.queryMetadata.type === \"update\" || this.queryMetadata.type === \"delete\") && this.queryMetadata.tables.length > 0) {\n try {\n const [res] = await Promise.all([\n query(),\n this.cache.onMutate({ tables: this.queryMetadata.tables })\n ]);\n return res;\n } catch (e) {\n throw new DrizzleQueryError(queryString, params, e);\n }\n }\n if (!this.cacheConfig) {\n try {\n return await query();\n } catch (e) {\n throw new DrizzleQueryError(queryString, params, e);\n }\n }\n if (this.queryMetadata.type === \"select\") {\n const fromCache = await this.cache.get(\n this.cacheConfig.tag ?? (await hashQuery(queryString, params)),\n this.queryMetadata.tables,\n this.cacheConfig.tag !== void 0,\n this.cacheConfig.autoInvalidate\n );\n if (fromCache === void 0) {\n let result;\n try {\n result = await query();\n } catch (e) {\n throw new DrizzleQueryError(queryString, params, e);\n }\n await this.cache.put(\n this.cacheConfig.tag ?? (await hashQuery(queryString, params)),\n result,\n // make sure we send tables that were used in a query only if user wants to invalidate it on each write\n this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n this.cacheConfig.tag !== void 0,\n this.cacheConfig.config\n );\n return result;\n }\n return fromCache;\n }\n try {\n return await query();\n } catch (e) {\n throw new DrizzleQueryError(queryString, params, e);\n }\n }\n getQuery() {\n return this.query;\n }\n mapRunResult(result, _isFromBatch) {\n return result;\n }\n mapAllResult(_result, _isFromBatch) {\n throw new Error(\"Not implemented\");\n }\n mapGetResult(_result, _isFromBatch) {\n throw new Error(\"Not implemented\");\n }\n execute(placeholderValues) {\n if (this.mode === \"async\") {\n return this[this.executeMethod](placeholderValues);\n }\n return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));\n }\n mapResult(response, isFromBatch) {\n switch (this.executeMethod) {\n case \"run\": {\n return this.mapRunResult(response, isFromBatch);\n }\n case \"all\": {\n return this.mapAllResult(response, isFromBatch);\n }\n case \"get\": {\n return this.mapGetResult(response, isFromBatch);\n }\n }\n }\n}\nclass SQLiteSession {\n constructor(dialect) {\n this.dialect = dialect;\n }\n static [entityKind] = \"SQLiteSession\";\n prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {\n return this.prepareQuery(\n query,\n fields,\n executeMethod,\n isResponseInArrayMode,\n customResultMapper,\n queryMetadata,\n cacheConfig\n );\n }\n run(query) {\n const staticQuery = this.dialect.sqlToQuery(query);\n try {\n return this.prepareOneTimeQuery(staticQuery, void 0, \"run\", false).run();\n } catch (err) {\n throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });\n }\n }\n /** @internal */\n extractRawRunValueFromBatchResult(result) {\n return result;\n }\n all(query) {\n return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), void 0, \"run\", false).all();\n }\n /** @internal */\n extractRawAllValueFromBatchResult(_result) {\n throw new Error(\"Not implemented\");\n }\n get(query) {\n return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), void 0, \"run\", false).get();\n }\n /** @internal */\n extractRawGetValueFromBatchResult(_result) {\n throw new Error(\"Not implemented\");\n }\n values(query) {\n return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), void 0, \"run\", false).values();\n }\n async count(sql) {\n const result = await this.values(sql);\n return result[0][0];\n }\n /** @internal */\n extractRawValuesValueFromBatchResult(_result) {\n throw new Error(\"Not implemented\");\n }\n}\nclass SQLiteTransaction extends BaseSQLiteDatabase {\n constructor(resultType, dialect, session, schema, nestedIndex = 0) {\n super(resultType, dialect, session, schema);\n this.schema = schema;\n this.nestedIndex = nestedIndex;\n }\n static [entityKind] = \"SQLiteTransaction\";\n rollback() {\n throw new TransactionRollbackError();\n }\n}\nexport {\n ExecuteResultSync,\n SQLitePreparedQuery,\n SQLiteSession,\n SQLiteTransaction\n};\n//# sourceMappingURL=session.js.map",
|
|
69
|
-
"/**\n * Drizzle ORM schema for Sylphx Flow\n * Type-safe database schema with migrations support\n */\n\nimport { index, integer, primaryKey, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\n// Memory table for persistent storage\nexport const memory = sqliteTable(\n 'memory',\n {\n key: text('key').notNull(),\n namespace: text('namespace').notNull().default('default'),\n value: text('value').notNull(),\n timestamp: integer('timestamp').notNull(),\n created_at: text('created_at').notNull(),\n updated_at: text('updated_at').notNull(),\n },\n (table) => ({\n pk: primaryKey({ columns: [table.key, table.namespace] }),\n namespaceIdx: index('idx_memory_namespace').on(table.namespace),\n timestampIdx: index('idx_memory_timestamp').on(table.timestamp),\n keyIdx: index('idx_memory_key').on(table.key),\n })\n);\n\n// Codebase files table\nexport const codebaseFiles = sqliteTable(\n 'codebase_files',\n {\n path: text('path').primaryKey(),\n mtime: integer('mtime').notNull(),\n hash: text('hash').notNull(),\n content: text('content'), // Optional full content\n language: text('language'), // Detected programming language\n size: integer('size'), // File size in bytes\n indexedAt: text('indexed_at').notNull(),\n },\n (table) => ({\n mtimeIdx: index('idx_codebase_files_mtime').on(table.mtime),\n hashIdx: index('idx_codebase_files_hash').on(table.hash),\n })\n);\n\n// TF-IDF terms table\nexport const tfidfTerms = sqliteTable(\n 'tfidf_terms',\n {\n filePath: text('file_path')\n .notNull()\n .references(() => codebaseFiles.path, { onDelete: 'cascade' }),\n term: text('term').notNull(),\n frequency: real('frequency').notNull(),\n },\n (table) => ({\n termIdx: index('idx_tfidf_terms_term').on(table.term),\n fileIdx: index('idx_tfidf_terms_file').on(table.filePath),\n })\n);\n\n// TF-IDF documents table (document vectors)\nexport const tfidfDocuments = sqliteTable('tfidf_documents', {\n filePath: text('file_path')\n .primaryKey()\n .references(() => codebaseFiles.path, { onDelete: 'cascade' }),\n magnitude: real('magnitude').notNull(),\n termCount: integer('term_count').notNull(),\n rawTerms: text('raw_terms').notNull(), // JSON string of Record<string, number>\n});\n\n// IDF values table\nexport const tfidfIdf = sqliteTable('tfidf_idf', {\n term: text('term').primaryKey(),\n idfValue: real('idf_value').notNull(),\n});\n\n// Codebase metadata table\nexport const codebaseMetadata = sqliteTable('codebase_metadata', {\n key: text('key').primaryKey(),\n value: text('value').notNull(),\n});\n\n// Export types for TypeScript\nexport type Memory = typeof memory.$inferSelect;\nexport type NewMemory = typeof memory.$inferInsert;\n\nexport type CodebaseFile = typeof codebaseFiles.$inferSelect;\nexport type NewCodebaseFile = typeof codebaseFiles.$inferInsert;\n\nexport type TfidfTerm = typeof tfidfTerms.$inferSelect;\nexport type NewTfidfTerm = typeof tfidfTerms.$inferInsert;\n\nexport type TfidfDocument = typeof tfidfDocuments.$inferSelect;\nexport type NewTfidfDocument = typeof tfidfDocuments.$inferInsert;\n\nexport type TfidfIdf = typeof tfidfIdf.$inferSelect;\nexport type NewTfidfIdf = typeof tfidfIdf.$inferInsert;\n\nexport type CodebaseMetadata = typeof codebaseMetadata.$inferSelect;\nexport type NewCodebaseMetadata = typeof codebaseMetadata.$inferInsert;\n\n// ============================================\n// Session Management Tables\n// ============================================\n\n/**\n * Sessions table - Main chat sessions\n * Stores session metadata and configuration\n */\nexport const sessions = sqliteTable(\n 'sessions',\n {\n id: text('id').primaryKey(),\n title: text('title'),\n provider: text('provider').notNull(), // 'anthropic' | 'openai' | 'google' | 'openrouter'\n model: text('model').notNull(),\n nextTodoId: integer('next_todo_id').notNull().default(1),\n\n // Note: Streaming state moved to messages table (message-level, not session-level)\n // Each message can be in streaming state with isStreaming flag\n\n created: integer('created').notNull(), // Unix timestamp (ms)\n updated: integer('updated').notNull(), // Unix timestamp (ms)\n },\n (table) => ({\n updatedIdx: index('idx_sessions_updated').on(table.updated),\n createdIdx: index('idx_sessions_created').on(table.created),\n providerIdx: index('idx_sessions_provider').on(table.provider),\n titleIdx: index('idx_sessions_title').on(table.title),\n })\n);\n\n/**\n * Messages table - Chat messages in sessions\n * Stores message metadata and role\n */\nexport const messages = sqliteTable(\n 'messages',\n {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n role: text('role').notNull(), // 'user' | 'assistant'\n timestamp: integer('timestamp').notNull(), // Unix timestamp (ms)\n ordering: integer('ordering').notNull(), // For display order\n finishReason: text('finish_reason'), // 'stop' | 'length' | 'tool-calls' | 'error'\n // Message status - unified state for all messages\n status: text('status').notNull().default('completed'), // 'active' | 'completed' | 'error' | 'abort'\n // Metadata stored as JSON: { cpu?: string, memory?: string }\n metadata: text('metadata'), // JSON string\n },\n (table) => ({\n sessionIdx: index('idx_messages_session').on(table.sessionId),\n orderingIdx: index('idx_messages_ordering').on(table.sessionId, table.ordering),\n timestampIdx: index('idx_messages_timestamp').on(table.timestamp),\n statusIdx: index('idx_messages_status').on(table.status),\n })\n);\n\n/**\n * Message parts table - Content parts of messages\n * Stores text, reasoning, tool calls, errors\n * Content structure varies by type, stored as JSON\n *\n * ALL parts have unified status field: 'active' | 'completed' | 'error' | 'abort'\n */\nexport const messageParts = sqliteTable(\n 'message_parts',\n {\n id: text('id').primaryKey(),\n messageId: text('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n ordering: integer('ordering').notNull(), // Order within message\n type: text('type').notNull(), // 'text' | 'reasoning' | 'tool' | 'error'\n // Content structure (JSON) - ALL parts include status field:\n // - text: { type: 'text', content: string, status: 'active' | 'completed' | ... }\n // - reasoning: { type: 'reasoning', content: string, status: ..., duration?: number }\n // - tool: { type: 'tool', name: string, status: ..., duration?: number, args?: any, result?: any, error?: string }\n // - error: { type: 'error', error: string, status: 'completed' }\n content: text('content').notNull(), // JSON string\n },\n (table) => ({\n messageIdx: index('idx_message_parts_message').on(table.messageId),\n orderingIdx: index('idx_message_parts_ordering').on(table.messageId, table.ordering),\n typeIdx: index('idx_message_parts_type').on(table.type),\n })\n);\n\n/**\n * Message attachments table - File attachments to messages\n */\nexport const messageAttachments = sqliteTable(\n 'message_attachments',\n {\n id: text('id').primaryKey(),\n messageId: text('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n path: text('path').notNull(),\n relativePath: text('relative_path').notNull(),\n size: integer('size'),\n },\n (table) => ({\n messageIdx: index('idx_message_attachments_message').on(table.messageId),\n pathIdx: index('idx_message_attachments_path').on(table.path),\n })\n);\n\n/**\n * Message usage table - Token usage for messages\n * 1:1 relationship with messages (only assistant messages have usage)\n */\nexport const messageUsage = sqliteTable('message_usage', {\n messageId: text('message_id')\n .primaryKey()\n .references(() => messages.id, { onDelete: 'cascade' }),\n promptTokens: integer('prompt_tokens').notNull(),\n completionTokens: integer('completion_tokens').notNull(),\n totalTokens: integer('total_tokens').notNull(),\n});\n\n/**\n * Todos table - Per-session todo lists\n */\nexport const todos = sqliteTable(\n 'todos',\n {\n id: integer('id').notNull(), // Per-session ID (not globally unique!)\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n content: text('content').notNull(),\n activeForm: text('active_form').notNull(),\n status: text('status').notNull(), // 'pending' | 'in_progress' | 'completed'\n ordering: integer('ordering').notNull(),\n },\n (table) => ({\n pk: primaryKey({ columns: [table.sessionId, table.id] }),\n sessionIdx: index('idx_todos_session').on(table.sessionId),\n statusIdx: index('idx_todos_status').on(table.status),\n orderingIdx: index('idx_todos_ordering').on(table.sessionId, table.ordering),\n })\n);\n\n/**\n * Message todo snapshots table - Snapshot of todos at message creation time\n * Enables rewind feature - can restore todo state at any point in conversation\n */\nexport const messageTodoSnapshots = sqliteTable(\n 'message_todo_snapshots',\n {\n id: text('id').primaryKey(),\n messageId: text('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n todoId: integer('todo_id').notNull(), // ID from snapshot (not FK!)\n content: text('content').notNull(),\n activeForm: text('active_form').notNull(),\n status: text('status').notNull(),\n ordering: integer('ordering').notNull(),\n },\n (table) => ({\n messageIdx: index('idx_message_todo_snapshots_message').on(table.messageId),\n })\n);\n\n// Export types for TypeScript\nexport type Session = typeof sessions.$inferSelect;\nexport type NewSession = typeof sessions.$inferInsert;\n\nexport type Message = typeof messages.$inferSelect;\nexport type NewMessage = typeof messages.$inferInsert;\n\nexport type MessagePart = typeof messageParts.$inferSelect;\nexport type NewMessagePart = typeof messageParts.$inferInsert;\n\nexport type MessageAttachment = typeof messageAttachments.$inferSelect;\nexport type NewMessageAttachment = typeof messageAttachments.$inferInsert;\n\nexport type MessageUsage = typeof messageUsage.$inferSelect;\nexport type NewMessageUsage = typeof messageUsage.$inferInsert;\n\nexport type Todo = typeof todos.$inferSelect;\nexport type NewTodo = typeof todos.$inferInsert;\n\nexport type MessageTodoSnapshot = typeof messageTodoSnapshots.$inferSelect;\nexport type NewMessageTodoSnapshot = typeof messageTodoSnapshots.$inferInsert;\n",
|
|
70
|
-
"/**\n * Auto Migration System\n * Automatically migrates from file-based to database on first app start\n *\n * Design:\n * 1. Check if database has sessions table\n * 2. If not → Run migrations automatically\n * 3. Check if JSON files exist but not in database\n * 4. If yes → Auto-migrate files to database\n * 5. Completely transparent to user\n */\n\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { readdir, mkdir, readFile as fsReadFile, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { createClient } from '@libsql/client';\nimport { drizzle } from 'drizzle-orm/libsql';\nimport { migrate } from 'drizzle-orm/libsql/migrator';\nimport { sql } from 'drizzle-orm';\nimport { SessionRepository } from './session-repository.js';\nimport { loadSession } from '../utils/session-manager.js';\nimport { findPackageRoot } from '../utils/paths.js';\n\nconst SESSION_DIR = join(homedir(), '.sylphx', 'sessions');\nconst DB_DIR = join(homedir(), '.sylphx-flow');\nconst DB_PATH = join(DB_DIR, 'memory.db');\nconst MIGRATION_FLAG = join(DB_DIR, '.session-migrated');\n\nexport interface MigrationProgress {\n total: number;\n current: number;\n status: string;\n}\n\nexport type ProgressCallback = (progress: MigrationProgress) => void;\n\n/**\n * Check if JSON session files need migration to database\n * Returns true if there are JSON files that need to be migrated\n *\n * Note: Schema migrations are handled automatically by Drizzle's migrate()\n * We only need to check for JSON file migration here\n */\nasync function needsFileMigration(db: any): Promise<boolean> {\n try {\n // Check if migration flag exists\n if (existsSync(MIGRATION_FLAG)) {\n // Already migrated - cleanup any remaining JSON files\n await cleanupOldJSONFiles();\n return false;\n }\n\n // Check if JSON files exist that need migration\n try {\n const files = await readdir(SESSION_DIR);\n const sessionFiles = files.filter((f) => f.endsWith('.json') && !f.startsWith('.'));\n\n if (sessionFiles.length === 0) {\n return false; // No files to migrate\n }\n\n // Check if any files not in database\n const repository = new SessionRepository(db);\n const dbCount = await repository.getSessionCount();\n\n // If database is empty but files exist, need migration\n return dbCount === 0 && sessionFiles.length > 0;\n } catch {\n return false; // Session directory doesn't exist\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Cleanup old JSON files after migration\n * Called when migration flag exists (already migrated)\n */\nasync function cleanupOldJSONFiles(): Promise<void> {\n try {\n const files = await readdir(SESSION_DIR);\n const sessionFiles = files.filter((f) => f.endsWith('.json') && !f.startsWith('.'));\n\n if (sessionFiles.length === 0) {\n return; // No files to cleanup\n }\n\n console.log(`Cleaning up ${sessionFiles.length} old JSON files...`);\n let deletedCount = 0;\n\n for (const file of sessionFiles) {\n try {\n await unlink(join(SESSION_DIR, file));\n deletedCount++;\n } catch (error) {\n console.warn(`Failed to delete ${file}:`, error);\n }\n }\n\n console.log(`Cleanup complete: deleted ${deletedCount}/${sessionFiles.length} JSON files`);\n } catch {\n // Session directory doesn't exist or other error - ignore\n }\n}\n\n/**\n * Run database schema migrations\n */\nasync function runSchemaMigrations(db: any): Promise<void> {\n // Ensure database directory exists\n await mkdir(DB_DIR, { recursive: true });\n\n // Run Drizzle migrations using package root to find migrations\n // This works with npm global install\n const packageRoot = findPackageRoot('drizzle migrations');\n const migrationsPath = join(packageRoot, 'drizzle');\n\n if (!existsSync(migrationsPath)) {\n throw new Error(`Drizzle migrations not found at ${migrationsPath}`);\n }\n\n await migrate(db, { migrationsFolder: migrationsPath });\n}\n\n/**\n * Migrate session files to database\n */\nasync function migrateSessionFiles(\n db: any,\n onProgress?: ProgressCallback\n): Promise<{ success: number; errors: number }> {\n const repository = new SessionRepository(db);\n\n // Get all session files\n const files = await readdir(SESSION_DIR);\n const sessionFiles = files.filter((f) => f.endsWith('.json') && !f.startsWith('.'));\n\n let successCount = 0;\n let errorCount = 0;\n\n onProgress?.({\n total: sessionFiles.length,\n current: 0,\n status: `Found ${sessionFiles.length} sessions to migrate`,\n });\n\n for (let i = 0; i < sessionFiles.length; i++) {\n const file = sessionFiles[i];\n const sessionId = file.replace('.json', '');\n\n try {\n onProgress?.({\n total: sessionFiles.length,\n current: i + 1,\n status: `Migrating session ${i + 1}/${sessionFiles.length}`,\n });\n\n // Load session from file\n const session = await loadSession(sessionId);\n\n if (!session) {\n errorCount++;\n continue;\n }\n\n // Check if already exists\n const existing = await repository.getSessionById(session.id);\n if (existing) {\n continue; // Skip duplicates\n }\n\n // Create session in database with existing ID and metadata\n await repository.createSessionFromData({\n id: session.id,\n provider: session.provider,\n model: session.model,\n title: session.title,\n nextTodoId: session.nextTodoId || 1,\n created: session.created,\n updated: session.updated,\n });\n\n // Add all messages\n // Normalize attachments from old JSON files (might have corrupt data like {})\n for (const message of session.messages) {\n // Normalize attachments: must be array or undefined\n let normalizedAttachments: typeof message.attachments = undefined;\n if (message.attachments && Array.isArray(message.attachments) && message.attachments.length > 0) {\n const validAttachments = message.attachments.filter((a: any) =>\n a && typeof a === 'object' && a.path && a.relativePath\n );\n if (validAttachments.length > 0) {\n normalizedAttachments = validAttachments;\n }\n }\n\n await repository.addMessage(\n session.id,\n message.role,\n message.content,\n normalizedAttachments,\n message.usage,\n message.finishReason,\n message.metadata,\n message.todoSnapshot\n );\n }\n\n // Update todos\n if (session.todos && session.todos.length > 0) {\n await repository.updateTodos(session.id, session.todos, session.nextTodoId);\n }\n\n // Migration successful - delete the JSON file to free space and avoid confusion\n const filePath = join(SESSION_DIR, file);\n try {\n await unlink(filePath);\n } catch (unlinkError) {\n console.warn(`Successfully migrated ${sessionId} but failed to delete JSON file:`, unlinkError);\n }\n\n successCount++;\n } catch (error) {\n console.error(`Error migrating ${sessionId}:`, error);\n errorCount++;\n // Keep JSON file on error for debugging\n }\n }\n\n // Create migration flag\n await fsReadFile(MIGRATION_FLAG, 'utf8').catch(() =>\n require('fs').writeFileSync(MIGRATION_FLAG, new Date().toISOString())\n );\n\n return { success: successCount, errors: errorCount };\n}\n\n/**\n * Auto-migrate on app startup\n * Returns database instance ready to use\n *\n * Design: Always run schema migrations (Drizzle handles detection)\n * 1. Run Drizzle migrate() - automatically applies only new migrations\n * 2. Check and migrate JSON files if needed\n */\nexport async function autoMigrate(onProgress?: ProgressCallback): Promise<any> {\n const DATABASE_URL = process.env.DATABASE_URL || `file:${DB_PATH}`;\n\n // Initialize database with optimized settings for concurrency\n const client = createClient({ url: DATABASE_URL });\n const db = drizzle(client);\n\n // Configure SQLite for better concurrency\n // WAL mode allows concurrent reads while writing\n // Busy timeout retries when database is locked (5 seconds)\n await client.execute('PRAGMA journal_mode = WAL');\n await client.execute('PRAGMA busy_timeout = 5000');\n await client.execute('PRAGMA synchronous = NORMAL');\n\n onProgress?.({\n total: 2,\n current: 0,\n status: 'Running database migrations...',\n });\n\n // Always run schema migrations\n // Drizzle's migrate() automatically detects and applies only new migrations\n await runSchemaMigrations(db);\n\n onProgress?.({\n total: 2,\n current: 1,\n status: 'Database schema up to date',\n });\n\n // Check if JSON file migration needed\n const needsFiles = await needsFileMigration(db);\n\n if (needsFiles) {\n try {\n const files = await readdir(SESSION_DIR);\n const sessionFiles = files.filter((f) => f.endsWith('.json') && !f.startsWith('.'));\n\n if (sessionFiles.length > 0) {\n onProgress?.({\n total: 2 + sessionFiles.length,\n current: 1,\n status: `Migrating ${sessionFiles.length} sessions from files...`,\n });\n\n // Migrate files to database\n const result = await migrateSessionFiles(db, (fileProgress) => {\n onProgress?.({\n total: 2 + fileProgress.total,\n current: 1 + fileProgress.current,\n status: fileProgress.status,\n });\n });\n\n onProgress?.({\n total: 2 + sessionFiles.length,\n current: 2 + sessionFiles.length,\n status: `Migration complete! ${result.success} sessions migrated`,\n });\n }\n } catch {\n // No session directory, skip file migration\n }\n }\n\n return db;\n}\n\n/**\n * Initialize database with auto-migration\n * Call this on app startup\n */\nexport async function initializeDatabase(onProgress?: ProgressCallback): Promise<any> {\n return autoMigrate(onProgress);\n}\n",
|
|
71
|
-
"/** Error thrown by the client. */\nexport class LibsqlError extends Error {\n /** Machine-readable error code. */\n code;\n /** Raw numeric error code */\n rawCode;\n constructor(message, code, rawCode, cause) {\n if (code !== undefined) {\n message = `${code}: ${message}`;\n }\n super(message, { cause });\n this.code = code;\n this.rawCode = rawCode;\n this.name = \"LibsqlError\";\n }\n}\n",
|
|
72
|
-
"// URI parser based on RFC 3986\n// We can't use the standard `URL` object, because we want to support relative `file:` URLs like\n// `file:relative/path/database.db`, which are not correct according to RFC 8089, which standardizes the\n// `file` scheme.\nimport { LibsqlError } from \"./api.js\";\nexport function parseUri(text) {\n const match = URI_RE.exec(text);\n if (match === null) {\n throw new LibsqlError(`The URL '${text}' is not in a valid format`, \"URL_INVALID\");\n }\n const groups = match.groups;\n const scheme = groups[\"scheme\"];\n const authority = groups[\"authority\"] !== undefined\n ? parseAuthority(groups[\"authority\"])\n : undefined;\n const path = percentDecode(groups[\"path\"]);\n const query = groups[\"query\"] !== undefined ? parseQuery(groups[\"query\"]) : undefined;\n const fragment = groups[\"fragment\"] !== undefined\n ? percentDecode(groups[\"fragment\"])\n : undefined;\n return { scheme, authority, path, query, fragment };\n}\nconst URI_RE = (() => {\n const SCHEME = \"(?<scheme>[A-Za-z][A-Za-z.+-]*)\";\n const AUTHORITY = \"(?<authority>[^/?#]*)\";\n const PATH = \"(?<path>[^?#]*)\";\n const QUERY = \"(?<query>[^#]*)\";\n const FRAGMENT = \"(?<fragment>.*)\";\n return new RegExp(`^${SCHEME}:(//${AUTHORITY})?${PATH}(\\\\?${QUERY})?(#${FRAGMENT})?$`, \"su\");\n})();\nfunction parseAuthority(text) {\n const match = AUTHORITY_RE.exec(text);\n if (match === null) {\n throw new LibsqlError(\"The authority part of the URL is not in a valid format\", \"URL_INVALID\");\n }\n const groups = match.groups;\n const host = percentDecode(groups[\"host_br\"] ?? groups[\"host\"]);\n const port = groups[\"port\"] ? parseInt(groups[\"port\"], 10) : undefined;\n const userinfo = groups[\"username\"] !== undefined\n ? {\n username: percentDecode(groups[\"username\"]),\n password: groups[\"password\"] !== undefined\n ? percentDecode(groups[\"password\"])\n : undefined,\n }\n : undefined;\n return { host, port, userinfo };\n}\nconst AUTHORITY_RE = (() => {\n return new RegExp(`^((?<username>[^:]*)(:(?<password>.*))?@)?((?<host>[^:\\\\[\\\\]]*)|(\\\\[(?<host_br>[^\\\\[\\\\]]*)\\\\]))(:(?<port>[0-9]*))?$`, \"su\");\n})();\n// Query string is parsed as application/x-www-form-urlencoded according to the Web URL standard:\n// https://url.spec.whatwg.org/#urlencoded-parsing\nfunction parseQuery(text) {\n const sequences = text.split(\"&\");\n const pairs = [];\n for (const sequence of sequences) {\n if (sequence === \"\") {\n continue;\n }\n let key;\n let value;\n const splitIdx = sequence.indexOf(\"=\");\n if (splitIdx < 0) {\n key = sequence;\n value = \"\";\n }\n else {\n key = sequence.substring(0, splitIdx);\n value = sequence.substring(splitIdx + 1);\n }\n pairs.push({\n key: percentDecode(key.replaceAll(\"+\", \" \")),\n value: percentDecode(value.replaceAll(\"+\", \" \")),\n });\n }\n return { pairs };\n}\nfunction percentDecode(text) {\n try {\n return decodeURIComponent(text);\n }\n catch (e) {\n if (e instanceof URIError) {\n throw new LibsqlError(`URL component has invalid percent encoding: ${e}`, \"URL_INVALID\", undefined, e);\n }\n throw e;\n }\n}\nexport function encodeBaseUrl(scheme, authority, path) {\n if (authority === undefined) {\n throw new LibsqlError(`URL with scheme ${JSON.stringify(scheme + \":\")} requires authority (the \"//\" part)`, \"URL_INVALID\");\n }\n const schemeText = `${scheme}:`;\n const hostText = encodeHost(authority.host);\n const portText = encodePort(authority.port);\n const userinfoText = encodeUserinfo(authority.userinfo);\n const authorityText = `//${userinfoText}${hostText}${portText}`;\n let pathText = path.split(\"/\").map(encodeURIComponent).join(\"/\");\n if (pathText !== \"\" && !pathText.startsWith(\"/\")) {\n pathText = \"/\" + pathText;\n }\n return new URL(`${schemeText}${authorityText}${pathText}`);\n}\nfunction encodeHost(host) {\n return host.includes(\":\") ? `[${encodeURI(host)}]` : encodeURI(host);\n}\nfunction encodePort(port) {\n return port !== undefined ? `:${port}` : \"\";\n}\nfunction encodeUserinfo(userinfo) {\n if (userinfo === undefined) {\n return \"\";\n }\n const usernameText = encodeURIComponent(userinfo.username);\n const passwordText = userinfo.password !== undefined\n ? `:${encodeURIComponent(userinfo.password)}`\n : \"\";\n return `${usernameText}${passwordText}@`;\n}\n",
|
|
73
|
-
"/**\n * base64.ts\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.8';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n let tab = {};\n a.forEach((c, i) => tab[c] = i);\n return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n ? Uint8Array.from.bind(Uint8Array)\n : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n // console.log('polyfilled');\n let u32, c0, c1, c2, asc = '';\n const pad = bin.length % 3;\n for (let i = 0; i < bin.length;) {\n if ((c0 = bin.charCodeAt(i++)) > 255 ||\n (c1 = bin.charCodeAt(i++)) > 255 ||\n (c2 = bin.charCodeAt(i++)) > 255)\n throw new TypeError('invalid character found');\n u32 = (c0 << 16) | (c1 << 8) | c2;\n asc += b64chs[u32 >> 18 & 63]\n + b64chs[u32 >> 12 & 63]\n + b64chs[u32 >> 6 & 63]\n + b64chs[u32 & 63];\n }\n return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n ? (u8a) => Buffer.from(u8a).toString('base64')\n : (u8a) => {\n // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n const maxargs = 0x1000;\n let strs = [];\n for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n }\n return _btoa(strs.join(''));\n };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n + _fromCC(0x80 | (cc & 0x3f)))\n : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n ? (s) => Buffer.from(s, 'utf8').toString('base64')\n : _TE\n ? (s) => _fromUint8Array(_TE.encode(s))\n : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n ? _mkUriSafe(_encode(src))\n : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n switch (cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n return (_fromCC((offset >>> 10) + 0xD800)\n + _fromCC((offset & 0x3FF) + 0xDC00));\n case 3:\n return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2)));\n default:\n return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1)));\n }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n // console.log('polyfilled');\n asc = asc.replace(/\\s+/g, '');\n if (!b64re.test(asc))\n throw new TypeError('malformed base64.');\n asc += '=='.slice(2 - (asc.length & 3));\n let u24, r1, r2;\n let binArray = []; // use array to avoid minor gc in loop\n for (let i = 0; i < asc.length;) {\n u24 = b64tab[asc.charAt(i++)] << 18\n | b64tab[asc.charAt(i++)] << 12\n | (r1 = b64tab[asc.charAt(i++)]) << 6\n | (r2 = b64tab[asc.charAt(i++)]);\n if (r1 === 64) {\n binArray.push(_fromCC(u24 >> 16 & 255));\n }\n else if (r2 === 64) {\n binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255));\n }\n else {\n binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255));\n }\n }\n return binArray.join('');\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n ? (a) => Buffer.from(a, 'base64').toString('utf8')\n : _TD\n ? (a) => _TD.decode(_toUint8Array(a))\n : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string. Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n */\nconst isValid = (src) => {\n if (typeof src !== 'string')\n return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n return {\n value: v, enumerable: false, writable: true, configurable: true\n };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n _add('fromBase64', function () { return decode(this); });\n _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n _add('toBase64URI', function () { return encode(this, true); });\n _add('toBase64URL', function () { return encode(this, true); });\n _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n _add('toBase64URI', function () { return fromUint8Array(this, true); });\n _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n extendString();\n extendUint8Array();\n};\nconst gBase64 = {\n version: version,\n VERSION: VERSION,\n atob: _atob,\n atobPolyfill: atobPolyfill,\n btoa: _btoa,\n btoaPolyfill: btoaPolyfill,\n fromBase64: decode,\n toBase64: encode,\n encode: encode,\n encodeURI: encodeURI,\n encodeURL: encodeURI,\n utob: utob,\n btou: btou,\n decode: decode,\n isValid: isValid,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array,\n extendString: extendString,\n extendUint8Array: extendUint8Array,\n extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n",
|
|
74
|
-
"import { Base64 } from \"js-base64\";\nexport const supportedUrlLink = \"https://github.com/libsql/libsql-client-ts#supported-urls\";\nexport function transactionModeToBegin(mode) {\n if (mode === \"write\") {\n return \"BEGIN IMMEDIATE\";\n }\n else if (mode === \"read\") {\n return \"BEGIN TRANSACTION READONLY\";\n }\n else if (mode === \"deferred\") {\n return \"BEGIN DEFERRED\";\n }\n else {\n throw RangeError('Unknown transaction mode, supported values are \"write\", \"read\" and \"deferred\"');\n }\n}\nexport class ResultSetImpl {\n columns;\n columnTypes;\n rows;\n rowsAffected;\n lastInsertRowid;\n constructor(columns, columnTypes, rows, rowsAffected, lastInsertRowid) {\n this.columns = columns;\n this.columnTypes = columnTypes;\n this.rows = rows;\n this.rowsAffected = rowsAffected;\n this.lastInsertRowid = lastInsertRowid;\n }\n toJSON() {\n return {\n columns: this.columns,\n columnTypes: this.columnTypes,\n rows: this.rows.map(rowToJson),\n rowsAffected: this.rowsAffected,\n lastInsertRowid: this.lastInsertRowid !== undefined\n ? \"\" + this.lastInsertRowid\n : null,\n };\n }\n}\nfunction rowToJson(row) {\n return Array.prototype.map.call(row, valueToJson);\n}\nfunction valueToJson(value) {\n if (typeof value === \"bigint\") {\n return \"\" + value;\n }\n else if (value instanceof ArrayBuffer) {\n return Base64.fromUint8Array(new Uint8Array(value));\n }\n else {\n return value;\n }\n}\n",
|
|
75
|
-
"import { LibsqlError } from \"./api.js\";\nimport { parseUri } from \"./uri.js\";\nimport { supportedUrlLink } from \"./util.js\";\nconst inMemoryMode = \":memory:\";\nexport function isInMemoryConfig(config) {\n return (config.scheme === \"file\" &&\n (config.path === \":memory:\" || config.path.startsWith(\":memory:?\")));\n}\nexport function expandConfig(config, preferHttp) {\n if (typeof config !== \"object\") {\n // produce a reasonable error message in the common case where users type\n // `createClient(\"libsql://...\")` instead of `createClient({url: \"libsql://...\"})`\n throw new TypeError(`Expected client configuration as object, got ${typeof config}`);\n }\n let { url, authToken, tls, intMode, concurrency } = config;\n // fill simple defaults right here\n concurrency = Math.max(0, concurrency || 20);\n intMode ??= \"number\";\n let connectionQueryParams = []; // recognized query parameters which we sanitize through white list of valid key-value pairs\n // convert plain :memory: url to URI format to make logic more uniform\n if (url === inMemoryMode) {\n url = \"file::memory:\";\n }\n // parse url parameters first and override config with update values\n const uri = parseUri(url);\n const originalUriScheme = uri.scheme.toLowerCase();\n const isInMemoryMode = originalUriScheme === \"file\" &&\n uri.path === inMemoryMode &&\n uri.authority === undefined;\n let queryParamsDef;\n if (isInMemoryMode) {\n queryParamsDef = {\n cache: {\n values: [\"shared\", \"private\"],\n update: (key, value) => connectionQueryParams.push(`${key}=${value}`),\n },\n };\n }\n else {\n queryParamsDef = {\n tls: {\n values: [\"0\", \"1\"],\n update: (_, value) => (tls = value === \"1\"),\n },\n authToken: {\n update: (_, value) => (authToken = value),\n },\n };\n }\n for (const { key, value } of uri.query?.pairs ?? []) {\n if (!Object.hasOwn(queryParamsDef, key)) {\n throw new LibsqlError(`Unsupported URL query parameter ${JSON.stringify(key)}`, \"URL_PARAM_NOT_SUPPORTED\");\n }\n const queryParamDef = queryParamsDef[key];\n if (queryParamDef.values !== undefined &&\n !queryParamDef.values.includes(value)) {\n throw new LibsqlError(`Unknown value for the \"${key}\" query argument: ${JSON.stringify(value)}. Supported values are: [${queryParamDef.values.map((x) => '\"' + x + '\"').join(\", \")}]`, \"URL_INVALID\");\n }\n if (queryParamDef.update !== undefined) {\n queryParamDef?.update(key, value);\n }\n }\n // fill complex defaults & validate config\n const connectionQueryParamsString = connectionQueryParams.length === 0\n ? \"\"\n : `?${connectionQueryParams.join(\"&\")}`;\n const path = uri.path + connectionQueryParamsString;\n let scheme;\n if (originalUriScheme === \"libsql\") {\n if (tls === false) {\n if (uri.authority?.port === undefined) {\n throw new LibsqlError('A \"libsql:\" URL with ?tls=0 must specify an explicit port', \"URL_INVALID\");\n }\n scheme = preferHttp ? \"http\" : \"ws\";\n }\n else {\n scheme = preferHttp ? \"https\" : \"wss\";\n }\n }\n else {\n scheme = originalUriScheme;\n }\n if (scheme === \"http\" || scheme === \"ws\") {\n tls ??= false;\n }\n else {\n tls ??= true;\n }\n if (scheme !== \"http\" &&\n scheme !== \"ws\" &&\n scheme !== \"https\" &&\n scheme !== \"wss\" &&\n scheme !== \"file\") {\n throw new LibsqlError('The client supports only \"libsql:\", \"wss:\", \"ws:\", \"https:\", \"http:\" and \"file:\" URLs, ' +\n `got ${JSON.stringify(uri.scheme + \":\")}. ` +\n `For more information, please read ${supportedUrlLink}`, \"URL_SCHEME_NOT_SUPPORTED\");\n }\n if (intMode !== \"number\" && intMode !== \"bigint\" && intMode !== \"string\") {\n throw new TypeError(`Invalid value for intMode, expected \"number\", \"bigint\" or \"string\", got ${JSON.stringify(intMode)}`);\n }\n if (uri.fragment !== undefined) {\n throw new LibsqlError(`URL fragments are not supported: ${JSON.stringify(\"#\" + uri.fragment)}`, \"URL_INVALID\");\n }\n if (isInMemoryMode) {\n return {\n scheme: \"file\",\n tls: false,\n path,\n intMode,\n concurrency,\n syncUrl: config.syncUrl,\n syncInterval: config.syncInterval,\n readYourWrites: config.readYourWrites,\n offline: config.offline,\n fetch: config.fetch,\n authToken: undefined,\n encryptionKey: undefined,\n authority: undefined,\n };\n }\n return {\n scheme,\n tls,\n authority: uri.authority,\n path,\n authToken,\n intMode,\n concurrency,\n encryptionKey: config.encryptionKey,\n syncUrl: config.syncUrl,\n syncInterval: config.syncInterval,\n readYourWrites: config.readYourWrites,\n offline: config.offline,\n fetch: config.fetch,\n };\n}\n",
|
|
76
|
-
"import Database from \"libsql\";\nimport { Buffer } from \"node:buffer\";\nimport { LibsqlError } from \"@libsql/core/api\";\nimport { expandConfig, isInMemoryConfig } from \"@libsql/core/config\";\nimport { supportedUrlLink, transactionModeToBegin, ResultSetImpl, } from \"@libsql/core/util\";\nexport * from \"@libsql/core/api\";\nexport function createClient(config) {\n return _createClient(expandConfig(config, true));\n}\n/** @private */\nexport function _createClient(config) {\n if (config.scheme !== \"file\") {\n throw new LibsqlError(`URL scheme ${JSON.stringify(config.scheme + \":\")} is not supported by the local sqlite3 client. ` +\n `For more information, please read ${supportedUrlLink}`, \"URL_SCHEME_NOT_SUPPORTED\");\n }\n const authority = config.authority;\n if (authority !== undefined) {\n const host = authority.host.toLowerCase();\n if (host !== \"\" && host !== \"localhost\") {\n throw new LibsqlError(`Invalid host in file URL: ${JSON.stringify(authority.host)}. ` +\n 'A \"file:\" URL with an absolute path should start with one slash (\"file:/absolute/path.db\") ' +\n 'or with three slashes (\"file:///absolute/path.db\"). ' +\n `For more information, please read ${supportedUrlLink}`, \"URL_INVALID\");\n }\n if (authority.port !== undefined) {\n throw new LibsqlError(\"File URL cannot have a port\", \"URL_INVALID\");\n }\n if (authority.userinfo !== undefined) {\n throw new LibsqlError(\"File URL cannot have username and password\", \"URL_INVALID\");\n }\n }\n let isInMemory = isInMemoryConfig(config);\n if (isInMemory && config.syncUrl) {\n throw new LibsqlError(`Embedded replica must use file for local db but URI with in-memory mode were provided instead: ${config.path}`, \"URL_INVALID\");\n }\n let path = config.path;\n if (isInMemory) {\n // note: we should prepend file scheme in order for SQLite3 to recognize :memory: connection query parameters\n path = `${config.scheme}:${config.path}`;\n }\n const options = {\n authToken: config.authToken,\n encryptionKey: config.encryptionKey,\n syncUrl: config.syncUrl,\n syncPeriod: config.syncInterval,\n readYourWrites: config.readYourWrites,\n offline: config.offline,\n };\n const db = new Database(path, options);\n executeStmt(db, \"SELECT 1 AS checkThatTheDatabaseCanBeOpened\", config.intMode);\n return new Sqlite3Client(path, options, db, config.intMode);\n}\nexport class Sqlite3Client {\n #path;\n #options;\n #db;\n #intMode;\n closed;\n protocol;\n /** @private */\n constructor(path, options, db, intMode) {\n this.#path = path;\n this.#options = options;\n this.#db = db;\n this.#intMode = intMode;\n this.closed = false;\n this.protocol = \"file\";\n }\n async execute(stmtOrSql, args) {\n let stmt;\n if (typeof stmtOrSql === \"string\") {\n stmt = {\n sql: stmtOrSql,\n args: args || [],\n };\n }\n else {\n stmt = stmtOrSql;\n }\n this.#checkNotClosed();\n return executeStmt(this.#getDb(), stmt, this.#intMode);\n }\n async batch(stmts, mode = \"deferred\") {\n this.#checkNotClosed();\n const db = this.#getDb();\n try {\n executeStmt(db, transactionModeToBegin(mode), this.#intMode);\n const resultSets = stmts.map((stmt) => {\n if (!db.inTransaction) {\n throw new LibsqlError(\"The transaction has been rolled back\", \"TRANSACTION_CLOSED\");\n }\n const normalizedStmt = Array.isArray(stmt)\n ? { sql: stmt[0], args: stmt[1] || [] }\n : stmt;\n return executeStmt(db, normalizedStmt, this.#intMode);\n });\n executeStmt(db, \"COMMIT\", this.#intMode);\n return resultSets;\n }\n finally {\n if (db.inTransaction) {\n executeStmt(db, \"ROLLBACK\", this.#intMode);\n }\n }\n }\n async migrate(stmts) {\n this.#checkNotClosed();\n const db = this.#getDb();\n try {\n executeStmt(db, \"PRAGMA foreign_keys=off\", this.#intMode);\n executeStmt(db, transactionModeToBegin(\"deferred\"), this.#intMode);\n const resultSets = stmts.map((stmt) => {\n if (!db.inTransaction) {\n throw new LibsqlError(\"The transaction has been rolled back\", \"TRANSACTION_CLOSED\");\n }\n return executeStmt(db, stmt, this.#intMode);\n });\n executeStmt(db, \"COMMIT\", this.#intMode);\n return resultSets;\n }\n finally {\n if (db.inTransaction) {\n executeStmt(db, \"ROLLBACK\", this.#intMode);\n }\n executeStmt(db, \"PRAGMA foreign_keys=on\", this.#intMode);\n }\n }\n async transaction(mode = \"write\") {\n const db = this.#getDb();\n executeStmt(db, transactionModeToBegin(mode), this.#intMode);\n this.#db = null; // A new connection will be lazily created on next use\n return new Sqlite3Transaction(db, this.#intMode);\n }\n async executeMultiple(sql) {\n this.#checkNotClosed();\n const db = this.#getDb();\n try {\n return executeMultiple(db, sql);\n }\n finally {\n if (db.inTransaction) {\n executeStmt(db, \"ROLLBACK\", this.#intMode);\n }\n }\n }\n async sync() {\n this.#checkNotClosed();\n const rep = await this.#getDb().sync();\n return {\n frames_synced: rep.frames_synced,\n frame_no: rep.frame_no,\n };\n }\n async reconnect() {\n try {\n if (!this.closed && this.#db !== null) {\n this.#db.close();\n }\n }\n finally {\n this.#db = new Database(this.#path, this.#options);\n this.closed = false;\n }\n }\n close() {\n this.closed = true;\n if (this.#db !== null) {\n this.#db.close();\n this.#db = null;\n }\n }\n #checkNotClosed() {\n if (this.closed) {\n throw new LibsqlError(\"The client is closed\", \"CLIENT_CLOSED\");\n }\n }\n // Lazily creates the database connection and returns it\n #getDb() {\n if (this.#db === null) {\n this.#db = new Database(this.#path, this.#options);\n }\n return this.#db;\n }\n}\nexport class Sqlite3Transaction {\n #database;\n #intMode;\n /** @private */\n constructor(database, intMode) {\n this.#database = database;\n this.#intMode = intMode;\n }\n async execute(stmtOrSql, args) {\n let stmt;\n if (typeof stmtOrSql === \"string\") {\n stmt = {\n sql: stmtOrSql,\n args: args || [],\n };\n }\n else {\n stmt = stmtOrSql;\n }\n this.#checkNotClosed();\n return executeStmt(this.#database, stmt, this.#intMode);\n }\n async batch(stmts) {\n return stmts.map((stmt) => {\n this.#checkNotClosed();\n const normalizedStmt = Array.isArray(stmt)\n ? { sql: stmt[0], args: stmt[1] || [] }\n : stmt;\n return executeStmt(this.#database, normalizedStmt, this.#intMode);\n });\n }\n async executeMultiple(sql) {\n this.#checkNotClosed();\n return executeMultiple(this.#database, sql);\n }\n async rollback() {\n if (!this.#database.open) {\n return;\n }\n this.#checkNotClosed();\n executeStmt(this.#database, \"ROLLBACK\", this.#intMode);\n }\n async commit() {\n this.#checkNotClosed();\n executeStmt(this.#database, \"COMMIT\", this.#intMode);\n }\n close() {\n if (this.#database.inTransaction) {\n executeStmt(this.#database, \"ROLLBACK\", this.#intMode);\n }\n }\n get closed() {\n return !this.#database.inTransaction;\n }\n #checkNotClosed() {\n if (this.closed) {\n throw new LibsqlError(\"The transaction is closed\", \"TRANSACTION_CLOSED\");\n }\n }\n}\nfunction executeStmt(db, stmt, intMode) {\n let sql;\n let args;\n if (typeof stmt === \"string\") {\n sql = stmt;\n args = [];\n }\n else {\n sql = stmt.sql;\n if (Array.isArray(stmt.args)) {\n args = stmt.args.map((value) => valueToSql(value, intMode));\n }\n else {\n args = {};\n for (const name in stmt.args) {\n const argName = name[0] === \"@\" || name[0] === \"$\" || name[0] === \":\"\n ? name.substring(1)\n : name;\n args[argName] = valueToSql(stmt.args[name], intMode);\n }\n }\n }\n try {\n const sqlStmt = db.prepare(sql);\n sqlStmt.safeIntegers(true);\n let returnsData = true;\n try {\n sqlStmt.raw(true);\n }\n catch {\n // raw() throws an exception if the statement does not return data\n returnsData = false;\n }\n if (returnsData) {\n const columns = Array.from(sqlStmt.columns().map((col) => col.name));\n const columnTypes = Array.from(sqlStmt.columns().map((col) => col.type ?? \"\"));\n const rows = sqlStmt.all(args).map((sqlRow) => {\n return rowFromSql(sqlRow, columns, intMode);\n });\n // TODO: can we get this info from better-sqlite3?\n const rowsAffected = 0;\n const lastInsertRowid = undefined;\n return new ResultSetImpl(columns, columnTypes, rows, rowsAffected, lastInsertRowid);\n }\n else {\n const info = sqlStmt.run(args);\n const rowsAffected = info.changes;\n const lastInsertRowid = BigInt(info.lastInsertRowid);\n return new ResultSetImpl([], [], [], rowsAffected, lastInsertRowid);\n }\n }\n catch (e) {\n throw mapSqliteError(e);\n }\n}\nfunction rowFromSql(sqlRow, columns, intMode) {\n const row = {};\n // make sure that the \"length\" property is not enumerable\n Object.defineProperty(row, \"length\", { value: sqlRow.length });\n for (let i = 0; i < sqlRow.length; ++i) {\n const value = valueFromSql(sqlRow[i], intMode);\n Object.defineProperty(row, i, { value });\n const column = columns[i];\n if (!Object.hasOwn(row, column)) {\n Object.defineProperty(row, column, {\n value,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n }\n return row;\n}\nfunction valueFromSql(sqlValue, intMode) {\n if (typeof sqlValue === \"bigint\") {\n if (intMode === \"number\") {\n if (sqlValue < minSafeBigint || sqlValue > maxSafeBigint) {\n throw new RangeError(\"Received integer which cannot be safely represented as a JavaScript number\");\n }\n return Number(sqlValue);\n }\n else if (intMode === \"bigint\") {\n return sqlValue;\n }\n else if (intMode === \"string\") {\n return \"\" + sqlValue;\n }\n else {\n throw new Error(\"Invalid value for IntMode\");\n }\n }\n else if (sqlValue instanceof Buffer) {\n return sqlValue.buffer;\n }\n return sqlValue;\n}\nconst minSafeBigint = -9007199254740991n;\nconst maxSafeBigint = 9007199254740991n;\nfunction valueToSql(value, intMode) {\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new RangeError(\"Only finite numbers (not Infinity or NaN) can be passed as arguments\");\n }\n return value;\n }\n else if (typeof value === \"bigint\") {\n if (value < minInteger || value > maxInteger) {\n throw new RangeError(\"bigint is too large to be represented as a 64-bit integer and passed as argument\");\n }\n return value;\n }\n else if (typeof value === \"boolean\") {\n switch (intMode) {\n case \"bigint\":\n return value ? 1n : 0n;\n case \"string\":\n return value ? \"1\" : \"0\";\n default:\n return value ? 1 : 0;\n }\n }\n else if (value instanceof ArrayBuffer) {\n return Buffer.from(value);\n }\n else if (value instanceof Date) {\n return value.valueOf();\n }\n else if (value === undefined) {\n throw new TypeError(\"undefined cannot be passed as argument to the database\");\n }\n else {\n return value;\n }\n}\nconst minInteger = -9223372036854775808n;\nconst maxInteger = 9223372036854775807n;\nfunction executeMultiple(db, sql) {\n try {\n db.exec(sql);\n }\n catch (e) {\n throw mapSqliteError(e);\n }\n}\nfunction mapSqliteError(e) {\n if (e instanceof Database.SqliteError) {\n return new LibsqlError(e.message, e.code, e.rawCode, e);\n }\n return e;\n}\n",
|
|
77
|
-
"/** A client for the Hrana protocol (a \"database connection pool\"). */\nexport class Client {\n /** @private */\n constructor() {\n this.intMode = \"number\";\n }\n /** Representation of integers returned from the database. See {@link IntMode}.\n *\n * This value is inherited by {@link Stream} objects created with {@link openStream}, but you can\n * override the integer mode for every stream by setting {@link Stream.intMode} on the stream.\n */\n intMode;\n}\n",
|
|
78
|
-
"/** Generic error produced by the Hrana client. */\nexport class ClientError extends Error {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"ClientError\";\n }\n}\n/** Error thrown when the server violates the protocol. */\nexport class ProtoError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"ProtoError\";\n }\n}\n/** Error thrown when the server returns an error response. */\nexport class ResponseError extends ClientError {\n code;\n /** @internal */\n proto;\n /** @private */\n constructor(message, protoError) {\n super(message);\n this.name = \"ResponseError\";\n this.code = protoError.code;\n this.proto = protoError;\n this.stack = undefined;\n }\n}\n/** Error thrown when the client or stream is closed. */\nexport class ClosedError extends ClientError {\n /** @private */\n constructor(message, cause) {\n if (cause !== undefined) {\n super(`${message}: ${cause}`);\n this.cause = cause;\n }\n else {\n super(message);\n }\n this.name = \"ClosedError\";\n }\n}\n/** Error thrown when the environment does not seem to support WebSockets. */\nexport class WebSocketUnsupportedError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"WebSocketUnsupportedError\";\n }\n}\n/** Error thrown when we encounter a WebSocket error. */\nexport class WebSocketError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"WebSocketError\";\n }\n}\n/** Error thrown when the HTTP server returns an error response. */\nexport class HttpServerError extends ClientError {\n status;\n /** @private */\n constructor(message, status) {\n super(message);\n this.status = status;\n this.name = \"HttpServerError\";\n }\n}\n/** Error thrown when a libsql URL is not valid. */\nexport class LibsqlUrlParseError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"LibsqlUrlParseError\";\n }\n}\n/** Error thrown when the protocol version is too low to support a feature. */\nexport class ProtocolVersionError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"ProtocolVersionError\";\n }\n}\n/** Error thrown when an internal client error happens. */\nexport class InternalError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"InternalError\";\n }\n}\n/** Error thrown when the API is misused. */\nexport class MisuseError extends ClientError {\n /** @private */\n constructor(message) {\n super(message);\n this.name = \"MisuseError\";\n }\n}\n",
|
|
79
|
-
"import { ProtoError } from \"../../errors.js\";\nexport function string(value) {\n if (typeof value === \"string\") {\n return value;\n }\n throw typeError(value, \"string\");\n}\nexport function stringOpt(value) {\n if (value === null || value === undefined) {\n return undefined;\n }\n else if (typeof value === \"string\") {\n return value;\n }\n throw typeError(value, \"string or null\");\n}\nexport function number(value) {\n if (typeof value === \"number\") {\n return value;\n }\n throw typeError(value, \"number\");\n}\nexport function boolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n throw typeError(value, \"boolean\");\n}\nexport function array(value) {\n if (Array.isArray(value)) {\n return value;\n }\n throw typeError(value, \"array\");\n}\nexport function object(value) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return value;\n }\n throw typeError(value, \"object\");\n}\nexport function arrayObjectsMap(value, fun) {\n return array(value).map((elemValue) => fun(object(elemValue)));\n}\nfunction typeError(value, expected) {\n if (value === undefined) {\n return new ProtoError(`Expected ${expected}, but the property was missing`);\n }\n let received = typeof value;\n if (value === null) {\n received = \"null\";\n }\n else if (Array.isArray(value)) {\n received = \"array\";\n }\n return new ProtoError(`Expected ${expected}, received ${received}`);\n}\nexport function readJsonObject(value, fun) {\n return fun(object(value));\n}\n",
|
|
80
|
-
"export class ObjectWriter {\n #output;\n #isFirst;\n constructor(output) {\n this.#output = output;\n this.#isFirst = false;\n }\n begin() {\n this.#output.push('{');\n this.#isFirst = true;\n }\n end() {\n this.#output.push('}');\n this.#isFirst = false;\n }\n #key(name) {\n if (this.#isFirst) {\n this.#output.push('\"');\n this.#isFirst = false;\n }\n else {\n this.#output.push(',\"');\n }\n this.#output.push(name);\n this.#output.push('\":');\n }\n string(name, value) {\n this.#key(name);\n this.#output.push(JSON.stringify(value));\n }\n stringRaw(name, value) {\n this.#key(name);\n this.#output.push('\"');\n this.#output.push(value);\n this.#output.push('\"');\n }\n number(name, value) {\n this.#key(name);\n this.#output.push(\"\" + value);\n }\n boolean(name, value) {\n this.#key(name);\n this.#output.push(value ? \"true\" : \"false\");\n }\n object(name, value, valueFun) {\n this.#key(name);\n this.begin();\n valueFun(this, value);\n this.end();\n }\n arrayObjects(name, values, valueFun) {\n this.#key(name);\n this.#output.push('[');\n for (let i = 0; i < values.length; ++i) {\n if (i !== 0) {\n this.#output.push(',');\n }\n this.begin();\n valueFun(this, values[i]);\n this.end();\n }\n this.#output.push(']');\n }\n}\nexport function writeJsonObject(value, fun) {\n const output = [];\n const writer = new ObjectWriter(output);\n writer.begin();\n fun(writer, value);\n writer.end();\n return output.join(\"\");\n}\n",
|
|
81
|
-
"export const VARINT = 0;\nexport const FIXED_64 = 1;\nexport const LENGTH_DELIMITED = 2;\nexport const GROUP_START = 3;\nexport const GROUP_END = 4;\nexport const FIXED_32 = 5;\n",
|
|
82
|
-
"import { ProtoError } from \"../../errors.js\";\nimport { VARINT, FIXED_64, LENGTH_DELIMITED, FIXED_32 } from \"./util.js\";\nclass MessageReader {\n #array;\n #view;\n #pos;\n constructor(array) {\n this.#array = array;\n this.#view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n this.#pos = 0;\n }\n varint() {\n let value = 0;\n for (let shift = 0;; shift += 7) {\n const byte = this.#array[this.#pos++];\n value |= (byte & 0x7f) << shift;\n if (!(byte & 0x80)) {\n break;\n }\n }\n return value;\n }\n varintBig() {\n let value = 0n;\n for (let shift = 0n;; shift += 7n) {\n const byte = this.#array[this.#pos++];\n value |= BigInt(byte & 0x7f) << shift;\n if (!(byte & 0x80)) {\n break;\n }\n }\n return value;\n }\n bytes(length) {\n const array = new Uint8Array(this.#array.buffer, this.#array.byteOffset + this.#pos, length);\n this.#pos += length;\n return array;\n }\n double() {\n const value = this.#view.getFloat64(this.#pos, true);\n this.#pos += 8;\n return value;\n }\n skipVarint() {\n for (;;) {\n const byte = this.#array[this.#pos++];\n if (!(byte & 0x80)) {\n break;\n }\n }\n }\n skip(count) {\n this.#pos += count;\n }\n eof() {\n return this.#pos >= this.#array.byteLength;\n }\n}\nexport class FieldReader {\n #reader;\n #wireType;\n constructor(reader) {\n this.#reader = reader;\n this.#wireType = -1;\n }\n setup(wireType) {\n this.#wireType = wireType;\n }\n #expect(expectedWireType) {\n if (this.#wireType !== expectedWireType) {\n throw new ProtoError(`Expected wire type ${expectedWireType}, got ${this.#wireType}`);\n }\n this.#wireType = -1;\n }\n bytes() {\n this.#expect(LENGTH_DELIMITED);\n const length = this.#reader.varint();\n return this.#reader.bytes(length);\n }\n string() {\n return new TextDecoder().decode(this.bytes());\n }\n message(def) {\n return readProtobufMessage(this.bytes(), def);\n }\n int32() {\n this.#expect(VARINT);\n return this.#reader.varint();\n }\n uint32() {\n return this.int32();\n }\n bool() {\n return this.int32() !== 0;\n }\n uint64() {\n this.#expect(VARINT);\n return this.#reader.varintBig();\n }\n sint64() {\n const value = this.uint64();\n return (value >> 1n) ^ (-(value & 1n));\n }\n double() {\n this.#expect(FIXED_64);\n return this.#reader.double();\n }\n maybeSkip() {\n if (this.#wireType < 0) {\n return;\n }\n else if (this.#wireType === VARINT) {\n this.#reader.skipVarint();\n }\n else if (this.#wireType === FIXED_64) {\n this.#reader.skip(8);\n }\n else if (this.#wireType === LENGTH_DELIMITED) {\n const length = this.#reader.varint();\n this.#reader.skip(length);\n }\n else if (this.#wireType === FIXED_32) {\n this.#reader.skip(4);\n }\n else {\n throw new ProtoError(`Unexpected wire type ${this.#wireType}`);\n }\n this.#wireType = -1;\n }\n}\nexport function readProtobufMessage(data, def) {\n const msgReader = new MessageReader(data);\n const fieldReader = new FieldReader(msgReader);\n let value = def.default();\n while (!msgReader.eof()) {\n const key = msgReader.varint();\n const tag = key >> 3;\n const wireType = key & 0x7;\n fieldReader.setup(wireType);\n const tagFun = def[tag];\n if (tagFun !== undefined) {\n const returnedValue = tagFun(fieldReader, value);\n if (returnedValue !== undefined) {\n value = returnedValue;\n }\n }\n fieldReader.maybeSkip();\n }\n return value;\n}\n",
|
|
83
|
-
"import { VARINT, FIXED_64, LENGTH_DELIMITED } from \"./util.js\";\nexport class MessageWriter {\n #buf;\n #array;\n #view;\n #pos;\n constructor() {\n this.#buf = new ArrayBuffer(256);\n this.#array = new Uint8Array(this.#buf);\n this.#view = new DataView(this.#buf);\n this.#pos = 0;\n }\n #ensure(extra) {\n if (this.#pos + extra <= this.#buf.byteLength) {\n return;\n }\n let newCap = this.#buf.byteLength;\n while (newCap < this.#pos + extra) {\n newCap *= 2;\n }\n const newBuf = new ArrayBuffer(newCap);\n const newArray = new Uint8Array(newBuf);\n const newView = new DataView(newBuf);\n newArray.set(new Uint8Array(this.#buf, 0, this.#pos));\n this.#buf = newBuf;\n this.#array = newArray;\n this.#view = newView;\n }\n #varint(value) {\n this.#ensure(5);\n value = 0 | value;\n do {\n let byte = value & 0x7f;\n value >>>= 7;\n byte |= (value ? 0x80 : 0);\n this.#array[this.#pos++] = byte;\n } while (value);\n }\n #varintBig(value) {\n this.#ensure(10);\n value = value & 0xffffffffffffffffn;\n do {\n let byte = Number(value & 0x7fn);\n value >>= 7n;\n byte |= (value ? 0x80 : 0);\n this.#array[this.#pos++] = byte;\n } while (value);\n }\n #tag(tag, wireType) {\n this.#varint((tag << 3) | wireType);\n }\n bytes(tag, value) {\n this.#tag(tag, LENGTH_DELIMITED);\n this.#varint(value.byteLength);\n this.#ensure(value.byteLength);\n this.#array.set(value, this.#pos);\n this.#pos += value.byteLength;\n }\n string(tag, value) {\n this.bytes(tag, new TextEncoder().encode(value));\n }\n message(tag, value, fun) {\n const writer = new MessageWriter();\n fun(writer, value);\n this.bytes(tag, writer.data());\n }\n int32(tag, value) {\n this.#tag(tag, VARINT);\n this.#varint(value);\n }\n uint32(tag, value) {\n this.int32(tag, value);\n }\n bool(tag, value) {\n this.int32(tag, value ? 1 : 0);\n }\n sint64(tag, value) {\n this.#tag(tag, VARINT);\n this.#varintBig((value << 1n) ^ (value >> 63n));\n }\n double(tag, value) {\n this.#tag(tag, FIXED_64);\n this.#ensure(8);\n this.#view.setFloat64(this.#pos, value, true);\n this.#pos += 8;\n }\n data() {\n return new Uint8Array(this.#buf, 0, this.#pos);\n }\n}\nexport function writeProtobufMessage(value, fun) {\n const w = new MessageWriter();\n fun(w, value);\n return w.data();\n}\n",
|
|
84
|
-
"import { InternalError } from \"./errors.js\";\n// An allocator of non-negative integer ids.\n//\n// This clever data structure has these \"ideal\" properties:\n// - It consumes memory proportional to the number of used ids (which is optimal).\n// - All operations are O(1) time.\n// - The allocated ids are small (with a slight modification, we could always provide the smallest possible\n// id).\nexport class IdAlloc {\n // Set of all allocated ids\n #usedIds;\n // Set of all free ids lower than `#usedIds.size`\n #freeIds;\n constructor() {\n this.#usedIds = new Set();\n this.#freeIds = new Set();\n }\n // Returns an id that was free, and marks it as used.\n alloc() {\n // this \"loop\" is just a way to pick an arbitrary element from the `#freeIds` set\n for (const freeId of this.#freeIds) {\n this.#freeIds.delete(freeId);\n this.#usedIds.add(freeId);\n // maintain the invariant of `#freeIds`\n if (!this.#usedIds.has(this.#usedIds.size - 1)) {\n this.#freeIds.add(this.#usedIds.size - 1);\n }\n return freeId;\n }\n // the `#freeIds` set is empty, so there are no free ids lower than `#usedIds.size`\n // this means that `#usedIds` is a set that contains all numbers from 0 to `#usedIds.size - 1`,\n // so `#usedIds.size` is free\n const freeId = this.#usedIds.size;\n this.#usedIds.add(freeId);\n return freeId;\n }\n free(id) {\n if (!this.#usedIds.delete(id)) {\n throw new InternalError(\"Freeing an id that is not allocated\");\n }\n // maintain the invariant of `#freeIds`\n this.#freeIds.delete(this.#usedIds.size);\n if (id < this.#usedIds.size) {\n this.#freeIds.add(id);\n }\n }\n}\n",
|
|
85
|
-
"import { InternalError } from \"./errors.js\";\nexport function impossible(value, message) {\n throw new InternalError(message);\n}\n",
|
|
86
|
-
"import { ProtoError, MisuseError } from \"./errors.js\";\nimport { impossible } from \"./util.js\";\nexport function valueToProto(value) {\n if (value === null) {\n return null;\n }\n else if (typeof value === \"string\") {\n return value;\n }\n else if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new RangeError(\"Only finite numbers (not Infinity or NaN) can be passed as arguments\");\n }\n return value;\n }\n else if (typeof value === \"bigint\") {\n if (value < minInteger || value > maxInteger) {\n throw new RangeError(\"This bigint value is too large to be represented as a 64-bit integer and passed as argument\");\n }\n return value;\n }\n else if (typeof value === \"boolean\") {\n return value ? 1n : 0n;\n }\n else if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n else if (value instanceof Uint8Array) {\n return value;\n }\n else if (value instanceof Date) {\n return +value.valueOf();\n }\n else if (typeof value === \"object\") {\n return \"\" + value.toString();\n }\n else {\n throw new TypeError(\"Unsupported type of value\");\n }\n}\nconst minInteger = -9223372036854775808n;\nconst maxInteger = 9223372036854775807n;\nexport function valueFromProto(value, intMode) {\n if (value === null) {\n return null;\n }\n else if (typeof value === \"number\") {\n return value;\n }\n else if (typeof value === \"string\") {\n return value;\n }\n else if (typeof value === \"bigint\") {\n if (intMode === \"number\") {\n const num = Number(value);\n if (!Number.isSafeInteger(num)) {\n throw new RangeError(\"Received integer which is too large to be safely represented as a JavaScript number\");\n }\n return num;\n }\n else if (intMode === \"bigint\") {\n return value;\n }\n else if (intMode === \"string\") {\n return \"\" + value;\n }\n else {\n throw new MisuseError(\"Invalid value for IntMode\");\n }\n }\n else if (value instanceof Uint8Array) {\n // TODO: we need to copy data from `Uint8Array` to return an `ArrayBuffer`. Perhaps we should add a\n // `blobMode` parameter, similar to `intMode`, which would allow the user to choose between receiving\n // `ArrayBuffer` (default, convenient) and `Uint8Array` (zero copy)?\n return value.slice().buffer;\n }\n else if (value === undefined) {\n throw new ProtoError(\"Received unrecognized type of Value\");\n }\n else {\n throw impossible(value, \"Impossible type of Value\");\n }\n}\n",
|
|
87
|
-
"import { ResponseError } from \"./errors.js\";\nimport { valueFromProto } from \"./value.js\";\nexport function stmtResultFromProto(result) {\n return {\n affectedRowCount: result.affectedRowCount,\n lastInsertRowid: result.lastInsertRowid,\n columnNames: result.cols.map(col => col.name),\n columnDecltypes: result.cols.map(col => col.decltype),\n };\n}\nexport function rowsResultFromProto(result, intMode) {\n const stmtResult = stmtResultFromProto(result);\n const rows = result.rows.map(row => rowFromProto(stmtResult.columnNames, row, intMode));\n return { ...stmtResult, rows };\n}\nexport function rowResultFromProto(result, intMode) {\n const stmtResult = stmtResultFromProto(result);\n let row;\n if (result.rows.length > 0) {\n row = rowFromProto(stmtResult.columnNames, result.rows[0], intMode);\n }\n return { ...stmtResult, row };\n}\nexport function valueResultFromProto(result, intMode) {\n const stmtResult = stmtResultFromProto(result);\n let value;\n if (result.rows.length > 0 && stmtResult.columnNames.length > 0) {\n value = valueFromProto(result.rows[0][0], intMode);\n }\n return { ...stmtResult, value };\n}\nfunction rowFromProto(colNames, values, intMode) {\n const row = {};\n // make sure that the \"length\" property is not enumerable\n Object.defineProperty(row, \"length\", { value: values.length });\n for (let i = 0; i < values.length; ++i) {\n const value = valueFromProto(values[i], intMode);\n Object.defineProperty(row, i, { value });\n const colName = colNames[i];\n if (colName !== undefined && !Object.hasOwn(row, colName)) {\n Object.defineProperty(row, colName, { value, enumerable: true, configurable: true, writable: true });\n }\n }\n return row;\n}\nexport function errorFromProto(error) {\n return new ResponseError(error.message, error);\n}\n",
|
|
88
|
-
"import { ClientError, ClosedError, MisuseError } from \"./errors.js\";\n/** Text of an SQL statement cached on the server. */\nexport class Sql {\n #owner;\n #sqlId;\n #closed;\n /** @private */\n constructor(owner, sqlId) {\n this.#owner = owner;\n this.#sqlId = sqlId;\n this.#closed = undefined;\n }\n /** @private */\n _getSqlId(owner) {\n if (this.#owner !== owner) {\n throw new MisuseError(\"Attempted to use SQL text opened with other object\");\n }\n else if (this.#closed !== undefined) {\n throw new ClosedError(\"SQL text is closed\", this.#closed);\n }\n return this.#sqlId;\n }\n /** Remove the SQL text from the server, releasing resouces. */\n close() {\n this._setClosed(new ClientError(\"SQL text was manually closed\"));\n }\n /** @private */\n _setClosed(error) {\n if (this.#closed === undefined) {\n this.#closed = error;\n this.#owner._closeSql(this.#sqlId);\n }\n }\n /** True if the SQL text is closed (removed from the server). */\n get closed() {\n return this.#closed !== undefined;\n }\n}\nexport function sqlToProto(owner, sql) {\n if (sql instanceof Sql) {\n return { sqlId: sql._getSqlId(owner) };\n }\n else {\n return { sql: \"\" + sql };\n }\n}\n",
|
|
89
|
-
"export class Queue {\n #pushStack;\n #shiftStack;\n constructor() {\n this.#pushStack = [];\n this.#shiftStack = [];\n }\n get length() {\n return this.#pushStack.length + this.#shiftStack.length;\n }\n push(elem) {\n this.#pushStack.push(elem);\n }\n shift() {\n if (this.#shiftStack.length === 0 && this.#pushStack.length > 0) {\n this.#shiftStack = this.#pushStack.reverse();\n this.#pushStack = [];\n }\n return this.#shiftStack.pop();\n }\n first() {\n return this.#shiftStack.length !== 0\n ? this.#shiftStack[this.#shiftStack.length - 1]\n : this.#pushStack[0];\n }\n}\n",
|
|
90
|
-
"import { sqlToProto } from \"./sql.js\";\nimport { valueToProto } from \"./value.js\";\n/** A statement that can be evaluated by the database. Besides the SQL text, it also contains the positional\n * and named arguments. */\nexport class Stmt {\n /** The SQL statement text. */\n sql;\n /** @private */\n _args;\n /** @private */\n _namedArgs;\n /** Initialize the statement with given SQL text. */\n constructor(sql) {\n this.sql = sql;\n this._args = [];\n this._namedArgs = new Map();\n }\n /** Binds positional parameters from the given `values`. All previous positional bindings are cleared. */\n bindIndexes(values) {\n this._args.length = 0;\n for (const value of values) {\n this._args.push(valueToProto(value));\n }\n return this;\n }\n /** Binds a parameter by a 1-based index. */\n bindIndex(index, value) {\n if (index !== (index | 0) || index <= 0) {\n throw new RangeError(\"Index of a positional argument must be positive integer\");\n }\n while (this._args.length < index) {\n this._args.push(null);\n }\n this._args[index - 1] = valueToProto(value);\n return this;\n }\n /** Binds a parameter by name. */\n bindName(name, value) {\n this._namedArgs.set(name, valueToProto(value));\n return this;\n }\n /** Clears all bindings. */\n unbindAll() {\n this._args.length = 0;\n this._namedArgs.clear();\n return this;\n }\n}\nexport function stmtToProto(sqlOwner, stmt, wantRows) {\n let inSql;\n let args = [];\n let namedArgs = [];\n if (stmt instanceof Stmt) {\n inSql = stmt.sql;\n args = stmt._args;\n for (const [name, value] of stmt._namedArgs.entries()) {\n namedArgs.push({ name, value });\n }\n }\n else if (Array.isArray(stmt)) {\n inSql = stmt[0];\n if (Array.isArray(stmt[1])) {\n args = stmt[1].map((arg) => valueToProto(arg));\n }\n else {\n namedArgs = Object.entries(stmt[1]).map(([name, value]) => {\n return { name, value: valueToProto(value) };\n });\n }\n }\n else {\n inSql = stmt;\n }\n const { sql, sqlId } = sqlToProto(sqlOwner, inSql);\n return { sql, sqlId, args, namedArgs, wantRows };\n}\n",
|
|
91
|
-
"import { ProtoError, MisuseError } from \"./errors.js\";\nimport { stmtResultFromProto, rowsResultFromProto, rowResultFromProto, valueResultFromProto, errorFromProto, } from \"./result.js\";\nimport { stmtToProto } from \"./stmt.js\";\nimport { impossible } from \"./util.js\";\n/** A builder for creating a batch and executing it on the server. */\nexport class Batch {\n /** @private */\n _stream;\n #useCursor;\n /** @private */\n _steps;\n #executed;\n /** @private */\n constructor(stream, useCursor) {\n this._stream = stream;\n this.#useCursor = useCursor;\n this._steps = [];\n this.#executed = false;\n }\n /** Return a builder for adding a step to the batch. */\n step() {\n return new BatchStep(this);\n }\n /** Execute the batch. */\n execute() {\n if (this.#executed) {\n throw new MisuseError(\"This batch has already been executed\");\n }\n this.#executed = true;\n const batch = {\n steps: this._steps.map((step) => step.proto),\n };\n if (this.#useCursor) {\n return executeCursor(this._stream, this._steps, batch);\n }\n else {\n return executeRegular(this._stream, this._steps, batch);\n }\n }\n}\nfunction executeRegular(stream, steps, batch) {\n return stream._batch(batch).then((result) => {\n for (let step = 0; step < steps.length; ++step) {\n const stepResult = result.stepResults.get(step);\n const stepError = result.stepErrors.get(step);\n steps[step].callback(stepResult, stepError);\n }\n });\n}\nasync function executeCursor(stream, steps, batch) {\n const cursor = await stream._openCursor(batch);\n try {\n let nextStep = 0;\n let beginEntry = undefined;\n let rows = [];\n for (;;) {\n const entry = await cursor.next();\n if (entry === undefined) {\n break;\n }\n if (entry.type === \"step_begin\") {\n if (entry.step < nextStep || entry.step >= steps.length) {\n throw new ProtoError(\"Server produced StepBeginEntry for unexpected step\");\n }\n else if (beginEntry !== undefined) {\n throw new ProtoError(\"Server produced StepBeginEntry before terminating previous step\");\n }\n for (let step = nextStep; step < entry.step; ++step) {\n steps[step].callback(undefined, undefined);\n }\n nextStep = entry.step + 1;\n beginEntry = entry;\n rows = [];\n }\n else if (entry.type === \"step_end\") {\n if (beginEntry === undefined) {\n throw new ProtoError(\"Server produced StepEndEntry but no step is active\");\n }\n const stmtResult = {\n cols: beginEntry.cols,\n rows,\n affectedRowCount: entry.affectedRowCount,\n lastInsertRowid: entry.lastInsertRowid,\n };\n steps[beginEntry.step].callback(stmtResult, undefined);\n beginEntry = undefined;\n rows = [];\n }\n else if (entry.type === \"step_error\") {\n if (beginEntry === undefined) {\n if (entry.step >= steps.length) {\n throw new ProtoError(\"Server produced StepErrorEntry for unexpected step\");\n }\n for (let step = nextStep; step < entry.step; ++step) {\n steps[step].callback(undefined, undefined);\n }\n }\n else {\n if (entry.step !== beginEntry.step) {\n throw new ProtoError(\"Server produced StepErrorEntry for unexpected step\");\n }\n beginEntry = undefined;\n rows = [];\n }\n steps[entry.step].callback(undefined, entry.error);\n nextStep = entry.step + 1;\n }\n else if (entry.type === \"row\") {\n if (beginEntry === undefined) {\n throw new ProtoError(\"Server produced RowEntry but no step is active\");\n }\n rows.push(entry.row);\n }\n else if (entry.type === \"error\") {\n throw errorFromProto(entry.error);\n }\n else if (entry.type === \"none\") {\n throw new ProtoError(\"Server produced unrecognized CursorEntry\");\n }\n else {\n throw impossible(entry, \"Impossible CursorEntry\");\n }\n }\n if (beginEntry !== undefined) {\n throw new ProtoError(\"Server closed Cursor before terminating active step\");\n }\n for (let step = nextStep; step < steps.length; ++step) {\n steps[step].callback(undefined, undefined);\n }\n }\n finally {\n cursor.close();\n }\n}\n/** A builder for adding a step to the batch. */\nexport class BatchStep {\n /** @private */\n _batch;\n #conds;\n /** @private */\n _index;\n /** @private */\n constructor(batch) {\n this._batch = batch;\n this.#conds = [];\n this._index = undefined;\n }\n /** Add the condition that needs to be satisfied to execute the statement. If you use this method multiple\n * times, we join the conditions with a logical AND. */\n condition(cond) {\n this.#conds.push(cond._proto);\n return this;\n }\n /** Add a statement that returns rows. */\n query(stmt) {\n return this.#add(stmt, true, rowsResultFromProto);\n }\n /** Add a statement that returns at most a single row. */\n queryRow(stmt) {\n return this.#add(stmt, true, rowResultFromProto);\n }\n /** Add a statement that returns at most a single value. */\n queryValue(stmt) {\n return this.#add(stmt, true, valueResultFromProto);\n }\n /** Add a statement without returning rows. */\n run(stmt) {\n return this.#add(stmt, false, stmtResultFromProto);\n }\n #add(inStmt, wantRows, fromProto) {\n if (this._index !== undefined) {\n throw new MisuseError(\"This BatchStep has already been added to the batch\");\n }\n const stmt = stmtToProto(this._batch._stream._sqlOwner(), inStmt, wantRows);\n let condition;\n if (this.#conds.length === 0) {\n condition = undefined;\n }\n else if (this.#conds.length === 1) {\n condition = this.#conds[0];\n }\n else {\n condition = { type: \"and\", conds: this.#conds.slice() };\n }\n const proto = { stmt, condition };\n return new Promise((outputCallback, errorCallback) => {\n const callback = (stepResult, stepError) => {\n if (stepResult !== undefined && stepError !== undefined) {\n errorCallback(new ProtoError(\"Server returned both result and error\"));\n }\n else if (stepError !== undefined) {\n errorCallback(errorFromProto(stepError));\n }\n else if (stepResult !== undefined) {\n outputCallback(fromProto(stepResult, this._batch._stream.intMode));\n }\n else {\n outputCallback(undefined);\n }\n };\n this._index = this._batch._steps.length;\n this._batch._steps.push({ proto, callback });\n });\n }\n}\nexport class BatchCond {\n /** @private */\n _batch;\n /** @private */\n _proto;\n /** @private */\n constructor(batch, proto) {\n this._batch = batch;\n this._proto = proto;\n }\n /** Create a condition that evaluates to true when the given step executes successfully.\n *\n * If the given step fails error or is skipped because its condition evaluated to false, this\n * condition evaluates to false.\n */\n static ok(step) {\n return new BatchCond(step._batch, { type: \"ok\", step: stepIndex(step) });\n }\n /** Create a condition that evaluates to true when the given step fails.\n *\n * If the given step succeeds or is skipped because its condition evaluated to false, this condition\n * evaluates to false.\n */\n static error(step) {\n return new BatchCond(step._batch, { type: \"error\", step: stepIndex(step) });\n }\n /** Create a condition that is a logical negation of another condition.\n */\n static not(cond) {\n return new BatchCond(cond._batch, { type: \"not\", cond: cond._proto });\n }\n /** Create a condition that is a logical AND of other conditions.\n */\n static and(batch, conds) {\n for (const cond of conds) {\n checkCondBatch(batch, cond);\n }\n return new BatchCond(batch, { type: \"and\", conds: conds.map(e => e._proto) });\n }\n /** Create a condition that is a logical OR of other conditions.\n */\n static or(batch, conds) {\n for (const cond of conds) {\n checkCondBatch(batch, cond);\n }\n return new BatchCond(batch, { type: \"or\", conds: conds.map(e => e._proto) });\n }\n /** Create a condition that evaluates to true when the SQL connection is in autocommit mode (not inside an\n * explicit transaction). This requires protocol version 3 or higher.\n */\n static isAutocommit(batch) {\n batch._stream.client()._ensureVersion(3, \"BatchCond.isAutocommit()\");\n return new BatchCond(batch, { type: \"is_autocommit\" });\n }\n}\nfunction stepIndex(step) {\n if (step._index === undefined) {\n throw new MisuseError(\"Cannot add a condition referencing a step that has not been added to the batch\");\n }\n return step._index;\n}\nfunction checkCondBatch(expectedBatch, cond) {\n if (cond._batch !== expectedBatch) {\n throw new MisuseError(\"Cannot mix BatchCond objects for different Batch objects\");\n }\n}\n",
|
|
92
|
-
"export function describeResultFromProto(result) {\n return {\n paramNames: result.params.map((p) => p.name),\n columns: result.cols,\n isExplain: result.isExplain,\n isReadonly: result.isReadonly,\n };\n}\n",
|
|
93
|
-
"import { Batch } from \"./batch.js\";\nimport { describeResultFromProto } from \"./describe.js\";\nimport { stmtResultFromProto, rowsResultFromProto, rowResultFromProto, valueResultFromProto, } from \"./result.js\";\nimport { sqlToProto } from \"./sql.js\";\nimport { stmtToProto } from \"./stmt.js\";\n/** A stream for executing SQL statements (a \"database connection\"). */\nexport class Stream {\n /** @private */\n constructor(intMode) {\n this.intMode = intMode;\n }\n /** Execute a statement and return rows. */\n query(stmt) {\n return this.#execute(stmt, true, rowsResultFromProto);\n }\n /** Execute a statement and return at most a single row. */\n queryRow(stmt) {\n return this.#execute(stmt, true, rowResultFromProto);\n }\n /** Execute a statement and return at most a single value. */\n queryValue(stmt) {\n return this.#execute(stmt, true, valueResultFromProto);\n }\n /** Execute a statement without returning rows. */\n run(stmt) {\n return this.#execute(stmt, false, stmtResultFromProto);\n }\n #execute(inStmt, wantRows, fromProto) {\n const stmt = stmtToProto(this._sqlOwner(), inStmt, wantRows);\n return this._execute(stmt).then((r) => fromProto(r, this.intMode));\n }\n /** Return a builder for creating and executing a batch.\n *\n * If `useCursor` is true, the batch will be executed using a Hrana cursor, which will stream results from\n * the server to the client, which consumes less memory on the server. This requires protocol version 3 or\n * higher.\n */\n batch(useCursor = false) {\n return new Batch(this, useCursor);\n }\n /** Parse and analyze a statement. This requires protocol version 2 or higher. */\n describe(inSql) {\n const protoSql = sqlToProto(this._sqlOwner(), inSql);\n return this._describe(protoSql).then(describeResultFromProto);\n }\n /** Execute a sequence of statements separated by semicolons. This requires protocol version 2 or higher.\n * */\n sequence(inSql) {\n const protoSql = sqlToProto(this._sqlOwner(), inSql);\n return this._sequence(protoSql);\n }\n /** Representation of integers returned from the database. See {@link IntMode}.\n *\n * This value affects the results of all operations on this stream.\n */\n intMode;\n}\n",
|
|
94
|
-
"export class Cursor {\n}\n",
|
|
95
|
-
"import { ClientError, ClosedError } from \"../errors.js\";\nimport { Cursor } from \"../cursor.js\";\nimport { Queue } from \"../queue.js\";\nconst fetchChunkSize = 1000;\nconst fetchQueueSize = 10;\nexport class WsCursor extends Cursor {\n #client;\n #stream;\n #cursorId;\n #entryQueue;\n #fetchQueue;\n #closed;\n #done;\n /** @private */\n constructor(client, stream, cursorId) {\n super();\n this.#client = client;\n this.#stream = stream;\n this.#cursorId = cursorId;\n this.#entryQueue = new Queue();\n this.#fetchQueue = new Queue();\n this.#closed = undefined;\n this.#done = false;\n }\n /** Fetch the next entry from the cursor. */\n async next() {\n for (;;) {\n if (this.#closed !== undefined) {\n throw new ClosedError(\"Cursor is closed\", this.#closed);\n }\n while (!this.#done && this.#fetchQueue.length < fetchQueueSize) {\n this.#fetchQueue.push(this.#fetch());\n }\n const entry = this.#entryQueue.shift();\n if (this.#done || entry !== undefined) {\n return entry;\n }\n // we assume that `Cursor.next()` is never called concurrently\n await this.#fetchQueue.shift().then((response) => {\n if (response === undefined) {\n return;\n }\n for (const entry of response.entries) {\n this.#entryQueue.push(entry);\n }\n this.#done ||= response.done;\n });\n }\n }\n #fetch() {\n return this.#stream._sendCursorRequest(this, {\n type: \"fetch_cursor\",\n cursorId: this.#cursorId,\n maxCount: fetchChunkSize,\n }).then((resp) => resp, (error) => {\n this._setClosed(error);\n return undefined;\n });\n }\n /** @private */\n _setClosed(error) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#closed = error;\n this.#stream._sendCursorRequest(this, {\n type: \"close_cursor\",\n cursorId: this.#cursorId,\n }).catch(() => undefined);\n this.#stream._cursorClosed(this);\n }\n /** Close the cursor. */\n close() {\n this._setClosed(new ClientError(\"Cursor was manually closed\"));\n }\n /** True if the cursor is closed. */\n get closed() {\n return this.#closed !== undefined;\n }\n}\n",
|
|
96
|
-
"import { ClientError, ClosedError, InternalError } from \"../errors.js\";\nimport { Queue } from \"../queue.js\";\nimport { Stream } from \"../stream.js\";\nimport { WsCursor } from \"./cursor.js\";\nexport class WsStream extends Stream {\n #client;\n #streamId;\n #queue;\n #cursor;\n #closing;\n #closed;\n /** @private */\n static open(client) {\n const streamId = client._streamIdAlloc.alloc();\n const stream = new WsStream(client, streamId);\n const responseCallback = () => undefined;\n const errorCallback = (e) => stream.#setClosed(e);\n const request = { type: \"open_stream\", streamId };\n client._sendRequest(request, { responseCallback, errorCallback });\n return stream;\n }\n /** @private */\n constructor(client, streamId) {\n super(client.intMode);\n this.#client = client;\n this.#streamId = streamId;\n this.#queue = new Queue();\n this.#cursor = undefined;\n this.#closing = false;\n this.#closed = undefined;\n }\n /** Get the {@link WsClient} object that this stream belongs to. */\n client() {\n return this.#client;\n }\n /** @private */\n _sqlOwner() {\n return this.#client;\n }\n /** @private */\n _execute(stmt) {\n return this.#sendStreamRequest({\n type: \"execute\",\n streamId: this.#streamId,\n stmt,\n }).then((response) => {\n return response.result;\n });\n }\n /** @private */\n _batch(batch) {\n return this.#sendStreamRequest({\n type: \"batch\",\n streamId: this.#streamId,\n batch,\n }).then((response) => {\n return response.result;\n });\n }\n /** @private */\n _describe(protoSql) {\n this.#client._ensureVersion(2, \"describe()\");\n return this.#sendStreamRequest({\n type: \"describe\",\n streamId: this.#streamId,\n sql: protoSql.sql,\n sqlId: protoSql.sqlId,\n }).then((response) => {\n return response.result;\n });\n }\n /** @private */\n _sequence(protoSql) {\n this.#client._ensureVersion(2, \"sequence()\");\n return this.#sendStreamRequest({\n type: \"sequence\",\n streamId: this.#streamId,\n sql: protoSql.sql,\n sqlId: protoSql.sqlId,\n }).then((_response) => {\n return undefined;\n });\n }\n /** Check whether the SQL connection underlying this stream is in autocommit state (i.e., outside of an\n * explicit transaction). This requires protocol version 3 or higher.\n */\n getAutocommit() {\n this.#client._ensureVersion(3, \"getAutocommit()\");\n return this.#sendStreamRequest({\n type: \"get_autocommit\",\n streamId: this.#streamId,\n }).then((response) => {\n return response.isAutocommit;\n });\n }\n #sendStreamRequest(request) {\n return new Promise((responseCallback, errorCallback) => {\n this.#pushToQueue({ type: \"request\", request, responseCallback, errorCallback });\n });\n }\n /** @private */\n _openCursor(batch) {\n this.#client._ensureVersion(3, \"cursor\");\n return new Promise((cursorCallback, errorCallback) => {\n this.#pushToQueue({ type: \"cursor\", batch, cursorCallback, errorCallback });\n });\n }\n /** @private */\n _sendCursorRequest(cursor, request) {\n if (cursor !== this.#cursor) {\n throw new InternalError(\"Cursor not associated with the stream attempted to execute a request\");\n }\n return new Promise((responseCallback, errorCallback) => {\n if (this.#closed !== undefined) {\n errorCallback(new ClosedError(\"Stream is closed\", this.#closed));\n }\n else {\n this.#client._sendRequest(request, { responseCallback, errorCallback });\n }\n });\n }\n /** @private */\n _cursorClosed(cursor) {\n if (cursor !== this.#cursor) {\n throw new InternalError(\"Cursor was closed, but it was not associated with the stream\");\n }\n this.#cursor = undefined;\n this.#flushQueue();\n }\n #pushToQueue(entry) {\n if (this.#closed !== undefined) {\n entry.errorCallback(new ClosedError(\"Stream is closed\", this.#closed));\n }\n else if (this.#closing) {\n entry.errorCallback(new ClosedError(\"Stream is closing\", undefined));\n }\n else {\n this.#queue.push(entry);\n this.#flushQueue();\n }\n }\n #flushQueue() {\n for (;;) {\n const entry = this.#queue.first();\n if (entry === undefined && this.#cursor === undefined && this.#closing) {\n this.#setClosed(new ClientError(\"Stream was gracefully closed\"));\n break;\n }\n else if (entry?.type === \"request\" && this.#cursor === undefined) {\n const { request, responseCallback, errorCallback } = entry;\n this.#queue.shift();\n this.#client._sendRequest(request, { responseCallback, errorCallback });\n }\n else if (entry?.type === \"cursor\" && this.#cursor === undefined) {\n const { batch, cursorCallback } = entry;\n this.#queue.shift();\n const cursorId = this.#client._cursorIdAlloc.alloc();\n const cursor = new WsCursor(this.#client, this, cursorId);\n const request = {\n type: \"open_cursor\",\n streamId: this.#streamId,\n cursorId,\n batch,\n };\n const responseCallback = () => undefined;\n const errorCallback = (e) => cursor._setClosed(e);\n this.#client._sendRequest(request, { responseCallback, errorCallback });\n this.#cursor = cursor;\n cursorCallback(cursor);\n }\n else {\n break;\n }\n }\n }\n #setClosed(error) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#closed = error;\n if (this.#cursor !== undefined) {\n this.#cursor._setClosed(error);\n }\n for (;;) {\n const entry = this.#queue.shift();\n if (entry !== undefined) {\n entry.errorCallback(error);\n }\n else {\n break;\n }\n }\n const request = { type: \"close_stream\", streamId: this.#streamId };\n const responseCallback = () => this.#client._streamIdAlloc.free(this.#streamId);\n const errorCallback = () => undefined;\n this.#client._sendRequest(request, { responseCallback, errorCallback });\n }\n /** Immediately close the stream. */\n close() {\n this.#setClosed(new ClientError(\"Stream was manually closed\"));\n }\n /** Gracefully close the stream. */\n closeGracefully() {\n this.#closing = true;\n this.#flushQueue();\n }\n /** True if the stream is closed or closing. */\n get closed() {\n return this.#closed !== undefined || this.#closing;\n }\n}\n",
|
|
97
|
-
"import { Base64 } from \"js-base64\";\nimport { impossible } from \"../util.js\";\nexport function Stmt(w, msg) {\n if (msg.sql !== undefined) {\n w.string(\"sql\", msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.number(\"sql_id\", msg.sqlId);\n }\n w.arrayObjects(\"args\", msg.args, Value);\n w.arrayObjects(\"named_args\", msg.namedArgs, NamedArg);\n w.boolean(\"want_rows\", msg.wantRows);\n}\nfunction NamedArg(w, msg) {\n w.string(\"name\", msg.name);\n w.object(\"value\", msg.value, Value);\n}\nexport function Batch(w, msg) {\n w.arrayObjects(\"steps\", msg.steps, BatchStep);\n}\nfunction BatchStep(w, msg) {\n if (msg.condition !== undefined) {\n w.object(\"condition\", msg.condition, BatchCond);\n }\n w.object(\"stmt\", msg.stmt, Stmt);\n}\nfunction BatchCond(w, msg) {\n w.stringRaw(\"type\", msg.type);\n if (msg.type === \"ok\" || msg.type === \"error\") {\n w.number(\"step\", msg.step);\n }\n else if (msg.type === \"not\") {\n w.object(\"cond\", msg.cond, BatchCond);\n }\n else if (msg.type === \"and\" || msg.type === \"or\") {\n w.arrayObjects(\"conds\", msg.conds, BatchCond);\n }\n else if (msg.type === \"is_autocommit\") {\n // do nothing\n }\n else {\n throw impossible(msg, \"Impossible type of BatchCond\");\n }\n}\nfunction Value(w, msg) {\n if (msg === null) {\n w.stringRaw(\"type\", \"null\");\n }\n else if (typeof msg === \"bigint\") {\n w.stringRaw(\"type\", \"integer\");\n w.stringRaw(\"value\", \"\" + msg);\n }\n else if (typeof msg === \"number\") {\n w.stringRaw(\"type\", \"float\");\n w.number(\"value\", msg);\n }\n else if (typeof msg === \"string\") {\n w.stringRaw(\"type\", \"text\");\n w.string(\"value\", msg);\n }\n else if (msg instanceof Uint8Array) {\n w.stringRaw(\"type\", \"blob\");\n w.stringRaw(\"base64\", Base64.fromUint8Array(msg));\n }\n else if (msg === undefined) {\n // do nothing\n }\n else {\n throw impossible(msg, \"Impossible type of Value\");\n }\n}\n",
|
|
98
|
-
"import { Stmt, Batch } from \"../shared/json_encode.js\";\nimport { impossible } from \"../util.js\";\nexport function ClientMsg(w, msg) {\n w.stringRaw(\"type\", msg.type);\n if (msg.type === \"hello\") {\n if (msg.jwt !== undefined) {\n w.string(\"jwt\", msg.jwt);\n }\n }\n else if (msg.type === \"request\") {\n w.number(\"request_id\", msg.requestId);\n w.object(\"request\", msg.request, Request);\n }\n else {\n throw impossible(msg, \"Impossible type of ClientMsg\");\n }\n}\nfunction Request(w, msg) {\n w.stringRaw(\"type\", msg.type);\n if (msg.type === \"open_stream\") {\n w.number(\"stream_id\", msg.streamId);\n }\n else if (msg.type === \"close_stream\") {\n w.number(\"stream_id\", msg.streamId);\n }\n else if (msg.type === \"execute\") {\n w.number(\"stream_id\", msg.streamId);\n w.object(\"stmt\", msg.stmt, Stmt);\n }\n else if (msg.type === \"batch\") {\n w.number(\"stream_id\", msg.streamId);\n w.object(\"batch\", msg.batch, Batch);\n }\n else if (msg.type === \"open_cursor\") {\n w.number(\"stream_id\", msg.streamId);\n w.number(\"cursor_id\", msg.cursorId);\n w.object(\"batch\", msg.batch, Batch);\n }\n else if (msg.type === \"close_cursor\") {\n w.number(\"cursor_id\", msg.cursorId);\n }\n else if (msg.type === \"fetch_cursor\") {\n w.number(\"cursor_id\", msg.cursorId);\n w.number(\"max_count\", msg.maxCount);\n }\n else if (msg.type === \"sequence\") {\n w.number(\"stream_id\", msg.streamId);\n if (msg.sql !== undefined) {\n w.string(\"sql\", msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.number(\"sql_id\", msg.sqlId);\n }\n }\n else if (msg.type === \"describe\") {\n w.number(\"stream_id\", msg.streamId);\n if (msg.sql !== undefined) {\n w.string(\"sql\", msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.number(\"sql_id\", msg.sqlId);\n }\n }\n else if (msg.type === \"store_sql\") {\n w.number(\"sql_id\", msg.sqlId);\n w.string(\"sql\", msg.sql);\n }\n else if (msg.type === \"close_sql\") {\n w.number(\"sql_id\", msg.sqlId);\n }\n else if (msg.type === \"get_autocommit\") {\n w.number(\"stream_id\", msg.streamId);\n }\n else {\n throw impossible(msg, \"Impossible type of Request\");\n }\n}\n",
|
|
99
|
-
"import { impossible } from \"../util.js\";\nexport function Stmt(w, msg) {\n if (msg.sql !== undefined) {\n w.string(1, msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.int32(2, msg.sqlId);\n }\n for (const arg of msg.args) {\n w.message(3, arg, Value);\n }\n for (const arg of msg.namedArgs) {\n w.message(4, arg, NamedArg);\n }\n w.bool(5, msg.wantRows);\n}\nfunction NamedArg(w, msg) {\n w.string(1, msg.name);\n w.message(2, msg.value, Value);\n}\nexport function Batch(w, msg) {\n for (const step of msg.steps) {\n w.message(1, step, BatchStep);\n }\n}\nfunction BatchStep(w, msg) {\n if (msg.condition !== undefined) {\n w.message(1, msg.condition, BatchCond);\n }\n w.message(2, msg.stmt, Stmt);\n}\nfunction BatchCond(w, msg) {\n if (msg.type === \"ok\") {\n w.uint32(1, msg.step);\n }\n else if (msg.type === \"error\") {\n w.uint32(2, msg.step);\n }\n else if (msg.type === \"not\") {\n w.message(3, msg.cond, BatchCond);\n }\n else if (msg.type === \"and\") {\n w.message(4, msg.conds, BatchCondList);\n }\n else if (msg.type === \"or\") {\n w.message(5, msg.conds, BatchCondList);\n }\n else if (msg.type === \"is_autocommit\") {\n w.message(6, undefined, Empty);\n }\n else {\n throw impossible(msg, \"Impossible type of BatchCond\");\n }\n}\nfunction BatchCondList(w, msg) {\n for (const cond of msg) {\n w.message(1, cond, BatchCond);\n }\n}\nfunction Value(w, msg) {\n if (msg === null) {\n w.message(1, undefined, Empty);\n }\n else if (typeof msg === \"bigint\") {\n w.sint64(2, msg);\n }\n else if (typeof msg === \"number\") {\n w.double(3, msg);\n }\n else if (typeof msg === \"string\") {\n w.string(4, msg);\n }\n else if (msg instanceof Uint8Array) {\n w.bytes(5, msg);\n }\n else if (msg === undefined) {\n // do nothing\n }\n else {\n throw impossible(msg, \"Impossible type of Value\");\n }\n}\nfunction Empty(_w, _msg) {\n // do nothing\n}\n",
|
|
100
|
-
"import { Stmt, Batch } from \"../shared/protobuf_encode.js\";\nimport { impossible } from \"../util.js\";\nexport function ClientMsg(w, msg) {\n if (msg.type === \"hello\") {\n w.message(1, msg, HelloMsg);\n }\n else if (msg.type === \"request\") {\n w.message(2, msg, RequestMsg);\n }\n else {\n throw impossible(msg, \"Impossible type of ClientMsg\");\n }\n}\nfunction HelloMsg(w, msg) {\n if (msg.jwt !== undefined) {\n w.string(1, msg.jwt);\n }\n}\nfunction RequestMsg(w, msg) {\n w.int32(1, msg.requestId);\n const request = msg.request;\n if (request.type === \"open_stream\") {\n w.message(2, request, OpenStreamReq);\n }\n else if (request.type === \"close_stream\") {\n w.message(3, request, CloseStreamReq);\n }\n else if (request.type === \"execute\") {\n w.message(4, request, ExecuteReq);\n }\n else if (request.type === \"batch\") {\n w.message(5, request, BatchReq);\n }\n else if (request.type === \"open_cursor\") {\n w.message(6, request, OpenCursorReq);\n }\n else if (request.type === \"close_cursor\") {\n w.message(7, request, CloseCursorReq);\n }\n else if (request.type === \"fetch_cursor\") {\n w.message(8, request, FetchCursorReq);\n }\n else if (request.type === \"sequence\") {\n w.message(9, request, SequenceReq);\n }\n else if (request.type === \"describe\") {\n w.message(10, request, DescribeReq);\n }\n else if (request.type === \"store_sql\") {\n w.message(11, request, StoreSqlReq);\n }\n else if (request.type === \"close_sql\") {\n w.message(12, request, CloseSqlReq);\n }\n else if (request.type === \"get_autocommit\") {\n w.message(13, request, GetAutocommitReq);\n }\n else {\n throw impossible(request, \"Impossible type of Request\");\n }\n}\nfunction OpenStreamReq(w, msg) {\n w.int32(1, msg.streamId);\n}\nfunction CloseStreamReq(w, msg) {\n w.int32(1, msg.streamId);\n}\nfunction ExecuteReq(w, msg) {\n w.int32(1, msg.streamId);\n w.message(2, msg.stmt, Stmt);\n}\nfunction BatchReq(w, msg) {\n w.int32(1, msg.streamId);\n w.message(2, msg.batch, Batch);\n}\nfunction OpenCursorReq(w, msg) {\n w.int32(1, msg.streamId);\n w.int32(2, msg.cursorId);\n w.message(3, msg.batch, Batch);\n}\nfunction CloseCursorReq(w, msg) {\n w.int32(1, msg.cursorId);\n}\nfunction FetchCursorReq(w, msg) {\n w.int32(1, msg.cursorId);\n w.uint32(2, msg.maxCount);\n}\nfunction SequenceReq(w, msg) {\n w.int32(1, msg.streamId);\n if (msg.sql !== undefined) {\n w.string(2, msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.int32(3, msg.sqlId);\n }\n}\nfunction DescribeReq(w, msg) {\n w.int32(1, msg.streamId);\n if (msg.sql !== undefined) {\n w.string(2, msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.int32(3, msg.sqlId);\n }\n}\nfunction StoreSqlReq(w, msg) {\n w.int32(1, msg.sqlId);\n w.string(2, msg.sql);\n}\nfunction CloseSqlReq(w, msg) {\n w.int32(1, msg.sqlId);\n}\nfunction GetAutocommitReq(w, msg) {\n w.int32(1, msg.streamId);\n}\n",
|
|
101
|
-
"import { Base64 } from \"js-base64\";\nimport { ProtoError } from \"../errors.js\";\nimport * as d from \"../encoding/json/decode.js\";\nexport function Error(obj) {\n const message = d.string(obj[\"message\"]);\n const code = d.stringOpt(obj[\"code\"]);\n return { message, code };\n}\nexport function StmtResult(obj) {\n const cols = d.arrayObjectsMap(obj[\"cols\"], Col);\n const rows = d.array(obj[\"rows\"]).map((rowObj) => d.arrayObjectsMap(rowObj, Value));\n const affectedRowCount = d.number(obj[\"affected_row_count\"]);\n const lastInsertRowidStr = d.stringOpt(obj[\"last_insert_rowid\"]);\n const lastInsertRowid = lastInsertRowidStr !== undefined\n ? BigInt(lastInsertRowidStr) : undefined;\n return { cols, rows, affectedRowCount, lastInsertRowid };\n}\nfunction Col(obj) {\n const name = d.stringOpt(obj[\"name\"]);\n const decltype = d.stringOpt(obj[\"decltype\"]);\n return { name, decltype };\n}\nexport function BatchResult(obj) {\n const stepResults = new Map();\n d.array(obj[\"step_results\"]).forEach((value, i) => {\n if (value !== null) {\n stepResults.set(i, StmtResult(d.object(value)));\n }\n });\n const stepErrors = new Map();\n d.array(obj[\"step_errors\"]).forEach((value, i) => {\n if (value !== null) {\n stepErrors.set(i, Error(d.object(value)));\n }\n });\n return { stepResults, stepErrors };\n}\nexport function CursorEntry(obj) {\n const type = d.string(obj[\"type\"]);\n if (type === \"step_begin\") {\n const step = d.number(obj[\"step\"]);\n const cols = d.arrayObjectsMap(obj[\"cols\"], Col);\n return { type: \"step_begin\", step, cols };\n }\n else if (type === \"step_end\") {\n const affectedRowCount = d.number(obj[\"affected_row_count\"]);\n const lastInsertRowidStr = d.stringOpt(obj[\"last_insert_rowid\"]);\n const lastInsertRowid = lastInsertRowidStr !== undefined\n ? BigInt(lastInsertRowidStr) : undefined;\n return { type: \"step_end\", affectedRowCount, lastInsertRowid };\n }\n else if (type === \"step_error\") {\n const step = d.number(obj[\"step\"]);\n const error = Error(d.object(obj[\"error\"]));\n return { type: \"step_error\", step, error };\n }\n else if (type === \"row\") {\n const row = d.arrayObjectsMap(obj[\"row\"], Value);\n return { type: \"row\", row };\n }\n else if (type === \"error\") {\n const error = Error(d.object(obj[\"error\"]));\n return { type: \"error\", error };\n }\n else {\n throw new ProtoError(\"Unexpected type of CursorEntry\");\n }\n}\nexport function DescribeResult(obj) {\n const params = d.arrayObjectsMap(obj[\"params\"], DescribeParam);\n const cols = d.arrayObjectsMap(obj[\"cols\"], DescribeCol);\n const isExplain = d.boolean(obj[\"is_explain\"]);\n const isReadonly = d.boolean(obj[\"is_readonly\"]);\n return { params, cols, isExplain, isReadonly };\n}\nfunction DescribeParam(obj) {\n const name = d.stringOpt(obj[\"name\"]);\n return { name };\n}\nfunction DescribeCol(obj) {\n const name = d.string(obj[\"name\"]);\n const decltype = d.stringOpt(obj[\"decltype\"]);\n return { name, decltype };\n}\nexport function Value(obj) {\n const type = d.string(obj[\"type\"]);\n if (type === \"null\") {\n return null;\n }\n else if (type === \"integer\") {\n const value = d.string(obj[\"value\"]);\n return BigInt(value);\n }\n else if (type === \"float\") {\n return d.number(obj[\"value\"]);\n }\n else if (type === \"text\") {\n return d.string(obj[\"value\"]);\n }\n else if (type === \"blob\") {\n return Base64.toUint8Array(d.string(obj[\"base64\"]));\n }\n else {\n throw new ProtoError(\"Unexpected type of Value\");\n }\n}\n",
|
|
102
|
-
"import { ProtoError } from \"../errors.js\";\nimport * as d from \"../encoding/json/decode.js\";\nimport { Error, StmtResult, BatchResult, CursorEntry, DescribeResult } from \"../shared/json_decode.js\";\nexport function ServerMsg(obj) {\n const type = d.string(obj[\"type\"]);\n if (type === \"hello_ok\") {\n return { type: \"hello_ok\" };\n }\n else if (type === \"hello_error\") {\n const error = Error(d.object(obj[\"error\"]));\n return { type: \"hello_error\", error };\n }\n else if (type === \"response_ok\") {\n const requestId = d.number(obj[\"request_id\"]);\n const response = Response(d.object(obj[\"response\"]));\n return { type: \"response_ok\", requestId, response };\n }\n else if (type === \"response_error\") {\n const requestId = d.number(obj[\"request_id\"]);\n const error = Error(d.object(obj[\"error\"]));\n return { type: \"response_error\", requestId, error };\n }\n else {\n throw new ProtoError(\"Unexpected type of ServerMsg\");\n }\n}\nfunction Response(obj) {\n const type = d.string(obj[\"type\"]);\n if (type === \"open_stream\") {\n return { type: \"open_stream\" };\n }\n else if (type === \"close_stream\") {\n return { type: \"close_stream\" };\n }\n else if (type === \"execute\") {\n const result = StmtResult(d.object(obj[\"result\"]));\n return { type: \"execute\", result };\n }\n else if (type === \"batch\") {\n const result = BatchResult(d.object(obj[\"result\"]));\n return { type: \"batch\", result };\n }\n else if (type === \"open_cursor\") {\n return { type: \"open_cursor\" };\n }\n else if (type === \"close_cursor\") {\n return { type: \"close_cursor\" };\n }\n else if (type === \"fetch_cursor\") {\n const entries = d.arrayObjectsMap(obj[\"entries\"], CursorEntry);\n const done = d.boolean(obj[\"done\"]);\n return { type: \"fetch_cursor\", entries, done };\n }\n else if (type === \"sequence\") {\n return { type: \"sequence\" };\n }\n else if (type === \"describe\") {\n const result = DescribeResult(d.object(obj[\"result\"]));\n return { type: \"describe\", result };\n }\n else if (type === \"store_sql\") {\n return { type: \"store_sql\" };\n }\n else if (type === \"close_sql\") {\n return { type: \"close_sql\" };\n }\n else if (type === \"get_autocommit\") {\n const isAutocommit = d.boolean(obj[\"is_autocommit\"]);\n return { type: \"get_autocommit\", isAutocommit };\n }\n else {\n throw new ProtoError(\"Unexpected type of Response\");\n }\n}\n",
|
|
103
|
-
"export const Error = {\n default() { return { message: \"\", code: undefined }; },\n 1(r, msg) { msg.message = r.string(); },\n 2(r, msg) { msg.code = r.string(); },\n};\nexport const StmtResult = {\n default() {\n return {\n cols: [],\n rows: [],\n affectedRowCount: 0,\n lastInsertRowid: undefined,\n };\n },\n 1(r, msg) { msg.cols.push(r.message(Col)); },\n 2(r, msg) { msg.rows.push(r.message(Row)); },\n 3(r, msg) { msg.affectedRowCount = Number(r.uint64()); },\n 4(r, msg) { msg.lastInsertRowid = r.sint64(); },\n};\nconst Col = {\n default() { return { name: undefined, decltype: undefined }; },\n 1(r, msg) { msg.name = r.string(); },\n 2(r, msg) { msg.decltype = r.string(); },\n};\nconst Row = {\n default() { return []; },\n 1(r, msg) { msg.push(r.message(Value)); },\n};\nexport const BatchResult = {\n default() { return { stepResults: new Map(), stepErrors: new Map() }; },\n 1(r, msg) {\n const [key, value] = r.message(BatchResultStepResult);\n msg.stepResults.set(key, value);\n },\n 2(r, msg) {\n const [key, value] = r.message(BatchResultStepError);\n msg.stepErrors.set(key, value);\n },\n};\nconst BatchResultStepResult = {\n default() { return [0, StmtResult.default()]; },\n 1(r, msg) { msg[0] = r.uint32(); },\n 2(r, msg) { msg[1] = r.message(StmtResult); },\n};\nconst BatchResultStepError = {\n default() { return [0, Error.default()]; },\n 1(r, msg) { msg[0] = r.uint32(); },\n 2(r, msg) { msg[1] = r.message(Error); },\n};\nexport const CursorEntry = {\n default() { return { type: \"none\" }; },\n 1(r) { return r.message(StepBeginEntry); },\n 2(r) { return r.message(StepEndEntry); },\n 3(r) { return r.message(StepErrorEntry); },\n 4(r) { return { type: \"row\", row: r.message(Row) }; },\n 5(r) { return { type: \"error\", error: r.message(Error) }; },\n};\nconst StepBeginEntry = {\n default() { return { type: \"step_begin\", step: 0, cols: [] }; },\n 1(r, msg) { msg.step = r.uint32(); },\n 2(r, msg) { msg.cols.push(r.message(Col)); },\n};\nconst StepEndEntry = {\n default() {\n return {\n type: \"step_end\",\n affectedRowCount: 0,\n lastInsertRowid: undefined,\n };\n },\n 1(r, msg) { msg.affectedRowCount = r.uint32(); },\n 2(r, msg) { msg.lastInsertRowid = r.uint64(); },\n};\nconst StepErrorEntry = {\n default() {\n return {\n type: \"step_error\",\n step: 0,\n error: Error.default(),\n };\n },\n 1(r, msg) { msg.step = r.uint32(); },\n 2(r, msg) { msg.error = r.message(Error); },\n};\nexport const DescribeResult = {\n default() {\n return {\n params: [],\n cols: [],\n isExplain: false,\n isReadonly: false,\n };\n },\n 1(r, msg) { msg.params.push(r.message(DescribeParam)); },\n 2(r, msg) { msg.cols.push(r.message(DescribeCol)); },\n 3(r, msg) { msg.isExplain = r.bool(); },\n 4(r, msg) { msg.isReadonly = r.bool(); },\n};\nconst DescribeParam = {\n default() { return { name: undefined }; },\n 1(r, msg) { msg.name = r.string(); },\n};\nconst DescribeCol = {\n default() { return { name: \"\", decltype: undefined }; },\n 1(r, msg) { msg.name = r.string(); },\n 2(r, msg) { msg.decltype = r.string(); },\n};\nconst Value = {\n default() { return undefined; },\n 1(r) { return null; },\n 2(r) { return r.sint64(); },\n 3(r) { return r.double(); },\n 4(r) { return r.string(); },\n 5(r) { return r.bytes(); },\n};\n",
|
|
104
|
-
"import { Error, StmtResult, BatchResult, CursorEntry, DescribeResult } from \"../shared/protobuf_decode.js\";\nexport const ServerMsg = {\n default() { return { type: \"none\" }; },\n 1(r) { return { type: \"hello_ok\" }; },\n 2(r) { return r.message(HelloErrorMsg); },\n 3(r) { return r.message(ResponseOkMsg); },\n 4(r) { return r.message(ResponseErrorMsg); },\n};\nconst HelloErrorMsg = {\n default() { return { type: \"hello_error\", error: Error.default() }; },\n 1(r, msg) { msg.error = r.message(Error); },\n};\nconst ResponseErrorMsg = {\n default() { return { type: \"response_error\", requestId: 0, error: Error.default() }; },\n 1(r, msg) { msg.requestId = r.int32(); },\n 2(r, msg) { msg.error = r.message(Error); },\n};\nconst ResponseOkMsg = {\n default() {\n return {\n type: \"response_ok\",\n requestId: 0,\n response: { type: \"none\" },\n };\n },\n 1(r, msg) { msg.requestId = r.int32(); },\n 2(r, msg) { msg.response = { type: \"open_stream\" }; },\n 3(r, msg) { msg.response = { type: \"close_stream\" }; },\n 4(r, msg) { msg.response = r.message(ExecuteResp); },\n 5(r, msg) { msg.response = r.message(BatchResp); },\n 6(r, msg) { msg.response = { type: \"open_cursor\" }; },\n 7(r, msg) { msg.response = { type: \"close_cursor\" }; },\n 8(r, msg) { msg.response = r.message(FetchCursorResp); },\n 9(r, msg) { msg.response = { type: \"sequence\" }; },\n 10(r, msg) { msg.response = r.message(DescribeResp); },\n 11(r, msg) { msg.response = { type: \"store_sql\" }; },\n 12(r, msg) { msg.response = { type: \"close_sql\" }; },\n 13(r, msg) { msg.response = r.message(GetAutocommitResp); },\n};\nconst ExecuteResp = {\n default() { return { type: \"execute\", result: StmtResult.default() }; },\n 1(r, msg) { msg.result = r.message(StmtResult); },\n};\nconst BatchResp = {\n default() { return { type: \"batch\", result: BatchResult.default() }; },\n 1(r, msg) { msg.result = r.message(BatchResult); },\n};\nconst FetchCursorResp = {\n default() { return { type: \"fetch_cursor\", entries: [], done: false }; },\n 1(r, msg) { msg.entries.push(r.message(CursorEntry)); },\n 2(r, msg) { msg.done = r.bool(); },\n};\nconst DescribeResp = {\n default() { return { type: \"describe\", result: DescribeResult.default() }; },\n 1(r, msg) { msg.result = r.message(DescribeResult); },\n};\nconst GetAutocommitResp = {\n default() { return { type: \"get_autocommit\", isAutocommit: false }; },\n 1(r, msg) { msg.isAutocommit = r.bool(); },\n};\n",
|
|
105
|
-
"import { Client } from \"../client.js\";\nimport { readJsonObject, writeJsonObject, readProtobufMessage, writeProtobufMessage, } from \"../encoding/index.js\";\nimport { ClientError, ProtoError, ClosedError, WebSocketError, ProtocolVersionError, InternalError, } from \"../errors.js\";\nimport { IdAlloc } from \"../id_alloc.js\";\nimport { errorFromProto } from \"../result.js\";\nimport { Sql } from \"../sql.js\";\nimport { impossible } from \"../util.js\";\nimport { WsStream } from \"./stream.js\";\nimport { ClientMsg as json_ClientMsg } from \"./json_encode.js\";\nimport { ClientMsg as protobuf_ClientMsg } from \"./protobuf_encode.js\";\nimport { ServerMsg as json_ServerMsg } from \"./json_decode.js\";\nimport { ServerMsg as protobuf_ServerMsg } from \"./protobuf_decode.js\";\nexport const subprotocolsV2 = new Map([\n [\"hrana2\", { version: 2, encoding: \"json\" }],\n [\"hrana1\", { version: 1, encoding: \"json\" }],\n]);\nexport const subprotocolsV3 = new Map([\n [\"hrana3-protobuf\", { version: 3, encoding: \"protobuf\" }],\n [\"hrana3\", { version: 3, encoding: \"json\" }],\n [\"hrana2\", { version: 2, encoding: \"json\" }],\n [\"hrana1\", { version: 1, encoding: \"json\" }],\n]);\n/** A client for the Hrana protocol over a WebSocket. */\nexport class WsClient extends Client {\n #socket;\n // List of callbacks that we queue until the socket transitions from the CONNECTING to the OPEN state.\n #openCallbacks;\n // Have we already transitioned from CONNECTING to OPEN and fired the callbacks in #openCallbacks?\n #opened;\n // Stores the error that caused us to close the client (and the socket). If we are not closed, this is\n // `undefined`.\n #closed;\n // Have we received a response to our \"hello\" from the server?\n #recvdHello;\n // Subprotocol negotiated with the server. It is only available after the socket transitions to the OPEN\n // state.\n #subprotocol;\n // Has the `getVersion()` function been called? This is only used to validate that the API is used\n // correctly.\n #getVersionCalled;\n // A map from request id to the responses that we expect to receive from the server.\n #responseMap;\n // An allocator of request ids.\n #requestIdAlloc;\n // An allocator of stream ids.\n /** @private */\n _streamIdAlloc;\n // An allocator of cursor ids.\n /** @private */\n _cursorIdAlloc;\n // An allocator of SQL text ids.\n #sqlIdAlloc;\n /** @private */\n constructor(socket, jwt) {\n super();\n this.#socket = socket;\n this.#openCallbacks = [];\n this.#opened = false;\n this.#closed = undefined;\n this.#recvdHello = false;\n this.#subprotocol = undefined;\n this.#getVersionCalled = false;\n this.#responseMap = new Map();\n this.#requestIdAlloc = new IdAlloc();\n this._streamIdAlloc = new IdAlloc();\n this._cursorIdAlloc = new IdAlloc();\n this.#sqlIdAlloc = new IdAlloc();\n this.#socket.binaryType = \"arraybuffer\";\n this.#socket.addEventListener(\"open\", () => this.#onSocketOpen());\n this.#socket.addEventListener(\"close\", (event) => this.#onSocketClose(event));\n this.#socket.addEventListener(\"error\", (event) => this.#onSocketError(event));\n this.#socket.addEventListener(\"message\", (event) => this.#onSocketMessage(event));\n this.#send({ type: \"hello\", jwt });\n }\n // Send (or enqueue to send) a message to the server.\n #send(msg) {\n if (this.#closed !== undefined) {\n throw new InternalError(\"Trying to send a message on a closed client\");\n }\n if (this.#opened) {\n this.#sendToSocket(msg);\n }\n else {\n const openCallback = () => this.#sendToSocket(msg);\n const errorCallback = () => undefined;\n this.#openCallbacks.push({ openCallback, errorCallback });\n }\n }\n // The socket transitioned from CONNECTING to OPEN\n #onSocketOpen() {\n const protocol = this.#socket.protocol;\n if (protocol === undefined) {\n this.#setClosed(new ClientError(\"The `WebSocket.protocol` property is undefined. This most likely means that the WebSocket \" +\n \"implementation provided by the environment is broken. If you are using Miniflare 2, \" +\n \"please update to Miniflare 3, which fixes this problem.\"));\n return;\n }\n else if (protocol === \"\") {\n this.#subprotocol = { version: 1, encoding: \"json\" };\n }\n else {\n this.#subprotocol = subprotocolsV3.get(protocol);\n if (this.#subprotocol === undefined) {\n this.#setClosed(new ProtoError(`Unrecognized WebSocket subprotocol: ${JSON.stringify(protocol)}`));\n return;\n }\n }\n for (const callbacks of this.#openCallbacks) {\n callbacks.openCallback();\n }\n this.#openCallbacks.length = 0;\n this.#opened = true;\n }\n #sendToSocket(msg) {\n const encoding = this.#subprotocol.encoding;\n if (encoding === \"json\") {\n const jsonMsg = writeJsonObject(msg, json_ClientMsg);\n this.#socket.send(jsonMsg);\n }\n else if (encoding === \"protobuf\") {\n const protobufMsg = writeProtobufMessage(msg, protobuf_ClientMsg);\n this.#socket.send(protobufMsg);\n }\n else {\n throw impossible(encoding, \"Impossible encoding\");\n }\n }\n /** Get the protocol version negotiated with the server, possibly waiting until the socket is open. */\n getVersion() {\n return new Promise((versionCallback, errorCallback) => {\n this.#getVersionCalled = true;\n if (this.#closed !== undefined) {\n errorCallback(this.#closed);\n }\n else if (!this.#opened) {\n const openCallback = () => versionCallback(this.#subprotocol.version);\n this.#openCallbacks.push({ openCallback, errorCallback });\n }\n else {\n versionCallback(this.#subprotocol.version);\n }\n });\n }\n // Make sure that the negotiated version is at least `minVersion`.\n /** @private */\n _ensureVersion(minVersion, feature) {\n if (this.#subprotocol === undefined || !this.#getVersionCalled) {\n throw new ProtocolVersionError(`${feature} is supported only on protocol version ${minVersion} and higher, ` +\n \"but the version supported by the WebSocket server is not yet known. \" +\n \"Use Client.getVersion() to wait until the version is available.\");\n }\n else if (this.#subprotocol.version < minVersion) {\n throw new ProtocolVersionError(`${feature} is supported on protocol version ${minVersion} and higher, ` +\n `but the WebSocket server only supports version ${this.#subprotocol.version}`);\n }\n }\n // Send a request to the server and invoke a callback when we get the response.\n /** @private */\n _sendRequest(request, callbacks) {\n if (this.#closed !== undefined) {\n callbacks.errorCallback(new ClosedError(\"Client is closed\", this.#closed));\n return;\n }\n const requestId = this.#requestIdAlloc.alloc();\n this.#responseMap.set(requestId, { ...callbacks, type: request.type });\n this.#send({ type: \"request\", requestId, request });\n }\n // The socket encountered an error.\n #onSocketError(event) {\n const eventMessage = event.message;\n const message = eventMessage ?? \"WebSocket was closed due to an error\";\n this.#setClosed(new WebSocketError(message));\n }\n // The socket was closed.\n #onSocketClose(event) {\n let message = `WebSocket was closed with code ${event.code}`;\n if (event.reason) {\n message += `: ${event.reason}`;\n }\n this.#setClosed(new WebSocketError(message));\n }\n // Close the client with the given error.\n #setClosed(error) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#closed = error;\n for (const callbacks of this.#openCallbacks) {\n callbacks.errorCallback(error);\n }\n this.#openCallbacks.length = 0;\n for (const [requestId, responseState] of this.#responseMap.entries()) {\n responseState.errorCallback(error);\n this.#requestIdAlloc.free(requestId);\n }\n this.#responseMap.clear();\n this.#socket.close();\n }\n // We received a message from the socket.\n #onSocketMessage(event) {\n if (this.#closed !== undefined) {\n return;\n }\n try {\n let msg;\n const encoding = this.#subprotocol.encoding;\n if (encoding === \"json\") {\n if (typeof event.data !== \"string\") {\n this.#socket.close(3003, \"Only text messages are accepted with JSON encoding\");\n this.#setClosed(new ProtoError(\"Received non-text message from server with JSON encoding\"));\n return;\n }\n msg = readJsonObject(JSON.parse(event.data), json_ServerMsg);\n }\n else if (encoding === \"protobuf\") {\n if (!(event.data instanceof ArrayBuffer)) {\n this.#socket.close(3003, \"Only binary messages are accepted with Protobuf encoding\");\n this.#setClosed(new ProtoError(\"Received non-binary message from server with Protobuf encoding\"));\n return;\n }\n msg = readProtobufMessage(new Uint8Array(event.data), protobuf_ServerMsg);\n }\n else {\n throw impossible(encoding, \"Impossible encoding\");\n }\n this.#handleMsg(msg);\n }\n catch (e) {\n this.#socket.close(3007, \"Could not handle message\");\n this.#setClosed(e);\n }\n }\n // Handle a message from the server.\n #handleMsg(msg) {\n if (msg.type === \"none\") {\n throw new ProtoError(\"Received an unrecognized ServerMsg\");\n }\n else if (msg.type === \"hello_ok\" || msg.type === \"hello_error\") {\n if (this.#recvdHello) {\n throw new ProtoError(\"Received a duplicated hello response\");\n }\n this.#recvdHello = true;\n if (msg.type === \"hello_error\") {\n throw errorFromProto(msg.error);\n }\n return;\n }\n else if (!this.#recvdHello) {\n throw new ProtoError(\"Received a non-hello message before a hello response\");\n }\n if (msg.type === \"response_ok\") {\n const requestId = msg.requestId;\n const responseState = this.#responseMap.get(requestId);\n this.#responseMap.delete(requestId);\n if (responseState === undefined) {\n throw new ProtoError(\"Received unexpected OK response\");\n }\n this.#requestIdAlloc.free(requestId);\n try {\n if (responseState.type !== msg.response.type) {\n console.dir({ responseState, msg });\n throw new ProtoError(\"Received unexpected type of response\");\n }\n responseState.responseCallback(msg.response);\n }\n catch (e) {\n responseState.errorCallback(e);\n throw e;\n }\n }\n else if (msg.type === \"response_error\") {\n const requestId = msg.requestId;\n const responseState = this.#responseMap.get(requestId);\n this.#responseMap.delete(requestId);\n if (responseState === undefined) {\n throw new ProtoError(\"Received unexpected error response\");\n }\n this.#requestIdAlloc.free(requestId);\n responseState.errorCallback(errorFromProto(msg.error));\n }\n else {\n throw impossible(msg, \"Impossible ServerMsg type\");\n }\n }\n /** Open a {@link WsStream}, a stream for executing SQL statements. */\n openStream() {\n return WsStream.open(this);\n }\n /** Cache a SQL text on the server. This requires protocol version 2 or higher. */\n storeSql(sql) {\n this._ensureVersion(2, \"storeSql()\");\n const sqlId = this.#sqlIdAlloc.alloc();\n const sqlObj = new Sql(this, sqlId);\n const responseCallback = () => undefined;\n const errorCallback = (e) => sqlObj._setClosed(e);\n const request = { type: \"store_sql\", sqlId, sql };\n this._sendRequest(request, { responseCallback, errorCallback });\n return sqlObj;\n }\n /** @private */\n _closeSql(sqlId) {\n if (this.#closed !== undefined) {\n return;\n }\n const responseCallback = () => this.#sqlIdAlloc.free(sqlId);\n const errorCallback = (e) => this.#setClosed(e);\n const request = { type: \"close_sql\", sqlId };\n this._sendRequest(request, { responseCallback, errorCallback });\n }\n /** Close the client and the WebSocket. */\n close() {\n this.#setClosed(new ClientError(\"Client was manually closed\"));\n }\n /** True if the client is closed. */\n get closed() {\n return this.#closed !== undefined;\n }\n}\n",
|
|
106
|
-
"const _Request = Request;\nconst _Headers = Headers;\n\nconst _fetch = fetch;\n\nexport { _fetch as fetch, _Request as Request, _Headers as Headers};\n",
|
|
107
|
-
"// queueMicrotask() ponyfill\n// https://github.com/libsql/libsql-client-ts/issues/47\nlet _queueMicrotask;\nif (typeof queueMicrotask !== \"undefined\") {\n _queueMicrotask = queueMicrotask;\n}\nelse {\n const resolved = Promise.resolve();\n _queueMicrotask = (callback) => {\n resolved.then(callback);\n };\n}\nexport { _queueMicrotask as queueMicrotask };\n",
|
|
108
|
-
"export class ByteQueue {\n #array;\n #shiftPos;\n #pushPos;\n constructor(initialCap) {\n this.#array = new Uint8Array(new ArrayBuffer(initialCap));\n this.#shiftPos = 0;\n this.#pushPos = 0;\n }\n get length() {\n return this.#pushPos - this.#shiftPos;\n }\n data() {\n return this.#array.slice(this.#shiftPos, this.#pushPos);\n }\n push(chunk) {\n this.#ensurePush(chunk.byteLength);\n this.#array.set(chunk, this.#pushPos);\n this.#pushPos += chunk.byteLength;\n }\n #ensurePush(pushLength) {\n if (this.#pushPos + pushLength <= this.#array.byteLength) {\n return;\n }\n const filledLength = this.#pushPos - this.#shiftPos;\n if (filledLength + pushLength <= this.#array.byteLength &&\n 2 * this.#pushPos >= this.#array.byteLength) {\n this.#array.copyWithin(0, this.#shiftPos, this.#pushPos);\n }\n else {\n let newCap = this.#array.byteLength;\n do {\n newCap *= 2;\n } while (filledLength + pushLength > newCap);\n const newArray = new Uint8Array(new ArrayBuffer(newCap));\n newArray.set(this.#array.slice(this.#shiftPos, this.#pushPos), 0);\n this.#array = newArray;\n }\n this.#pushPos = filledLength;\n this.#shiftPos = 0;\n }\n shift(length) {\n this.#shiftPos += length;\n }\n}\n",
|
|
109
|
-
"import { ProtoError } from \"../errors.js\";\nimport * as d from \"../encoding/json/decode.js\";\nimport { Error, StmtResult, BatchResult, DescribeResult } from \"../shared/json_decode.js\";\nexport function PipelineRespBody(obj) {\n const baton = d.stringOpt(obj[\"baton\"]);\n const baseUrl = d.stringOpt(obj[\"base_url\"]);\n const results = d.arrayObjectsMap(obj[\"results\"], StreamResult);\n return { baton, baseUrl, results };\n}\nfunction StreamResult(obj) {\n const type = d.string(obj[\"type\"]);\n if (type === \"ok\") {\n const response = StreamResponse(d.object(obj[\"response\"]));\n return { type: \"ok\", response };\n }\n else if (type === \"error\") {\n const error = Error(d.object(obj[\"error\"]));\n return { type: \"error\", error };\n }\n else {\n throw new ProtoError(\"Unexpected type of StreamResult\");\n }\n}\nfunction StreamResponse(obj) {\n const type = d.string(obj[\"type\"]);\n if (type === \"close\") {\n return { type: \"close\" };\n }\n else if (type === \"execute\") {\n const result = StmtResult(d.object(obj[\"result\"]));\n return { type: \"execute\", result };\n }\n else if (type === \"batch\") {\n const result = BatchResult(d.object(obj[\"result\"]));\n return { type: \"batch\", result };\n }\n else if (type === \"sequence\") {\n return { type: \"sequence\" };\n }\n else if (type === \"describe\") {\n const result = DescribeResult(d.object(obj[\"result\"]));\n return { type: \"describe\", result };\n }\n else if (type === \"store_sql\") {\n return { type: \"store_sql\" };\n }\n else if (type === \"close_sql\") {\n return { type: \"close_sql\" };\n }\n else if (type === \"get_autocommit\") {\n const isAutocommit = d.boolean(obj[\"is_autocommit\"]);\n return { type: \"get_autocommit\", isAutocommit };\n }\n else {\n throw new ProtoError(\"Unexpected type of StreamResponse\");\n }\n}\nexport function CursorRespBody(obj) {\n const baton = d.stringOpt(obj[\"baton\"]);\n const baseUrl = d.stringOpt(obj[\"base_url\"]);\n return { baton, baseUrl };\n}\n",
|
|
110
|
-
"import { Error, StmtResult, BatchResult, DescribeResult } from \"../shared/protobuf_decode.js\";\nexport const PipelineRespBody = {\n default() { return { baton: undefined, baseUrl: undefined, results: [] }; },\n 1(r, msg) { msg.baton = r.string(); },\n 2(r, msg) { msg.baseUrl = r.string(); },\n 3(r, msg) { msg.results.push(r.message(StreamResult)); },\n};\nconst StreamResult = {\n default() { return { type: \"none\" }; },\n 1(r) { return { type: \"ok\", response: r.message(StreamResponse) }; },\n 2(r) { return { type: \"error\", error: r.message(Error) }; },\n};\nconst StreamResponse = {\n default() { return { type: \"none\" }; },\n 1(r) { return { type: \"close\" }; },\n 2(r) { return r.message(ExecuteStreamResp); },\n 3(r) { return r.message(BatchStreamResp); },\n 4(r) { return { type: \"sequence\" }; },\n 5(r) { return r.message(DescribeStreamResp); },\n 6(r) { return { type: \"store_sql\" }; },\n 7(r) { return { type: \"close_sql\" }; },\n 8(r) { return r.message(GetAutocommitStreamResp); },\n};\nconst ExecuteStreamResp = {\n default() { return { type: \"execute\", result: StmtResult.default() }; },\n 1(r, msg) { msg.result = r.message(StmtResult); },\n};\nconst BatchStreamResp = {\n default() { return { type: \"batch\", result: BatchResult.default() }; },\n 1(r, msg) { msg.result = r.message(BatchResult); },\n};\nconst DescribeStreamResp = {\n default() { return { type: \"describe\", result: DescribeResult.default() }; },\n 1(r, msg) { msg.result = r.message(DescribeResult); },\n};\nconst GetAutocommitStreamResp = {\n default() { return { type: \"get_autocommit\", isAutocommit: false }; },\n 1(r, msg) { msg.isAutocommit = r.bool(); },\n};\nexport const CursorRespBody = {\n default() { return { baton: undefined, baseUrl: undefined }; },\n 1(r, msg) { msg.baton = r.string(); },\n 2(r, msg) { msg.baseUrl = r.string(); },\n};\n",
|
|
111
|
-
"import { ByteQueue } from \"../byte_queue.js\";\nimport { Cursor } from \"../cursor.js\";\nimport * as jsond from \"../encoding/json/decode.js\";\nimport * as protobufd from \"../encoding/protobuf/decode.js\";\nimport { ClientError, ClosedError, ProtoError, InternalError } from \"../errors.js\";\nimport { impossible } from \"../util.js\";\nimport { CursorRespBody as json_CursorRespBody } from \"./json_decode.js\";\nimport { CursorRespBody as protobuf_CursorRespBody } from \"./protobuf_decode.js\";\nimport { CursorEntry as json_CursorEntry } from \"../shared/json_decode.js\";\nimport { CursorEntry as protobuf_CursorEntry } from \"../shared/protobuf_decode.js\";\nexport class HttpCursor extends Cursor {\n #stream;\n #encoding;\n #reader;\n #queue;\n #closed;\n #done;\n /** @private */\n constructor(stream, encoding) {\n super();\n this.#stream = stream;\n this.#encoding = encoding;\n this.#reader = undefined;\n this.#queue = new ByteQueue(16 * 1024);\n this.#closed = undefined;\n this.#done = false;\n }\n async open(response) {\n if (response.body === null) {\n throw new ProtoError(\"No response body for cursor request\");\n }\n this.#reader = response.body.getReader();\n const respBody = await this.#nextItem(json_CursorRespBody, protobuf_CursorRespBody);\n if (respBody === undefined) {\n throw new ProtoError(\"Empty response to cursor request\");\n }\n return respBody;\n }\n /** Fetch the next entry from the cursor. */\n next() {\n return this.#nextItem(json_CursorEntry, protobuf_CursorEntry);\n }\n /** Close the cursor. */\n close() {\n this._setClosed(new ClientError(\"Cursor was manually closed\"));\n }\n /** @private */\n _setClosed(error) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#closed = error;\n this.#stream._cursorClosed(this);\n if (this.#reader !== undefined) {\n this.#reader.cancel();\n }\n }\n /** True if the cursor is closed. */\n get closed() {\n return this.#closed !== undefined;\n }\n async #nextItem(jsonFun, protobufDef) {\n for (;;) {\n if (this.#done) {\n return undefined;\n }\n else if (this.#closed !== undefined) {\n throw new ClosedError(\"Cursor is closed\", this.#closed);\n }\n if (this.#encoding === \"json\") {\n const jsonData = this.#parseItemJson();\n if (jsonData !== undefined) {\n const jsonText = new TextDecoder().decode(jsonData);\n const jsonValue = JSON.parse(jsonText);\n return jsond.readJsonObject(jsonValue, jsonFun);\n }\n }\n else if (this.#encoding === \"protobuf\") {\n const protobufData = this.#parseItemProtobuf();\n if (protobufData !== undefined) {\n return protobufd.readProtobufMessage(protobufData, protobufDef);\n }\n }\n else {\n throw impossible(this.#encoding, \"Impossible encoding\");\n }\n if (this.#reader === undefined) {\n throw new InternalError(\"Attempted to read from HTTP cursor before it was opened\");\n }\n const { value, done } = await this.#reader.read();\n if (done && this.#queue.length === 0) {\n this.#done = true;\n }\n else if (done) {\n throw new ProtoError(\"Unexpected end of cursor stream\");\n }\n else {\n this.#queue.push(value);\n }\n }\n }\n #parseItemJson() {\n const data = this.#queue.data();\n const newlineByte = 10;\n const newlinePos = data.indexOf(newlineByte);\n if (newlinePos < 0) {\n return undefined;\n }\n const jsonData = data.slice(0, newlinePos);\n this.#queue.shift(newlinePos + 1);\n return jsonData;\n }\n #parseItemProtobuf() {\n const data = this.#queue.data();\n let varintValue = 0;\n let varintLength = 0;\n for (;;) {\n if (varintLength >= data.byteLength) {\n return undefined;\n }\n const byte = data[varintLength];\n varintValue |= (byte & 0x7f) << (7 * varintLength);\n varintLength += 1;\n if (!(byte & 0x80)) {\n break;\n }\n }\n if (data.byteLength < varintLength + varintValue) {\n return undefined;\n }\n const protobufData = data.slice(varintLength, varintLength + varintValue);\n this.#queue.shift(varintLength + varintValue);\n return protobufData;\n }\n}\n",
|
|
112
|
-
"import { Stmt, Batch } from \"../shared/json_encode.js\";\nimport { impossible } from \"../util.js\";\nexport function PipelineReqBody(w, msg) {\n if (msg.baton !== undefined) {\n w.string(\"baton\", msg.baton);\n }\n w.arrayObjects(\"requests\", msg.requests, StreamRequest);\n}\nfunction StreamRequest(w, msg) {\n w.stringRaw(\"type\", msg.type);\n if (msg.type === \"close\") {\n // do nothing\n }\n else if (msg.type === \"execute\") {\n w.object(\"stmt\", msg.stmt, Stmt);\n }\n else if (msg.type === \"batch\") {\n w.object(\"batch\", msg.batch, Batch);\n }\n else if (msg.type === \"sequence\") {\n if (msg.sql !== undefined) {\n w.string(\"sql\", msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.number(\"sql_id\", msg.sqlId);\n }\n }\n else if (msg.type === \"describe\") {\n if (msg.sql !== undefined) {\n w.string(\"sql\", msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.number(\"sql_id\", msg.sqlId);\n }\n }\n else if (msg.type === \"store_sql\") {\n w.number(\"sql_id\", msg.sqlId);\n w.string(\"sql\", msg.sql);\n }\n else if (msg.type === \"close_sql\") {\n w.number(\"sql_id\", msg.sqlId);\n }\n else if (msg.type === \"get_autocommit\") {\n // do nothing\n }\n else {\n throw impossible(msg, \"Impossible type of StreamRequest\");\n }\n}\nexport function CursorReqBody(w, msg) {\n if (msg.baton !== undefined) {\n w.string(\"baton\", msg.baton);\n }\n w.object(\"batch\", msg.batch, Batch);\n}\n",
|
|
113
|
-
"import { Stmt, Batch } from \"../shared/protobuf_encode.js\";\nimport { impossible } from \"../util.js\";\nexport function PipelineReqBody(w, msg) {\n if (msg.baton !== undefined) {\n w.string(1, msg.baton);\n }\n for (const req of msg.requests) {\n w.message(2, req, StreamRequest);\n }\n}\nfunction StreamRequest(w, msg) {\n if (msg.type === \"close\") {\n w.message(1, msg, CloseStreamReq);\n }\n else if (msg.type === \"execute\") {\n w.message(2, msg, ExecuteStreamReq);\n }\n else if (msg.type === \"batch\") {\n w.message(3, msg, BatchStreamReq);\n }\n else if (msg.type === \"sequence\") {\n w.message(4, msg, SequenceStreamReq);\n }\n else if (msg.type === \"describe\") {\n w.message(5, msg, DescribeStreamReq);\n }\n else if (msg.type === \"store_sql\") {\n w.message(6, msg, StoreSqlStreamReq);\n }\n else if (msg.type === \"close_sql\") {\n w.message(7, msg, CloseSqlStreamReq);\n }\n else if (msg.type === \"get_autocommit\") {\n w.message(8, msg, GetAutocommitStreamReq);\n }\n else {\n throw impossible(msg, \"Impossible type of StreamRequest\");\n }\n}\nfunction CloseStreamReq(_w, _msg) {\n}\nfunction ExecuteStreamReq(w, msg) {\n w.message(1, msg.stmt, Stmt);\n}\nfunction BatchStreamReq(w, msg) {\n w.message(1, msg.batch, Batch);\n}\nfunction SequenceStreamReq(w, msg) {\n if (msg.sql !== undefined) {\n w.string(1, msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.int32(2, msg.sqlId);\n }\n}\nfunction DescribeStreamReq(w, msg) {\n if (msg.sql !== undefined) {\n w.string(1, msg.sql);\n }\n if (msg.sqlId !== undefined) {\n w.int32(2, msg.sqlId);\n }\n}\nfunction StoreSqlStreamReq(w, msg) {\n w.int32(1, msg.sqlId);\n w.string(2, msg.sql);\n}\nfunction CloseSqlStreamReq(w, msg) {\n w.int32(1, msg.sqlId);\n}\nfunction GetAutocommitStreamReq(_w, _msg) {\n}\nexport function CursorReqBody(w, msg) {\n if (msg.baton !== undefined) {\n w.string(1, msg.baton);\n }\n w.message(2, msg.batch, Batch);\n}\n",
|
|
114
|
-
"import { Request, Headers } from \"@libsql/isomorphic-fetch\";\nimport { ClientError, HttpServerError, ProtocolVersionError, ProtoError, ClosedError, InternalError, } from \"../errors.js\";\nimport { readJsonObject, writeJsonObject, readProtobufMessage, writeProtobufMessage, } from \"../encoding/index.js\";\nimport { IdAlloc } from \"../id_alloc.js\";\nimport { Queue } from \"../queue.js\";\nimport { queueMicrotask } from \"../queue_microtask.js\";\nimport { errorFromProto } from \"../result.js\";\nimport { Sql } from \"../sql.js\";\nimport { Stream } from \"../stream.js\";\nimport { impossible } from \"../util.js\";\nimport { HttpCursor } from \"./cursor.js\";\nimport { PipelineReqBody as json_PipelineReqBody } from \"./json_encode.js\";\nimport { PipelineReqBody as protobuf_PipelineReqBody } from \"./protobuf_encode.js\";\nimport { CursorReqBody as json_CursorReqBody } from \"./json_encode.js\";\nimport { CursorReqBody as protobuf_CursorReqBody } from \"./protobuf_encode.js\";\nimport { PipelineRespBody as json_PipelineRespBody } from \"./json_decode.js\";\nimport { PipelineRespBody as protobuf_PipelineRespBody } from \"./protobuf_decode.js\";\nexport class HttpStream extends Stream {\n #client;\n #baseUrl;\n #jwt;\n #fetch;\n #baton;\n #queue;\n #flushing;\n #cursor;\n #closing;\n #closeQueued;\n #closed;\n #sqlIdAlloc;\n /** @private */\n constructor(client, baseUrl, jwt, customFetch) {\n super(client.intMode);\n this.#client = client;\n this.#baseUrl = baseUrl.toString();\n this.#jwt = jwt;\n this.#fetch = customFetch;\n this.#baton = undefined;\n this.#queue = new Queue();\n this.#flushing = false;\n this.#closing = false;\n this.#closeQueued = false;\n this.#closed = undefined;\n this.#sqlIdAlloc = new IdAlloc();\n }\n /** Get the {@link HttpClient} object that this stream belongs to. */\n client() {\n return this.#client;\n }\n /** @private */\n _sqlOwner() {\n return this;\n }\n /** Cache a SQL text on the server. */\n storeSql(sql) {\n const sqlId = this.#sqlIdAlloc.alloc();\n this.#sendStreamRequest({ type: \"store_sql\", sqlId, sql }).then(() => undefined, (error) => this._setClosed(error));\n return new Sql(this, sqlId);\n }\n /** @private */\n _closeSql(sqlId) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#sendStreamRequest({ type: \"close_sql\", sqlId }).then(() => this.#sqlIdAlloc.free(sqlId), (error) => this._setClosed(error));\n }\n /** @private */\n _execute(stmt) {\n return this.#sendStreamRequest({ type: \"execute\", stmt }).then((response) => {\n return response.result;\n });\n }\n /** @private */\n _batch(batch) {\n return this.#sendStreamRequest({ type: \"batch\", batch }).then((response) => {\n return response.result;\n });\n }\n /** @private */\n _describe(protoSql) {\n return this.#sendStreamRequest({\n type: \"describe\",\n sql: protoSql.sql,\n sqlId: protoSql.sqlId\n }).then((response) => {\n return response.result;\n });\n }\n /** @private */\n _sequence(protoSql) {\n return this.#sendStreamRequest({\n type: \"sequence\",\n sql: protoSql.sql,\n sqlId: protoSql.sqlId,\n }).then((_response) => {\n return undefined;\n });\n }\n /** Check whether the SQL connection underlying this stream is in autocommit state (i.e., outside of an\n * explicit transaction). This requires protocol version 3 or higher.\n */\n getAutocommit() {\n this.#client._ensureVersion(3, \"getAutocommit()\");\n return this.#sendStreamRequest({\n type: \"get_autocommit\",\n }).then((response) => {\n return response.isAutocommit;\n });\n }\n #sendStreamRequest(request) {\n return new Promise((responseCallback, errorCallback) => {\n this.#pushToQueue({ type: \"pipeline\", request, responseCallback, errorCallback });\n });\n }\n /** @private */\n _openCursor(batch) {\n return new Promise((cursorCallback, errorCallback) => {\n this.#pushToQueue({ type: \"cursor\", batch, cursorCallback, errorCallback });\n });\n }\n /** @private */\n _cursorClosed(cursor) {\n if (cursor !== this.#cursor) {\n throw new InternalError(\"Cursor was closed, but it was not associated with the stream\");\n }\n this.#cursor = undefined;\n queueMicrotask(() => this.#flushQueue());\n }\n /** Immediately close the stream. */\n close() {\n this._setClosed(new ClientError(\"Stream was manually closed\"));\n }\n /** Gracefully close the stream. */\n closeGracefully() {\n this.#closing = true;\n queueMicrotask(() => this.#flushQueue());\n }\n /** True if the stream is closed. */\n get closed() {\n return this.#closed !== undefined || this.#closing;\n }\n /** @private */\n _setClosed(error) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#closed = error;\n if (this.#cursor !== undefined) {\n this.#cursor._setClosed(error);\n }\n this.#client._streamClosed(this);\n for (;;) {\n const entry = this.#queue.shift();\n if (entry !== undefined) {\n entry.errorCallback(error);\n }\n else {\n break;\n }\n }\n if ((this.#baton !== undefined || this.#flushing) && !this.#closeQueued) {\n this.#queue.push({\n type: \"pipeline\",\n request: { type: \"close\" },\n responseCallback: () => undefined,\n errorCallback: () => undefined,\n });\n this.#closeQueued = true;\n queueMicrotask(() => this.#flushQueue());\n }\n }\n #pushToQueue(entry) {\n if (this.#closed !== undefined) {\n throw new ClosedError(\"Stream is closed\", this.#closed);\n }\n else if (this.#closing) {\n throw new ClosedError(\"Stream is closing\", undefined);\n }\n else {\n this.#queue.push(entry);\n queueMicrotask(() => this.#flushQueue());\n }\n }\n #flushQueue() {\n if (this.#flushing || this.#cursor !== undefined) {\n return;\n }\n if (this.#closing && this.#queue.length === 0) {\n this._setClosed(new ClientError(\"Stream was gracefully closed\"));\n return;\n }\n const endpoint = this.#client._endpoint;\n if (endpoint === undefined) {\n this.#client._endpointPromise.then(() => this.#flushQueue(), (error) => this._setClosed(error));\n return;\n }\n const firstEntry = this.#queue.shift();\n if (firstEntry === undefined) {\n return;\n }\n else if (firstEntry.type === \"pipeline\") {\n const pipeline = [firstEntry];\n for (;;) {\n const entry = this.#queue.first();\n if (entry !== undefined && entry.type === \"pipeline\") {\n pipeline.push(entry);\n this.#queue.shift();\n }\n else if (entry === undefined && this.#closing && !this.#closeQueued) {\n pipeline.push({\n type: \"pipeline\",\n request: { type: \"close\" },\n responseCallback: () => undefined,\n errorCallback: () => undefined,\n });\n this.#closeQueued = true;\n break;\n }\n else {\n break;\n }\n }\n this.#flushPipeline(endpoint, pipeline);\n }\n else if (firstEntry.type === \"cursor\") {\n this.#flushCursor(endpoint, firstEntry);\n }\n else {\n throw impossible(firstEntry, \"Impossible type of QueueEntry\");\n }\n }\n #flushPipeline(endpoint, pipeline) {\n this.#flush(() => this.#createPipelineRequest(pipeline, endpoint), (resp) => decodePipelineResponse(resp, endpoint.encoding), (respBody) => respBody.baton, (respBody) => respBody.baseUrl, (respBody) => handlePipelineResponse(pipeline, respBody), (error) => pipeline.forEach((entry) => entry.errorCallback(error)));\n }\n #flushCursor(endpoint, entry) {\n const cursor = new HttpCursor(this, endpoint.encoding);\n this.#cursor = cursor;\n this.#flush(() => this.#createCursorRequest(entry, endpoint), (resp) => cursor.open(resp), (respBody) => respBody.baton, (respBody) => respBody.baseUrl, (_respBody) => entry.cursorCallback(cursor), (error) => entry.errorCallback(error));\n }\n #flush(createRequest, decodeResponse, getBaton, getBaseUrl, handleResponse, handleError) {\n let promise;\n try {\n const request = createRequest();\n const fetch = this.#fetch;\n promise = fetch(request);\n }\n catch (error) {\n promise = Promise.reject(error);\n }\n this.#flushing = true;\n promise.then((resp) => {\n if (!resp.ok) {\n return errorFromResponse(resp).then((error) => {\n throw error;\n });\n }\n return decodeResponse(resp);\n }).then((r) => {\n this.#baton = getBaton(r);\n this.#baseUrl = getBaseUrl(r) ?? this.#baseUrl;\n handleResponse(r);\n }).catch((error) => {\n this._setClosed(error);\n handleError(error);\n }).finally(() => {\n this.#flushing = false;\n this.#flushQueue();\n });\n }\n #createPipelineRequest(pipeline, endpoint) {\n return this.#createRequest(new URL(endpoint.pipelinePath, this.#baseUrl), {\n baton: this.#baton,\n requests: pipeline.map((entry) => entry.request),\n }, endpoint.encoding, json_PipelineReqBody, protobuf_PipelineReqBody);\n }\n #createCursorRequest(entry, endpoint) {\n if (endpoint.cursorPath === undefined) {\n throw new ProtocolVersionError(\"Cursors are supported only on protocol version 3 and higher, \" +\n `but the HTTP server only supports version ${endpoint.version}.`);\n }\n return this.#createRequest(new URL(endpoint.cursorPath, this.#baseUrl), {\n baton: this.#baton,\n batch: entry.batch,\n }, endpoint.encoding, json_CursorReqBody, protobuf_CursorReqBody);\n }\n #createRequest(url, reqBody, encoding, jsonFun, protobufFun) {\n let bodyData;\n let contentType;\n if (encoding === \"json\") {\n bodyData = writeJsonObject(reqBody, jsonFun);\n contentType = \"application/json\";\n }\n else if (encoding === \"protobuf\") {\n bodyData = writeProtobufMessage(reqBody, protobufFun);\n contentType = \"application/x-protobuf\";\n }\n else {\n throw impossible(encoding, \"Impossible encoding\");\n }\n const headers = new Headers();\n headers.set(\"content-type\", contentType);\n if (this.#jwt !== undefined) {\n headers.set(\"authorization\", `Bearer ${this.#jwt}`);\n }\n return new Request(url.toString(), { method: \"POST\", headers, body: bodyData });\n }\n}\nfunction handlePipelineResponse(pipeline, respBody) {\n if (respBody.results.length !== pipeline.length) {\n throw new ProtoError(\"Server returned unexpected number of pipeline results\");\n }\n for (let i = 0; i < pipeline.length; ++i) {\n const result = respBody.results[i];\n const entry = pipeline[i];\n if (result.type === \"ok\") {\n if (result.response.type !== entry.request.type) {\n throw new ProtoError(\"Received unexpected type of response\");\n }\n entry.responseCallback(result.response);\n }\n else if (result.type === \"error\") {\n entry.errorCallback(errorFromProto(result.error));\n }\n else if (result.type === \"none\") {\n throw new ProtoError(\"Received unrecognized type of StreamResult\");\n }\n else {\n throw impossible(result, \"Received impossible type of StreamResult\");\n }\n }\n}\nasync function decodePipelineResponse(resp, encoding) {\n if (encoding === \"json\") {\n const respJson = await resp.json();\n return readJsonObject(respJson, json_PipelineRespBody);\n }\n if (encoding === \"protobuf\") {\n const respData = await resp.arrayBuffer();\n return readProtobufMessage(new Uint8Array(respData), protobuf_PipelineRespBody);\n }\n await resp.body?.cancel();\n throw impossible(encoding, \"Impossible encoding\");\n}\nasync function errorFromResponse(resp) {\n const respType = resp.headers.get(\"content-type\") ?? \"text/plain\";\n let message = `Server returned HTTP status ${resp.status}`;\n if (respType === \"application/json\") {\n const respBody = await resp.json();\n if (\"message\" in respBody) {\n return errorFromProto(respBody);\n }\n return new HttpServerError(message, resp.status);\n }\n if (respType === \"text/plain\") {\n const respBody = (await resp.text()).trim();\n if (respBody !== \"\") {\n message += `: ${respBody}`;\n }\n return new HttpServerError(message, resp.status);\n }\n await resp.body?.cancel();\n return new HttpServerError(message, resp.status);\n}\n",
|
|
115
|
-
"import { fetch, Request } from \"@libsql/isomorphic-fetch\";\nimport { Client } from \"../client.js\";\nimport { ClientError, ClosedError, ProtocolVersionError } from \"../errors.js\";\nimport { HttpStream } from \"./stream.js\";\nexport const checkEndpoints = [\n {\n versionPath: \"v3-protobuf\",\n pipelinePath: \"v3-protobuf/pipeline\",\n cursorPath: \"v3-protobuf/cursor\",\n version: 3,\n encoding: \"protobuf\",\n },\n /*\n {\n versionPath: \"v3\",\n pipelinePath: \"v3/pipeline\",\n cursorPath: \"v3/cursor\",\n version: 3,\n encoding: \"json\",\n },\n */\n];\nconst fallbackEndpoint = {\n versionPath: \"v2\",\n pipelinePath: \"v2/pipeline\",\n cursorPath: undefined,\n version: 2,\n encoding: \"json\",\n};\n/** A client for the Hrana protocol over HTTP. */\nexport class HttpClient extends Client {\n #url;\n #jwt;\n #fetch;\n #closed;\n #streams;\n /** @private */\n _endpointPromise;\n /** @private */\n _endpoint;\n /** @private */\n constructor(url, jwt, customFetch, protocolVersion = 2) {\n super();\n this.#url = url;\n this.#jwt = jwt;\n this.#fetch = customFetch ?? fetch;\n this.#closed = undefined;\n this.#streams = new Set();\n if (protocolVersion == 3) {\n this._endpointPromise = findEndpoint(this.#fetch, this.#url);\n this._endpointPromise.then((endpoint) => this._endpoint = endpoint, (error) => this.#setClosed(error));\n }\n else {\n this._endpointPromise = Promise.resolve(fallbackEndpoint);\n this._endpointPromise.then((endpoint) => this._endpoint = endpoint, (error) => this.#setClosed(error));\n }\n }\n /** Get the protocol version supported by the server. */\n async getVersion() {\n if (this._endpoint !== undefined) {\n return this._endpoint.version;\n }\n return (await this._endpointPromise).version;\n }\n // Make sure that the negotiated version is at least `minVersion`.\n /** @private */\n _ensureVersion(minVersion, feature) {\n if (minVersion <= fallbackEndpoint.version) {\n return;\n }\n else if (this._endpoint === undefined) {\n throw new ProtocolVersionError(`${feature} is supported only on protocol version ${minVersion} and higher, ` +\n \"but the version supported by the HTTP server is not yet known. \" +\n \"Use Client.getVersion() to wait until the version is available.\");\n }\n else if (this._endpoint.version < minVersion) {\n throw new ProtocolVersionError(`${feature} is supported only on protocol version ${minVersion} and higher, ` +\n `but the HTTP server only supports version ${this._endpoint.version}.`);\n }\n }\n /** Open a {@link HttpStream}, a stream for executing SQL statements. */\n openStream() {\n if (this.#closed !== undefined) {\n throw new ClosedError(\"Client is closed\", this.#closed);\n }\n const stream = new HttpStream(this, this.#url, this.#jwt, this.#fetch);\n this.#streams.add(stream);\n return stream;\n }\n /** @private */\n _streamClosed(stream) {\n this.#streams.delete(stream);\n }\n /** Close the client and all its streams. */\n close() {\n this.#setClosed(new ClientError(\"Client was manually closed\"));\n }\n /** True if the client is closed. */\n get closed() {\n return this.#closed !== undefined;\n }\n #setClosed(error) {\n if (this.#closed !== undefined) {\n return;\n }\n this.#closed = error;\n for (const stream of Array.from(this.#streams)) {\n stream._setClosed(new ClosedError(\"Client was closed\", error));\n }\n }\n}\nasync function findEndpoint(customFetch, clientUrl) {\n const fetch = customFetch;\n for (const endpoint of checkEndpoints) {\n const url = new URL(endpoint.versionPath, clientUrl);\n const request = new Request(url.toString(), { method: \"GET\" });\n const response = await fetch(request);\n await response.arrayBuffer();\n if (response.ok) {\n return endpoint;\n }\n }\n return fallbackEndpoint;\n}\n",
|
|
116
|
-
"import { WebSocket } from \"@libsql/isomorphic-ws\";\nimport { subprotocolsV2, subprotocolsV3 } from \"./ws/client.js\";\nimport { WebSocketUnsupportedError } from \"./errors.js\";\nimport { HttpClient } from \"./http/client.js\";\nimport { WsClient } from \"./ws/client.js\";\nexport { WebSocket } from \"@libsql/isomorphic-ws\";\nexport { fetch, Request, Headers } from \"@libsql/isomorphic-fetch\";\nexport { Client } from \"./client.js\";\nexport * from \"./errors.js\";\nexport { Batch, BatchStep, BatchCond } from \"./batch.js\";\nexport { parseLibsqlUrl } from \"./libsql_url.js\";\nexport { Sql } from \"./sql.js\";\nexport { Stmt } from \"./stmt.js\";\nexport { Stream } from \"./stream.js\";\nexport { HttpClient } from \"./http/client.js\";\nexport { HttpStream } from \"./http/stream.js\";\nexport { WsClient } from \"./ws/client.js\";\nexport { WsStream } from \"./ws/stream.js\";\n/** Open a Hrana client over WebSocket connected to the given `url`. */\nexport function openWs(url, jwt, protocolVersion = 2) {\n if (typeof WebSocket === \"undefined\") {\n throw new WebSocketUnsupportedError(\"WebSockets are not supported in this environment\");\n }\n var subprotocols = undefined;\n if (protocolVersion == 3) {\n subprotocols = Array.from(subprotocolsV3.keys());\n }\n else {\n subprotocols = Array.from(subprotocolsV2.keys());\n }\n const socket = new WebSocket(url, subprotocols);\n return new WsClient(socket, jwt);\n}\n/** Open a Hrana client over HTTP connected to the given `url`.\n *\n * If the `customFetch` argument is passed and not `undefined`, it is used in place of the `fetch` function\n * from `@libsql/isomorphic-fetch`. This function is always called with a `Request` object from\n * `@libsql/isomorphic-fetch`.\n */\nexport function openHttp(url, jwt, customFetch, protocolVersion = 2) {\n return new HttpClient(url instanceof URL ? url : new URL(url), jwt, customFetch, protocolVersion);\n}\n",
|
|
117
|
-
"import * as hrana from \"@libsql/hrana-client\";\nimport { LibsqlError } from \"@libsql/core/api\";\nimport { transactionModeToBegin, ResultSetImpl } from \"@libsql/core/util\";\nexport class HranaTransaction {\n #mode;\n #version;\n // Promise that is resolved when the BEGIN statement completes, or `undefined` if we haven't executed the\n // BEGIN statement yet.\n #started;\n /** @private */\n constructor(mode, version) {\n this.#mode = mode;\n this.#version = version;\n this.#started = undefined;\n }\n execute(stmt) {\n return this.batch([stmt]).then((results) => results[0]);\n }\n async batch(stmts) {\n const stream = this._getStream();\n if (stream.closed) {\n throw new LibsqlError(\"Cannot execute statements because the transaction is closed\", \"TRANSACTION_CLOSED\");\n }\n try {\n const hranaStmts = stmts.map(stmtToHrana);\n let rowsPromises;\n if (this.#started === undefined) {\n // The transaction hasn't started yet, so we need to send the BEGIN statement in a batch with\n // `hranaStmts`.\n this._getSqlCache().apply(hranaStmts);\n const batch = stream.batch(this.#version >= 3);\n const beginStep = batch.step();\n const beginPromise = beginStep.run(transactionModeToBegin(this.#mode));\n // Execute the `hranaStmts` only if the BEGIN succeeded, to make sure that we don't execute it\n // outside of a transaction.\n let lastStep = beginStep;\n rowsPromises = hranaStmts.map((hranaStmt) => {\n const stmtStep = batch\n .step()\n .condition(hrana.BatchCond.ok(lastStep));\n if (this.#version >= 3) {\n // If the Hrana version supports it, make sure that we are still in a transaction\n stmtStep.condition(hrana.BatchCond.not(hrana.BatchCond.isAutocommit(batch)));\n }\n const rowsPromise = stmtStep.query(hranaStmt);\n rowsPromise.catch(() => undefined); // silence Node warning\n lastStep = stmtStep;\n return rowsPromise;\n });\n // `this.#started` is resolved successfully only if the batch and the BEGIN statement inside\n // of the batch are both successful.\n this.#started = batch\n .execute()\n .then(() => beginPromise)\n .then(() => undefined);\n try {\n await this.#started;\n }\n catch (e) {\n // If the BEGIN failed, the transaction is unusable and we must close it. However, if the\n // BEGIN suceeds and `hranaStmts` fail, the transaction is _not_ closed.\n this.close();\n throw e;\n }\n }\n else {\n if (this.#version < 3) {\n // The transaction has started, so we must wait until the BEGIN statement completed to make\n // sure that we don't execute `hranaStmts` outside of a transaction.\n await this.#started;\n }\n else {\n // The transaction has started, but we will use `hrana.BatchCond.isAutocommit()` to make\n // sure that we don't execute `hranaStmts` outside of a transaction, so we don't have to\n // wait for `this.#started`\n }\n this._getSqlCache().apply(hranaStmts);\n const batch = stream.batch(this.#version >= 3);\n let lastStep = undefined;\n rowsPromises = hranaStmts.map((hranaStmt) => {\n const stmtStep = batch.step();\n if (lastStep !== undefined) {\n stmtStep.condition(hrana.BatchCond.ok(lastStep));\n }\n if (this.#version >= 3) {\n stmtStep.condition(hrana.BatchCond.not(hrana.BatchCond.isAutocommit(batch)));\n }\n const rowsPromise = stmtStep.query(hranaStmt);\n rowsPromise.catch(() => undefined); // silence Node warning\n lastStep = stmtStep;\n return rowsPromise;\n });\n await batch.execute();\n }\n const resultSets = [];\n for (const rowsPromise of rowsPromises) {\n const rows = await rowsPromise;\n if (rows === undefined) {\n throw new LibsqlError(\"Statement in a transaction was not executed, \" +\n \"probably because the transaction has been rolled back\", \"TRANSACTION_CLOSED\");\n }\n resultSets.push(resultSetFromHrana(rows));\n }\n return resultSets;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n }\n async executeMultiple(sql) {\n const stream = this._getStream();\n if (stream.closed) {\n throw new LibsqlError(\"Cannot execute statements because the transaction is closed\", \"TRANSACTION_CLOSED\");\n }\n try {\n if (this.#started === undefined) {\n // If the transaction hasn't started yet, start it now\n this.#started = stream\n .run(transactionModeToBegin(this.#mode))\n .then(() => undefined);\n try {\n await this.#started;\n }\n catch (e) {\n this.close();\n throw e;\n }\n }\n else {\n // Wait until the transaction has started\n await this.#started;\n }\n await stream.sequence(sql);\n }\n catch (e) {\n throw mapHranaError(e);\n }\n }\n async rollback() {\n try {\n const stream = this._getStream();\n if (stream.closed) {\n return;\n }\n if (this.#started !== undefined) {\n // We don't have to wait for the BEGIN statement to complete. If the BEGIN fails, we will\n // execute a ROLLBACK outside of an active transaction, which should be harmless.\n }\n else {\n // We did nothing in the transaction, so there is nothing to rollback.\n return;\n }\n // Pipeline the ROLLBACK statement and the stream close.\n const promise = stream.run(\"ROLLBACK\").catch((e) => {\n throw mapHranaError(e);\n });\n stream.closeGracefully();\n await promise;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n finally {\n // `this.close()` may close the `hrana.Client`, which aborts all pending stream requests, so we\n // must call it _after_ we receive the ROLLBACK response.\n // Also note that the current stream should already be closed, but we need to call `this.close()`\n // anyway, because it may need to do more cleanup.\n this.close();\n }\n }\n async commit() {\n // (this method is analogous to `rollback()`)\n try {\n const stream = this._getStream();\n if (stream.closed) {\n throw new LibsqlError(\"Cannot commit the transaction because it is already closed\", \"TRANSACTION_CLOSED\");\n }\n if (this.#started !== undefined) {\n // Make sure to execute the COMMIT only if the BEGIN was successful.\n await this.#started;\n }\n else {\n return;\n }\n const promise = stream.run(\"COMMIT\").catch((e) => {\n throw mapHranaError(e);\n });\n stream.closeGracefully();\n await promise;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n finally {\n this.close();\n }\n }\n}\nexport async function executeHranaBatch(mode, version, batch, hranaStmts, disableForeignKeys = false) {\n if (disableForeignKeys) {\n batch.step().run(\"PRAGMA foreign_keys=off\");\n }\n const beginStep = batch.step();\n const beginPromise = beginStep.run(transactionModeToBegin(mode));\n let lastStep = beginStep;\n const stmtPromises = hranaStmts.map((hranaStmt) => {\n const stmtStep = batch.step().condition(hrana.BatchCond.ok(lastStep));\n if (version >= 3) {\n stmtStep.condition(hrana.BatchCond.not(hrana.BatchCond.isAutocommit(batch)));\n }\n const stmtPromise = stmtStep.query(hranaStmt);\n lastStep = stmtStep;\n return stmtPromise;\n });\n const commitStep = batch.step().condition(hrana.BatchCond.ok(lastStep));\n if (version >= 3) {\n commitStep.condition(hrana.BatchCond.not(hrana.BatchCond.isAutocommit(batch)));\n }\n const commitPromise = commitStep.run(\"COMMIT\");\n const rollbackStep = batch\n .step()\n .condition(hrana.BatchCond.not(hrana.BatchCond.ok(commitStep)));\n rollbackStep.run(\"ROLLBACK\").catch((_) => undefined);\n if (disableForeignKeys) {\n batch.step().run(\"PRAGMA foreign_keys=on\");\n }\n await batch.execute();\n const resultSets = [];\n await beginPromise;\n for (const stmtPromise of stmtPromises) {\n const hranaRows = await stmtPromise;\n if (hranaRows === undefined) {\n throw new LibsqlError(\"Statement in a batch was not executed, probably because the transaction has been rolled back\", \"TRANSACTION_CLOSED\");\n }\n resultSets.push(resultSetFromHrana(hranaRows));\n }\n await commitPromise;\n return resultSets;\n}\nexport function stmtToHrana(stmt) {\n let sql;\n let args;\n if (Array.isArray(stmt)) {\n [sql, args] = stmt;\n }\n else if (typeof stmt === \"string\") {\n sql = stmt;\n }\n else {\n sql = stmt.sql;\n args = stmt.args;\n }\n const hranaStmt = new hrana.Stmt(sql);\n if (args) {\n if (Array.isArray(args)) {\n hranaStmt.bindIndexes(args);\n }\n else {\n for (const [key, value] of Object.entries(args)) {\n hranaStmt.bindName(key, value);\n }\n }\n }\n return hranaStmt;\n}\nexport function resultSetFromHrana(hranaRows) {\n const columns = hranaRows.columnNames.map((c) => c ?? \"\");\n const columnTypes = hranaRows.columnDecltypes.map((c) => c ?? \"\");\n const rows = hranaRows.rows;\n const rowsAffected = hranaRows.affectedRowCount;\n const lastInsertRowid = hranaRows.lastInsertRowid !== undefined\n ? hranaRows.lastInsertRowid\n : undefined;\n return new ResultSetImpl(columns, columnTypes, rows, rowsAffected, lastInsertRowid);\n}\nexport function mapHranaError(e) {\n if (e instanceof hrana.ClientError) {\n const code = mapHranaErrorCode(e);\n return new LibsqlError(e.message, code, undefined, e);\n }\n return e;\n}\nfunction mapHranaErrorCode(e) {\n if (e instanceof hrana.ResponseError && e.code !== undefined) {\n return e.code;\n }\n else if (e instanceof hrana.ProtoError) {\n return \"HRANA_PROTO_ERROR\";\n }\n else if (e instanceof hrana.ClosedError) {\n return e.cause instanceof hrana.ClientError\n ? mapHranaErrorCode(e.cause)\n : \"HRANA_CLOSED_ERROR\";\n }\n else if (e instanceof hrana.WebSocketError) {\n return \"HRANA_WEBSOCKET_ERROR\";\n }\n else if (e instanceof hrana.HttpServerError) {\n return \"SERVER_ERROR\";\n }\n else if (e instanceof hrana.ProtocolVersionError) {\n return \"PROTOCOL_VERSION_ERROR\";\n }\n else if (e instanceof hrana.InternalError) {\n return \"INTERNAL_ERROR\";\n }\n else {\n return \"UNKNOWN\";\n }\n}\n",
|
|
118
|
-
"export class SqlCache {\n #owner;\n #sqls;\n capacity;\n constructor(owner, capacity) {\n this.#owner = owner;\n this.#sqls = new Lru();\n this.capacity = capacity;\n }\n // Replaces SQL strings with cached `hrana.Sql` objects in the statements in `hranaStmts`. After this\n // function returns, we guarantee that all `hranaStmts` refer to valid (not closed) `hrana.Sql` objects,\n // but _we may invalidate any other `hrana.Sql` objects_ (by closing them, thus removing them from the\n // server).\n //\n // In practice, this means that after calling this function, you can use the statements only up to the\n // first `await`, because concurrent code may also use the cache and invalidate those statements.\n apply(hranaStmts) {\n if (this.capacity <= 0) {\n return;\n }\n const usedSqlObjs = new Set();\n for (const hranaStmt of hranaStmts) {\n if (typeof hranaStmt.sql !== \"string\") {\n continue;\n }\n const sqlText = hranaStmt.sql;\n // Stored SQL cannot exceed 5kb.\n // https://github.com/tursodatabase/libsql/blob/e9d637e051685f92b0da43849507b5ef4232fbeb/libsql-server/src/hrana/http/request.rs#L10\n if (sqlText.length >= 5000) {\n continue;\n }\n let sqlObj = this.#sqls.get(sqlText);\n if (sqlObj === undefined) {\n while (this.#sqls.size + 1 > this.capacity) {\n const [evictSqlText, evictSqlObj] = this.#sqls.peekLru();\n if (usedSqlObjs.has(evictSqlObj)) {\n // The SQL object that we are trying to evict is already in use in this batch, so we\n // must not evict and close it.\n break;\n }\n evictSqlObj.close();\n this.#sqls.delete(evictSqlText);\n }\n if (this.#sqls.size + 1 <= this.capacity) {\n sqlObj = this.#owner.storeSql(sqlText);\n this.#sqls.set(sqlText, sqlObj);\n }\n }\n if (sqlObj !== undefined) {\n hranaStmt.sql = sqlObj;\n usedSqlObjs.add(sqlObj);\n }\n }\n }\n}\nclass Lru {\n // This maps keys to the cache values. The entries are ordered by their last use (entires that were used\n // most recently are at the end).\n #cache;\n constructor() {\n this.#cache = new Map();\n }\n get(key) {\n const value = this.#cache.get(key);\n if (value !== undefined) {\n // move the entry to the back of the Map\n this.#cache.delete(key);\n this.#cache.set(key, value);\n }\n return value;\n }\n set(key, value) {\n this.#cache.set(key, value);\n }\n peekLru() {\n for (const entry of this.#cache.entries()) {\n return entry;\n }\n return undefined;\n }\n delete(key) {\n this.#cache.delete(key);\n }\n get size() {\n return this.#cache.size;\n }\n}\n",
|
|
119
|
-
"import * as hrana from \"@libsql/hrana-client\";\nimport { LibsqlError } from \"@libsql/core/api\";\nimport { expandConfig } from \"@libsql/core/config\";\nimport { HranaTransaction, executeHranaBatch, stmtToHrana, resultSetFromHrana, mapHranaError, } from \"./hrana.js\";\nimport { SqlCache } from \"./sql_cache.js\";\nimport { encodeBaseUrl } from \"@libsql/core/uri\";\nimport { supportedUrlLink } from \"@libsql/core/util\";\nimport promiseLimit from \"promise-limit\";\nexport * from \"@libsql/core/api\";\nexport function createClient(config) {\n return _createClient(expandConfig(config, false));\n}\n/** @private */\nexport function _createClient(config) {\n if (config.scheme !== \"wss\" && config.scheme !== \"ws\") {\n throw new LibsqlError('The WebSocket client supports only \"libsql:\", \"wss:\" and \"ws:\" URLs, ' +\n `got ${JSON.stringify(config.scheme + \":\")}. For more information, please read ${supportedUrlLink}`, \"URL_SCHEME_NOT_SUPPORTED\");\n }\n if (config.encryptionKey !== undefined) {\n throw new LibsqlError(\"Encryption key is not supported by the remote client.\", \"ENCRYPTION_KEY_NOT_SUPPORTED\");\n }\n if (config.scheme === \"ws\" && config.tls) {\n throw new LibsqlError(`A \"ws:\" URL cannot opt into TLS by using ?tls=1`, \"URL_INVALID\");\n }\n else if (config.scheme === \"wss\" && !config.tls) {\n throw new LibsqlError(`A \"wss:\" URL cannot opt out of TLS by using ?tls=0`, \"URL_INVALID\");\n }\n const url = encodeBaseUrl(config.scheme, config.authority, config.path);\n let client;\n try {\n client = hrana.openWs(url, config.authToken);\n }\n catch (e) {\n if (e instanceof hrana.WebSocketUnsupportedError) {\n const suggestedScheme = config.scheme === \"wss\" ? \"https\" : \"http\";\n const suggestedUrl = encodeBaseUrl(suggestedScheme, config.authority, config.path);\n throw new LibsqlError(\"This environment does not support WebSockets, please switch to the HTTP client by using \" +\n `a \"${suggestedScheme}:\" URL (${JSON.stringify(suggestedUrl)}). ` +\n `For more information, please read ${supportedUrlLink}`, \"WEBSOCKETS_NOT_SUPPORTED\");\n }\n throw mapHranaError(e);\n }\n return new WsClient(client, url, config.authToken, config.intMode, config.concurrency);\n}\nconst maxConnAgeMillis = 60 * 1000;\nconst sqlCacheCapacity = 100;\nexport class WsClient {\n #url;\n #authToken;\n #intMode;\n // State of the current connection. The `hrana.WsClient` inside may be closed at any moment due to an\n // asynchronous error.\n #connState;\n // If defined, this is a connection that will be used in the future, once it is ready.\n #futureConnState;\n closed;\n protocol;\n #isSchemaDatabase;\n #promiseLimitFunction;\n /** @private */\n constructor(client, url, authToken, intMode, concurrency) {\n this.#url = url;\n this.#authToken = authToken;\n this.#intMode = intMode;\n this.#connState = this.#openConn(client);\n this.#futureConnState = undefined;\n this.closed = false;\n this.protocol = \"ws\";\n this.#promiseLimitFunction = promiseLimit(concurrency);\n }\n async limit(fn) {\n return this.#promiseLimitFunction(fn);\n }\n async execute(stmtOrSql, args) {\n let stmt;\n if (typeof stmtOrSql === \"string\") {\n stmt = {\n sql: stmtOrSql,\n args: args || [],\n };\n }\n else {\n stmt = stmtOrSql;\n }\n return this.limit(async () => {\n const streamState = await this.#openStream();\n try {\n const hranaStmt = stmtToHrana(stmt);\n // Schedule all operations synchronously, so they will be pipelined and executed in a single\n // network roundtrip.\n streamState.conn.sqlCache.apply([hranaStmt]);\n const hranaRowsPromise = streamState.stream.query(hranaStmt);\n streamState.stream.closeGracefully();\n const hranaRowsResult = await hranaRowsPromise;\n return resultSetFromHrana(hranaRowsResult);\n }\n catch (e) {\n throw mapHranaError(e);\n }\n finally {\n this._closeStream(streamState);\n }\n });\n }\n async batch(stmts, mode = \"deferred\") {\n return this.limit(async () => {\n const streamState = await this.#openStream();\n try {\n const normalizedStmts = stmts.map((stmt) => {\n if (Array.isArray(stmt)) {\n return {\n sql: stmt[0],\n args: stmt[1] || [],\n };\n }\n return stmt;\n });\n const hranaStmts = normalizedStmts.map(stmtToHrana);\n const version = await streamState.conn.client.getVersion();\n // Schedule all operations synchronously, so they will be pipelined and executed in a single\n // network roundtrip.\n streamState.conn.sqlCache.apply(hranaStmts);\n const batch = streamState.stream.batch(version >= 3);\n const resultsPromise = executeHranaBatch(mode, version, batch, hranaStmts);\n const results = await resultsPromise;\n return results;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n finally {\n this._closeStream(streamState);\n }\n });\n }\n async migrate(stmts) {\n return this.limit(async () => {\n const streamState = await this.#openStream();\n try {\n const hranaStmts = stmts.map(stmtToHrana);\n const version = await streamState.conn.client.getVersion();\n // Schedule all operations synchronously, so they will be pipelined and executed in a single\n // network roundtrip.\n const batch = streamState.stream.batch(version >= 3);\n const resultsPromise = executeHranaBatch(\"deferred\", version, batch, hranaStmts, true);\n const results = await resultsPromise;\n return results;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n finally {\n this._closeStream(streamState);\n }\n });\n }\n async transaction(mode = \"write\") {\n return this.limit(async () => {\n const streamState = await this.#openStream();\n try {\n const version = await streamState.conn.client.getVersion();\n // the BEGIN statement will be batched with the first statement on the transaction to save a\n // network roundtrip\n return new WsTransaction(this, streamState, mode, version);\n }\n catch (e) {\n this._closeStream(streamState);\n throw mapHranaError(e);\n }\n });\n }\n async executeMultiple(sql) {\n return this.limit(async () => {\n const streamState = await this.#openStream();\n try {\n // Schedule all operations synchronously, so they will be pipelined and executed in a single\n // network roundtrip.\n const promise = streamState.stream.sequence(sql);\n streamState.stream.closeGracefully();\n await promise;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n finally {\n this._closeStream(streamState);\n }\n });\n }\n sync() {\n throw new LibsqlError(\"sync not supported in ws mode\", \"SYNC_NOT_SUPPORTED\");\n }\n async #openStream() {\n if (this.closed) {\n throw new LibsqlError(\"The client is closed\", \"CLIENT_CLOSED\");\n }\n const now = new Date();\n const ageMillis = now.valueOf() - this.#connState.openTime.valueOf();\n if (ageMillis > maxConnAgeMillis &&\n this.#futureConnState === undefined) {\n // The existing connection is too old, let's open a new one.\n const futureConnState = this.#openConn();\n this.#futureConnState = futureConnState;\n // However, if we used `futureConnState` immediately, we would introduce additional latency,\n // because we would have to wait for the WebSocket handshake to complete, even though we may a\n // have perfectly good existing connection in `this.#connState`!\n //\n // So we wait until the `hrana.Client.getVersion()` operation completes (which happens when the\n // WebSocket hanshake completes), and only then we replace `this.#connState` with\n // `futureConnState`, which is stored in `this.#futureConnState` in the meantime.\n futureConnState.client.getVersion().then((_version) => {\n if (this.#connState !== futureConnState) {\n // We need to close `this.#connState` before we replace it. However, it is possible\n // that `this.#connState` has already been replaced: see the code below.\n if (this.#connState.streamStates.size === 0) {\n this.#connState.client.close();\n }\n else {\n // If there are existing streams on the connection, we must not close it, because\n // these streams would be broken. The last stream to be closed will also close the\n // connection in `_closeStream()`.\n }\n }\n this.#connState = futureConnState;\n this.#futureConnState = undefined;\n }, (_e) => {\n // If the new connection could not be established, let's just ignore the error and keep\n // using the existing connection.\n this.#futureConnState = undefined;\n });\n }\n if (this.#connState.client.closed) {\n // An error happened on this connection and it has been closed. Let's try to seamlessly reconnect.\n try {\n if (this.#futureConnState !== undefined) {\n // We are already in the process of opening a new connection, so let's just use it\n // immediately.\n this.#connState = this.#futureConnState;\n }\n else {\n this.#connState = this.#openConn();\n }\n }\n catch (e) {\n throw mapHranaError(e);\n }\n }\n const connState = this.#connState;\n try {\n // Now we wait for the WebSocket handshake to complete (if it hasn't completed yet). Note that\n // this does not increase latency, because any messages that we would send on the WebSocket before\n // the handshake would be queued until the handshake is completed anyway.\n if (connState.useSqlCache === undefined) {\n connState.useSqlCache =\n (await connState.client.getVersion()) >= 2;\n if (connState.useSqlCache) {\n connState.sqlCache.capacity = sqlCacheCapacity;\n }\n }\n const stream = connState.client.openStream();\n stream.intMode = this.#intMode;\n const streamState = { conn: connState, stream };\n connState.streamStates.add(streamState);\n return streamState;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n }\n #openConn(client) {\n try {\n client ??= hrana.openWs(this.#url, this.#authToken);\n return {\n client,\n useSqlCache: undefined,\n sqlCache: new SqlCache(client, 0),\n openTime: new Date(),\n streamStates: new Set(),\n };\n }\n catch (e) {\n throw mapHranaError(e);\n }\n }\n async reconnect() {\n try {\n for (const st of Array.from(this.#connState.streamStates)) {\n try {\n st.stream.close();\n }\n catch { }\n }\n this.#connState.client.close();\n }\n catch { }\n if (this.#futureConnState) {\n try {\n this.#futureConnState.client.close();\n }\n catch { }\n this.#futureConnState = undefined;\n }\n const next = this.#openConn();\n const version = await next.client.getVersion();\n next.useSqlCache = version >= 2;\n if (next.useSqlCache) {\n next.sqlCache.capacity = sqlCacheCapacity;\n }\n this.#connState = next;\n this.closed = false;\n }\n _closeStream(streamState) {\n streamState.stream.close();\n const connState = streamState.conn;\n connState.streamStates.delete(streamState);\n if (connState.streamStates.size === 0 &&\n connState !== this.#connState) {\n // We are not using this connection anymore and this is the last stream that was using it, so we\n // must close it now.\n connState.client.close();\n }\n }\n close() {\n this.#connState.client.close();\n this.closed = true;\n if (this.#futureConnState) {\n try {\n this.#futureConnState.client.close();\n }\n catch { }\n this.#futureConnState = undefined;\n }\n this.closed = true;\n }\n}\nexport class WsTransaction extends HranaTransaction {\n #client;\n #streamState;\n /** @private */\n constructor(client, state, mode, version) {\n super(mode, version);\n this.#client = client;\n this.#streamState = state;\n }\n /** @private */\n _getStream() {\n return this.#streamState.stream;\n }\n /** @private */\n _getSqlCache() {\n return this.#streamState.conn.sqlCache;\n }\n close() {\n this.#client._closeStream(this.#streamState);\n }\n get closed() {\n return this.#streamState.stream.closed;\n }\n}\n",
|
|
120
|
-
"import * as hrana from \"@libsql/hrana-client\";\nimport { LibsqlError } from \"@libsql/core/api\";\nimport { expandConfig } from \"@libsql/core/config\";\nimport { HranaTransaction, executeHranaBatch, stmtToHrana, resultSetFromHrana, mapHranaError, } from \"./hrana.js\";\nimport { SqlCache } from \"./sql_cache.js\";\nimport { encodeBaseUrl } from \"@libsql/core/uri\";\nimport { supportedUrlLink } from \"@libsql/core/util\";\nimport promiseLimit from \"promise-limit\";\nexport * from \"@libsql/core/api\";\nexport function createClient(config) {\n return _createClient(expandConfig(config, true));\n}\n/** @private */\nexport function _createClient(config) {\n if (config.scheme !== \"https\" && config.scheme !== \"http\") {\n throw new LibsqlError('The HTTP client supports only \"libsql:\", \"https:\" and \"http:\" URLs, ' +\n `got ${JSON.stringify(config.scheme + \":\")}. For more information, please read ${supportedUrlLink}`, \"URL_SCHEME_NOT_SUPPORTED\");\n }\n if (config.encryptionKey !== undefined) {\n throw new LibsqlError(\"Encryption key is not supported by the remote client.\", \"ENCRYPTION_KEY_NOT_SUPPORTED\");\n }\n if (config.scheme === \"http\" && config.tls) {\n throw new LibsqlError(`A \"http:\" URL cannot opt into TLS by using ?tls=1`, \"URL_INVALID\");\n }\n else if (config.scheme === \"https\" && !config.tls) {\n throw new LibsqlError(`A \"https:\" URL cannot opt out of TLS by using ?tls=0`, \"URL_INVALID\");\n }\n const url = encodeBaseUrl(config.scheme, config.authority, config.path);\n return new HttpClient(url, config.authToken, config.intMode, config.fetch, config.concurrency);\n}\nconst sqlCacheCapacity = 30;\nexport class HttpClient {\n #client;\n protocol;\n #url;\n #intMode;\n #customFetch;\n #concurrency;\n #authToken;\n #promiseLimitFunction;\n /** @private */\n constructor(url, authToken, intMode, customFetch, concurrency) {\n this.#url = url;\n this.#authToken = authToken;\n this.#intMode = intMode;\n this.#customFetch = customFetch;\n this.#concurrency = concurrency;\n this.#client = hrana.openHttp(this.#url, this.#authToken, this.#customFetch);\n this.#client.intMode = this.#intMode;\n this.protocol = \"http\";\n this.#promiseLimitFunction = promiseLimit(this.#concurrency);\n }\n async limit(fn) {\n return this.#promiseLimitFunction(fn);\n }\n async execute(stmtOrSql, args) {\n let stmt;\n if (typeof stmtOrSql === \"string\") {\n stmt = {\n sql: stmtOrSql,\n args: args || [],\n };\n }\n else {\n stmt = stmtOrSql;\n }\n return this.limit(async () => {\n try {\n const hranaStmt = stmtToHrana(stmt);\n // Pipeline all operations, so `hrana.HttpClient` can open the stream, execute the statement and\n // close the stream in a single HTTP request.\n let rowsPromise;\n const stream = this.#client.openStream();\n try {\n rowsPromise = stream.query(hranaStmt);\n }\n finally {\n stream.closeGracefully();\n }\n const rowsResult = await rowsPromise;\n return resultSetFromHrana(rowsResult);\n }\n catch (e) {\n throw mapHranaError(e);\n }\n });\n }\n async batch(stmts, mode = \"deferred\") {\n return this.limit(async () => {\n try {\n const normalizedStmts = stmts.map((stmt) => {\n if (Array.isArray(stmt)) {\n return {\n sql: stmt[0],\n args: stmt[1] || [],\n };\n }\n return stmt;\n });\n const hranaStmts = normalizedStmts.map(stmtToHrana);\n const version = await this.#client.getVersion();\n // Pipeline all operations, so `hrana.HttpClient` can open the stream, execute the batch and\n // close the stream in a single HTTP request.\n let resultsPromise;\n const stream = this.#client.openStream();\n try {\n // It makes sense to use a SQL cache even for a single batch, because it may contain the same\n // statement repeated multiple times.\n const sqlCache = new SqlCache(stream, sqlCacheCapacity);\n sqlCache.apply(hranaStmts);\n // TODO: we do not use a cursor here, because it would cause three roundtrips:\n // 1. pipeline request to store SQL texts\n // 2. cursor request\n // 3. pipeline request to close the stream\n const batch = stream.batch(false);\n resultsPromise = executeHranaBatch(mode, version, batch, hranaStmts);\n }\n finally {\n stream.closeGracefully();\n }\n const results = await resultsPromise;\n return results;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n });\n }\n async migrate(stmts) {\n return this.limit(async () => {\n try {\n const hranaStmts = stmts.map(stmtToHrana);\n const version = await this.#client.getVersion();\n // Pipeline all operations, so `hrana.HttpClient` can open the stream, execute the batch and\n // close the stream in a single HTTP request.\n let resultsPromise;\n const stream = this.#client.openStream();\n try {\n const batch = stream.batch(false);\n resultsPromise = executeHranaBatch(\"deferred\", version, batch, hranaStmts, true);\n }\n finally {\n stream.closeGracefully();\n }\n const results = await resultsPromise;\n return results;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n });\n }\n async transaction(mode = \"write\") {\n return this.limit(async () => {\n try {\n const version = await this.#client.getVersion();\n return new HttpTransaction(this.#client.openStream(), mode, version);\n }\n catch (e) {\n throw mapHranaError(e);\n }\n });\n }\n async executeMultiple(sql) {\n return this.limit(async () => {\n try {\n // Pipeline all operations, so `hrana.HttpClient` can open the stream, execute the sequence and\n // close the stream in a single HTTP request.\n let promise;\n const stream = this.#client.openStream();\n try {\n promise = stream.sequence(sql);\n }\n finally {\n stream.closeGracefully();\n }\n await promise;\n }\n catch (e) {\n throw mapHranaError(e);\n }\n });\n }\n sync() {\n throw new LibsqlError(\"sync not supported in http mode\", \"SYNC_NOT_SUPPORTED\");\n }\n close() {\n this.#client.close();\n }\n async reconnect() {\n try {\n if (!this.closed) {\n // Abort in-flight ops and free resources\n this.#client.close();\n }\n }\n finally {\n // Recreate the underlying hrana client\n this.#client = hrana.openHttp(this.#url, this.#authToken, this.#customFetch);\n this.#client.intMode = this.#intMode;\n }\n }\n get closed() {\n return this.#client.closed;\n }\n}\nexport class HttpTransaction extends HranaTransaction {\n #stream;\n #sqlCache;\n /** @private */\n constructor(stream, mode, version) {\n super(mode, version);\n this.#stream = stream;\n this.#sqlCache = new SqlCache(stream, sqlCacheCapacity);\n }\n /** @private */\n _getStream() {\n return this.#stream;\n }\n /** @private */\n _getSqlCache() {\n return this.#sqlCache;\n }\n close() {\n this.#stream.close();\n }\n get closed() {\n return this.#stream.closed;\n }\n}\n",
|
|
121
|
-
"import { expandConfig } from \"@libsql/core/config\";\nimport { _createClient as _createSqlite3Client } from \"./sqlite3.js\";\nimport { _createClient as _createWsClient } from \"./ws.js\";\nimport { _createClient as _createHttpClient } from \"./http.js\";\nexport * from \"@libsql/core/api\";\n/** Creates a {@link Client} object.\n *\n * You must pass at least an `url` in the {@link Config} object.\n */\nexport function createClient(config) {\n return _createClient(expandConfig(config, true));\n}\nfunction _createClient(config) {\n if (config.scheme === \"wss\" || config.scheme === \"ws\") {\n return _createWsClient(config);\n }\n else if (config.scheme === \"https\" || config.scheme === \"http\") {\n return _createHttpClient(config);\n }\n else {\n return _createSqlite3Client(config);\n }\n}\n",
|
|
122
|
-
"import { NoopCache } from \"../cache/core/index.js\";\nimport { entityKind } from \"../entity.js\";\nimport { NoopLogger } from \"../logger.js\";\nimport { fillPlaceholders, sql } from \"../sql/sql.js\";\nimport { SQLiteTransaction } from \"../sqlite-core/index.js\";\nimport { SQLitePreparedQuery, SQLiteSession } from \"../sqlite-core/session.js\";\nimport { mapResultRow } from \"../utils.js\";\nclass LibSQLSession extends SQLiteSession {\n constructor(client, dialect, schema, options, tx) {\n super(dialect);\n this.client = client;\n this.schema = schema;\n this.options = options;\n this.tx = tx;\n this.logger = options.logger ?? new NoopLogger();\n this.cache = options.cache ?? new NoopCache();\n }\n static [entityKind] = \"LibSQLSession\";\n logger;\n cache;\n prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {\n return new LibSQLPreparedQuery(\n this.client,\n query,\n this.logger,\n this.cache,\n queryMetadata,\n cacheConfig,\n fields,\n this.tx,\n executeMethod,\n isResponseInArrayMode,\n customResultMapper\n );\n }\n async batch(queries) {\n const preparedQueries = [];\n const builtQueries = [];\n for (const query of queries) {\n const preparedQuery = query._prepare();\n const builtQuery = preparedQuery.getQuery();\n preparedQueries.push(preparedQuery);\n builtQueries.push({ sql: builtQuery.sql, args: builtQuery.params });\n }\n const batchResults = await this.client.batch(builtQueries);\n return batchResults.map((result, i) => preparedQueries[i].mapResult(result, true));\n }\n async migrate(queries) {\n const preparedQueries = [];\n const builtQueries = [];\n for (const query of queries) {\n const preparedQuery = query._prepare();\n const builtQuery = preparedQuery.getQuery();\n preparedQueries.push(preparedQuery);\n builtQueries.push({ sql: builtQuery.sql, args: builtQuery.params });\n }\n const batchResults = await this.client.migrate(builtQueries);\n return batchResults.map((result, i) => preparedQueries[i].mapResult(result, true));\n }\n async transaction(transaction, _config) {\n const libsqlTx = await this.client.transaction();\n const session = new LibSQLSession(\n this.client,\n this.dialect,\n this.schema,\n this.options,\n libsqlTx\n );\n const tx = new LibSQLTransaction(\"async\", this.dialect, session, this.schema);\n try {\n const result = await transaction(tx);\n await libsqlTx.commit();\n return result;\n } catch (err) {\n await libsqlTx.rollback();\n throw err;\n }\n }\n extractRawAllValueFromBatchResult(result) {\n return result.rows;\n }\n extractRawGetValueFromBatchResult(result) {\n return result.rows[0];\n }\n extractRawValuesValueFromBatchResult(result) {\n return result.rows;\n }\n}\nclass LibSQLTransaction extends SQLiteTransaction {\n static [entityKind] = \"LibSQLTransaction\";\n async transaction(transaction) {\n const savepointName = `sp${this.nestedIndex}`;\n const tx = new LibSQLTransaction(\"async\", this.dialect, this.session, this.schema, this.nestedIndex + 1);\n await this.session.run(sql.raw(`savepoint ${savepointName}`));\n try {\n const result = await transaction(tx);\n await this.session.run(sql.raw(`release savepoint ${savepointName}`));\n return result;\n } catch (err) {\n await this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n throw err;\n }\n }\n}\nclass LibSQLPreparedQuery extends SQLitePreparedQuery {\n constructor(client, query, logger, cache, queryMetadata, cacheConfig, fields, tx, executeMethod, _isResponseInArrayMode, customResultMapper) {\n super(\"async\", executeMethod, query, cache, queryMetadata, cacheConfig);\n this.client = client;\n this.logger = logger;\n this.fields = fields;\n this.tx = tx;\n this._isResponseInArrayMode = _isResponseInArrayMode;\n this.customResultMapper = customResultMapper;\n this.customResultMapper = customResultMapper;\n this.fields = fields;\n }\n static [entityKind] = \"LibSQLPreparedQuery\";\n async run(placeholderValues) {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n this.logger.logQuery(this.query.sql, params);\n return await this.queryWithCache(this.query.sql, params, async () => {\n const stmt = { sql: this.query.sql, args: params };\n return this.tx ? this.tx.execute(stmt) : this.client.execute(stmt);\n });\n }\n async all(placeholderValues) {\n const { fields, logger, query, tx, client, customResultMapper } = this;\n if (!fields && !customResultMapper) {\n const params = fillPlaceholders(query.params, placeholderValues ?? {});\n logger.logQuery(query.sql, params);\n return await this.queryWithCache(query.sql, params, async () => {\n const stmt = { sql: query.sql, args: params };\n return (tx ? tx.execute(stmt) : client.execute(stmt)).then(({ rows: rows2 }) => this.mapAllResult(rows2));\n });\n }\n const rows = await this.values(placeholderValues);\n return this.mapAllResult(rows);\n }\n mapAllResult(rows, isFromBatch) {\n if (isFromBatch) {\n rows = rows.rows;\n }\n if (!this.fields && !this.customResultMapper) {\n return rows.map((row) => normalizeRow(row));\n }\n if (this.customResultMapper) {\n return this.customResultMapper(rows, normalizeFieldValue);\n }\n return rows.map((row) => {\n return mapResultRow(\n this.fields,\n Array.prototype.slice.call(row).map((v) => normalizeFieldValue(v)),\n this.joinsNotNullableMap\n );\n });\n }\n async get(placeholderValues) {\n const { fields, logger, query, tx, client, customResultMapper } = this;\n if (!fields && !customResultMapper) {\n const params = fillPlaceholders(query.params, placeholderValues ?? {});\n logger.logQuery(query.sql, params);\n return await this.queryWithCache(query.sql, params, async () => {\n const stmt = { sql: query.sql, args: params };\n return (tx ? tx.execute(stmt) : client.execute(stmt)).then(({ rows: rows2 }) => this.mapGetResult(rows2));\n });\n }\n const rows = await this.values(placeholderValues);\n return this.mapGetResult(rows);\n }\n mapGetResult(rows, isFromBatch) {\n if (isFromBatch) {\n rows = rows.rows;\n }\n const row = rows[0];\n if (!this.fields && !this.customResultMapper) {\n return normalizeRow(row);\n }\n if (!row) {\n return void 0;\n }\n if (this.customResultMapper) {\n return this.customResultMapper(rows, normalizeFieldValue);\n }\n return mapResultRow(\n this.fields,\n Array.prototype.slice.call(row).map((v) => normalizeFieldValue(v)),\n this.joinsNotNullableMap\n );\n }\n async values(placeholderValues) {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n this.logger.logQuery(this.query.sql, params);\n return await this.queryWithCache(this.query.sql, params, async () => {\n const stmt = { sql: this.query.sql, args: params };\n return (this.tx ? this.tx.execute(stmt) : this.client.execute(stmt)).then(({ rows }) => rows);\n });\n }\n /** @internal */\n isResponseInArrayMode() {\n return this._isResponseInArrayMode;\n }\n}\nfunction normalizeRow(obj) {\n return Object.keys(obj).reduce((acc, key) => {\n if (Object.prototype.propertyIsEnumerable.call(obj, key)) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\nfunction normalizeFieldValue(value) {\n if (typeof ArrayBuffer !== \"undefined\" && value instanceof ArrayBuffer) {\n if (typeof Buffer !== \"undefined\") {\n if (!(value instanceof Buffer)) {\n return Buffer.from(value);\n }\n return value;\n }\n if (typeof TextDecoder !== \"undefined\") {\n return new TextDecoder().decode(value);\n }\n throw new Error(\"TextDecoder is not available. Please provide either Buffer or TextDecoder polyfill.\");\n }\n return value;\n}\nexport {\n LibSQLPreparedQuery,\n LibSQLSession,\n LibSQLTransaction\n};\n//# sourceMappingURL=session.js.map",
|
|
123
|
-
"import { entityKind } from \"../entity.js\";\nimport { DefaultLogger } from \"../logger.js\";\nimport {\n createTableRelationsHelpers,\n extractTablesRelationalConfig\n} from \"../relations.js\";\nimport { BaseSQLiteDatabase } from \"../sqlite-core/db.js\";\nimport { SQLiteAsyncDialect } from \"../sqlite-core/dialect.js\";\nimport { LibSQLSession } from \"./session.js\";\nclass LibSQLDatabase extends BaseSQLiteDatabase {\n static [entityKind] = \"LibSQLDatabase\";\n async batch(batch) {\n return this.session.batch(batch);\n }\n}\nfunction construct(client, config = {}) {\n const dialect = new SQLiteAsyncDialect({ casing: config.casing });\n let logger;\n if (config.logger === true) {\n logger = new DefaultLogger();\n } else if (config.logger !== false) {\n logger = config.logger;\n }\n let schema;\n if (config.schema) {\n const tablesConfig = extractTablesRelationalConfig(\n config.schema,\n createTableRelationsHelpers\n );\n schema = {\n fullSchema: config.schema,\n schema: tablesConfig.tables,\n tableNamesMap: tablesConfig.tableNamesMap\n };\n }\n const session = new LibSQLSession(client, dialect, schema, { logger, cache: config.cache }, void 0);\n const db = new LibSQLDatabase(\"async\", dialect, session, schema);\n db.$client = client;\n db.$cache = config.cache;\n if (db.$cache) {\n db.$cache[\"invalidate\"] = config.cache?.onMutate;\n }\n return db;\n}\nexport {\n LibSQLDatabase,\n construct\n};\n//# sourceMappingURL=driver-core.js.map",
|
|
124
|
-
"import { createClient } from \"@libsql/client\";\nimport { isConfig } from \"../utils.js\";\nimport { construct } from \"./driver-core.js\";\nimport { LibSQLDatabase } from \"./driver-core.js\";\nfunction drizzle(...params) {\n if (typeof params[0] === \"string\") {\n const instance = createClient({\n url: params[0]\n });\n return construct(instance, params[1]);\n }\n if (isConfig(params[0])) {\n const { connection, client, ...drizzleConfig } = params[0];\n if (client) return construct(client, drizzleConfig);\n const instance = typeof connection === \"string\" ? createClient({ url: connection }) : createClient(connection);\n return construct(instance, drizzleConfig);\n }\n return construct(params[0], params[1]);\n}\n((drizzle2) => {\n function mock(config) {\n return construct({}, config);\n }\n drizzle2.mock = mock;\n})(drizzle || (drizzle = {}));\nexport {\n LibSQLDatabase,\n drizzle\n};\n//# sourceMappingURL=driver.js.map",
|
|
125
|
-
"import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nfunction readMigrationFiles(config) {\n const migrationFolderTo = config.migrationsFolder;\n const migrationQueries = [];\n const journalPath = `${migrationFolderTo}/meta/_journal.json`;\n if (!fs.existsSync(journalPath)) {\n throw new Error(`Can't find meta/_journal.json file`);\n }\n const journalAsString = fs.readFileSync(`${migrationFolderTo}/meta/_journal.json`).toString();\n const journal = JSON.parse(journalAsString);\n for (const journalEntry of journal.entries) {\n const migrationPath = `${migrationFolderTo}/${journalEntry.tag}.sql`;\n try {\n const query = fs.readFileSync(`${migrationFolderTo}/${journalEntry.tag}.sql`).toString();\n const result = query.split(\"--> statement-breakpoint\").map((it) => {\n return it;\n });\n migrationQueries.push({\n sql: result,\n bps: journalEntry.breakpoints,\n folderMillis: journalEntry.when,\n hash: crypto.createHash(\"sha256\").update(query).digest(\"hex\")\n });\n } catch {\n throw new Error(`No file ${migrationPath} found in ${migrationFolderTo} folder`);\n }\n }\n return migrationQueries;\n}\nexport {\n readMigrationFiles\n};\n//# sourceMappingURL=migrator.js.map",
|
|
126
|
-
"import { readMigrationFiles } from \"../migrator.js\";\nimport { sql } from \"../sql/sql.js\";\nasync function migrate(db, config) {\n const migrations = readMigrationFiles(config);\n const migrationsTable = config.migrationsTable ?? \"__drizzle_migrations\";\n const migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric\n\t\t)\n\t`;\n await db.session.run(migrationTableCreate);\n const dbMigrations = await db.values(\n sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`\n );\n const lastDbMigration = dbMigrations[0] ?? void 0;\n const statementToBatch = [];\n for (const migration of migrations) {\n if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {\n for (const stmt of migration.sql) {\n statementToBatch.push(db.run(sql.raw(stmt)));\n }\n statementToBatch.push(\n db.run(\n sql`INSERT INTO ${sql.identifier(migrationsTable)} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`\n )\n );\n }\n }\n await db.session.migrate(statementToBatch);\n}\nexport {\n migrate\n};\n//# sourceMappingURL=migrator.js.map",
|
|
127
|
-
"/**\n * Session Manager\n * Manage chat sessions for headless mode\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { ProviderId } from '../config/ai-config.js';\nimport type { Session } from '../types/session.types.js';\n\nexport type { Session } from '../types/session.types.js';\n\nconst SESSION_DIR = join(homedir(), '.sylphx', 'sessions');\nconst LAST_SESSION_FILE = join(SESSION_DIR, '.last-session');\n\n/**\n * Ensure session directory exists\n */\nasync function ensureSessionDir(): Promise<void> {\n await mkdir(SESSION_DIR, { recursive: true });\n}\n\n/**\n * Get session file path\n */\nfunction getSessionPath(sessionId: string): string {\n return join(SESSION_DIR, `${sessionId}.json`);\n}\n\n/**\n * Create new session\n */\nexport async function createSession(provider: ProviderId, model: string): Promise<Session> {\n await ensureSessionDir();\n\n const session: Session = {\n id: `session-${Date.now()}`,\n provider,\n model,\n messages: [],\n todos: [], // Initialize empty todos\n nextTodoId: 1, // Start from 1\n created: Date.now(),\n updated: Date.now(),\n };\n\n await saveSession(session);\n await setLastSession(session.id);\n\n return session;\n}\n\n/**\n * Save session to file\n */\nexport async function saveSession(session: Session): Promise<void> {\n await ensureSessionDir();\n // Create a new object with updated timestamp (don't mutate readonly session from Zustand)\n const sessionToSave = {\n ...session,\n updated: Date.now(),\n };\n const path = getSessionPath(session.id);\n // Use compact JSON format for faster serialization and smaller file size\n await writeFile(path, JSON.stringify(sessionToSave), 'utf8');\n}\n\n/**\n * Load session from file with migration support\n * Automatically adds missing fields from newer schema versions\n */\nexport async function loadSession(sessionId: string): Promise<Session | null> {\n try {\n const path = getSessionPath(sessionId);\n const content = await readFile(path, 'utf8');\n const rawSession = JSON.parse(content) as any;\n\n // Migration: Add todos/nextTodoId if missing\n if (!rawSession.todos) {\n rawSession.todos = [];\n }\n if (typeof rawSession.nextTodoId !== 'number') {\n rawSession.nextTodoId = 1;\n }\n\n // Migration: Normalize message content format\n // Old: { content: string }\n // New: { content: MessagePart[] }\n if (Array.isArray(rawSession.messages)) {\n rawSession.messages = rawSession.messages.map((msg: any) => {\n if (typeof msg.content === 'string') {\n return {\n ...msg,\n content: [{ type: 'text', content: msg.content }],\n };\n }\n return msg;\n });\n }\n\n return rawSession as Session;\n } catch {\n return null;\n }\n}\n\n/**\n * Get last session ID\n */\nexport async function getLastSessionId(): Promise<string | null> {\n try {\n const content = await readFile(LAST_SESSION_FILE, 'utf8');\n return content.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Set last session ID\n */\nexport async function setLastSession(sessionId: string): Promise<void> {\n await ensureSessionDir();\n await writeFile(LAST_SESSION_FILE, sessionId, 'utf8');\n}\n\n/**\n * Load last session\n */\nexport async function loadLastSession(): Promise<Session | null> {\n const sessionId = await getLastSessionId();\n if (!sessionId) return null;\n return loadSession(sessionId);\n}\n\n/**\n * Add message to session (in-memory helper for headless mode)\n * Converts string content to MessagePart[] format\n */\nexport function addMessage(\n session: Session,\n role: 'user' | 'assistant',\n content: string\n): Session {\n return {\n ...session,\n messages: [\n ...session.messages,\n {\n role,\n content: [{ type: 'text', content }], // Convert to MessagePart[]\n timestamp: Date.now(),\n },\n ],\n };\n}\n\n/**\n * Clear session messages but keep metadata\n */\nexport function clearSessionMessages(session: Session): Session {\n return {\n ...session,\n messages: [],\n updated: Date.now(),\n };\n}\n"
|
|
128
|
-
],
|
|
129
|
-
"mappings": "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",
|
|
130
|
-
"debugId": "FF7D5F25812F12A764756E2164756E21",
|
|
131
|
-
"names": []
|
|
132
|
-
}
|