@syncular/core 0.0.1 → 0.0.2-127

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.
Files changed (70) hide show
  1. package/README.md +24 -0
  2. package/dist/blobs.d.ts +9 -4
  3. package/dist/blobs.d.ts.map +1 -1
  4. package/dist/blobs.js +0 -12
  5. package/dist/blobs.js.map +1 -1
  6. package/dist/column-codecs.d.ts +55 -0
  7. package/dist/column-codecs.d.ts.map +1 -0
  8. package/dist/column-codecs.js +124 -0
  9. package/dist/column-codecs.js.map +1 -0
  10. package/dist/index.d.ts +11 -9
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +21 -7
  13. package/dist/index.js.map +1 -1
  14. package/dist/kysely-serialize.d.ts +1 -1
  15. package/dist/kysely-serialize.d.ts.map +1 -1
  16. package/dist/logger.d.ts +7 -32
  17. package/dist/logger.d.ts.map +1 -1
  18. package/dist/logger.js +6 -40
  19. package/dist/logger.js.map +1 -1
  20. package/dist/proxy/types.d.ts +0 -9
  21. package/dist/proxy/types.d.ts.map +1 -1
  22. package/dist/schemas/index.js +3 -3
  23. package/dist/schemas/sync.d.ts +120 -6
  24. package/dist/schemas/sync.d.ts.map +1 -1
  25. package/dist/schemas/sync.js +17 -3
  26. package/dist/schemas/sync.js.map +1 -1
  27. package/dist/scopes/index.d.ts +39 -64
  28. package/dist/scopes/index.d.ts.map +1 -1
  29. package/dist/scopes/index.js +9 -154
  30. package/dist/scopes/index.js.map +1 -1
  31. package/dist/snapshot-chunks.d.ts +26 -0
  32. package/dist/snapshot-chunks.d.ts.map +1 -0
  33. package/dist/snapshot-chunks.js +89 -0
  34. package/dist/snapshot-chunks.js.map +1 -0
  35. package/dist/telemetry.d.ts +114 -0
  36. package/dist/telemetry.d.ts.map +1 -0
  37. package/dist/telemetry.js +113 -0
  38. package/dist/telemetry.js.map +1 -0
  39. package/dist/types.d.ts +12 -9
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/types.js.map +1 -1
  42. package/dist/utils/id.d.ts +2 -0
  43. package/dist/utils/id.d.ts.map +1 -0
  44. package/dist/utils/id.js +8 -0
  45. package/dist/utils/id.js.map +1 -0
  46. package/dist/utils/index.d.ts +3 -0
  47. package/dist/utils/index.d.ts.map +1 -0
  48. package/dist/utils/index.js +3 -0
  49. package/dist/utils/index.js.map +1 -0
  50. package/dist/utils/object.d.ts +2 -0
  51. package/dist/utils/object.d.ts.map +1 -0
  52. package/dist/utils/object.js +4 -0
  53. package/dist/utils/object.js.map +1 -0
  54. package/package.json +28 -8
  55. package/src/__tests__/telemetry.test.ts +170 -0
  56. package/src/__tests__/utils.test.ts +27 -0
  57. package/src/blobs.ts +15 -14
  58. package/src/column-codecs.ts +228 -0
  59. package/src/index.ts +15 -41
  60. package/src/kysely-serialize.ts +1 -1
  61. package/src/logger.ts +10 -68
  62. package/src/proxy/types.ts +0 -10
  63. package/src/schemas/sync.ts +27 -3
  64. package/src/scopes/index.ts +72 -200
  65. package/src/snapshot-chunks.ts +112 -0
  66. package/src/telemetry.ts +238 -0
  67. package/src/types.ts +14 -18
  68. package/src/utils/id.ts +7 -0
  69. package/src/utils/index.ts +2 -0
  70. package/src/utils/object.ts +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-chunks.d.ts","sourceRoot":"","sources":["../src/snapshot-chunks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAChE,MAAM,MAAM,yBAAyB,GAAG,OAAO,4BAA4B,CAAC;AAE5E,eAAO,MAAM,+BAA+B,SAAS,CAAC;AACtD,MAAM,MAAM,4BAA4B,GACtC,OAAO,+BAA+B,CAAC;AAWzC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CA2B5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CASvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CAoC/D"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @syncular/core - Snapshot chunk encoding helpers
