@syncular/server 0.0.1-73 → 0.0.1-88
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/dist/blobs/adapters/database.d.ts.map +1 -1
- package/dist/blobs/adapters/database.js +25 -3
- package/dist/blobs/adapters/database.js.map +1 -1
- package/dist/blobs/index.js +5 -5
- package/dist/dialect/base.js +1 -1
- package/dist/dialect/index.js +3 -3
- package/dist/helpers/index.js +4 -4
- package/dist/index.js +16 -16
- package/dist/proxy/handler.d.ts.map +1 -1
- package/dist/proxy/handler.js +7 -4
- package/dist/proxy/handler.js.map +1 -1
- package/dist/proxy/index.js +3 -3
- package/dist/proxy/mutation-detector.d.ts +4 -0
- package/dist/proxy/mutation-detector.d.ts.map +1 -1
- package/dist/proxy/mutation-detector.js +209 -24
- package/dist/proxy/mutation-detector.js.map +1 -1
- package/dist/pull.d.ts +1 -1
- package/dist/pull.d.ts.map +1 -1
- package/dist/pull.js +445 -322
- package/dist/pull.js.map +1 -1
- package/dist/push.d.ts +1 -1
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +341 -260
- package/dist/push.js.map +1 -1
- package/dist/realtime/index.js +1 -1
- package/dist/shapes/index.js +3 -3
- package/dist/snapshot-chunks/adapters/s3.js +1 -1
- package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -1
- package/dist/snapshot-chunks/db-metadata.js +47 -41
- package/dist/snapshot-chunks/db-metadata.js.map +1 -1
- package/dist/snapshot-chunks/index.js +3 -3
- package/dist/subscriptions/index.js +1 -1
- package/package.json +1 -1
- package/src/blobs/adapters/database.test.ts +67 -0
- package/src/blobs/adapters/database.ts +34 -9
- package/src/proxy/handler.test.ts +120 -0
- package/src/proxy/handler.ts +9 -2
- package/src/proxy/mutation-detector.test.ts +71 -0
- package/src/proxy/mutation-detector.ts +227 -29
- package/src/pull.ts +609 -418
- package/src/push.ts +473 -349
- package/src/snapshot-chunks/db-metadata.test.ts +100 -0
- package/src/snapshot-chunks/db-metadata.ts +68 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/blobs/adapters/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAIV,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,CACF,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC3E,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC,CAAC;CACX;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/blobs/adapters/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAIV,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,CACF,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC3E,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC,CAAC;CACX;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CA8DrE;AAoBD,MAAM,WAAW,iCAAiC,CAChD,EAAE,SAAS,WAAW,GAAG,WAAW;IAEpC,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,WAAW,EAAE,eAAe,CAAC;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gCAAgC,CAAC,EAAE,SAAS,WAAW,EACrE,OAAO,EAAE,iCAAiC,CAAC,EAAE,CAAC,GAC7C,kBAAkB,CAiGpB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,SAAS,WAAW,EAC9D,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB,GACA,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,SAAS,WAAW,EAC/D,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBtE"}
|
|
@@ -11,11 +11,21 @@ import { sql } from 'kysely';
|
|
|
11
11
|
*/
|
|
12
12
|
export function createHmacTokenSigner(secret) {
|
|
13
13
|
const encoder = new TextEncoder();
|
|
14
|
+
const keyPromise = crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);
|
|
14
15
|
async function hmacSign(data) {
|
|
15
|
-
const key = await
|
|
16
|
+
const key = await keyPromise;
|
|
16
17
|
const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(data));
|
|
17
18
|
return bufferToHex(new Uint8Array(signature));
|
|
18
19
|
}
|
|
20
|
+
async function hmacVerify(data, signatureHex) {
|
|
21
|
+
const parsedSignature = hexToBuffer(signatureHex);
|
|
22
|
+
if (!parsedSignature)
|
|
23
|
+
return false;
|
|
24
|
+
const signature = new Uint8Array(parsedSignature.length);
|
|
25
|
+
signature.set(parsedSignature);
|
|
26
|
+
const key = await keyPromise;
|
|
27
|
+
return crypto.subtle.verify('HMAC', key, signature, encoder.encode(data));
|
|
28
|
+
}
|
|
19
29
|
return {
|
|
20
30
|
async sign(payload, _expiresIn) {
|
|
21
31
|
const data = JSON.stringify(payload);
|
|
@@ -27,8 +37,8 @@ export function createHmacTokenSigner(secret) {
|
|
|
27
37
|
const [dataB64, sig] = token.split('.');
|
|
28
38
|
if (!dataB64 || !sig)
|
|
29
39
|
return null;
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
40
|
+
const isValidSig = await hmacVerify(dataB64, sig);
|
|
41
|
+
if (!isValidSig)
|
|
32
42
|
return null;
|
|
33
43
|
try {
|
|
34
44
|
const data = JSON.parse(atob(dataB64));
|
|
@@ -47,6 +57,18 @@ function bufferToHex(buffer) {
|
|
|
47
57
|
.map((b) => b.toString(16).padStart(2, '0'))
|
|
48
58
|
.join('');
|
|
49
59
|
}
|
|
60
|
+
function hexToBuffer(hex) {
|
|
61
|
+
if (hex.length === 0 || hex.length % 2 !== 0)
|
|
62
|
+
return null;
|
|
63
|
+
if (!/^[0-9a-f]+$/i.test(hex))
|
|
64
|
+
return null;
|
|
65
|
+
const out = new Uint8Array(hex.length / 2);
|
|
66
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
67
|
+
const pair = hex.slice(i, i + 2);
|
|
68
|
+
out[i / 2] = Number.parseInt(pair, 16);
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
50
72
|
/**
|
|
51
73
|
* Create a database blob storage adapter.
|
|
52
74
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/blobs/adapters/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAe,GAAG,EAAE,MAAM,QAAQ,CAAC;AA6B1C;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAmB;IACrE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/blobs/adapters/database.ts"],"names":[],"mappings":"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"}
|
package/dist/blobs/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @syncular/server - Blob storage exports
|
|
3
3
|
*/
|
|
4
|
-
export * from './adapters/database';
|
|
5
|
-
export * from './adapters/s3';
|
|
6
|
-
export * from './manager';
|
|
7
|
-
export * from './migrate';
|
|
8
|
-
export * from './types';
|
|
4
|
+
export * from './adapters/database.js';
|
|
5
|
+
export * from './adapters/s3.js';
|
|
6
|
+
export * from './manager.js';
|
|
7
|
+
export * from './migrate.js';
|
|
8
|
+
export * from './types.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/dialect/base.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* database-specific sync dialect implementations.
|
|
6
6
|
*/
|
|
7
7
|
import { sql } from 'kysely';
|
|
8
|
-
import { coerceIsoString, coerceNumber, parseScopes } from './helpers';
|
|
8
|
+
import { coerceIsoString, coerceNumber, parseScopes } from './helpers.js';
|
|
9
9
|
/**
|
|
10
10
|
* Abstract base class for server sync dialects.
|
|
11
11
|
*
|
package/dist/dialect/index.js
CHANGED
package/dist/helpers/index.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Convenience helpers for implementing server table handlers.
|
|
5
5
|
*/
|
|
6
|
-
export * from './conflict';
|
|
7
|
-
export * from './emitted-change';
|
|
8
|
-
export * from './paginate';
|
|
9
|
-
export * from './scope-strings';
|
|
6
|
+
export * from './conflict.js';
|
|
7
|
+
export * from './emitted-change.js';
|
|
8
|
+
export * from './paginate.js';
|
|
9
|
+
export * from './scope-strings.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js
CHANGED
|
@@ -8,20 +8,20 @@
|
|
|
8
8
|
* - blob/media storage
|
|
9
9
|
*/
|
|
10
10
|
export * from '@syncular/core';
|
|
11
|
-
export * from './blobs';
|
|
12
|
-
export * from './clients';
|
|
13
|
-
export * from './compaction';
|
|
14
|
-
export * from './dialect';
|
|
15
|
-
export * from './helpers';
|
|
16
|
-
export * from './migrate';
|
|
17
|
-
export * from './proxy';
|
|
18
|
-
export * from './prune';
|
|
19
|
-
export * from './pull';
|
|
20
|
-
export * from './push';
|
|
21
|
-
export * from './realtime';
|
|
22
|
-
export * from './schema';
|
|
23
|
-
export * from './shapes';
|
|
24
|
-
export * from './snapshot-chunks';
|
|
25
|
-
export * from './stats';
|
|
26
|
-
export * from './subscriptions';
|
|
11
|
+
export * from './blobs/index.js';
|
|
12
|
+
export * from './clients.js';
|
|
13
|
+
export * from './compaction.js';
|
|
14
|
+
export * from './dialect/index.js';
|
|
15
|
+
export * from './helpers/index.js';
|
|
16
|
+
export * from './migrate.js';
|
|
17
|
+
export * from './proxy/index.js';
|
|
18
|
+
export * from './prune.js';
|
|
19
|
+
export * from './pull.js';
|
|
20
|
+
export * from './push.js';
|
|
21
|
+
export * from './realtime/index.js';
|
|
22
|
+
export * from './schema.js';
|
|
23
|
+
export * from './shapes/index.js';
|
|
24
|
+
export * from './snapshot-chunks.js';
|
|
25
|
+
export * from './stats.js';
|
|
26
|
+
export * from './subscriptions/index.js';
|
|
27
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/proxy/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/proxy/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQ5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,qBAAqB,CAAC,EAAE,SAAS,UAAU,GAAG,UAAU;IACvE,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,0BAA0B;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gDAAgD;IAChD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,uCAAuC;IACvC,GAAG,EAAE,iBAAiB,CAAC;IACvB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,UAAU,EAAE,SAAS,OAAO,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAiDD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,SAAS,UAAU,EAC3D,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAyDlC"}
|
package/dist/proxy/handler.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Executes proxied queries with automatic oplog generation for mutations.
|
|
5
5
|
*/
|
|
6
6
|
import { sql } from 'kysely';
|
|
7
|
-
import { appendReturning, detectMutation, hasReturningClause, } from './mutation-detector';
|
|
8
|
-
import { createOplogEntries } from './oplog';
|
|
7
|
+
import { appendReturning, detectMutation, hasReturningClause, hasReturningWildcard, } from './mutation-detector.js';
|
|
8
|
+
import { createOplogEntries } from './oplog.js';
|
|
9
9
|
/**
|
|
10
10
|
* Build a raw SQL query with parameters using Kysely's sql helper.
|
|
11
11
|
*
|
|
@@ -72,8 +72,11 @@ export async function executeProxyQuery(args) {
|
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
74
|
// Mutation with registered shape - append RETURNING * and create oplog
|
|
75
|
-
const
|
|
76
|
-
|
|
75
|
+
const hasReturning = hasReturningClause(sqlQuery);
|
|
76
|
+
if (hasReturning && !hasReturningWildcard(sqlQuery)) {
|
|
77
|
+
throw new Error(`Proxy mutation on synced table "${mutation.tableName}" must use RETURNING * (or omit RETURNING)`);
|
|
78
|
+
}
|
|
79
|
+
const finalSql = hasReturning ? sqlQuery : appendReturning(sqlQuery);
|
|
77
80
|
const result = await buildRawQuery(finalSql, parameters).execute(db);
|
|
78
81
|
const affectedRows = result.rows;
|
|
79
82
|
if (affectedRows.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/proxy/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAG7B,OAAO,EACL,eAAe,EACf,cAAc,EACd,kBAAkB,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/proxy/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy/index.js
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Server-side proxy functionality for database access.
|
|
5
5
|
*/
|
|
6
6
|
// Query execution
|
|
7
|
-
export { executeProxyQuery, } from './handler';
|
|
7
|
+
export { executeProxyQuery, } from './handler.js';
|
|
8
8
|
// Mutation detection
|
|
9
|
-
export { detectMutation } from './mutation-detector';
|
|
9
|
+
export { detectMutation } from './mutation-detector.js';
|
|
10
10
|
// Oplog creation
|
|
11
11
|
// Registry
|
|
12
|
-
export { ProxyTableRegistry } from './registry';
|
|
12
|
+
export { ProxyTableRegistry } from './registry.js';
|
|
13
13
|
// Types
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -21,6 +21,10 @@ export declare function detectMutation(sql: string): DetectedMutation | null;
|
|
|
21
21
|
* Check if SQL already has a RETURNING clause.
|
|
22
22
|
*/
|
|
23
23
|
export declare function hasReturningClause(sql: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Check if SQL has a wildcard RETURNING clause (RETURNING * or alias.*).
|
|
26
|
+
*/
|
|
27
|
+
export declare function hasReturningWildcard(sql: string): boolean;
|
|
24
28
|
/**
|
|
25
29
|
* Append RETURNING * to a mutation query if not already present.
|
|
26
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation-detector.d.ts","sourceRoot":"","sources":["../../src/proxy/mutation-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"mutation-detector.d.ts","sourceRoot":"","sources":["../../src/proxy/mutation-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAyMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CA2BnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQnD"}
|
|
@@ -3,6 +3,187 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detects whether a SQL query is a mutation (INSERT/UPDATE/DELETE).
|
|
5
5
|
*/
|
|
6
|
+
function isWordStart(ch) {
|
|
7
|
+
return /[A-Za-z_]/.test(ch);
|
|
8
|
+
}
|
|
9
|
+
function isWordPart(ch) {
|
|
10
|
+
return /[A-Za-z0-9_$]/.test(ch);
|
|
11
|
+
}
|
|
12
|
+
function skipLeadingNoise(sql) {
|
|
13
|
+
let index = 0;
|
|
14
|
+
while (index < sql.length) {
|
|
15
|
+
while (index < sql.length && /[\s;]/.test(sql[index])) {
|
|
16
|
+
index += 1;
|
|
17
|
+
}
|
|
18
|
+
if (sql.startsWith('--', index)) {
|
|
19
|
+
index += 2;
|
|
20
|
+
while (index < sql.length && sql[index] !== '\n') {
|
|
21
|
+
index += 1;
|
|
22
|
+
}
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (sql.startsWith('/*', index)) {
|
|
26
|
+
const end = sql.indexOf('*/', index + 2);
|
|
27
|
+
if (end === -1)
|
|
28
|
+
return '';
|
|
29
|
+
index = end + 2;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
return sql.slice(index);
|
|
35
|
+
}
|
|
36
|
+
function extractMainStatement(sql) {
|
|
37
|
+
const normalized = skipLeadingNoise(sql);
|
|
38
|
+
if (!normalized.toLowerCase().startsWith('with')) {
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
41
|
+
const lower = normalized.toLowerCase();
|
|
42
|
+
const rootKeywords = new Set(['insert', 'update', 'delete', 'select']);
|
|
43
|
+
let index = 0;
|
|
44
|
+
let depth = 0;
|
|
45
|
+
let inSingleQuote = false;
|
|
46
|
+
let inDoubleQuote = false;
|
|
47
|
+
let inLineComment = false;
|
|
48
|
+
let inBlockComment = false;
|
|
49
|
+
while (index < normalized.length) {
|
|
50
|
+
const ch = normalized[index];
|
|
51
|
+
const next = normalized[index + 1];
|
|
52
|
+
if (inLineComment) {
|
|
53
|
+
if (ch === '\n')
|
|
54
|
+
inLineComment = false;
|
|
55
|
+
index += 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (inBlockComment) {
|
|
59
|
+
if (ch === '*' && next === '/') {
|
|
60
|
+
inBlockComment = false;
|
|
61
|
+
index += 2;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
index += 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (inSingleQuote) {
|
|
68
|
+
if (ch === "'" && next === "'") {
|
|
69
|
+
index += 2;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (ch === "'")
|
|
73
|
+
inSingleQuote = false;
|
|
74
|
+
index += 1;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (inDoubleQuote) {
|
|
78
|
+
if (ch === '"' && next === '"') {
|
|
79
|
+
index += 2;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (ch === '"')
|
|
83
|
+
inDoubleQuote = false;
|
|
84
|
+
index += 1;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (ch === '-' && next === '-') {
|
|
88
|
+
inLineComment = true;
|
|
89
|
+
index += 2;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (ch === '/' && next === '*') {
|
|
93
|
+
inBlockComment = true;
|
|
94
|
+
index += 2;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (ch === "'") {
|
|
98
|
+
inSingleQuote = true;
|
|
99
|
+
index += 1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (ch === '"') {
|
|
103
|
+
inDoubleQuote = true;
|
|
104
|
+
index += 1;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (ch === '(') {
|
|
108
|
+
depth += 1;
|
|
109
|
+
index += 1;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (ch === ')') {
|
|
113
|
+
if (depth > 0)
|
|
114
|
+
depth -= 1;
|
|
115
|
+
index += 1;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (depth === 0 && isWordStart(ch)) {
|
|
119
|
+
const tokenStart = index;
|
|
120
|
+
index += 1;
|
|
121
|
+
while (index < normalized.length && isWordPart(normalized[index])) {
|
|
122
|
+
index += 1;
|
|
123
|
+
}
|
|
124
|
+
const token = lower.slice(tokenStart, index);
|
|
125
|
+
if (token !== 'with' &&
|
|
126
|
+
token !== 'recursive' &&
|
|
127
|
+
rootKeywords.has(token)) {
|
|
128
|
+
return normalized.slice(tokenStart);
|
|
129
|
+
}
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
index += 1;
|
|
133
|
+
}
|
|
134
|
+
return normalized;
|
|
135
|
+
}
|
|
136
|
+
function parseIdentifier(input, startIndex) {
|
|
137
|
+
let index = startIndex;
|
|
138
|
+
while (index < input.length && /\s/.test(input[index])) {
|
|
139
|
+
index += 1;
|
|
140
|
+
}
|
|
141
|
+
if (index >= input.length)
|
|
142
|
+
return null;
|
|
143
|
+
if (input[index] === '"') {
|
|
144
|
+
index += 1;
|
|
145
|
+
let value = '';
|
|
146
|
+
while (index < input.length) {
|
|
147
|
+
const ch = input[index];
|
|
148
|
+
if (ch === '"' && input[index + 1] === '"') {
|
|
149
|
+
value += '"';
|
|
150
|
+
index += 2;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (ch === '"') {
|
|
154
|
+
index += 1;
|
|
155
|
+
return { name: value, nextIndex: index };
|
|
156
|
+
}
|
|
157
|
+
value += ch;
|
|
158
|
+
index += 1;
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
if (!isWordStart(input[index]))
|
|
163
|
+
return null;
|
|
164
|
+
const first = index;
|
|
165
|
+
index += 1;
|
|
166
|
+
while (index < input.length && isWordPart(input[index])) {
|
|
167
|
+
index += 1;
|
|
168
|
+
}
|
|
169
|
+
return { name: input.slice(first, index), nextIndex: index };
|
|
170
|
+
}
|
|
171
|
+
function parseTargetTable(input) {
|
|
172
|
+
const first = parseIdentifier(input, 0);
|
|
173
|
+
if (!first)
|
|
174
|
+
return null;
|
|
175
|
+
let index = first.nextIndex;
|
|
176
|
+
while (index < input.length && /\s/.test(input[index])) {
|
|
177
|
+
index += 1;
|
|
178
|
+
}
|
|
179
|
+
if (input[index] !== '.') {
|
|
180
|
+
return first.name;
|
|
181
|
+
}
|
|
182
|
+
const second = parseIdentifier(input, index + 1);
|
|
183
|
+
if (!second)
|
|
184
|
+
return null;
|
|
185
|
+
return second.name;
|
|
186
|
+
}
|
|
6
187
|
/**
|
|
7
188
|
* Detect if a SQL query is a mutation and extract table info.
|
|
8
189
|
*
|
|
@@ -10,30 +191,25 @@
|
|
|
10
191
|
* @returns Mutation info if detected, null for read queries
|
|
11
192
|
*/
|
|
12
193
|
export function detectMutation(sql) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (deleteMatch) {
|
|
33
|
-
return {
|
|
34
|
-
operation: 'delete',
|
|
35
|
-
tableName: deleteMatch[2],
|
|
36
|
-
};
|
|
194
|
+
const statement = extractMainStatement(sql).trimStart();
|
|
195
|
+
const lower = statement.toLowerCase();
|
|
196
|
+
if (lower.startsWith('insert')) {
|
|
197
|
+
const tableName = parseTargetTable(statement.replace(/^insert\s+into\s+/i, ''));
|
|
198
|
+
if (!tableName)
|
|
199
|
+
return null;
|
|
200
|
+
return { operation: 'upsert', tableName };
|
|
201
|
+
}
|
|
202
|
+
if (lower.startsWith('update')) {
|
|
203
|
+
const tableName = parseTargetTable(statement.replace(/^update\s+/i, ''));
|
|
204
|
+
if (!tableName)
|
|
205
|
+
return null;
|
|
206
|
+
return { operation: 'upsert', tableName };
|
|
207
|
+
}
|
|
208
|
+
if (lower.startsWith('delete')) {
|
|
209
|
+
const tableName = parseTargetTable(statement.replace(/^delete\s+from\s+/i, ''));
|
|
210
|
+
if (!tableName)
|
|
211
|
+
return null;
|
|
212
|
+
return { operation: 'delete', tableName };
|
|
37
213
|
}
|
|
38
214
|
return null;
|
|
39
215
|
}
|
|
@@ -44,6 +220,15 @@ export function hasReturningClause(sql) {
|
|
|
44
220
|
// Simple check - look for RETURNING keyword not in a string
|
|
45
221
|
return /\bRETURNING\b/i.test(sql);
|
|
46
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if SQL has a wildcard RETURNING clause (RETURNING * or alias.*).
|
|
225
|
+
*/
|
|
226
|
+
export function hasReturningWildcard(sql) {
|
|
227
|
+
const match = sql.match(/\bRETURNING\b([\s\S]*)$/i);
|
|
228
|
+
if (!match)
|
|
229
|
+
return false;
|
|
230
|
+
return /(^|,)\s*(?:[A-Za-z_][A-Za-z0-9_$]*\.)?\*/i.test(match[1]);
|
|
231
|
+
}
|
|
47
232
|
/**
|
|
48
233
|
* Append RETURNING * to a mutation query if not already present.
|
|
49
234
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation-detector.js","sourceRoot":"","sources":["../../src/proxy/mutation-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH
|
|
1
|
+
{"version":3,"file":"mutation-detector.js","sourceRoot":"","sources":["../../src/proxy/mutation-detector.ts"],"names":[],"mappings":"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"}
|
package/dist/pull.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ScopeValues, type SyncPullRequest, type SyncPullResponse } from '@syncular/core';
|
|
2
2
|
import type { Kysely } from 'kysely';
|
|
3
3
|
import type { ServerSyncDialect } from './dialect/types';
|
|
4
4
|
import type { SyncCoreDb } from './schema';
|
package/dist/pull.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../src/pull.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../src/pull.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,WAAW,EAIhB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAItB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAcpE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,eAAe,EAAE,WAAW,CAAC;IAC7B,oFAAoF;IACpF,YAAY,EAAE,MAAM,CAAC;CACtB;AA0JD,wBAAsB,IAAI,CAAC,EAAE,SAAS,UAAU,EAAE,IAAI,EAAE;IACtD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC,GAAG,OAAO,CAAC,UAAU,CAAC,CA8gBtB"}
|