@powersync/service-sync-rules 0.0.0-dev-20261005120023 → 0.0.0-dev-20261007110800

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 (49) hide show
  1. package/dist/HydratedSyncConfig.js +4 -1
  2. package/dist/HydratedSyncConfig.js.map +1 -1
  3. package/dist/SourceTableConfig.d.ts +11 -6
  4. package/dist/SourceTableConfig.js +33 -31
  5. package/dist/SourceTableConfig.js.map +1 -1
  6. package/dist/SqlSyncRules.d.ts +0 -12
  7. package/dist/SqlSyncRules.js +1 -3
  8. package/dist/SqlSyncRules.js.map +1 -1
  9. package/dist/SyncConfig.d.ts +0 -5
  10. package/dist/SyncConfig.js +0 -4
  11. package/dist/SyncConfig.js.map +1 -1
  12. package/dist/SyncConfigDiagnostics.d.ts +12 -0
  13. package/dist/SyncConfigDiagnostics.js +2 -0
  14. package/dist/SyncConfigDiagnostics.js.map +1 -0
  15. package/dist/from_yaml.d.ts +0 -13
  16. package/dist/from_yaml.js +77 -71
  17. package/dist/from_yaml.js.map +1 -1
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.js +3 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/json_schema.d.ts +1 -2
  22. package/dist/json_schema.js +4 -9
  23. package/dist/json_schema.js.map +1 -1
  24. package/dist/legacy/streams/from_sql.js +1 -1
  25. package/dist/legacy/streams/from_sql.js.map +1 -1
  26. package/dist/mongo/MongoBsonValidators.d.ts +61 -0
  27. package/dist/mongo/MongoBsonValidators.js +112 -0
  28. package/dist/mongo/MongoBsonValidators.js.map +1 -0
  29. package/dist/mongo/MongoFilterExpression.d.ts +56 -0
  30. package/dist/mongo/MongoFilterExpression.js +172 -0
  31. package/dist/mongo/MongoFilterExpression.js.map +1 -0
  32. package/dist/mongo/MongoFilterValidation.d.ts +28 -0
  33. package/dist/mongo/MongoFilterValidation.js +47 -0
  34. package/dist/mongo/MongoFilterValidation.js.map +1 -0
  35. package/dist/sync_plan/evaluator/index.js +0 -1
  36. package/dist/sync_plan/evaluator/index.js.map +1 -1
  37. package/dist/sync_plan/plan.d.ts +0 -4
  38. package/dist/sync_plan/serialize.d.ts +0 -5
  39. package/dist/sync_plan/serialize.js +1 -20
  40. package/dist/sync_plan/serialize.js.map +1 -1
  41. package/dist/yaml_source_locations.d.ts +2 -2
  42. package/dist/yaml_source_locations.js +7 -12
  43. package/dist/yaml_source_locations.js.map +1 -1
  44. package/package.json +4 -2
  45. package/schema/sync_config.json +361 -4
  46. package/schema/sync_rules.json +361 -4
  47. package/dist/SyncConfigParserHooks.d.ts +0 -103
  48. package/dist/SyncConfigParserHooks.js +0 -11
  49. package/dist/SyncConfigParserHooks.js.map +0 -1