3
+ */
4
+ export const SYNC_SNAPSHOT_CHUNK_ENCODING = 'json-row-frame-v1';
5
+ export const SYNC_SNAPSHOT_CHUNK_COMPRESSION = 'gzip';
6
+ const SNAPSHOT_ROW_FRAME_MAGIC = new Uint8Array([0x53, 0x52, 0x46, 0x31]); // "SRF1"
7
+ const FRAME_LENGTH_BYTES = 4;
8
+ const MAX_FRAME_BYTE_LENGTH = 0xffff_ffff;
9
+ function normalizeRowJson(row) {
10
+ const serialized = JSON.stringify(row);
11
+ return serialized === undefined ? 'null' : serialized;
12
+ }
13
+ /**
14
+ * Encode rows as framed JSON bytes without the format header.
15
+ */
16
+ export function encodeSnapshotRowFrames(rows) {
17
+ const encoder = new TextEncoder();
18
+ const payloads = [];
19
+ let totalByteLength = 0;
20
+ for (const row of rows) {
21
+ const payload = encoder.encode(normalizeRowJson(row));
22
+ if (payload.length > MAX_FRAME_BYTE_LENGTH) {
23
+ throw new Error(`Snapshot row payload exceeds ${MAX_FRAME_BYTE_LENGTH} bytes`);
24
+ }
25
+ payloads.push(payload);
26
+ totalByteLength += FRAME_LENGTH_BYTES + payload.length;
27
+ }
28
+ const encoded = new Uint8Array(totalByteLength);
29
+ const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.length);
30
+ let offset = 0;
31
+ for (const payload of payloads) {
32
+ view.setUint32(offset, payload.length, false);
33
+ offset += FRAME_LENGTH_BYTES;
34
+ encoded.set(payload, offset);
35
+ offset += payload.length;
36
+ }
37
+ return encoded;
38
+ }
39
+ /**
40
+ * Encode rows as framed JSON bytes with a format header.
41
+ *
42
+ * Format:
43
+ * - 4-byte magic header ("SRF1")
44
+ * - repeated frames of:
45
+ * - 4-byte big-endian payload byte length
46
+ * - UTF-8 JSON payload
47
+ */
48
+ export function encodeSnapshotRows(rows) {
49
+ const framedRows = encodeSnapshotRowFrames(rows);
50
+ const totalByteLength = SNAPSHOT_ROW_FRAME_MAGIC.length + framedRows.length;
51
+ const encoded = new Uint8Array(totalByteLength);
52
+ encoded.set(SNAPSHOT_ROW_FRAME_MAGIC, 0);
53
+ encoded.set(framedRows, SNAPSHOT_ROW_FRAME_MAGIC.length);
54
+ return encoded;
55
+ }
56
+ /**
57
+ * Decode framed JSON bytes into rows.
58
+ */
59
+ export function decodeSnapshotRows(bytes) {
60
+ if (bytes.length < SNAPSHOT_ROW_FRAME_MAGIC.length) {
61
+ throw new Error('Snapshot chunk payload is too small');
62
+ }
63
+ for (let index = 0; index < SNAPSHOT_ROW_FRAME_MAGIC.length; index += 1) {
64
+ const expected = SNAPSHOT_ROW_FRAME_MAGIC[index];
65
+ const actual = bytes[index];
66
+ if (actual !== expected) {
67
+ throw new Error('Unexpected snapshot chunk format');
68
+ }
69
+ }
70
+ const rows = [];
71
+ const decoder = new TextDecoder();
72
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
73
+ let offset = SNAPSHOT_ROW_FRAME_MAGIC.length;
74
+ while (offset < bytes.length) {
75
+ if (offset + FRAME_LENGTH_BYTES > bytes.length) {
76
+ throw new Error('Snapshot chunk payload ended mid-frame header');
77
+ }
78
+ const payloadLength = view.getUint32(offset, false);
79
+ offset += FRAME_LENGTH_BYTES;
80
+ if (offset + payloadLength > bytes.length) {
81
+ throw new Error('Snapshot chunk payload ended mid-frame body');
82
+ }
83
+ const payload = bytes.subarray(offset, offset + payloadLength);
84
+ offset += payloadLength;
85
+ rows.push(JSON.parse(decoder.decode(payload)));
86
+ }
87
+ return rows;
88
+ }
89
+ //# sourceMappingURL=snapshot-chunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-chunks.js","sourceRoot":"","sources":["../src/snapshot-chunks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @syncular/core - Runtime telemetry abstraction
3
+ *
4
+ * Provides vendor-neutral logging, tracing, and metrics interfaces so
5
+ * Syncular libraries can emit telemetry without coupling to a specific SDK.
6
+ */
7
+ /**
8
+ * Supported log levels.
9
+ */
10
+ export type SyncTelemetryLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
11
+ /**
12
+ * Primitive attribute value used by traces and metrics.
13
+ */
14
+ export type SyncTelemetryAttributeValue = string | number | boolean;
15
+ /**
16
+ * Attribute bag used by traces and metrics.
17
+ */
18
+ export type SyncTelemetryAttributes = Record<string, SyncTelemetryAttributeValue>;
19
+ /**
20
+ * Structured sync log event.
21
+ */
22
+ export interface SyncTelemetryEvent {
23
+ event: string;
24
+ level?: SyncTelemetryLevel;
25
+ userId?: string;
26
+ durationMs?: number;
27
+ rowCount?: number;
28
+ resetRequired?: boolean;
29
+ error?: string;
30
+ [key: string]: unknown;
31
+ }
32
+ /**
33
+ * Span creation options.
34
+ */
35
+ export interface SyncSpanOptions {
36
+ name: string;
37
+ op?: string;
38
+ attributes?: SyncTelemetryAttributes;
39
+ }
40
+ /**
41
+ * Span API exposed to Syncular internals.
42
+ */
43
+ export interface SyncSpan {
44
+ setAttribute(name: string, value: SyncTelemetryAttributeValue): void;
45
+ setAttributes(attributes: SyncTelemetryAttributes): void;
46
+ setStatus(status: 'ok' | 'error'): void;
47
+ }
48
+ /**
49
+ * Tracing interface.
50
+ */
51
+ export interface SyncTracer {
52
+ startSpan<T>(options: SyncSpanOptions, callback: (span: SyncSpan) => T): T;
53
+ }
54
+ /**
55
+ * Metric record options.
56
+ */
57
+ export interface SyncMetricOptions {
58
+ attributes?: SyncTelemetryAttributes;
59
+ unit?: string;
60
+ }
61
+ /**
62
+ * Metrics interface.
63
+ */
64
+ export interface SyncMetrics {
65
+ count(name: string, value?: number, options?: SyncMetricOptions): void;
66
+ gauge(name: string, value: number, options?: SyncMetricOptions): void;
67
+ distribution(name: string, value: number, options?: SyncMetricOptions): void;
68
+ }
69
+ /**
70
+ * Unified telemetry interface.
71
+ */
72
+ export interface SyncTelemetry {
73
+ log(event: SyncTelemetryEvent): void;
74
+ tracer: SyncTracer;
75
+ metrics: SyncMetrics;
76
+ captureException(error: unknown, context?: Record<string, unknown>): void;
77
+ }
78
+ /**
79
+ * Create console-backed default telemetry (logs only; no-op tracing/metrics).
80
+ */
81
+ export declare function createDefaultSyncTelemetry(): SyncTelemetry;
82
+ /**
83
+ * Get currently configured telemetry backend.
84
+ */
85
+ export declare function getSyncTelemetry(): SyncTelemetry;
86
+ /**
87
+ * Replace active telemetry backend.
88
+ */
89
+ export declare function configureSyncTelemetry(telemetry: SyncTelemetry): void;
90
+ /**
91
+ * Reset telemetry backend to default console implementation.
92
+ */
93
+ export declare function resetSyncTelemetry(): void;
94
+ /**
95
+ * Capture an exception through the active telemetry backend.
96
+ */
97
+ export declare function captureSyncException(error: unknown, context?: Record<string, unknown>): void;
98
+ /**
99
+ * Start a span through the active telemetry backend.
100
+ */
101
+ export declare function startSyncSpan<T>(options: SyncSpanOptions, callback: (span: SyncSpan) => T): T;
102
+ /**
103
+ * Record a counter metric through the active telemetry backend.
104
+ */
105
+ export declare function countSyncMetric(name: string, value?: number, options?: SyncMetricOptions): void;
106
+ /**
107
+ * Record a gauge metric through the active telemetry backend.
108
+ */
109
+ export declare function gaugeSyncMetric(name: string, value: number, options?: SyncMetricOptions): void;
110
+ /**
111
+ * Record a distribution metric through the active telemetry backend.
112
+ */
113
+ export declare function distributionSyncMetric(name: string, value: number, options?: SyncMetricOptions): void;
114
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @syncular/core - Runtime telemetry abstraction
3
+ *
4
+ * Provides vendor-neutral logging, tracing, and metrics interfaces so
5
+ * Syncular libraries can emit telemetry without coupling to a specific SDK.
6
+ */
7
+ const noopSpan = {
8
+ setAttribute() { },
9
+ setAttributes() { },
10
+ setStatus() { },
11
+ };
12
+ const noopTracer = {
13
+ startSpan(_options, callback) {
14
+ return callback(noopSpan);
15
+ },
16
+ };
17
+ const noopMetrics = {
18
+ count() { },
19
+ gauge() { },
20
+ distribution() { },
21
+ };
22
+ function createConsoleLogger() {
23
+ const isNode = typeof globalThis !== 'undefined' &&
24
+ typeof globalThis.setImmediate === 'function';
25
+ const defer = isNode
26
+ ? (fn) => globalThis.setImmediate(fn)
27
+ : (fn) => setTimeout(fn, 0);
28
+ return (event) => {
29
+ defer(() => {
30
+ const level = event.level ?? (event.error ? 'error' : 'info');
31
+ const payload = {
32
+ timestamp: new Date().toISOString(),
33
+ level,
34
+ ...event,
35
+ };
36
+ console.log(JSON.stringify(payload));
37
+ });
38
+ };
39
+ }
40
+ /**
41
+ * Create console-backed default telemetry (logs only; no-op tracing/metrics).
42
+ */
43
+ export function createDefaultSyncTelemetry() {
44
+ const logger = createConsoleLogger();
45
+ return {
46
+ log(event) {
47
+ logger(event);
48
+ },
49
+ tracer: noopTracer,
50
+ metrics: noopMetrics,
51
+ captureException(error, context) {
52
+ const message = error instanceof Error
53
+ ? error.message
54
+ : `Unknown error: ${String(error)}`;
55
+ logger({
56
+ event: 'sync.exception',
57
+ level: 'error',
58
+ error: message,
59
+ ...(context ?? {}),
60
+ });
61
+ },
62
+ };
63
+ }
64
+ let activeSyncTelemetry = createDefaultSyncTelemetry();
65
+ /**
66
+ * Get currently configured telemetry backend.
67
+ */
68
+ export function getSyncTelemetry() {
69
+ return activeSyncTelemetry;
70
+ }
71
+ /**
72
+ * Replace active telemetry backend.
73
+ */
74
+ export function configureSyncTelemetry(telemetry) {
75
+ activeSyncTelemetry = telemetry;
76
+ }
77
+ /**
78
+ * Reset telemetry backend to default console implementation.
79
+ */
80
+ export function resetSyncTelemetry() {
81
+ activeSyncTelemetry = createDefaultSyncTelemetry();
82
+ }
83
+ /**
84
+ * Capture an exception through the active telemetry backend.
85
+ */
86
+ export function captureSyncException(error, context) {
87
+ activeSyncTelemetry.captureException(error, context);
88
+ }
89
+ /**
90
+ * Start a span through the active telemetry backend.
91
+ */
92
+ export function startSyncSpan(options, callback) {
93
+ return activeSyncTelemetry.tracer.startSpan(options, callback);
94
+ }
95
+ /**
96
+ * Record a counter metric through the active telemetry backend.
97
+ */
98
+ export function countSyncMetric(name, value, options) {
99
+ activeSyncTelemetry.metrics.count(name, value, options);
100
+ }
101
+ /**
102
+ * Record a gauge metric through the active telemetry backend.
103
+ */
104
+ export function gaugeSyncMetric(name, value, options) {
105
+ activeSyncTelemetry.metrics.gauge(name, value, options);
106
+ }
107
+ /**
108
+ * Record a distribution metric through the active telemetry backend.
109
+ */
110
+ export function distributionSyncMetric(name, value, options) {
111
+ activeSyncTelemetry.metrics.distribution(name, value, options);
112
+ }
113
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * Non-protocol types: conflict detection, transport interfaces.
5
5
  * Protocol types (SyncOp, SyncPushRequest, etc.) live in ./schemas/sync.ts
