@framers/sql-storage-adapter 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/core/contracts/features.d.ts.map +1 -1
- package/dist/core/contracts/features.js +20 -1
- package/dist/core/contracts/features.js.map +1 -1
- package/dist/fts/PostgresFts.d.ts +2 -1
- package/dist/fts/PostgresFts.d.ts.map +1 -1
- package/dist/fts/PostgresFts.js +10 -6
- package/dist/fts/PostgresFts.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -496,6 +496,8 @@ await exporter.exportToFile('/backups/snapshot.db');
|
|
|
496
496
|
const bytes = await exporter.exportToBytes();
|
|
497
497
|
```
|
|
498
498
|
|
|
499
|
+
On Postgres, `features.exporter` requires a Node runtime plus an adapter that was created with a connection string in `adapter.options.connectionString`, since `pg_dump` runs out-of-process.
|
|
500
|
+
|
|
499
501
|
## CI, Releases, and Badges
|
|
500
502
|
|
|
501
503
|
- GitHub Actions workflows:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../src/core/contracts/features.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../src/core/contracts/features.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmCjD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CAa9E"}
|
|
@@ -6,6 +6,22 @@ import { NodeBlobCodec } from '../../codecs/NodeBlobCodec.js';
|
|
|
6
6
|
import { BrowserBlobCodec } from '../../codecs/BrowserBlobCodec.js';
|
|
7
7
|
import { SqliteFileExporter } from '../../exporters/SqliteFileExporter.js';
|
|
8
8
|
import { PostgresExporter } from '../../exporters/PostgresExporter.js';
|
|
9
|
+
function extractPostgresConnectionString(adapter) {
|
|
10
|
+
const options = adapter.options;
|
|
11
|
+
if (!options)
|
|
12
|
+
return undefined;
|
|
13
|
+
if (options.connectionString)
|
|
14
|
+
return options.connectionString;
|
|
15
|
+
if (!options.database)
|
|
16
|
+
return undefined;
|
|
17
|
+
const host = options.host ?? 'localhost';
|
|
18
|
+
const port = options.port ?? 5432;
|
|
19
|
+
const user = options.user ? encodeURIComponent(options.user) : '';
|
|
20
|
+
const password = options.password ? `:${encodeURIComponent(options.password)}` : '';
|
|
21
|
+
const auth = user ? `${user}${password}@` : '';
|
|
22
|
+
const sslQuery = options.ssl ? '?sslmode=require' : '';
|
|
23
|
+
return `postgresql://${auth}${host}:${port}/${options.database}${sslQuery}`;
|
|
24
|
+
}
|
|
9
25
|
/**
|
|
10
26
|
* Create a platform-aware feature bundle for the given storage adapter.
|
|
11
27
|
*
|
|
@@ -15,11 +31,14 @@ import { PostgresExporter } from '../../exporters/PostgresExporter.js';
|
|
|
15
31
|
export function createStorageFeatures(adapter) {
|
|
16
32
|
const isPostgres = adapter.kind === 'postgres';
|
|
17
33
|
const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
34
|
+
const postgresConnectionString = isPostgres ? extractPostgresConnectionString(adapter) : undefined;
|
|
18
35
|
return {
|
|
19
36
|
dialect: isPostgres ? new PostgresDialect() : new SqliteDialect(),
|
|
20
37
|
fts: isPostgres ? new PostgresFts() : new SqliteFts5(),
|
|
21
38
|
blobCodec: isBrowser ? new BrowserBlobCodec() : new NodeBlobCodec(),
|
|
22
|
-
exporter: isPostgres
|
|
39
|
+
exporter: isPostgres
|
|
40
|
+
? new PostgresExporter(postgresConnectionString)
|
|
41
|
+
: new SqliteFileExporter(adapter),
|
|
23
42
|
};
|
|
24
43
|
}
|
|
25
44
|
//# sourceMappingURL=features.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/core/contracts/features.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/core/contracts/features.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAYvE,SAAS,+BAA+B,CAAC,OAAuB;IAC9D,MAAM,OAAO,GAAI,OAAqE,CAAC,OAAO,CAAC;IAC/F,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,gBAAgB;QAAE,OAAO,OAAO,CAAC,gBAAgB,CAAC;IAC9D,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO,gBAAgB,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC;AAC9E,CAAC;AAeD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAuB;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;IAC1F,MAAM,wBAAwB,GAAG,UAAU,CAAC,CAAC,CAAC,+BAA+B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnG,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE;QACjE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE;QACtD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE;QACnE,QAAQ,EAAE,UAAU;YAClB,CAAC,CAAC,IAAI,gBAAgB,CAAC,wBAAwB,CAAC;YAChD,CAAC,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -10,6 +10,7 @@ export declare class PostgresFts implements IFullTextSearch {
|
|
|
10
10
|
/** The content table is stored during createIndex for use by other methods. */
|
|
11
11
|
private _contentTable;
|
|
12
12
|
private _columns;
|
|
13
|
+
private _lang;
|
|
13
14
|
createIndex(config: {
|
|
14
15
|
table: string;
|
|
15
16
|
columns: string[];
|
|
@@ -19,7 +20,7 @@ export declare class PostgresFts implements IFullTextSearch {
|
|
|
19
20
|
matchClause(_indexName: string, queryPlaceholder: string): string;
|
|
20
21
|
rankExpression(_indexName: string, queryPlaceholder?: string): string;
|
|
21
22
|
rebuildCommand(_indexName: string): string;
|
|
22
|
-
syncInsert(_indexName: string,
|
|
23
|
+
syncInsert(_indexName: string, _rowIdExpr: string, columns: string[]): string;
|
|
23
24
|
sanitizeQuery(input: string): string;
|
|
24
25
|
joinClause(contentTable: string, contentAlias: string, _ftsAlias: string, _indexName: string): string;
|
|
25
26
|
/** Map FTS5-style tokenizer strings to Postgres text search configurations. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresFts.d.ts","sourceRoot":"","sources":["../../src/fts/PostgresFts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,+EAA+E;IAC/E,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAgB;
|
|
1
|
+
{"version":3,"file":"PostgresFts.d.ts","sourceRoot":"","sources":["../../src/fts/PostgresFts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,+EAA+E;IAC/E,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,KAAK,CAAa;IAE1B,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAe5G,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM;IAIjE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM;IAKrE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAM1C,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IAQ7E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAIrG,+EAA+E;IAC/E,OAAO,CAAC,gBAAgB;CAKzB"}
|
package/dist/fts/PostgresFts.js
CHANGED
|
@@ -10,6 +10,7 @@ export class PostgresFts {
|
|
|
10
10
|
/** The content table is stored during createIndex for use by other methods. */
|
|
11
11
|
this._contentTable = '';
|
|
12
12
|
this._columns = [];
|
|
13
|
+
this._lang = 'english';
|
|
13
14
|
}
|
|
14
15
|
createIndex(config) {
|
|
15
16
|
const ct = config.contentTable ?? config.table;
|
|
@@ -17,6 +18,7 @@ export class PostgresFts {
|
|
|
17
18
|
this._columns = config.columns;
|
|
18
19
|
const colConcat = config.columns.map((c) => `COALESCE(${c}, '')`).join(" || ' ' || ");
|
|
19
20
|
const lang = this._tokenizerToLang(config.tokenizer);
|
|
21
|
+
this._lang = lang;
|
|
20
22
|
return [
|
|
21
23
|
`ALTER TABLE ${ct} ADD COLUMN IF NOT EXISTS _tsv tsvector`,
|
|
22
24
|
`CREATE INDEX IF NOT EXISTS idx_${config.table}_tsv ON ${ct} USING GIN(_tsv)`,
|
|
@@ -24,21 +26,23 @@ export class PostgresFts {
|
|
|
24
26
|
].join(';\n');
|
|
25
27
|
}
|
|
26
28
|
matchClause(_indexName, queryPlaceholder) {
|
|
27
|
-
return `_tsv @@ plainto_tsquery('
|
|
29
|
+
return `_tsv @@ plainto_tsquery('${this._lang}', ${queryPlaceholder})`;
|
|
28
30
|
}
|
|
29
31
|
rankExpression(_indexName, queryPlaceholder) {
|
|
30
32
|
const qp = queryPlaceholder ?? '$1';
|
|
31
|
-
return `ts_rank(_tsv, plainto_tsquery('
|
|
33
|
+
return `ts_rank(_tsv, plainto_tsquery('${this._lang}', ${qp}))`;
|
|
32
34
|
}
|
|
33
35
|
rebuildCommand(_indexName) {
|
|
34
36
|
const ct = this._contentTable;
|
|
35
37
|
const colConcat = this._columns.map((c) => `COALESCE(${c}, '')`).join(" || ' ' || ");
|
|
36
|
-
return `UPDATE ${ct} SET _tsv = to_tsvector('
|
|
38
|
+
return `UPDATE ${ct} SET _tsv = to_tsvector('${this._lang}', ${colConcat})`;
|
|
37
39
|
}
|
|
38
|
-
syncInsert(_indexName,
|
|
40
|
+
syncInsert(_indexName, _rowIdExpr, columns) {
|
|
39
41
|
const ct = this._contentTable;
|
|
40
|
-
const colConcat = columns
|
|
41
|
-
|
|
42
|
+
const colConcat = columns
|
|
43
|
+
.map((_, index) => `COALESCE($${index + 2}, '')`)
|
|
44
|
+
.join(" || ' ' || ");
|
|
45
|
+
return `UPDATE ${ct} SET _tsv = to_tsvector('${this._lang}', ${colConcat}) WHERE id = $1`;
|
|
42
46
|
}
|
|
43
47
|
sanitizeQuery(input) {
|
|
44
48
|
return input;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresFts.js","sourceRoot":"","sources":["../../src/fts/PostgresFts.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAAxB;QACE,+EAA+E;QACvE,kBAAa,GAAG,EAAE,CAAC;QACnB,aAAQ,GAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PostgresFts.js","sourceRoot":"","sources":["../../src/fts/PostgresFts.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAAxB;QACE,+EAA+E;QACvE,kBAAa,GAAG,EAAE,CAAC;QACnB,aAAQ,GAAa,EAAE,CAAC;QACxB,UAAK,GAAG,SAAS,CAAC;IAsD5B,CAAC;IApDC,WAAW,CAAC,MAAuF;QACjG,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,OAAO;YACL,eAAe,EAAE,yCAAyC;YAC1D,kCAAkC,MAAM,CAAC,KAAK,WAAW,EAAE,kBAAkB;YAC7E,UAAU,EAAE,4BAA4B,IAAI,MAAM,SAAS,sBAAsB;SAClF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,UAAkB,EAAE,gBAAwB;QACtD,OAAO,4BAA4B,IAAI,CAAC,KAAK,MAAM,gBAAgB,GAAG,CAAC;IACzE,CAAC;IAED,cAAc,CAAC,UAAkB,EAAE,gBAAyB;QAC1D,MAAM,EAAE,GAAG,gBAAgB,IAAI,IAAI,CAAC;QACpC,OAAO,kCAAkC,IAAI,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC;IAClE,CAAC;IAED,cAAc,CAAC,UAAkB;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrF,OAAO,UAAU,EAAE,4BAA4B,IAAI,CAAC,KAAK,MAAM,SAAS,GAAG,CAAC;IAC9E,CAAC;IAED,UAAU,CAAC,UAAkB,EAAE,UAAkB,EAAE,OAAiB;QAClE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,KAAK,GAAG,CAAC,OAAO,CAAC;aAChD,IAAI,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,UAAU,EAAE,4BAA4B,IAAI,CAAC,KAAK,MAAM,SAAS,iBAAiB,CAAC;IAC5F,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,UAAU,CAAC,YAAoB,EAAE,YAAoB,EAAE,SAAiB,EAAE,UAAkB;QAC1F,OAAO,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;IAC3C,CAAC;IAED,+EAA+E;IACvE,gBAAgB,CAAC,SAAkB;QACzC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QACjC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QACnD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
package/package.json
CHANGED