@@ -3,7 +3,8 @@
3
3
  "properties": {
4
4
  "bucket_definitions": {
5
5
  "type": "object",
6
- "description": "List of bucket definitions",
6
+ "deprecated": true,
7
+ "description": "Deprecated: legacy Sync Rules bucket definitions. They will be removed in the next major version of the PowerSync Service. Use `streams:` (Sync Streams) instead: https://docs.powersync.com/sync/rules/migrate-to-sync-streams",
7
8
  "examples": [
8
9
  {
9
10
  "global": {
@@ -176,12 +177,368 @@
176
177
  "type": "object",
177
178
  "propertyNames": {
178
179
  "minLength": 1,
179
- "pattern": "^(?:[^.\"]+|\"(?:[^\"]|\"\")+\")(?:\\.(?:[^.\"]+|\"(?:[^\"]|\"\")+\")){0,2}$",
180
- "patternErrorMessage": "Use <table>, <database>.<table>, or <connection>.<database>.<table>. Double-quote names containing dots or quotes."
180
+ "pattern": "^(?:[^.\"]+|\"(?:[^\"]|\"\")+\")(?:\\.(?:[^.\"]+|\"(?:[^\"]|\"\")+\")){0,2}$"
181
181
  },
182
182
  "additionalProperties": {
183
183
  "type": "object",
184
- "properties": {},
184
+ "properties": {
185
+ "mongodb_filter_expression": {
186
+ "anyOf": [
187
+ {
188
+ "$schema": "http://json-schema.org/draft-07/schema#",
189
+ "anyOf": [
190
+ {
191
+ "type": "object",
192
+ "properties": {
193
+ "$eq": {
194
+ "type": "array",
195
+ "items": [
196
+ {
197
+ "$ref": "#/definitions/__schema0"
198
+ },
199
+ {
200
+ "$ref": "#/definitions/__schema1"
201
+ }
202
+ ],
203
+ "minItems": 2,
204
+ "maxItems": 2,
205
+ "description": "Compare a source field with a scalar constant.",
206
+ "examples": [
207
+ [
208
+ "$$doc.status",
209
+ "active"
210
+ ]
211
+ ]
212
+ }
213
+ },
214
+ "required": [
215
+ "$eq"
216
+ ],
217
+ "additionalProperties": false
218
+ },
219
+ {
220
+ "type": "object",
221
+ "properties": {
222
+ "$in": {
223
+ "type": "array",
224
+ "items": [
225
+ {
226
+ "$ref": "#/definitions/__schema0"
227
+ },
228
+ {
229
+ "$ref": "#/definitions/__schema5"
230
+ }
231
+ ],
232
+ "minItems": 2,
233
+ "maxItems": 2,
234
+ "examples": [
235
+ [
236
+ "$$doc.status",
237
+ [
238
+ "pending",
239
+ "shipped"
240
+ ]
241
+ ]
242
+ ]
243
+ }
244
+ },
245
+ "required": [
246
+ "$in"
247
+ ],
248
+ "additionalProperties": false
249
+ },
250
+ {
251
+ "type": "object",
252
+ "properties": {
253
+ "$and": {
254
+ "minItems": 1,
255
+ "type": "array",
256
+ "items": {
257
+ "$ref": "#"
258
+ },
259
+ "examples": [
260
+ [
261
+ {
262
+ "$eq": [
263
+ "$$doc.active",
264
+ true
265
+ ]
266
+ }
267
+ ]
268
+ ]
269
+ }
270
+ },
271
+ "required": [
272
+ "$and"
273
+ ],
274
+ "additionalProperties": false
275
+ },
276
+ {
277
+ "type": "object",
278
+ "properties": {
279
+ "$or": {
280
+ "minItems": 1,
281
+ "type": "array",
282
+ "items": {
283
+ "$ref": "#"
284
+ },
285
+ "examples": [
286
+ [
287
+ {
288
+ "$eq": [
289
+ "$$doc.status",
290
+ "pending"
291
+ ]
292
+ },
293
+ {
294
+ "$eq": [
295
+ "$$doc.priority",
296
+ true
297
+ ]
298
+ }
299
+ ]
300
+ ]
301
+ }
302
+ },
303
+ "required": [
304
+ "$or"
305
+ ],
306
+ "additionalProperties": false
307
+ }
308
+ ],
309
+ "definitions": {
310
+ "__schema0": {
311
+ "type": "string",
312
+ "pattern": "^\\$\\$doc(?:\\.(?![0-9]+(?:\\.|$))[^.$][^.]*)+$"
313
+ },
314
+ "__schema1": {
315
+ "anyOf": [
316
+ {
317
+ "type": "boolean"
318
+ },
319
+ {
320
+ "type": "number"
321
+ },
322
+ {
323
+ "type": "string",
324
+ "pattern": "^(?!\\$)"
325
+ },
326
+ {
327
+ "anyOf": [
328
+ {
329
+ "type": "object",
330
+ "properties": {
331
+ "$literal": {
332
+ "type": "string"
333
+ }
334
+ },
335
+ "required": [
336
+ "$literal"
337
+ ],
338
+ "additionalProperties": false
339
+ },
340
+ {
341
+ "type": "object",
342
+ "properties": {
343
+ "$oid": {
344
+ "type": "string",
345
+ "pattern": "^[0-9a-fA-F]{24}$"
346
+ }
347
+ },
348
+ "required": [
349
+ "$oid"
350
+ ],
351
+ "additionalProperties": false
352
+ },
353
+ {
354
+ "type": "object",
355
+ "properties": {
356
+ "$numberInt": {
357
+ "allOf": [
358
+ {
359
+ "$ref": "#/definitions/__schema2"
360
+ }
361
+ ]
362
+ }
363
+ },
364
+ "required": [
365
+ "$numberInt"
366
+ ],
367
+ "additionalProperties": false
368
+ },
369
+ {
370
+ "type": "object",
371
+ "properties": {
372
+ "$numberLong": {
373
+ "allOf": [
374
+ {
375
+ "$ref": "#/definitions/__schema2"
376
+ }
377
+ ]
378
+ }
379
+ },
380
+ "required": [
381
+ "$numberLong"
382
+ ],
383
+ "additionalProperties": false
384
+ },
385
+ {
386
+ "type": "object",
387
+ "properties": {
388
+ "$numberDouble": {
389
+ "type": "string",
390
+ "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$"
391
+ }
392
+ },
393
+ "required": [
394
+ "$numberDouble"
395
+ ],
396
+ "additionalProperties": false
397
+ },
398
+ {
399
+ "type": "object",
400
+ "properties": {
401
+ "$numberDecimal": {
402
+ "type": "string"
403
+ }
404
+ },
405
+ "required": [
406
+ "$numberDecimal"
407
+ ],
408
+ "additionalProperties": false
409
+ },
410
+ {
411
+ "type": "object",
412
+ "properties": {
413
+ "$uuid": {
414
+ "type": "string",
415
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
416
+ }
417
+ },
418
+ "required": [
419
+ "$uuid"
420
+ ],
421
+ "additionalProperties": false
422
+ },
423
+ {
424
+ "type": "object",
425
+ "properties": {
426
+ "$date": {
427
+ "anyOf": [
428
+ {
429
+ "type": "string",
430
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$"
431
+ },
432
+ {
433
+ "type": "object",
434
+ "properties": {
435
+ "$numberLong": {
436
+ "allOf": [
437
+ {
438
+ "$ref": "#/definitions/__schema2"
439
+ }
440
+ ]
441
+ }
442
+ },
443
+ "required": [
444
+ "$numberLong"
445
+ ],
446
+ "additionalProperties": false
447
+ }
448
+ ]
449
+ }
450
+ },
451
+ "required": [
452
+ "$date"
453
+ ],
454
+ "additionalProperties": false
455
+ },
456
+ {
457
+ "type": "object",
458
+ "properties": {
459
+ "$timestamp": {
460
+ "type": "object",
461
+ "properties": {
462
+ "t": {
463
+ "type": "integer",
464
+ "minimum": 0,
465
+ "maximum": 4294967295
466
+ },
467
+ "i": {
468
+ "type": "integer",
469
+ "minimum": 0,
470
+ "maximum": 4294967295
471
+ }
472
+ },
473
+ "required": [
474
+ "t",
475
+ "i"
476
+ ],
477
+ "additionalProperties": false
478
+ }
479
+ },
480
+ "required": [
481
+ "$timestamp"
482
+ ],
483
+ "additionalProperties": false
484
+ },
485
+ {
486
+ "type": "object",
487
+ "properties": {
488
+ "$binary": {
489
+ "type": "object",
490
+ "properties": {
491
+ "base64": {
492
+ "$ref": "#/definitions/__schema3"
493
+ },
494
+ "subType": {
495
+ "$ref": "#/definitions/__schema4"
496
+ }
497
+ },
498
+ "required": [
499
+ "base64",
500
+ "subType"
501
+ ],
502
+ "additionalProperties": false
503
+ }
504
+ },
505
+ "required": [
506
+ "$binary"
507
+ ],
508
+ "additionalProperties": false
509
+ }
510
+ ]
511
+ }
512
+ ]
513
+ },
514
+ "__schema2": {
515
+ "type": "string",
516
+ "pattern": "^-?(?:0|[1-9][0-9]*)$"
517
+ },
518
+ "__schema3": {
519
+ "type": "string",
520
+ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$"
521
+ },
522
+ "__schema4": {
523
+ "type": "string",
524
+ "pattern": "^[0-9a-fA-F]{2}$"
525
+ },
526
+ "__schema5": {
527
+ "minItems": 1,
528
+ "type": "array",
529
+ "items": {
530
+ "$ref": "#/definitions/__schema1"
531
+ }
532
+ }
533
+ },
534
+ "$id": "https://powersync.com/schemas/mongodb-filter-expression"
535
+ },
536
+ {
537
+ "const": "disabled"
538
+ }
539
+ ]
540
+ }
541
+ },
185
542
  "additionalProperties": false
186
543
  }
187
544
  },
@@ -1,103 +0,0 @@
1
- import type { JsonObject } from './json.js';
2
- import type { SyncConfig } from './SyncConfig.js';
3
- import type { TablePattern } from './TablePattern.js';
4
- /**
5
- * A decoded config path, for example `['config', 'source_table_options', 'orders', 'option']`.
6
- */
7
- export type SyncConfigSourcePath = readonly (string | number)[];
8
- export type SyncConfigSourceLocationTarget = 'key' | 'value';
9
- /**
10
- * Offsets into the authored config, compatible with locations returned by service diagnostics.
11
- */
12
- export interface SyncConfigSourceSpan {
13
- start_offset: number;
14
- end_offset: number;
15
- }
16
- /**
17
- * A parser warning or failure, optionally pointing to the relevant config key or value.
18
- */
19
- export interface SyncConfigDiagnostic {
20
- level: 'warning' | 'fatal';
21
- message: string;
22
- location?: SyncConfigSourceSpan;
23
- }
24
- export interface SyncConfigSourceLocationResolver {
25
- /**
26
- * Resolve a field to its source span, falling back to its nearest existing ancestor.
27
- */
28
- getLocation(path: SyncConfigSourcePath, target?: SyncConfigSourceLocationTarget): SyncConfigSourceSpan | undefined;
29
- }
30
- /**
31
- * Context for parsing input sync config.
32
- */
33
- export interface SyncConfigParserContext {
34
- readonly defaultSchema: string;
35
- /**
36
- * Candidate being assembled. With throwOnError: false, a partial config may be returned with fatal diagnostics.
37
- * Store options on the appropriate config fields.
38
- */
39
- parsedConfig: SyncConfig;
40
- /**
41
- * Sources selected by SQL. Additional parsers may inspect these, but cannot add replication sources.
42
- */
43
- sourceTables: readonly TablePattern[];
44
- /**
45
- * Utility helpers for determining source locations.
46
- */
47
- sourceLocations: SyncConfigSourceLocationResolver;
48
- /**
49
- * Report a diagnostic found while parsing.
50
- */
51
- reportDiagnostic(diagnostic: SyncConfigDiagnostic): void;
52
- }
53
- /**
54
- * Context for validating persisted sync config.
55
- */
56
- export interface PersistedSyncConfigParserContext {
57
- /**
58
- * Default schema used to resolve unqualified table names during validation.
59
- * Some callers supply a placeholder; do not persist names qualified using this value.
60
- */
61
- readonly defaultSchema: string;
62
- /**
63
- * Report a warning or fatal error found while validating the persisted config.
64
- * Include a config source location when available. Fatal errors prevent the config from loading.
65
- */
66
- reportDiagnostic(diagnostic: SyncConfigDiagnostic): void;
67
- }
68
- /**
69
- * Additional deterministic parsing/validation, registered per service rather than globally or by source type.
70
- * A hook identifies its own fields and leaves unrelated input alone. Source I/O belongs in source validation.
71
- */
72
- export interface AdditionalSyncConfigParser {
73
- /**
74
- * A unique ID for the parser. Persisted sync configs store these IDs to validate
75
- * if modules which created the persisted config are present.
76
- */
77
- readonly id: string;
78
- /**
79
- * Mutates an isolated schema before parsing.
80
- */
81
- extendJsonSchema?(options: {
82
- schema: JsonObject;
83
- }): void;
84
- /**
85
- * `config` is decoded sync config. Everything else needed to parse it is supplied through `context`.
86
- * Parse module-owned input into context.parsedConfig, including sourceTableConfig entries for this module.
87
- * Core does not copy source-table options from the input or normalize the parser's output here.
88
- * For a PrecompiledSyncConfig, add this parser's ID to parsedConfig.plan.moduleData with a null value
89
- * when the config requires this module. The plan's keys determine which parsers must be present on reload.
90
- */
91
- parse(options: {
92
- config: unknown;
93
- context: SyncConfigParserContext;
94
- }): void;
95
- /**
96
- * Validate saved config fields without reparsing their original config or requiring config source locations.
97
- */
98
- validatePersisted?(options: {
99
- config: SyncConfig;
100
- context: PersistedSyncConfigParserContext;
101
- }): void;
102
- }
103
- export declare function validateAdditionalSyncConfigParsers(parsers: readonly AdditionalSyncConfigParser[]): void;
@@ -1,11 +0,0 @@
1
- export function validateAdditionalSyncConfigParsers(parsers) {
2
- const ids = new Set();
3
- for (const parser of parsers) {
4
- if (!parser.id)
5
- throw new Error('A sync config parser id must not be empty.');
6
- if (ids.has(parser.id))
7
- throw new Error(`A sync config parser is already registered with id '${parser.id}'.`);
8
- ids.add(parser.id);
9
- }
10
- }
11
- //# sourceMappingURL=SyncConfigParserHooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SyncConfigParserHooks.js","sourceRoot":"","sources":["../src/SyncConfigParserHooks.ts"],"names":[],"mappings":"AAyGA,MAAM,UAAU,mCAAmC,CAAC,OAA8C;IAChG,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC9E,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9G,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}