6
6
  */
7
- import type { SyncPullRequest, SyncPullResponse, SyncPushRequest, SyncPushResponse } from './schemas/sync';
7
+ import type { SyncCombinedRequest, SyncCombinedResponse } from './schemas/sync';
8
8
  /**
9
9
  * Result of a conflict check - no conflict
10
10
  */
@@ -102,21 +102,24 @@ export interface SyncTransportBlobs {
102
102
  */
103
103
  export interface SyncTransport {
104
104
  /**
105
- * Pull commits/snapshots from the server.
105
+ * Combined push+pull in a single round-trip.
106
106
  */
107
- pull(request: SyncPullRequest, options?: SyncTransportOptions): Promise<SyncPullResponse>;
108
- /**
109
- * Push a client commit to the server.
110
- */
111
- push(request: SyncPushRequest, options?: SyncTransportOptions): Promise<SyncPushResponse>;
107
+ sync(request: SyncCombinedRequest, options?: SyncTransportOptions): Promise<SyncCombinedResponse>;
112
108
  /**
113
109
  * Download an encoded bootstrap snapshot chunk.
114
- *
115
- * The server must validate auth for the chunk.
116
110
  */
117
111
  fetchSnapshotChunk(request: {
118
112
  chunkId: string;
119
113
  }, options?: SyncTransportOptions): Promise<Uint8Array>;
114
+ /**
115
+ * Optional streaming snapshot chunk download.
116
+ *
117
+ * When implemented, clients can decode and apply large bootstrap chunks
118
+ * incrementally without materializing the entire chunk in memory.
119
+ */
120
+ fetchSnapshotChunkStream?(request: {
121
+ chunkId: string;
122
+ }, options?: SyncTransportOptions): Promise<ReadableStream<Uint8Array>>;
120
123
  /**
121
124
  * Optional blob operations.
122
125
  * When present, enables blob upload/download functionality.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2JH;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB,MAAM;IACN,IAAI;IAHtB,YACE,OAAe,EACC,MAAe,EACf,IAAa,EAC7B;QACA,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHC,MAAM;oBACN,IAAI;QAGpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAAA,CAClC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuJH;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB,MAAM;IACN,IAAI;IAHtB,YACE,OAAe,EACC,MAAe,EACf,IAAa,EAC7B;QACA,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHC,MAAM;oBACN,IAAI;QAGpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAAA,CAClC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function randomId(): string;
2
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAMjC"}
@@ -0,0 +1,8 @@
1
+ export function randomId() {
2
+ const cryptoObj = globalThis.crypto;
3
+ if (cryptoObj && typeof cryptoObj.randomUUID === 'function') {
4
+ return cryptoObj.randomUUID();
5
+ }
6
+ return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
7
+ }
8
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,GAAW;IACjC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;IACpC,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,CAC/D"}
@@ -0,0 +1,3 @@
1
+ export * from './id';
2
+ export * from './object';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './id.js';
2
+ export * from './object.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
2
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,4 @@
1
+ export function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAoC;IACzE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,CAC7E"}
package/package.json CHANGED
@@ -1,6 +1,25 @@
1
1
  {
2
2
  "name": "@syncular/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.2-127",
4
+ "description": "Core protocol types and shared utilities for the Syncular sync framework",
5
+ "license": "MIT",
6
+ "author": "Benjamin Kniffler",
7
+ "homepage": "https://syncular.dev",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/syncular/syncular.git",
11
+ "directory": "packages/core"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/syncular/syncular/issues"
15
+ },
16
+ "keywords": [
17
+ "sync",
18
+ "offline-first",
19
+ "realtime",
20
+ "database",
21
+ "typescript"
22
+ ],
4
23
  "private": false,
5
24
  "publishConfig": {
6
25
  "access": "public"
@@ -9,6 +28,7 @@
9
28
  "exports": {
10
29
  ".": {
11
30
  "bun": "./src/index.ts",
31
+ "browser": "./src/index.ts",
12
32
  "import": {
13
33
  "types": "./dist/index.d.ts",
14
34
  "default": "./dist/index.js"
@@ -18,17 +38,17 @@
18
38
  "scripts": {
19
39
  "test": "bun test src/__tests__",
20
40
  "tsgo": "tsgo --noEmit",
21
- "build": "rm -rf dist && tsgo"
22
- },
23
- "dependencies": {
24
- "zod": "^4.3.6"
41
+ "build": "tsgo",
42
+ "release": "bunx syncular-publish"
25
43
  },
26
44
  "peerDependencies": {
27
- "kysely": "^0.28.0"
45
+ "kysely": "^0.28.0",
46
+ "zod": "^4.0.0"
28
47
  },
29
48
  "devDependencies": {
30
- "@syncular/config": "workspace:*",
31
- "kysely": "*"
49
+ "@syncular/config": "0.0.0",
50
+ "kysely": "*",
51
+ "zod": "*"
32
52
  },
33
53
  "files": [
34
54
  "dist",