@syncular/core 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -19
- package/dist/blob-ref.d.ts +21 -0
- package/dist/blob-ref.js +97 -0
- package/dist/bytes.d.ts +45 -0
- package/dist/bytes.js +242 -0
- package/dist/canonical-json.d.ts +10 -0
- package/dist/canonical-json.js +18 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +5 -0
- package/dist/crypto.d.ts +60 -0
- package/dist/crypto.js +251 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.js +17 -0
- package/dist/frames.d.ts +24 -0
- package/dist/frames.js +42 -0
- package/dist/index.d.ts +18 -26
- package/dist/index.js +18 -43
- package/dist/message.d.ts +157 -0
- package/dist/message.js +786 -0
- package/dist/realtime.d.ts +92 -0
- package/dist/realtime.js +222 -0
- package/dist/render.d.ts +22 -0
- package/dist/render.js +273 -0
- package/dist/row-codec.d.ts +39 -0
- package/dist/row-codec.js +176 -0
- package/dist/segment.d.ts +18 -0
- package/dist/segment.js +105 -0
- package/dist/stream.d.ts +20 -0
- package/dist/stream.js +102 -0
- package/package.json +7 -59
- package/src/blob-ref.ts +135 -0
- package/src/bytes.ts +301 -0
- package/src/canonical-json.ts +20 -0
- package/src/constants.ts +7 -0
- package/src/crypto.ts +335 -0
- package/src/errors.ts +18 -0
- package/src/frames.ts +47 -0
- package/src/index.ts +18 -43
- package/src/message.ts +1024 -0
- package/src/realtime.ts +340 -0
- package/src/render.ts +325 -0
- package/src/row-codec.ts +265 -0
- package/src/segment.ts +150 -0
- package/src/stream.ts +128 -0
- package/dist/blobs.d.ts +0 -153
- package/dist/blobs.d.ts.map +0 -1
- package/dist/blobs.js +0 -47
- package/dist/blobs.js.map +0 -1
- package/dist/column-codecs.d.ts +0 -59
- package/dist/column-codecs.d.ts.map +0 -1
- package/dist/column-codecs.js +0 -159
- package/dist/column-codecs.js.map +0 -1
- package/dist/conflict.d.ts +0 -22
- package/dist/conflict.d.ts.map +0 -1
- package/dist/conflict.js +0 -81
- package/dist/conflict.js.map +0 -1
- package/dist/database.d.ts +0 -7
- package/dist/database.d.ts.map +0 -1
- package/dist/database.js +0 -14
- package/dist/database.js.map +0 -1
- package/dist/dialect.d.ts +0 -7
- package/dist/dialect.d.ts.map +0 -1
- package/dist/dialect.js +0 -2
- package/dist/dialect.js.map +0 -1
- package/dist/error-responses.d.ts +0 -393
- package/dist/error-responses.d.ts.map +0 -1
- package/dist/error-responses.js +0 -393
- package/dist/error-responses.js.map +0 -1
- package/dist/http/api-client.d.ts +0 -11
- package/dist/http/api-client.d.ts.map +0 -1
- package/dist/http/api-client.js +0 -30
- package/dist/http/api-client.js.map +0 -1
- package/dist/http/blob.d.ts +0 -6
- package/dist/http/blob.d.ts.map +0 -1
- package/dist/http/blob.js +0 -46
- package/dist/http/blob.js.map +0 -1
- package/dist/http/generated/api.d.ts +0 -5241
- package/dist/http/generated/api.d.ts.map +0 -1
- package/dist/http/generated/api.js +0 -6
- package/dist/http/generated/api.js.map +0 -1
- package/dist/http/index.d.ts +0 -18
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -212
- package/dist/http/index.js.map +0 -1
- package/dist/http/shared.d.ts +0 -45
- package/dist/http/shared.d.ts.map +0 -1
- package/dist/http/shared.js +0 -122
- package/dist/http/shared.js.map +0 -1
- package/dist/http/transport-client.d.ts +0 -31
- package/dist/http/transport-client.d.ts.map +0 -1
- package/dist/http/transport-client.js +0 -193
- package/dist/http/transport-client.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/kysely-column-codecs.d.ts +0 -31
- package/dist/kysely-column-codecs.d.ts.map +0 -1
- package/dist/kysely-column-codecs.js +0 -452
- package/dist/kysely-column-codecs.js.map +0 -1
- package/dist/logger.d.ts +0 -29
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -26
- package/dist/logger.js.map +0 -1
- package/dist/proxy/index.d.ts +0 -54
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js +0 -7
- package/dist/proxy/index.js.map +0 -1
- package/dist/schemas/blobs.d.ts +0 -82
- package/dist/schemas/blobs.d.ts.map +0 -1
- package/dist/schemas/blobs.js +0 -64
- package/dist/schemas/blobs.js.map +0 -1
- package/dist/schemas/common.d.ts +0 -100
- package/dist/schemas/common.d.ts.map +0 -1
- package/dist/schemas/common.js +0 -64
- package/dist/schemas/common.js.map +0 -1
- package/dist/schemas/index.d.ts +0 -7
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js +0 -7
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/sync.d.ts +0 -1065
- package/dist/schemas/sync.d.ts.map +0 -1
- package/dist/schemas/sync.js +0 -361
- package/dist/schemas/sync.js.map +0 -1
- package/dist/scopes/index.d.ts +0 -113
- package/dist/scopes/index.d.ts.map +0 -1
- package/dist/scopes/index.js +0 -103
- package/dist/scopes/index.js.map +0 -1
- package/dist/sentry.d.ts +0 -31
- package/dist/sentry.d.ts.map +0 -1
- package/dist/sentry.js +0 -147
- package/dist/sentry.js.map +0 -1
- package/dist/snapshot-chunks.d.ts +0 -110
- package/dist/snapshot-chunks.d.ts.map +0 -1
- package/dist/snapshot-chunks.js +0 -682
- package/dist/snapshot-chunks.js.map +0 -1
- package/dist/sync-packs.d.ts +0 -33
- package/dist/sync-packs.d.ts.map +0 -1
- package/dist/sync-packs.js +0 -821
- package/dist/sync-packs.js.map +0 -1
- package/dist/telemetry.d.ts +0 -114
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -114
- package/dist/telemetry.js.map +0 -1
- package/dist/transforms.d.ts +0 -146
- package/dist/transforms.d.ts.map +0 -1
- package/dist/transforms.js +0 -155
- package/dist/transforms.js.map +0 -1
- package/dist/types.d.ts +0 -210
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -20
- package/dist/types.js.map +0 -1
- package/dist/utils/bytes.d.ts +0 -4
- package/dist/utils/bytes.d.ts.map +0 -1
- package/dist/utils/bytes.js +0 -66
- package/dist/utils/bytes.js.map +0 -1
- package/dist/utils/compression.d.ts +0 -22
- package/dist/utils/compression.d.ts.map +0 -1
- package/dist/utils/compression.js +0 -129
- package/dist/utils/compression.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -13
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -107
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/id.d.ts +0 -3
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -25
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/index.d.ts +0 -10
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -10
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/internal-runtime.d.ts +0 -16
- package/dist/utils/internal-runtime.d.ts.map +0 -1
- package/dist/utils/internal-runtime.js +0 -14
- package/dist/utils/internal-runtime.js.map +0 -1
- package/dist/utils/object.d.ts +0 -2
- package/dist/utils/object.d.ts.map +0 -1
- package/dist/utils/object.js +0 -4
- package/dist/utils/object.js.map +0 -1
- package/dist/utils/realtime-change-index.d.ts +0 -9
- package/dist/utils/realtime-change-index.d.ts.map +0 -1
- package/dist/utils/realtime-change-index.js +0 -36
- package/dist/utils/realtime-change-index.js.map +0 -1
- package/dist/utils/realtime-connection-registry.d.ts +0 -40
- package/dist/utils/realtime-connection-registry.d.ts.map +0 -1
- package/dist/utils/realtime-connection-registry.js +0 -237
- package/dist/utils/realtime-connection-registry.js.map +0 -1
- package/dist/utils/table-registry.d.ts +0 -10
- package/dist/utils/table-registry.d.ts.map +0 -1
- package/dist/utils/table-registry.js +0 -54
- package/dist/utils/table-registry.js.map +0 -1
- package/dist/utils/url.d.ts +0 -3
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/url.js +0 -20
- package/dist/utils/url.js.map +0 -1
- package/src/blobs.ts +0 -219
- package/src/column-codecs.ts +0 -262
- package/src/conflict.ts +0 -92
- package/src/database.ts +0 -21
- package/src/dialect.ts +0 -8
- package/src/error-responses.ts +0 -423
- package/src/http/api-client.ts +0 -39
- package/src/http/blob.ts +0 -95
- package/src/http/generated/api.ts +0 -5241
- package/src/http/index.ts +0 -365
- package/src/http/shared.ts +0 -220
- package/src/http/transport-client.ts +0 -314
- package/src/kysely-column-codecs.ts +0 -585
- package/src/logger.ts +0 -38
- package/src/proxy/index.ts +0 -57
- package/src/schemas/blobs.ts +0 -110
- package/src/schemas/common.ts +0 -89
- package/src/schemas/index.ts +0 -7
- package/src/schemas/sync.ts +0 -517
- package/src/scopes/index.ts +0 -237
- package/src/sentry.ts +0 -200
- package/src/snapshot-chunks.ts +0 -964
- package/src/sync-packs.ts +0 -1096
- package/src/telemetry.ts +0 -243
- package/src/transforms.ts +0 -256
- package/src/types.ts +0 -267
- package/src/utils/bytes.ts +0 -75
- package/src/utils/compression.ts +0 -187
- package/src/utils/crypto.ts +0 -146
- package/src/utils/id.ts +0 -34
- package/src/utils/index.ts +0 -9
- package/src/utils/internal-runtime.ts +0 -39
- package/src/utils/object.ts +0 -3
- package/src/utils/realtime-change-index.ts +0 -44
- package/src/utils/realtime-connection-registry.ts +0 -286
- package/src/utils/table-registry.ts +0 -67
- package/src/utils/url.ts +0 -29
package/dist/blobs.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @syncular/core - Blob types for media/binary handling
|
|
3
|
-
*
|
|
4
|
-
* Content-addressable blob storage with presigned URL support.
|
|
5
|
-
* Protocol types (BlobRef, BlobMetadata, etc.) live in ./schemas/blobs.ts
|
|
6
|
-
*/
|
|
7
|
-
// ============================================================================
|
|
8
|
-
// Utility Functions
|
|
9
|
-
// ============================================================================
|
|
10
|
-
/**
|
|
11
|
-
* Create a BlobRef from upload metadata.
|
|
12
|
-
*/
|
|
13
|
-
export function createBlobRef(args) {
|
|
14
|
-
const ref = {
|
|
15
|
-
hash: args.hash,
|
|
16
|
-
size: args.size,
|
|
17
|
-
mimeType: args.mimeType,
|
|
18
|
-
};
|
|
19
|
-
if (args.encrypted) {
|
|
20
|
-
ref.encrypted = true;
|
|
21
|
-
if (args.keyId) {
|
|
22
|
-
ref.keyId = args.keyId;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return ref;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Parse a blob hash, validating format.
|
|
29
|
-
* @returns The hex hash without prefix, or null if invalid.
|
|
30
|
-
*/
|
|
31
|
-
export function parseBlobHash(hash) {
|
|
32
|
-
if (!hash.startsWith('sha256:'))
|
|
33
|
-
return null;
|
|
34
|
-
const hex = hash.slice(7);
|
|
35
|
-
if (hex.length !== 64)
|
|
36
|
-
return null;
|
|
37
|
-
if (!/^[0-9a-f]+$/i.test(hex))
|
|
38
|
-
return null;
|
|
39
|
-
return hex.toLowerCase();
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Create a blob hash string from hex.
|
|
43
|
-
*/
|
|
44
|
-
export function createBlobHash(hexHash) {
|
|
45
|
-
return `sha256:${hexHash.toLowerCase()}`;
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=blobs.js.map
|
package/dist/blobs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blobs.js","sourceRoot":"","sources":["../src/blobs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwKH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAM7B;IACC,MAAM,GAAG,GAAY;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;IACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;AAC3C,CAAC"}
|
package/dist/column-codecs.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type { SqlFamily } from './dialect';
|
|
2
|
-
export type ColumnCodecDialect = SqlFamily;
|
|
3
|
-
export interface ColumnCodecTypeImport {
|
|
4
|
-
name: string;
|
|
5
|
-
from: string;
|
|
6
|
-
}
|
|
7
|
-
export type ColumnCodecType = string | {
|
|
8
|
-
type: string;
|
|
9
|
-
import?: ColumnCodecTypeImport;
|
|
10
|
-
};
|
|
11
|
-
export interface ColumnCodec<App, Db> {
|
|
12
|
-
ts: ColumnCodecType;
|
|
13
|
-
toDb(value: App): Db;
|
|
14
|
-
fromDb(value: Db): App;
|
|
15
|
-
dialects?: Partial<Record<ColumnCodecDialect, {
|
|
16
|
-
toDb?(value: App): Db;
|
|
17
|
-
fromDb?(value: Db): App;
|
|
18
|
-
}>>;
|
|
19
|
-
}
|
|
20
|
-
export type AnyColumnCodec = ColumnCodec<unknown, unknown>;
|
|
21
|
-
export interface ColumnCodecColumn {
|
|
22
|
-
table: string;
|
|
23
|
-
column: string;
|
|
24
|
-
sqlType?: string;
|
|
25
|
-
nullable?: boolean;
|
|
26
|
-
isPrimaryKey?: boolean;
|
|
27
|
-
hasDefault?: boolean;
|
|
28
|
-
dialect?: ColumnCodecDialect;
|
|
29
|
-
}
|
|
30
|
-
export type TableColumnCodecs = Record<string, AnyColumnCodec>;
|
|
31
|
-
export type ColumnCodecSource = (column: ColumnCodecColumn) => AnyColumnCodec | undefined;
|
|
32
|
-
export declare function toTableColumnCodecs(table: string, codecSource: ColumnCodecSource | undefined, columns: Iterable<string>, options?: {
|
|
33
|
-
dialect?: ColumnCodecDialect;
|
|
34
|
-
sqlTypes?: Record<string, string | undefined>;
|
|
35
|
-
}): TableColumnCodecs;
|
|
36
|
-
export declare function createTableColumnCodecsResolver(codecSource: ColumnCodecSource | undefined, options?: {
|
|
37
|
-
dialect?: ColumnCodecDialect;
|
|
38
|
-
}): (table: string, row: Record<string, unknown>) => TableColumnCodecs;
|
|
39
|
-
export declare function applyCodecToDbValue(codec: AnyColumnCodec, value: unknown, dialect?: ColumnCodecDialect): unknown;
|
|
40
|
-
export declare function applyCodecFromDbValue(codec: AnyColumnCodec, value: unknown, dialect?: ColumnCodecDialect): unknown;
|
|
41
|
-
export declare function applyCodecsToDbRow(row: Record<string, unknown>, tableCodecs: TableColumnCodecs, dialect?: ColumnCodecDialect): Record<string, unknown>;
|
|
42
|
-
export declare function applyCodecsFromDbRow(row: Record<string, unknown>, tableCodecs: TableColumnCodecs, dialect?: ColumnCodecDialect): Record<string, unknown>;
|
|
43
|
-
export declare function numberBoolean(): ColumnCodec<boolean, number | boolean | string>;
|
|
44
|
-
export interface StringJsonCodecOptions<T> {
|
|
45
|
-
ts?: ColumnCodecType;
|
|
46
|
-
import?: ColumnCodecTypeImport;
|
|
47
|
-
stringify?: (value: T) => string;
|
|
48
|
-
parse?: (value: string) => T;
|
|
49
|
-
}
|
|
50
|
-
export declare function stringJson<T = unknown>(options?: StringJsonCodecOptions<T>): ColumnCodec<T, string | T>;
|
|
51
|
-
export declare function timestampDate(): ColumnCodec<Date, string | Date>;
|
|
52
|
-
export declare function dateString(): ColumnCodec<string, string | Date>;
|
|
53
|
-
export declare const codecs: {
|
|
54
|
-
numberBoolean: typeof numberBoolean;
|
|
55
|
-
stringJson: typeof stringJson;
|
|
56
|
-
timestampDate: typeof timestampDate;
|
|
57
|
-
dateString: typeof dateString;
|
|
58
|
-
};
|
|
59
|
-
//# sourceMappingURL=column-codecs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"column-codecs.d.ts","sourceRoot":"","sources":["../src/column-codecs.ts"],"names":[],"mappings":"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"}
|
package/dist/column-codecs.js
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
function hasCodecs(tableCodecs) {
|
|
2
|
-
return Object.keys(tableCodecs).length > 0;
|
|
3
|
-
}
|
|
4
|
-
function resolveCodecToDb(codec, dialect) {
|
|
5
|
-
return codec.dialects?.[dialect]?.toDb ?? codec.toDb;
|
|
6
|
-
}
|
|
7
|
-
function resolveCodecFromDb(codec, dialect) {
|
|
8
|
-
return codec.dialects?.[dialect]?.fromDb ?? codec.fromDb;
|
|
9
|
-
}
|
|
10
|
-
export function toTableColumnCodecs(table, codecSource, columns, options = {}) {
|
|
11
|
-
if (!codecSource)
|
|
12
|
-
return {};
|
|
13
|
-
const out = {};
|
|
14
|
-
for (const column of columns) {
|
|
15
|
-
if (column.length === 0)
|
|
16
|
-
continue;
|
|
17
|
-
const codec = codecSource({
|
|
18
|
-
table,
|
|
19
|
-
column,
|
|
20
|
-
sqlType: options.sqlTypes?.[column],
|
|
21
|
-
dialect: options.dialect,
|
|
22
|
-
});
|
|
23
|
-
if (codec)
|
|
24
|
-
out[column] = codec;
|
|
25
|
-
}
|
|
26
|
-
return out;
|
|
27
|
-
}
|
|
28
|
-
export function createTableColumnCodecsResolver(codecSource, options = {}) {
|
|
29
|
-
const tableCaches = new Map();
|
|
30
|
-
return (table, row) => {
|
|
31
|
-
if (!codecSource)
|
|
32
|
-
return {};
|
|
33
|
-
const columns = Object.keys(row);
|
|
34
|
-
if (columns.length === 0)
|
|
35
|
-
return {};
|
|
36
|
-
const cacheKey = columns.slice().sort().join('\u0000');
|
|
37
|
-
let perTableCache = tableCaches.get(table);
|
|
38
|
-
if (!perTableCache) {
|
|
39
|
-
perTableCache = new Map();
|
|
40
|
-
tableCaches.set(table, perTableCache);
|
|
41
|
-
}
|
|
42
|
-
const cached = perTableCache.get(cacheKey);
|
|
43
|
-
if (cached)
|
|
44
|
-
return cached;
|
|
45
|
-
const resolved = toTableColumnCodecs(table, codecSource, columns, {
|
|
46
|
-
dialect: options.dialect,
|
|
47
|
-
});
|
|
48
|
-
perTableCache.set(cacheKey, resolved);
|
|
49
|
-
return resolved;
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
export function applyCodecToDbValue(codec, value, dialect = 'sqlite') {
|
|
53
|
-
if (value === null || value === undefined)
|
|
54
|
-
return value;
|
|
55
|
-
const transform = resolveCodecToDb(codec, dialect);
|
|
56
|
-
return transform(value);
|
|
57
|
-
}
|
|
58
|
-
export function applyCodecFromDbValue(codec, value, dialect = 'sqlite') {
|
|
59
|
-
if (value === null || value === undefined)
|
|
60
|
-
return value;
|
|
61
|
-
const transform = resolveCodecFromDb(codec, dialect);
|
|
62
|
-
return transform(value);
|
|
63
|
-
}
|
|
64
|
-
export function applyCodecsToDbRow(row, tableCodecs, dialect = 'sqlite') {
|
|
65
|
-
if (!hasCodecs(tableCodecs))
|
|
66
|
-
return { ...row };
|
|
67
|
-
const transformed = { ...row };
|
|
68
|
-
for (const [column, codec] of Object.entries(tableCodecs)) {
|
|
69
|
-
if (!(column in transformed))
|
|
70
|
-
continue;
|
|
71
|
-
transformed[column] = applyCodecToDbValue(codec, transformed[column], dialect);
|
|
72
|
-
}
|
|
73
|
-
return transformed;
|
|
74
|
-
}
|
|
75
|
-
export function applyCodecsFromDbRow(row, tableCodecs, dialect = 'sqlite') {
|
|
76
|
-
if (!hasCodecs(tableCodecs))
|
|
77
|
-
return { ...row };
|
|
78
|
-
let transformed = null;
|
|
79
|
-
for (const [column, codec] of Object.entries(tableCodecs)) {
|
|
80
|
-
if (!(column in row))
|
|
81
|
-
continue;
|
|
82
|
-
const value = row[column];
|
|
83
|
-
if (value === null || value === undefined)
|
|
84
|
-
continue;
|
|
85
|
-
transformed ??= { ...row };
|
|
86
|
-
transformed[column] = applyCodecFromDbValue(codec, value, dialect);
|
|
87
|
-
}
|
|
88
|
-
return transformed ?? row;
|
|
89
|
-
}
|
|
90
|
-
function parseBooleanValue(value) {
|
|
91
|
-
if (typeof value === 'boolean')
|
|
92
|
-
return value;
|
|
93
|
-
if (typeof value === 'number')
|
|
94
|
-
return value !== 0;
|
|
95
|
-
if (typeof value === 'string') {
|
|
96
|
-
const normalized = value.trim().toLowerCase();
|
|
97
|
-
if (normalized === 'true' || normalized === 't')
|
|
98
|
-
return true;
|
|
99
|
-
if (normalized === 'false' || normalized === 'f')
|
|
100
|
-
return false;
|
|
101
|
-
const asNumber = Number(normalized);
|
|
102
|
-
if (Number.isFinite(asNumber))
|
|
103
|
-
return asNumber !== 0;
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
return Boolean(value);
|
|
107
|
-
}
|
|
108
|
-
export function numberBoolean() {
|
|
109
|
-
return {
|
|
110
|
-
ts: 'boolean',
|
|
111
|
-
toDb: (value) => (value ? 1 : 0),
|
|
112
|
-
fromDb: (value) => parseBooleanValue(value),
|
|
113
|
-
dialects: {
|
|
114
|
-
postgres: {
|
|
115
|
-
toDb: (value) => value,
|
|
116
|
-
fromDb: (value) => parseBooleanValue(value),
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
export function stringJson(options = {}) {
|
|
122
|
-
const stringify = options.stringify ?? ((value) => JSON.stringify(value));
|
|
123
|
-
const parse = options.parse ?? ((value) => JSON.parse(value));
|
|
124
|
-
const ts = options.ts ??
|
|
125
|
-
(options.import
|
|
126
|
-
? { type: options.import.name, import: options.import }
|
|
127
|
-
: 'unknown');
|
|
128
|
-
return {
|
|
129
|
-
ts,
|
|
130
|
-
toDb: (value) => stringify(value),
|
|
131
|
-
fromDb: (value) => {
|
|
132
|
-
if (typeof value === 'string') {
|
|
133
|
-
return parse(value);
|
|
134
|
-
}
|
|
135
|
-
return value;
|
|
136
|
-
},
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
export function timestampDate() {
|
|
140
|
-
return {
|
|
141
|
-
ts: 'Date',
|
|
142
|
-
toDb: (value) => value.toISOString(),
|
|
143
|
-
fromDb: (value) => value instanceof Date ? value : new Date(String(value)),
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
export function dateString() {
|
|
147
|
-
return {
|
|
148
|
-
ts: 'string',
|
|
149
|
-
toDb: (value) => value,
|
|
150
|
-
fromDb: (value) => value instanceof Date ? value.toISOString().slice(0, 10) : String(value),
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
export const codecs = {
|
|
154
|
-
numberBoolean,
|
|
155
|
-
stringJson,
|
|
156
|
-
timestampDate,
|
|
157
|
-
dateString,
|
|
158
|
-
};
|
|
159
|
-
//# sourceMappingURL=column-codecs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"column-codecs.js","sourceRoot":"","sources":["../src/column-codecs.ts"],"names":[],"mappings":"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"}
|
package/dist/conflict.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @syncular/core - Pure conflict detection and field-level merge utilities
|
|
3
|
-
*
|
|
4
|
-
* These are pure functions with no database dependencies.
|
|
5
|
-
* Database-specific conflict detection (triggers, etc.) lives in @syncular/server.
|
|
6
|
-
*/
|
|
7
|
-
import type { MergeResult } from './types';
|
|
8
|
-
/**
|
|
9
|
-
* Performs field-level merge between client changes and server state.
|
|
10
|
-
*
|
|
11
|
-
* Merge logic:
|
|
12
|
-
* - If only client changed a field -> use client's value
|
|
13
|
-
* - If only server changed a field -> keep server's value
|
|
14
|
-
* - If both changed same field to different values -> true conflict
|
|
15
|
-
*
|
|
16
|
-
* @param baseRow - The row state when client started editing (from base_version)
|
|
17
|
-
* @param serverRow - Current server row state
|
|
18
|
-
* @param clientPayload - Client's intended changes
|
|
19
|
-
* @returns MergeResult indicating if merge is possible and the result
|
|
20
|
-
*/
|
|
21
|
-
export declare function performFieldLevelMerge(baseRow: Record<string, unknown> | null, serverRow: Record<string, unknown>, clientPayload: Record<string, unknown>): MergeResult;
|
|
22
|
-
//# sourceMappingURL=conflict.d.ts.map
|
package/dist/conflict.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../src/conflict.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,WAAW,CAqCb"}
|
package/dist/conflict.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @syncular/core - Pure conflict detection and field-level merge utilities
|
|
3
|
-
*
|
|
4
|
-
* These are pure functions with no database dependencies.
|
|
5
|
-
* Database-specific conflict detection (triggers, etc.) lives in @syncular/server.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Performs field-level merge between client changes and server state.
|
|
9
|
-
*
|
|
10
|
-
* Merge logic:
|
|
11
|
-
* - If only client changed a field -> use client's value
|
|
12
|
-
* - If only server changed a field -> keep server's value
|
|
13
|
-
* - If both changed same field to different values -> true conflict
|
|
14
|
-
*
|
|
15
|
-
* @param baseRow - The row state when client started editing (from base_version)
|
|
16
|
-
* @param serverRow - Current server row state
|
|
17
|
-
* @param clientPayload - Client's intended changes
|
|
18
|
-
* @returns MergeResult indicating if merge is possible and the result
|
|
19
|
-
*/
|
|
20
|
-
export function performFieldLevelMerge(baseRow, serverRow, clientPayload) {
|
|
21
|
-
// If no base row (new insert), client payload wins entirely
|
|
22
|
-
if (!baseRow) {
|
|
23
|
-
return { canMerge: true, mergedPayload: clientPayload };
|
|
24
|
-
}
|
|
25
|
-
const conflictingFields = [];
|
|
26
|
-
const mergedPayload = { ...serverRow };
|
|
27
|
-
// Check each field in the client payload
|
|
28
|
-
for (const [field, clientValue] of Object.entries(clientPayload)) {
|
|
29
|
-
const baseValue = baseRow[field];
|
|
30
|
-
const serverValue = serverRow[field];
|
|
31
|
-
const clientChanged = !deepEqual(baseValue, clientValue);
|
|
32
|
-
const serverChanged = !deepEqual(baseValue, serverValue);
|
|
33
|
-
if (clientChanged && serverChanged) {
|
|
34
|
-
// Both changed the same field
|
|
35
|
-
if (!deepEqual(clientValue, serverValue)) {
|
|
36
|
-
// Changed to different values - true conflict
|
|
37
|
-
conflictingFields.push(field);
|
|
38
|
-
}
|
|
39
|
-
// If they changed to the same value, no conflict - use either
|
|
40
|
-
mergedPayload[field] = clientValue;
|
|
41
|
-
}
|
|
42
|
-
else if (clientChanged) {
|
|
43
|
-
// Only client changed - use client's value
|
|
44
|
-
mergedPayload[field] = clientValue;
|
|
45
|
-
}
|
|
46
|
-
// If only server changed or neither changed, keep server value (already in mergedPayload)
|
|
47
|
-
}
|
|
48
|
-
if (conflictingFields.length > 0) {
|
|
49
|
-
return { canMerge: false, conflictingFields };
|
|
50
|
-
}
|
|
51
|
-
return { canMerge: true, mergedPayload };
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Deep equality check for values (handles primitives, arrays, objects)
|
|
55
|
-
*/
|
|
56
|
-
function deepEqual(a, b) {
|
|
57
|
-
if (a === b)
|
|
58
|
-
return true;
|
|
59
|
-
if (a === null || b === null)
|
|
60
|
-
return a === b;
|
|
61
|
-
if (typeof a !== typeof b)
|
|
62
|
-
return false;
|
|
63
|
-
if (typeof a === 'object') {
|
|
64
|
-
if (Array.isArray(a) && Array.isArray(b)) {
|
|
65
|
-
if (a.length !== b.length)
|
|
66
|
-
return false;
|
|
67
|
-
return a.every((item, index) => deepEqual(item, b[index]));
|
|
68
|
-
}
|
|
69
|
-
if (Array.isArray(a) || Array.isArray(b))
|
|
70
|
-
return false;
|
|
71
|
-
const aObj = a;
|
|
72
|
-
const bObj = b;
|
|
73
|
-
const aKeys = Object.keys(aObj);
|
|
74
|
-
const bKeys = Object.keys(bObj);
|
|
75
|
-
if (aKeys.length !== bKeys.length)
|
|
76
|
-
return false;
|
|
77
|
-
return aKeys.every((key) => deepEqual(aObj[key], bObj[key]));
|
|
78
|
-
}
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=conflict.js.map
|
package/dist/conflict.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conflict.js","sourceRoot":"","sources":["../src/conflict.ts"],"names":[],"mappings":"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"}
|
package/dist/database.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Kysely } from 'kysely';
|
|
2
|
-
import type { ColumnCodecSource } from './column-codecs';
|
|
3
|
-
import type { SqlFamily, SyncularDialectDescriptor } from './dialect';
|
|
4
|
-
export declare function createDatabase<T, F extends SqlFamily = SqlFamily>(options: SyncularDialectDescriptor<F> & {
|
|
5
|
-
codecs?: ColumnCodecSource;
|
|
6
|
-
}): Kysely<T>;
|
|
7
|
-
//# sourceMappingURL=database.d.ts.map
|
package/dist/database.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAGtE,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/D,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG;IACtC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B,aAYF"}
|
package/dist/database.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Kysely } from 'kysely';
|
|
2
|
-
import { createColumnCodecsPlugin } from './kysely-column-codecs.js';
|
|
3
|
-
export function createDatabase(options) {
|
|
4
|
-
const db = new Kysely({
|
|
5
|
-
dialect: options.dialect,
|
|
6
|
-
});
|
|
7
|
-
if (!options.codecs)
|
|
8
|
-
return db;
|
|
9
|
-
return db.withPlugin(createColumnCodecsPlugin({
|
|
10
|
-
codecs: options.codecs,
|
|
11
|
-
dialect: options.family,
|
|
12
|
-
}));
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=database.js.map
|
package/dist/database.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,UAAU,cAAc,CAC5B,OAEC;IAED,MAAM,EAAE,GAAG,IAAI,MAAM,CAAI;QACvB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,EAAE,CAAC,UAAU,CAClB,wBAAwB,CAAC;QACvB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,MAAM;KACxB,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/dist/dialect.d.ts
DELETED
package/dist/dialect.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9C,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,CAAC;CACX"}
|
package/dist/dialect.js
DELETED
package/dist/dialect.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dialect.js","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":""}
|