purecontext-mcp 1.5.2 → 1.11.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/AGENT_INSTRUCTIONS.md +18 -10
- package/AGENT_REFERENCE.md +684 -561
- package/CHANGELOG.md +567 -445
- package/CODE-HISTORY.md +29 -1
- package/FRAMEWORK-ADAPTERS.md +368 -351
- package/FULL-INSTALLATION-GUIDE.md +351 -341
- package/README.md +411 -339
- package/REFACTORING-SAFELY.md +338 -279
- package/SAFE-CHANGES.md +208 -156
- package/USER-GUIDE.md +3 -1
- package/WHY-PURECONTEXT.md +103 -73
- package/WORKFLOW-PR-REVIEW.md +245 -199
- package/dist/adapters/astro-preprocessor.d.ts +25 -0
- package/dist/adapters/astro-preprocessor.d.ts.map +1 -0
- package/dist/adapters/astro-preprocessor.js +50 -0
- package/dist/adapters/astro-preprocessor.js.map +1 -0
- package/dist/adapters/astro.d.ts +13 -0
- package/dist/adapters/astro.d.ts.map +1 -0
- package/dist/adapters/astro.js +83 -0
- package/dist/adapters/astro.js.map +1 -0
- package/dist/adapters/detect-utils.d.ts +38 -0
- package/dist/adapters/detect-utils.d.ts.map +1 -0
- package/dist/adapters/detect-utils.js +95 -0
- package/dist/adapters/detect-utils.js.map +1 -0
- package/dist/adapters/nuxt.d.ts +20 -0
- package/dist/adapters/nuxt.d.ts.map +1 -1
- package/dist/adapters/nuxt.js +128 -13
- package/dist/adapters/nuxt.js.map +1 -1
- package/dist/adapters/svelte-preprocessor.d.ts +29 -0
- package/dist/adapters/svelte-preprocessor.d.ts.map +1 -0
- package/dist/adapters/svelte-preprocessor.js +83 -0
- package/dist/adapters/svelte-preprocessor.js.map +1 -0
- package/dist/adapters/svelte.d.ts +13 -0
- package/dist/adapters/svelte.d.ts.map +1 -0
- package/dist/adapters/svelte.js +96 -0
- package/dist/adapters/svelte.js.map +1 -0
- package/dist/adapters/vue.d.ts.map +1 -1
- package/dist/adapters/vue.js +87 -20
- package/dist/adapters/vue.js.map +1 -1
- package/dist/bin.d.ts +16 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +21 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/hooks.d.ts +2 -2
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +123 -135
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/install-writers.d.ts.map +1 -1
- package/dist/cli/install-writers.js +281 -36
- package/dist/cli/install-writers.js.map +1 -1
- package/dist/cli/resolve-node.d.ts +53 -0
- package/dist/cli/resolve-node.d.ts.map +1 -0
- package/dist/cli/resolve-node.js +84 -0
- package/dist/cli/resolve-node.js.map +1 -0
- package/dist/config/config-loader.js +24 -0
- package/dist/config/config-loader.js.map +1 -1
- package/dist/config/config-schema.d.ts +71 -0
- package/dist/config/config-schema.d.ts.map +1 -1
- package/dist/config/config-schema.js +102 -0
- package/dist/config/config-schema.js.map +1 -1
- package/dist/core/db/api-keys.d.ts +1 -1
- package/dist/core/db/api-keys.d.ts.map +1 -1
- package/dist/core/db/api-keys.js +39 -39
- package/dist/core/db/api-keys.js.map +1 -1
- package/dist/core/db/co-change-store.d.ts +34 -0
- package/dist/core/db/co-change-store.d.ts.map +1 -0
- package/dist/core/db/co-change-store.js +78 -0
- package/dist/core/db/co-change-store.js.map +1 -0
- package/dist/core/db/schema.d.ts +3 -3
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +12 -30
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/db/sqlite-loader.d.ts +51 -0
- package/dist/core/db/sqlite-loader.d.ts.map +1 -0
- package/dist/core/db/sqlite-loader.js +94 -0
- package/dist/core/db/sqlite-loader.js.map +1 -0
- package/dist/core/db/wasm-sqlite.d.ts +4 -0
- package/dist/core/db/wasm-sqlite.d.ts.map +1 -0
- package/dist/core/db/wasm-sqlite.js +270 -0
- package/dist/core/db/wasm-sqlite.js.map +1 -0
- package/dist/core/diff-parser.d.ts.map +1 -1
- package/dist/core/diff-parser.js +6 -1
- package/dist/core/diff-parser.js.map +1 -1
- package/dist/core/git-log-reader.d.ts +28 -0
- package/dist/core/git-log-reader.d.ts.map +1 -1
- package/dist/core/git-log-reader.js +74 -3
- package/dist/core/git-log-reader.js.map +1 -1
- package/dist/core/index-manager.d.ts.map +1 -1
- package/dist/core/index-manager.js +29 -3
- package/dist/core/index-manager.js.map +1 -1
- package/dist/core/indexing-worker.d.ts +2 -0
- package/dist/core/indexing-worker.d.ts.map +1 -1
- package/dist/core/indexing-worker.js +2 -0
- package/dist/core/indexing-worker.js.map +1 -1
- package/dist/core/watcher/file-watcher.d.ts +6 -0
- package/dist/core/watcher/file-watcher.d.ts.map +1 -1
- package/dist/core/watcher/file-watcher.js +11 -1
- package/dist/core/watcher/file-watcher.js.map +1 -1
- package/dist/graph/path-resolver.js +86 -17
- package/dist/graph/path-resolver.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/node-guard.d.ts +15 -0
- package/dist/node-guard.d.ts.map +1 -0
- package/dist/node-guard.js +33 -0
- package/dist/node-guard.js.map +1 -0
- package/dist/server/admin-api.d.ts +1 -1
- package/dist/server/admin-api.d.ts.map +1 -1
- package/dist/server/admin-api.js +2 -2
- package/dist/server/admin-api.js.map +1 -1
- package/dist/server/auth/api-key.d.ts +1 -1
- package/dist/server/auth/api-key.d.ts.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +25 -0
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/analyze-diff.d.ts +8 -0
- package/dist/server/tools/analyze-diff.d.ts.map +1 -1
- package/dist/server/tools/analyze-diff.js +80 -16
- package/dist/server/tools/analyze-diff.js.map +1 -1
- package/dist/server/tools/change-synthesis.d.ts +90 -0
- package/dist/server/tools/change-synthesis.d.ts.map +1 -0
- package/dist/server/tools/change-synthesis.js +236 -0
- package/dist/server/tools/change-synthesis.js.map +1 -0
- package/dist/server/tools/co-change.d.ts +65 -0
- package/dist/server/tools/co-change.d.ts.map +1 -0
- package/dist/server/tools/co-change.js +146 -0
- package/dist/server/tools/co-change.js.map +1 -0
- package/dist/server/tools/compare-change-impact.d.ts +58 -0
- package/dist/server/tools/compare-change-impact.d.ts.map +1 -0
- package/dist/server/tools/compare-change-impact.js +0 -0
- package/dist/server/tools/compare-change-impact.js.map +1 -0
- package/dist/server/tools/find-refactoring-opportunities.d.ts +1 -1
- package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -1
- package/dist/server/tools/get-architecture-snapshot.js +28 -14
- package/dist/server/tools/get-architecture-snapshot.js.map +1 -1
- package/dist/server/tools/get-churn-metrics.d.ts.map +1 -1
- package/dist/server/tools/get-churn-metrics.js +1 -12
- package/dist/server/tools/get-churn-metrics.js.map +1 -1
- package/dist/server/tools/get-co-change.d.ts +37 -0
- package/dist/server/tools/get-co-change.d.ts.map +1 -0
- package/dist/server/tools/get-co-change.js +120 -0
- package/dist/server/tools/get-co-change.js.map +1 -0
- package/dist/server/tools/get-context-bundle.d.ts.map +1 -1
- package/dist/server/tools/get-context-bundle.js +56 -3
- package/dist/server/tools/get-context-bundle.js.map +1 -1
- package/dist/server/tools/get-entry-points.d.ts +1 -1
- package/dist/server/tools/get-symbol-risk.d.ts +25 -0
- package/dist/server/tools/get-symbol-risk.d.ts.map +1 -0
- package/dist/server/tools/get-symbol-risk.js +60 -0
- package/dist/server/tools/get-symbol-risk.js.map +1 -0
- package/dist/server/tools/get-symbol-source.d.ts +2 -0
- package/dist/server/tools/get-symbol-source.d.ts.map +1 -1
- package/dist/server/tools/get-symbol-source.js +18 -1
- package/dist/server/tools/get-symbol-source.js.map +1 -1
- package/dist/server/tools/index-repo.d.ts.map +1 -1
- package/dist/server/tools/index-repo.js +8 -2
- package/dist/server/tools/index-repo.js.map +1 -1
- package/dist/server/tools/prepare-change.d.ts +61 -0
- package/dist/server/tools/prepare-change.d.ts.map +1 -0
- package/dist/server/tools/prepare-change.js +262 -0
- package/dist/server/tools/prepare-change.js.map +1 -0
- package/dist/server/tools/search-symbols.d.ts +2 -0
- package/dist/server/tools/search-symbols.d.ts.map +1 -1
- package/dist/server/tools/search-symbols.js +33 -0
- package/dist/server/tools/search-symbols.js.map +1 -1
- package/dist/server/tools/symbol-lines.d.ts +25 -0
- package/dist/server/tools/symbol-lines.d.ts.map +1 -0
- package/dist/server/tools/symbol-lines.js +40 -0
- package/dist/server/tools/symbol-lines.js.map +1 -0
- package/dist/server/tools/symbol-risk.d.ts +109 -0
- package/dist/server/tools/symbol-risk.d.ts.map +1 -0
- package/dist/server/tools/symbol-risk.js +251 -0
- package/dist/server/tools/symbol-risk.js.map +1 -0
- package/dist/server/tools/verify-change.d.ts +40 -0
- package/dist/server/tools/verify-change.d.ts.map +1 -0
- package/dist/server/tools/verify-change.js +149 -0
- package/dist/server/tools/verify-change.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/01-introduction.md +2 -2
- package/docs/02-installation.md +97 -89
- package/docs/03-quick-start.md +138 -135
- package/docs/04-configuration.md +247 -214
- package/docs/05-cli-reference.md +236 -219
- package/docs/06-tools-reference.md +902 -499
- package/docs/14-transport-modes.md +170 -167
- package/docs/18-git-history.md +43 -0
- package/docs/23-performance.md +123 -121
- package/docs/26-troubleshooting.md +249 -234
- package/grammars/README.md +88 -0
- package/package.json +7 -25
- package/AGENT_INSTRUCTIONS_SHORT.md +0 -150
package/dist/core/db/schema.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RepoMetadata } from '../types.js';
|
|
2
|
-
import type
|
|
3
|
-
type DatabaseConstructor =
|
|
4
|
-
export declare const SCHEMA_VERSION =
|
|
2
|
+
import { type SqliteDatabase } from './sqlite-loader.js';
|
|
3
|
+
type DatabaseConstructor = new (filename: string) => SqliteDatabase;
|
|
4
|
+
export declare const SCHEMA_VERSION = 8;
|
|
5
5
|
export declare function computeRepoId(absolutePath: string): string;
|
|
6
6
|
export declare function getIndexDir(): string;
|
|
7
7
|
export declare function openDatabase(repoId: string, indexDir?: string): InstanceType<DatabaseConstructor>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAO3E,KAAK,mBAAmB,GAAG,KAAK,QAAQ,EAAE,MAAM,KAAK,cAAc,CAAC;AAEpE,eAAO,MAAM,cAAc,IAAI,CAAC;AA+HhC,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAMjG;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAIxE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAY9E;AAoLD,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAwB1F;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKlG;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,GAAG,YAAY,EAAE,CAE/E;AAgCD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,EACrC,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAKf"}
|
package/dist/core/db/schema.js
CHANGED
|
@@ -1,34 +1,11 @@
|
|
|
1
|
-
import { createRequire } from 'module';
|
|
2
1
|
import { createHash } from 'crypto';
|
|
3
2
|
import { mkdirSync } from 'fs';
|
|
4
3
|
import { homedir } from 'os';
|
|
5
4
|
import { join } from 'path';
|
|
6
5
|
import { EMBEDDINGS_DDL } from './embedding-store.js';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// NativeDependencyError (with an actionable user message) rather than an
|
|
11
|
-
// opaque module-load crash.
|
|
12
|
-
const _require = createRequire(import.meta.url);
|
|
13
|
-
let _Database = null;
|
|
14
|
-
let _dbLoadError = null;
|
|
15
|
-
let _dbLoaded = false;
|
|
16
|
-
function getDatabase() {
|
|
17
|
-
if (!_dbLoaded) {
|
|
18
|
-
try {
|
|
19
|
-
_Database = _require('better-sqlite3');
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
_dbLoadError = err;
|
|
23
|
-
}
|
|
24
|
-
_dbLoaded = true;
|
|
25
|
-
}
|
|
26
|
-
if (_dbLoadError !== null || _Database === null) {
|
|
27
|
-
throw new NativeDependencyError(_dbLoadError);
|
|
28
|
-
}
|
|
29
|
-
return _Database;
|
|
30
|
-
}
|
|
31
|
-
export const SCHEMA_VERSION = 7;
|
|
6
|
+
import { CO_CHANGE_DDL } from './co-change-store.js';
|
|
7
|
+
import { getSqliteFactory } from './sqlite-loader.js';
|
|
8
|
+
export const SCHEMA_VERSION = 8;
|
|
32
9
|
const DDL = `
|
|
33
10
|
PRAGMA journal_mode = WAL;
|
|
34
11
|
PRAGMA foreign_keys = ON;
|
|
@@ -162,22 +139,21 @@ export function getIndexDir() {
|
|
|
162
139
|
return join(homedir(), '.purecontext', 'indexes');
|
|
163
140
|
}
|
|
164
141
|
export function openDatabase(repoId, indexDir) {
|
|
165
|
-
const DB = getDatabase();
|
|
166
142
|
const dir = indexDir ?? getIndexDir();
|
|
167
143
|
mkdirSync(dir, { recursive: true });
|
|
168
|
-
const db =
|
|
144
|
+
const db = getSqliteFactory().open(join(dir, `${repoId}.db`));
|
|
169
145
|
initializeDatabase(db);
|
|
170
146
|
return db;
|
|
171
147
|
}
|
|
172
148
|
export function openInMemoryDatabase() {
|
|
173
|
-
const
|
|
174
|
-
const db = new DB(':memory:');
|
|
149
|
+
const db = getSqliteFactory().open(':memory:');
|
|
175
150
|
initializeDatabase(db);
|
|
176
151
|
return db;
|
|
177
152
|
}
|
|
178
153
|
export function initializeDatabase(db) {
|
|
179
154
|
db.exec(DDL);
|
|
180
155
|
db.exec(EMBEDDINGS_DDL);
|
|
156
|
+
db.exec(CO_CHANGE_DDL);
|
|
181
157
|
runMigrations(db);
|
|
182
158
|
// Ensure source column exists — added after v7, using try-catch for existing DBs
|
|
183
159
|
// (SQLite does not support ALTER TABLE ... ADD COLUMN IF NOT EXISTS)
|
|
@@ -336,6 +312,12 @@ function runMigrations(db) {
|
|
|
336
312
|
db.exec('ALTER TABLE symbols ADD COLUMN nesting_depth INTEGER');
|
|
337
313
|
}
|
|
338
314
|
}
|
|
315
|
+
// Migration v7 → v8: add commit_files table for repo-level co-change capture.
|
|
316
|
+
// Additive — the table is created by CO_CHANGE_DDL (IF NOT EXISTS) in
|
|
317
|
+
// initializeDatabase; old indexes load without re-indexing.
|
|
318
|
+
if (dbVersion < 8) {
|
|
319
|
+
db.exec(CO_CHANGE_DDL);
|
|
320
|
+
}
|
|
339
321
|
}
|
|
340
322
|
// ─── Repo operations ──────────────────────────────────────────────────────────
|
|
341
323
|
export function upsertRepo(db, meta) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type BetterSqlite3 from 'better-sqlite3';
|
|
2
|
+
/**
|
|
3
|
+
* SQLite backend loader.
|
|
4
|
+
*
|
|
5
|
+
* PureContext stores its index in SQLite. The default engine is the native
|
|
6
|
+
* `better-sqlite3` addon, which is fast but ABI-bound: a prebuilt binary only
|
|
7
|
+
* loads under the Node version (NODE_MODULE_VERSION) it was built for. We ship
|
|
8
|
+
* prebuilds for Node 18/20/22, so on any other Node — or if the prebuild fails
|
|
9
|
+
* to load for any reason — we fall back to a pure-WASM SQLite build that is
|
|
10
|
+
* ABI-independent and runs on any Node >= 18.
|
|
11
|
+
*
|
|
12
|
+
* Tiers (best first):
|
|
13
|
+
* 1. better-sqlite3 — native, fastest, when a matching prebuild loads
|
|
14
|
+
* 2. @sqlite.org/sqlite-wasm — WASM fallback, FTS5-capable, any Node/ABI
|
|
15
|
+
*
|
|
16
|
+
* The WASM engine needs async initialisation, so call `initSqliteBackend()`
|
|
17
|
+
* once during startup (bootstrap). After that, `getSqliteFactory()` is sync and
|
|
18
|
+
* usable from any code path. The returned databases are structurally
|
|
19
|
+
* compatible with the subset of the better-sqlite3 API the codebase uses, so
|
|
20
|
+
* call sites keep their `Database.Database` types unchanged.
|
|
21
|
+
*/
|
|
22
|
+
export type SqliteDatabase = BetterSqlite3.Database;
|
|
23
|
+
export type SqliteBackendKind = 'better-sqlite3' | 'wasm';
|
|
24
|
+
export interface SqliteOpenOptions {
|
|
25
|
+
/** Open the database read-only (no writes / no persistence flush). */
|
|
26
|
+
readonly?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface SqliteFactory {
|
|
29
|
+
/** Open (or create) a database at `filename`, or an in-memory DB for ':memory:'. */
|
|
30
|
+
open(filename: string, options?: SqliteOpenOptions): SqliteDatabase;
|
|
31
|
+
/** Which engine backs this factory — for diagnostics/telemetry. */
|
|
32
|
+
readonly backend: SqliteBackendKind;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Initialise the SQLite backend, selecting the best available engine. Call once
|
|
36
|
+
* during startup. Safe to call multiple times (memoised). Async because the
|
|
37
|
+
* WASM fallback requires async module init.
|
|
38
|
+
*/
|
|
39
|
+
export declare function initSqliteBackend(): Promise<SqliteFactory>;
|
|
40
|
+
/**
|
|
41
|
+
* Get the selected SQLite factory. If `initSqliteBackend()` has not run yet,
|
|
42
|
+
* this performs a synchronous native-only init (back-compat for code paths that
|
|
43
|
+
* open a database before bootstrap). The WASM fallback is only reachable via
|
|
44
|
+
* the async `initSqliteBackend()`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getSqliteFactory(): SqliteFactory;
|
|
47
|
+
/** Test-only: inject a specific factory (e.g. force WASM) without env/global state. */
|
|
48
|
+
export declare function _setSqliteFactoryForTests(factory: SqliteFactory): void;
|
|
49
|
+
/** Test-only: reset memoised state so a different backend can be selected. */
|
|
50
|
+
export declare function _resetSqliteBackendForTests(): void;
|
|
51
|
+
//# sourceMappingURL=sqlite-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-loader.d.ts","sourceRoot":"","sources":["../../../src/core/db/sqlite-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC;IACpE,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AA0CD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAsBhE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAehD;AAED,uFAAuF;AACvF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAEtE;AAED,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createRequire } from 'module';
|
|
2
|
+
import { NativeDependencyError } from '../errors.js';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
const _require = createRequire(import.meta.url);
|
|
5
|
+
let _factory = null;
|
|
6
|
+
let _lastLoadError = null;
|
|
7
|
+
// ─── Tier 1: native better-sqlite3 ──────────────────────────────────────────
|
|
8
|
+
function tryLoadNative() {
|
|
9
|
+
try {
|
|
10
|
+
const Database = _require('better-sqlite3');
|
|
11
|
+
// require() only loads better-sqlite3's JS wrapper; the native .node addon
|
|
12
|
+
// is loaded lazily on the first `new Database()`, which is where an ABI
|
|
13
|
+
// mismatch (wrong NODE_MODULE_VERSION) actually throws. Force that load now
|
|
14
|
+
// with a throwaway in-memory DB so a mismatch surfaces here and we fall
|
|
15
|
+
// back to WASM — rather than committing to native and crashing at open().
|
|
16
|
+
new Database(':memory:').close();
|
|
17
|
+
return {
|
|
18
|
+
backend: 'better-sqlite3',
|
|
19
|
+
open(filename, options) {
|
|
20
|
+
// better-sqlite3 rejects readonly for ':memory:' — only pass it for files.
|
|
21
|
+
if (options?.readonly && filename !== ':memory:') {
|
|
22
|
+
return new Database(filename, { readonly: true });
|
|
23
|
+
}
|
|
24
|
+
return new Database(filename);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
_lastLoadError = err;
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Returns true when the WASM backend is explicitly requested via env. */
|
|
34
|
+
function wasmForced() {
|
|
35
|
+
const v = process.env['PCTX_SQLITE_BACKEND'];
|
|
36
|
+
return v === 'wasm' || process.env['PCTX_FORCE_WASM'] === '1';
|
|
37
|
+
}
|
|
38
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* Initialise the SQLite backend, selecting the best available engine. Call once
|
|
41
|
+
* during startup. Safe to call multiple times (memoised). Async because the
|
|
42
|
+
* WASM fallback requires async module init.
|
|
43
|
+
*/
|
|
44
|
+
export async function initSqliteBackend() {
|
|
45
|
+
if (_factory)
|
|
46
|
+
return _factory;
|
|
47
|
+
// Tier 1 — native (fast path), unless WASM is explicitly forced.
|
|
48
|
+
if (!wasmForced()) {
|
|
49
|
+
const native = tryLoadNative();
|
|
50
|
+
if (native) {
|
|
51
|
+
_factory = native;
|
|
52
|
+
logger.debug('SQLite backend: better-sqlite3 (native)');
|
|
53
|
+
return _factory;
|
|
54
|
+
}
|
|
55
|
+
logger.warn('better-sqlite3 native addon unavailable for this Node version; ' +
|
|
56
|
+
'falling back to WASM SQLite (slower, but ABI-independent)');
|
|
57
|
+
}
|
|
58
|
+
// Tier 2 — WASM fallback. ABI-independent; runs on any Node >= 18.
|
|
59
|
+
const { createWasmFactory } = await import('./wasm-sqlite.js');
|
|
60
|
+
_factory = await createWasmFactory();
|
|
61
|
+
logger.info('SQLite backend: WASM (@sqlite.org/sqlite-wasm)');
|
|
62
|
+
return _factory;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the selected SQLite factory. If `initSqliteBackend()` has not run yet,
|
|
66
|
+
* this performs a synchronous native-only init (back-compat for code paths that
|
|
67
|
+
* open a database before bootstrap). The WASM fallback is only reachable via
|
|
68
|
+
* the async `initSqliteBackend()`.
|
|
69
|
+
*/
|
|
70
|
+
export function getSqliteFactory() {
|
|
71
|
+
if (_factory)
|
|
72
|
+
return _factory;
|
|
73
|
+
// Sync path: native only. The WASM backend needs async init, so if it is
|
|
74
|
+
// forced or native is unavailable, the caller must have run
|
|
75
|
+
// `initSqliteBackend()` first.
|
|
76
|
+
if (!wasmForced()) {
|
|
77
|
+
const native = tryLoadNative();
|
|
78
|
+
if (native) {
|
|
79
|
+
_factory = native;
|
|
80
|
+
return _factory;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
throw new NativeDependencyError(_lastLoadError);
|
|
84
|
+
}
|
|
85
|
+
/** Test-only: inject a specific factory (e.g. force WASM) without env/global state. */
|
|
86
|
+
export function _setSqliteFactoryForTests(factory) {
|
|
87
|
+
_factory = factory;
|
|
88
|
+
}
|
|
89
|
+
/** Test-only: reset memoised state so a different backend can be selected. */
|
|
90
|
+
export function _resetSqliteBackendForTests() {
|
|
91
|
+
_factory = null;
|
|
92
|
+
_lastLoadError = null;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=sqlite-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-loader.js","sourceRoot":"","sources":["../../../src/core/db/sqlite-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-sqlite.d.ts","sourceRoot":"","sources":["../../../src/core/db/wasm-sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AAmE3F,yEAAyE;AACzE,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAchE"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { Buffer } from 'node:buffer';
|
|
4
|
+
import { logger } from '../logger.js';
|
|
5
|
+
let _sqlite3 = null;
|
|
6
|
+
/** Initialise the wasm module once and return a factory backed by it. */
|
|
7
|
+
export async function createWasmFactory() {
|
|
8
|
+
if (!_sqlite3) {
|
|
9
|
+
const mod = (await import('@sqlite.org/sqlite-wasm'));
|
|
10
|
+
_sqlite3 = await mod.default();
|
|
11
|
+
}
|
|
12
|
+
const sqlite3 = _sqlite3;
|
|
13
|
+
return {
|
|
14
|
+
backend: 'wasm',
|
|
15
|
+
open(filename, options) {
|
|
16
|
+
return new WasmDatabase(sqlite3, filename, options?.readonly ?? false);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// ─── Value conversion ─────────────────────────────────────────────────────────
|
|
21
|
+
function isNamedBindObject(args) {
|
|
22
|
+
if (args.length !== 1)
|
|
23
|
+
return false;
|
|
24
|
+
const v = args[0];
|
|
25
|
+
return (typeof v === 'object' &&
|
|
26
|
+
v !== null &&
|
|
27
|
+
!Array.isArray(v) &&
|
|
28
|
+
!ArrayBuffer.isView(v) // excludes Buffer / Uint8Array / typed arrays
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
/** Normalise a value for binding (mirror better-sqlite3 leniency we rely on). */
|
|
32
|
+
function normIn(value) {
|
|
33
|
+
if (value === undefined)
|
|
34
|
+
return null;
|
|
35
|
+
if (typeof value === 'boolean')
|
|
36
|
+
return value ? 1 : 0;
|
|
37
|
+
// Buffer is a Uint8Array subclass; sqlite-wasm binds Uint8Array as a BLOB.
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
/** Convert an out value: BLOBs come back as Uint8Array; expose as Buffer. */
|
|
41
|
+
function normOut(value) {
|
|
42
|
+
if (value instanceof Uint8Array)
|
|
43
|
+
return Buffer.from(value);
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
// ─── Statement wrapper ──────────────────────────────────────────────────────
|
|
47
|
+
class WasmStatement {
|
|
48
|
+
owner;
|
|
49
|
+
sql;
|
|
50
|
+
stmt = null;
|
|
51
|
+
/** Cached 1-based bind index -> object key for named params; null until compiled. */
|
|
52
|
+
namedPlan = null;
|
|
53
|
+
columnNames = null;
|
|
54
|
+
constructor(owner, sql) {
|
|
55
|
+
this.owner = owner;
|
|
56
|
+
this.sql = sql;
|
|
57
|
+
}
|
|
58
|
+
compile() {
|
|
59
|
+
if (!this.stmt) {
|
|
60
|
+
this.stmt = this.owner.rawDb.prepare(this.sql);
|
|
61
|
+
this.owner.trackStatement(this.stmt);
|
|
62
|
+
const capi = this.owner.sqlite3.capi;
|
|
63
|
+
const count = capi.sqlite3_bind_parameter_count(this.stmt.pointer);
|
|
64
|
+
const plan = [];
|
|
65
|
+
for (let i = 1; i <= count; i++) {
|
|
66
|
+
const name = capi.sqlite3_bind_parameter_name(this.stmt.pointer, i);
|
|
67
|
+
// name is like "@id"/":id"/"$id" for named params, null for positional "?"
|
|
68
|
+
if (name)
|
|
69
|
+
plan.push({ index: i, key: name.slice(1) });
|
|
70
|
+
}
|
|
71
|
+
this.namedPlan = plan;
|
|
72
|
+
}
|
|
73
|
+
return this.stmt;
|
|
74
|
+
}
|
|
75
|
+
bindArgs(stmt, args) {
|
|
76
|
+
if (isNamedBindObject(args)) {
|
|
77
|
+
const obj = args[0];
|
|
78
|
+
for (const { index, key } of this.namedPlan ?? []) {
|
|
79
|
+
stmt.bind(index, normIn(obj[key]));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
for (let i = 0; i < args.length; i++)
|
|
84
|
+
stmt.bind(i + 1, normIn(args[i]));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
readRow(stmt) {
|
|
88
|
+
if (!this.columnNames)
|
|
89
|
+
this.columnNames = stmt.getColumnNames();
|
|
90
|
+
const row = {};
|
|
91
|
+
for (let i = 0; i < this.columnNames.length; i++) {
|
|
92
|
+
row[this.columnNames[i]] = normOut(stmt.get(i));
|
|
93
|
+
}
|
|
94
|
+
return row;
|
|
95
|
+
}
|
|
96
|
+
run(...args) {
|
|
97
|
+
const stmt = this.compile();
|
|
98
|
+
try {
|
|
99
|
+
this.bindArgs(stmt, args);
|
|
100
|
+
stmt.step();
|
|
101
|
+
const changes = this.owner.rawDb.changes();
|
|
102
|
+
const lastInsertRowid = this.owner.sqlite3.capi.sqlite3_last_insert_rowid(this.owner.rawDb.pointer);
|
|
103
|
+
this.owner.markDirty();
|
|
104
|
+
return { changes: Number(changes), lastInsertRowid };
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
stmt.reset(true);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
get(...args) {
|
|
111
|
+
const stmt = this.compile();
|
|
112
|
+
try {
|
|
113
|
+
this.bindArgs(stmt, args);
|
|
114
|
+
if (!stmt.step())
|
|
115
|
+
return undefined;
|
|
116
|
+
return this.readRow(stmt);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
stmt.reset(true);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
all(...args) {
|
|
123
|
+
const stmt = this.compile();
|
|
124
|
+
try {
|
|
125
|
+
this.bindArgs(stmt, args);
|
|
126
|
+
const rows = [];
|
|
127
|
+
while (stmt.step())
|
|
128
|
+
rows.push(this.readRow(stmt));
|
|
129
|
+
return rows;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
stmt.reset(true);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// ─── Database wrapper ─────────────────────────────────────────────────────────
|
|
137
|
+
class WasmDatabase {
|
|
138
|
+
sqlite3;
|
|
139
|
+
filename;
|
|
140
|
+
readonly_;
|
|
141
|
+
rawDb;
|
|
142
|
+
persistent;
|
|
143
|
+
statements = new Set();
|
|
144
|
+
dirty = false;
|
|
145
|
+
txnDepth = 0;
|
|
146
|
+
flushTimer = null;
|
|
147
|
+
closed = false;
|
|
148
|
+
constructor(sqlite3, filename, readonly_) {
|
|
149
|
+
this.sqlite3 = sqlite3;
|
|
150
|
+
this.filename = filename;
|
|
151
|
+
this.readonly_ = readonly_;
|
|
152
|
+
this.persistent = !!filename && filename !== ':memory:';
|
|
153
|
+
this.rawDb = new sqlite3.oo1.DB(':memory:');
|
|
154
|
+
if (this.persistent && existsSync(filename) && statSync(filename).size > 0) {
|
|
155
|
+
this.deserializeFrom(readFileSync(filename));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
deserializeFrom(buf) {
|
|
159
|
+
const { capi, wasm } = this.sqlite3;
|
|
160
|
+
// allocFromTypedArray needs a plain Uint8Array — a Node Buffer (a Uint8Array
|
|
161
|
+
// subclass) trips its element-size detection. Copy into a clean Uint8Array.
|
|
162
|
+
const bytes = Uint8Array.from(buf);
|
|
163
|
+
const ptr = wasm.allocFromTypedArray(bytes);
|
|
164
|
+
const flags = (capi.SQLITE_DESERIALIZE_FREEONCLOSE ?? 1) | (capi.SQLITE_DESERIALIZE_RESIZEABLE ?? 2);
|
|
165
|
+
const rc = capi.sqlite3_deserialize(this.rawDb.pointer, 'main', ptr, bytes.length, bytes.length, flags);
|
|
166
|
+
if (rc !== 0) {
|
|
167
|
+
wasm.dealloc(ptr);
|
|
168
|
+
throw new Error(`sqlite3_deserialize failed (rc=${rc}) for ${this.filename}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
prepare(sql) {
|
|
172
|
+
return new WasmStatement(this, sql);
|
|
173
|
+
}
|
|
174
|
+
exec(sql) {
|
|
175
|
+
this.rawDb.exec(sql);
|
|
176
|
+
this.markDirty();
|
|
177
|
+
return this;
|
|
178
|
+
}
|
|
179
|
+
// better-sqlite3-compatible transaction: returns a callable that runs `fn`
|
|
180
|
+
// inside a transaction (savepoints for nesting), passing through args/return.
|
|
181
|
+
transaction(fn) {
|
|
182
|
+
return (...args) => {
|
|
183
|
+
const depth = this.txnDepth;
|
|
184
|
+
const savepoint = `_pc_sp_${depth}`;
|
|
185
|
+
this.rawDb.exec(depth === 0 ? 'BEGIN' : `SAVEPOINT ${savepoint}`);
|
|
186
|
+
this.txnDepth++;
|
|
187
|
+
try {
|
|
188
|
+
const result = fn(...args);
|
|
189
|
+
this.rawDb.exec(depth === 0 ? 'COMMIT' : `RELEASE ${savepoint}`);
|
|
190
|
+
this.markDirty();
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
try {
|
|
195
|
+
this.rawDb.exec(depth === 0 ? 'ROLLBACK' : `ROLLBACK TO ${savepoint}; RELEASE ${savepoint}`);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// best-effort rollback
|
|
199
|
+
}
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
this.txnDepth--;
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// Pragmas are issued via the DDL strings (exec); provide a minimal method for
|
|
208
|
+
// API compatibility. Returns [] since no caller reads pragma results.
|
|
209
|
+
pragma(source) {
|
|
210
|
+
this.rawDb.exec(`PRAGMA ${source}`);
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
close() {
|
|
214
|
+
if (this.closed)
|
|
215
|
+
return;
|
|
216
|
+
this.closed = true;
|
|
217
|
+
if (this.flushTimer) {
|
|
218
|
+
clearTimeout(this.flushTimer);
|
|
219
|
+
this.flushTimer = null;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
this.flush();
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
for (const stmt of this.statements) {
|
|
226
|
+
try {
|
|
227
|
+
stmt.finalize();
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// ignore
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
this.statements.clear();
|
|
234
|
+
this.rawDb.close();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ── internal ──────────────────────────────────────────────────────────────
|
|
238
|
+
trackStatement(stmt) {
|
|
239
|
+
this.statements.add(stmt);
|
|
240
|
+
}
|
|
241
|
+
markDirty() {
|
|
242
|
+
if (!this.persistent || this.readonly_ || this.closed)
|
|
243
|
+
return;
|
|
244
|
+
this.dirty = true;
|
|
245
|
+
if (!this.flushTimer) {
|
|
246
|
+
this.flushTimer = setTimeout(() => {
|
|
247
|
+
this.flushTimer = null;
|
|
248
|
+
try {
|
|
249
|
+
this.flush();
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
logger.warn(`WASM SQLite debounced flush failed: ${err.message}`);
|
|
253
|
+
}
|
|
254
|
+
}, 250);
|
|
255
|
+
// Don't keep the event loop alive solely for a pending flush.
|
|
256
|
+
this.flushTimer.unref?.();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
flush() {
|
|
260
|
+
if (!this.dirty || !this.persistent || this.readonly_)
|
|
261
|
+
return;
|
|
262
|
+
const bytes = this.sqlite3.capi.sqlite3_js_db_export(this.rawDb.pointer);
|
|
263
|
+
mkdirSync(dirname(this.filename), { recursive: true });
|
|
264
|
+
const tmp = `${this.filename}.tmp-${process.pid}`;
|
|
265
|
+
writeFileSync(tmp, Buffer.from(bytes));
|
|
266
|
+
renameSync(tmp, this.filename);
|
|
267
|
+
this.dirty = false;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=wasm-sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-sqlite.js","sourceRoot":"","sources":["../../../src/core/db/wasm-sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-parser.d.ts","sourceRoot":"","sources":["../../src/core/diff-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qDAAqD;IACrD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAYD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"diff-parser.d.ts","sourceRoot":"","sources":["../../src/core/diff-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qDAAqD;IACrD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAYD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CA6FlD;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAM/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EAAE,GAChB,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAKvC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAsCnE"}
|
package/dist/core/diff-parser.js
CHANGED
|
@@ -18,7 +18,12 @@ const DEV_NULL = '/dev/null';
|
|
|
18
18
|
*/
|
|
19
19
|
export function parseDiff(text) {
|
|
20
20
|
const results = [];
|
|
21
|
-
|
|
21
|
+
// Split on CRLF or LF. `git diff` emits LF, but a diff saved to a file (or
|
|
22
|
+
// produced by tooling) on Windows can carry `\r`. Leaving the trailing `\r`
|
|
23
|
+
// on each line breaks the `$`-anchored path regexes below (`.` does not match
|
|
24
|
+
// `\r`, and `$` without the `m` flag does not match the position before it),
|
|
25
|
+
// which would make a CRLF diff parse as zero files.
|
|
26
|
+
const lines = text.split(/\r?\n/);
|
|
22
27
|
let current = null;
|
|
23
28
|
let currentHunk = null;
|
|
24
29
|
// Line cursors that advance as we walk through a hunk.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-parser.js","sourceRoot":"","sources":["../../src/core/diff-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmCH,iFAAiF;AAEjF,MAAM,OAAO,GAAG,6CAA6C,CAAC;AAC9D,kEAAkE;AAClE,MAAM,WAAW,GAAG,oBAAoB,CAAC;AACzC,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"diff-parser.js","sourceRoot":"","sources":["../../src/core/diff-parser.ts"],"names":[],"mappings":"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"}
|