@powersync/service-sync-rules 0.0.0-dev-20260803144812 → 0.0.0-dev-20260929095716

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 (166) hide show
  1. package/README.md +49 -14
  2. package/dist/BucketSource.d.ts +2 -2
  3. package/dist/ConnectionConfig.d.ts +39 -0
  4. package/dist/ConnectionConfig.js +97 -0
  5. package/dist/ConnectionConfig.js.map +1 -0
  6. package/dist/HydratedSyncConfig.d.ts +11 -2
  7. package/dist/HydratedSyncConfig.js +18 -4
  8. package/dist/HydratedSyncConfig.js.map +1 -1
  9. package/dist/HydrationState.d.ts +2 -0
  10. package/dist/HydrationState.js.map +1 -1
  11. package/dist/SqlSyncRules.d.ts +15 -0
  12. package/dist/SqlSyncRules.js +3 -1
  13. package/dist/SqlSyncRules.js.map +1 -1
  14. package/dist/StorageVersion.js +2 -1
  15. package/dist/StorageVersion.js.map +1 -1
  16. package/dist/SyncConfig.d.ts +11 -3
  17. package/dist/SyncConfig.js +16 -11
  18. package/dist/SyncConfig.js.map +1 -1
  19. package/dist/SyncConfigParserHooks.d.ts +103 -0
  20. package/dist/SyncConfigParserHooks.js +11 -0
  21. package/dist/SyncConfigParserHooks.js.map +1 -0
  22. package/dist/compatibility.d.ts +2 -1
  23. package/dist/compatibility.js +4 -2
  24. package/dist/compatibility.js.map +1 -1
  25. package/dist/compiler/bucket_resolver.d.ts +1 -0
  26. package/dist/compiler/bucket_resolver.js +22 -12
  27. package/dist/compiler/bucket_resolver.js.map +1 -1
  28. package/dist/compiler/compatibility.d.ts +38 -9
  29. package/dist/compiler/compatibility.js +81 -11
  30. package/dist/compiler/compatibility.js.map +1 -1
  31. package/dist/compiler/compiler.d.ts +84 -16
  32. package/dist/compiler/compiler.js +112 -16
  33. package/dist/compiler/compiler.js.map +1 -1
  34. package/dist/compiler/equality.d.ts +2 -2
  35. package/dist/compiler/equality.js +2 -2
  36. package/dist/compiler/expression.d.ts +20 -18
  37. package/dist/compiler/expression.js +23 -14
  38. package/dist/compiler/expression.js.map +1 -1
  39. package/dist/compiler/filter.d.ts +4 -4
  40. package/dist/compiler/filter.js +5 -4
  41. package/dist/compiler/filter.js.map +1 -1
  42. package/dist/compiler/ir_to_sync_plan.d.ts +4 -2
  43. package/dist/compiler/ir_to_sync_plan.js +40 -36
  44. package/dist/compiler/ir_to_sync_plan.js.map +1 -1
  45. package/dist/compiler/parser.d.ts +1 -1
  46. package/dist/compiler/parser.js +2 -2
  47. package/dist/compiler/querier_graph.js +43 -24
  48. package/dist/compiler/querier_graph.js.map +1 -1
  49. package/dist/compiler/rows.d.ts +23 -29
  50. package/dist/compiler/rows.js +83 -59
  51. package/dist/compiler/rows.js.map +1 -1
  52. package/dist/compiler/sqlite.js +1 -2
  53. package/dist/compiler/sqlite.js.map +1 -1
  54. package/dist/compiler/table.d.ts +5 -4
  55. package/dist/compiler/table.js +6 -7
  56. package/dist/compiler/table.js.map +1 -1
  57. package/dist/events/CompiledEventSourceQuery.d.ts +51 -0
  58. package/dist/events/CompiledEventSourceQuery.js +119 -0
  59. package/dist/events/CompiledEventSourceQuery.js.map +1 -0
  60. package/dist/events/EventDescriptor.d.ts +26 -0
  61. package/dist/events/EventDescriptor.js +2 -0
  62. package/dist/events/EventDescriptor.js.map +1 -0
  63. package/dist/from_yaml.d.ts +14 -1
  64. package/dist/from_yaml.js +101 -39
  65. package/dist/from_yaml.js.map +1 -1
  66. package/dist/index.d.ts +5 -2
  67. package/dist/index.js +5 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/json.d.ts +7 -0
  70. package/dist/json.js +2 -0
  71. package/dist/json.js.map +1 -0
  72. package/dist/json_schema.d.ts +11 -0
  73. package/dist/json_schema.js +27 -4
  74. package/dist/json_schema.js.map +1 -1
  75. package/dist/legacy/BaseSqlDataQuery.d.ts +12 -0
  76. package/dist/legacy/BaseSqlDataQuery.js +3 -0
  77. package/dist/legacy/BaseSqlDataQuery.js.map +1 -1
  78. package/dist/legacy/SqlBucketDescriptor.d.ts +9 -0
  79. package/dist/legacy/SqlBucketDescriptor.js +6 -0
  80. package/dist/legacy/SqlBucketDescriptor.js.map +1 -1
  81. package/dist/legacy/SqlDataQuery.d.ts +6 -0
  82. package/dist/legacy/SqlDataQuery.js +3 -0
  83. package/dist/legacy/SqlDataQuery.js.map +1 -1
  84. package/dist/legacy/SqlParameterQuery.d.ts +4 -0
  85. package/dist/legacy/SqlParameterQuery.js +1 -0
  86. package/dist/legacy/SqlParameterQuery.js.map +1 -1
  87. package/dist/legacy/StaticSqlParameterQuery.d.ts +4 -0
  88. package/dist/legacy/StaticSqlParameterQuery.js +1 -0
  89. package/dist/legacy/StaticSqlParameterQuery.js.map +1 -1
  90. package/dist/legacy/TableQuerySchema.d.ts +1 -0
  91. package/dist/legacy/TableQuerySchema.js +1 -0
  92. package/dist/legacy/TableQuerySchema.js.map +1 -1
  93. package/dist/legacy/TableValuedFunctionSqlParameterQuery.d.ts +4 -0
  94. package/dist/legacy/TableValuedFunctionSqlParameterQuery.js +1 -0
  95. package/dist/legacy/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  96. package/dist/legacy/sql_filters.d.ts +13 -0
  97. package/dist/legacy/sql_filters.js +10 -0
  98. package/dist/legacy/sql_filters.js.map +1 -1
  99. package/dist/legacy/sql_support.d.ts +33 -0
  100. package/dist/legacy/sql_support.js +33 -0
  101. package/dist/legacy/sql_support.js.map +1 -1
  102. package/dist/legacy/streams/filter.d.ts +22 -0
  103. package/dist/legacy/streams/filter.js +19 -0
  104. package/dist/legacy/streams/filter.js.map +1 -1
  105. package/dist/legacy/streams/from_sql.d.ts +3 -0
  106. package/dist/legacy/streams/from_sql.js +4 -1
  107. package/dist/legacy/streams/from_sql.js.map +1 -1
  108. package/dist/legacy/streams/functions.d.ts +3 -0
  109. package/dist/legacy/streams/functions.js +3 -0
  110. package/dist/legacy/streams/functions.js.map +1 -1
  111. package/dist/legacy/streams/parameter.d.ts +10 -0
  112. package/dist/legacy/streams/stream.d.ts +7 -1
  113. package/dist/legacy/streams/stream.js +7 -1
  114. package/dist/legacy/streams/stream.js.map +1 -1
  115. package/dist/legacy/streams/variant.d.ts +6 -0
  116. package/dist/legacy/streams/variant.js +1 -0
  117. package/dist/legacy/streams/variant.js.map +1 -1
  118. package/dist/legacy/validators.d.ts +1 -0
  119. package/dist/legacy/validators.js +1 -0
  120. package/dist/legacy/validators.js.map +1 -1
  121. package/dist/schema-generators/RustSchemaGenerator.d.ts +22 -0
  122. package/dist/schema-generators/RustSchemaGenerator.js +120 -0
  123. package/dist/schema-generators/RustSchemaGenerator.js.map +1 -0
  124. package/dist/schema-generators/generators.d.ts +2 -0
  125. package/dist/schema-generators/generators.js +2 -0
  126. package/dist/schema-generators/generators.js.map +1 -1
  127. package/dist/schema-generators/schema-generators.d.ts +1 -0
  128. package/dist/schema-generators/schema-generators.js +1 -0
  129. package/dist/schema-generators/schema-generators.js.map +1 -1
  130. package/dist/sql_functions.d.ts +1 -1
  131. package/dist/sync_plan/evaluator/bucket_data_source.js +11 -53
  132. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
  133. package/dist/sync_plan/evaluator/bucket_source.js +1 -1
  134. package/dist/sync_plan/evaluator/index.d.ts +2 -7
  135. package/dist/sync_plan/evaluator/index.js +7 -7
  136. package/dist/sync_plan/evaluator/index.js.map +1 -1
  137. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +1 -1
  138. package/dist/sync_plan/evaluator/parameter_evaluator.js +12 -8
  139. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
  140. package/dist/sync_plan/evaluator/row_projection.d.ts +22 -0
  141. package/dist/sync_plan/evaluator/row_projection.js +71 -0
  142. package/dist/sync_plan/evaluator/row_projection.js.map +1 -0
  143. package/dist/sync_plan/plan.d.ts +43 -6
  144. package/dist/sync_plan/plan_equality_serialized.d.ts +12 -2
  145. package/dist/sync_plan/plan_equality_serialized.js +56 -0
  146. package/dist/sync_plan/plan_equality_serialized.js.map +1 -1
  147. package/dist/sync_plan/schema_inference.d.ts +1 -1
  148. package/dist/sync_plan/schema_inference.js +1 -1
  149. package/dist/sync_plan/serialize.d.ts +52 -5
  150. package/dist/sync_plan/serialize.js +125 -20
  151. package/dist/sync_plan/serialize.js.map +1 -1
  152. package/dist/utils.d.ts +1 -0
  153. package/dist/utils.js +43 -12
  154. package/dist/utils.js.map +1 -1
  155. package/dist/yaml_source_locations.d.ts +14 -0
  156. package/dist/yaml_source_locations.js +117 -0
  157. package/dist/yaml_source_locations.js.map +1 -0
  158. package/dist/yaml_validation.js.map +1 -1
  159. package/package.json +2 -1
  160. package/schema/sync_rules.json +49 -3
  161. package/dist/events/SqlEventDescriptor.d.ts +0 -20
  162. package/dist/events/SqlEventDescriptor.js +0 -51
  163. package/dist/events/SqlEventDescriptor.js.map +0 -1
  164. package/dist/events/SqlEventSourceQuery.d.ts +0 -20
  165. package/dist/events/SqlEventSourceQuery.js +0 -125
  166. package/dist/events/SqlEventSourceQuery.js.map +0 -1
@@ -0,0 +1,117 @@
1
+ import { isMap, isNode, isScalar } from 'yaml';
2
+ import { YamlError } from './errors.js';
3
+ /**
4
+ * Creates a path-based source-location resolver over a parsed YAML document.
5
+ * For `config: { edition: 3 }`, resolving `['config', 'edition']` locates `3` by default or `edition` with target `'key'`.
6
+ */
7
+ export function createYamlSourceLocationResolver(document) {
8
+ return {
9
+ getLocation(path, target = 'value') {
10
+ return getYamlPathLocation(document, path, target);
11
+ }
12
+ };
13
+ }
14
+ /**
15
+ * Maps AJV validation errors to sync config errors positioned in the original source.
16
+ * For example, a type error at `/config/edition` highlights that field's value and retains AJV's message.
17
+ */
18
+ export function mapAjvErrorsToYamlErrors(sourceLocations, errors) {
19
+ return errors.map((error) => {
20
+ const { path, target } = getAjvErrorSourcePath(error);
21
+ const location = sourceLocations.getLocation(path, target);
22
+ // Honor editor guidance such as "Use $$doc.name" instead of showing the reference regex.
23
+ // Only pattern failures use this annotation; other failures retain their own AJV messages.
24
+ const guidance = error.keyword === 'pattern' && typeof error.parentSchema === 'object' && error.parentSchema !== null
25
+ ? error.parentSchema.patternErrorMessage
26
+ : undefined;
27
+ const message = typeof guidance === 'string' ? guidance : (error.message ?? 'The sync config does not match its JSON Schema.');
28
+ return new YamlError(new Error(message), location && { start: location.start_offset, end: location.end_offset });
29
+ });
30
+ }
31
+ /**
32
+ * Converts an AJV error into a config path and chooses whether to highlight its key or value.
33
+ * An extra property `unknown` at `/config` targets the key at `['config', 'unknown']`.
34
+ * Missing properties target their containing map because the missing field has no source node.
35
+ */
36
+ function getAjvErrorSourcePath(error) {
37
+ const path = parseJsonPointer(error.instancePath);
38
+ if (error.keyword == 'additionalProperties') {
39
+ const additionalProperty = error.params.additionalProperty;
40
+ if (typeof additionalProperty == 'string') {
41
+ path.push(additionalProperty);
42
+ }
43
+ return { path, target: 'key' };
44
+ }
45
+ else if (error.keyword == 'propertyNames' && typeof error.propertyName == 'string') {
46
+ path.push(error.propertyName);
47
+ return { path, target: 'key' };
48
+ }
49
+ else if (error.keyword == 'required' || error.keyword == 'minProperties') {
50
+ // A missing property has no node of its own. Highlight the containing map's key, such as the table definition.
51
+ return { path, target: path.length == 0 ? 'value' : 'key' };
52
+ }
53
+ return { path, target: 'value' };
54
+ }
55
+ /**
56
+ * Finds a key or value's source offsets, trying parent paths when the requested node does not exist.
57
+ * For example, `['config', 'missing']` falls back to `['config']` if `missing` is absent.
58
+ */
59
+ function getYamlPathLocation(document, path, target) {
60
+ const resolvedPath = [...path];
61
+ while (true) {
62
+ const node = getYamlPathNode(document, resolvedPath, target);
63
+ if (node != null) {
64
+ return getNodeLocation(node);
65
+ }
66
+ if (resolvedPath.length == 0) {
67
+ return undefined;
68
+ }
69
+ resolvedPath.pop();
70
+ }
71
+ }
72
+ /**
73
+ * Looks up the YAML node at an exact path, returning undefined if no matching node exists.
74
+ * For `edition: 3`, `['edition']` selects the `edition` key node or the `3` value node according to the target.
75
+ * An empty path selects the document's root node.
76
+ */
77
+ function getYamlPathNode(document, path, target) {
78
+ if (target == 'value' || path.length == 0) {
79
+ const value = document.getIn(path, true);
80
+ return isNode(value) ? value : undefined;
81
+ }
82
+ const parent = document.getIn(path.slice(0, -1), true);
83
+ if (!isMap(parent)) {
84
+ return undefined;
85
+ }
86
+ const key = path[path.length - 1];
87
+ const pair = parent.items.find((candidate) => isScalar(candidate.key) && String(candidate.key.value) == String(key));
88
+ return pair != null && isNode(pair.key) ? pair.key : undefined;
89
+ }
90
+ /**
91
+ * Converts a YAML node's range into source offsets, including any trailing comment or newline in the node range.
92
+ * A range `[4, 7, 8]` becomes `{ start_offset: 4, end_offset: 8 }`; a node without a range has no location.
93
+ */
94
+ function getNodeLocation(node) {
95
+ if (node?.range == null) {
96
+ return undefined;
97
+ }
98
+ return {
99
+ start_offset: node.range[0],
100
+ end_offset: node.range[2]
101
+ };
102
+ }
103
+ /**
104
+ * Splits a JSON pointer into path segments and decodes escaped slashes (`~1`) and tildes (`~0`).
105
+ * For example, `/tables/a~1b/~0name` becomes `['tables', 'a/b', '~name']`; an empty pointer becomes `[]`.
106
+ * Numeric segments remain strings, so `/items/0` becomes `['items', '0']`.
107
+ */
108
+ function parseJsonPointer(pointer) {
109
+ if (pointer.length == 0) {
110
+ return [];
111
+ }
112
+ return pointer
113
+ .split('/')
114
+ .slice(1)
115
+ .map((segment) => segment.replaceAll('~1', '/').replaceAll('~0', '~'));
116
+ }
117
+ //# sourceMappingURL=yaml_source_locations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml_source_locations.js","sourceRoot":"","sources":["../src/yaml_source_locations.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAQ,MAAM,MAAM,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,QAAkB;IACjE,OAAO;QACL,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;YAChC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,eAAiD,EACjD,MAA8B;IAE9B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3D,yFAAyF;QACzF,2FAA2F;QAC3F,MAAM,QAAQ,GACZ,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;YAClG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,mBAAmB;YACxC,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,iDAAiD,CAAC,CAAC;QACjH,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,KAAkB;IAI/C,MAAM,IAAI,GAA2B,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE1E,IAAI,KAAK,CAAC,OAAO,IAAI,sBAAsB,EAAE,CAAC;QAC5C,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAC3D,IAAI,OAAO,kBAAkB,IAAI,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,IAAI,eAAe,IAAI,OAAO,KAAK,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;QAC3E,+GAA+G;QAC/G,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,QAAkB,EAClB,IAA0B,EAC1B,MAAsC;IAEtC,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,YAAY,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CACtB,QAAkB,EAClB,IAA0B,EAC1B,MAAsC;IAEtC,IAAI,MAAM,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrH,OAAO,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAsB;IAC7C,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,CAAC;SACR,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"yaml_validation.js","sourceRoot":"","sources":["../src/yaml_validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yaml_validation.js","sourceRoot":"","sources":["../src/yaml_validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@powersync/service-sync-rules",
3
3
  "repository": "https://github.com/powersync-ja/powersync-service",
4
- "version": "0.0.0-dev-20260803144812",
4
+ "version": "0.0.0-dev-20260929095716",
5
5
  "exports": "./dist/index.js",
6
6
  "license": "FSL-1.1-ALv2",
7
7
  "publishConfig": {
@@ -16,6 +16,7 @@
16
16
  "@syncpoint/wkx": "^0.5.0",
17
17
  "ajv": "^8.18.0",
18
18
  "pgsql-ast-parser": "^11.1.0",
19
+ "ts-codec": "^1.3.0",
19
20
  "uuid": "^14.0.0",
20
21
  "yaml": "^2.8.3",
21
22
  "@powersync/service-jsonbig": "^0.17.13"
@@ -170,8 +170,49 @@
170
170
  },
171
171
  "config": {
172
172
  "type": "object",
173
- "description": "Config declaring the compatibility level used to parse these definitions.",
173
+ "description": "Compatibility, storage, and source connection settings for these definitions.",
174
174
  "properties": {
175
+ "connections": {
176
+ "type": "object",
177
+ "propertyNames": {
178
+ "minLength": 1
179
+ },
180
+ "additionalProperties": {
181
+ "anyOf": [
182
+ {
183
+ "type": "object",
184
+ "additionalProperties": false,
185
+ "maxProperties": 0
186
+ },
187
+ {
188
+ "definitions": {},
189
+ "type": "object",
190
+ "properties": {
191
+ "type": {
192
+ "type": "string",
193
+ "minLength": 1
194
+ },
195
+ "tables": {
196
+ "type": "object",
197
+ "propertyNames": {
198
+ "minLength": 1
199
+ },
200
+ "additionalProperties": {
201
+ "type": "object",
202
+ "properties": {},
203
+ "additionalProperties": false,
204
+ "maxProperties": 0
205
+ }
206
+ }
207
+ },
208
+ "additionalProperties": false,
209
+ "required": [
210
+ "type"
211
+ ]
212
+ }
213
+ ]
214
+ }
215
+ },
175
216
  "edition": {
176
217
  "type": "integer",
177
218
  "default": 1,
@@ -180,11 +221,12 @@
180
221
  },
181
222
  "storage_version": {
182
223
  "type": "integer",
183
- "description": "Storage version used by the storage database. By default, the latest stable version is used.",
224
+ "description": "Storage version used by the storage database. By default, version 2 is used.",
184
225
  "default": 2,
185
226
  "enum": [
186
227
  2,
187
- 3
228
+ 3,
229
+ 4
188
230
  ]
189
231
  },
190
232
  "timestamp_max_precision": {
@@ -215,6 +257,10 @@
215
257
  "unstable_sqlite_expression_engine": {
216
258
  "type": "boolean",
217
259
  "description": "Enabled by default starting from edition null: Experimental option to evaluate functions and operators in Sync Streams with SQLite instead of a JavaScript implementation."
260
+ },
261
+ "fixed_booleans_in_json": {
262
+ "type": "boolean",
263
+ "description": "Enabled by default starting from edition null: Consistently sync boolean values of a JSON object or array in source data as booleans (instead of integers 0/1)."
218
264
  }
219
265
  },
220
266
  "additionalProperties": false
@@ -1,20 +0,0 @@
1
- import { CompatibilityContext } from '../compatibility.js';
2
- import { QueryParseResult } from '../legacy/SqlBucketDescriptor.js';
3
- import { SourceTableRef } from '../SourceTableRef.js';
4
- import { SyncRulesOptions } from '../SqlSyncRules.js';
5
- import { TablePattern } from '../TablePattern.js';
6
- import { EvaluateRowOptions } from '../types.js';
7
- import { EvaluatedEventRowWithErrors, SqlEventSourceQuery } from './SqlEventSourceQuery.js';
8
- /**
9
- * A sync config event which is triggered from a SQL table change.
10
- */
11
- export declare class SqlEventDescriptor {
12
- private readonly compatibility;
13
- name: string;
14
- sourceQueries: SqlEventSourceQuery[];
15
- constructor(name: string, compatibility: CompatibilityContext);
16
- addSourceQuery(sql: string, options: SyncRulesOptions): QueryParseResult;
17
- evaluateRowWithErrors(options: EvaluateRowOptions): EvaluatedEventRowWithErrors;
18
- getSourceTables(): Set<TablePattern>;
19
- tableTriggersEvent(table: SourceTableRef): boolean;
20
- }
@@ -1,51 +0,0 @@
1
- import { SqlRuleError } from '../errors.js';
2
- import { SqlEventSourceQuery } from './SqlEventSourceQuery.js';
3
- /**
4
- * A sync config event which is triggered from a SQL table change.
5
- */
6
- export class SqlEventDescriptor {
7
- compatibility;
8
- name;
9
- sourceQueries = [];
10
- constructor(name, compatibility) {
11
- this.compatibility = compatibility;
12
- this.name = name;
13
- }
14
- addSourceQuery(sql, options) {
15
- const source = SqlEventSourceQuery.fromSql(sql, options, this.compatibility);
16
- // Each source query should be for a unique table
17
- const existingSourceQuery = this.sourceQueries.find((q) => q.table == source.table);
18
- if (existingSourceQuery) {
19
- return {
20
- parsed: false,
21
- errors: [new SqlRuleError('Each payload query should query a unique table', sql)]
22
- };
23
- }
24
- this.sourceQueries.push(source);
25
- return {
26
- parsed: true,
27
- errors: source.errors
28
- };
29
- }
30
- evaluateRowWithErrors(options) {
31
- // There should only be 1 payload result per source query
32
- const matchingQuery = this.sourceQueries.find((q) => q.applies(options.sourceTable));
33
- if (!matchingQuery) {
34
- return {
35
- errors: [{ error: `No matching source query found for table ${options.sourceTable.name}` }]
36
- };
37
- }
38
- return matchingQuery.evaluateRowWithErrors(options.sourceTable, options.record);
39
- }
40
- getSourceTables() {
41
- let result = new Set();
42
- for (let query of this.sourceQueries) {
43
- result.add(query.sourceTable);
44
- }
45
- return result;
46
- }
47
- tableTriggersEvent(table) {
48
- return this.sourceQueries.some((query) => query.applies(table));
49
- }
50
- }
51
- //# sourceMappingURL=SqlEventDescriptor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SqlEventDescriptor.js","sourceRoot":"","sources":["../../src/events/SqlEventDescriptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,OAAO,EAA+B,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE5F;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAMV;IALnB,IAAI,CAAS;IACb,aAAa,GAA0B,EAAE,CAAC;IAE1C,YACE,IAAY,EACK,aAAmC;QAAnC,kBAAa,GAAb,aAAa,CAAsB;QAEpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,GAAW,EAAE,OAAyB;QACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE7E,iDAAiD;QACjD,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QACpF,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,IAAI,YAAY,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;aAClF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhC,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAED,qBAAqB,CAAC,OAA2B;QAC/C,yDAAyD;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;gBACL,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,4CAA4C,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;aAC5F,CAAC;QACJ,CAAC;QAED,OAAO,aAAa,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,eAAe;QACb,IAAI,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;QACrC,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAY,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kBAAkB,CAAC,KAAqB;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -1,20 +0,0 @@
1
- import { CompatibilityContext } from '../compatibility.js';
2
- import { BaseSqlDataQuery, BaseSqlDataQueryOptions } from '../legacy/BaseSqlDataQuery.js';
3
- import { SourceTableRef } from '../SourceTableRef.js';
4
- import { SyncRulesOptions } from '../SqlSyncRules.js';
5
- import { EvaluationError, SqliteJsonRow, SqliteRow } from '../types.js';
6
- export type EvaluatedEventSourceRow = {
7
- data: SqliteJsonRow;
8
- };
9
- export type EvaluatedEventRowWithErrors = {
10
- result?: EvaluatedEventSourceRow;
11
- errors: EvaluationError[];
12
- };
13
- /**
14
- * Defines how a Replicated Row is mapped to source parameters for events.
15
- */
16
- export declare class SqlEventSourceQuery extends BaseSqlDataQuery {
17
- static fromSql(sql: string, options: SyncRulesOptions, compatibility: CompatibilityContext): SqlEventSourceQuery;
18
- constructor(options: BaseSqlDataQueryOptions);
19
- evaluateRowWithErrors(table: SourceTableRef, row: SqliteRow): EvaluatedEventRowWithErrors;
20
- }
@@ -1,125 +0,0 @@
1
- import { parse } from 'pgsql-ast-parser';
2
- import { SqlRuleError } from '../errors.js';
3
- import { ExpressionType } from '../ExpressionType.js';
4
- import { BaseSqlDataQuery } from '../legacy/BaseSqlDataQuery.js';
5
- import { AvailableTable, SqlTools } from '../legacy/sql_filters.js';
6
- import { checkUnsupportedFeatures, isClauseError } from '../legacy/sql_support.js';
7
- import { TableQuerySchema } from '../legacy/TableQuerySchema.js';
8
- import { TablePattern } from '../TablePattern.js';
9
- import { isSelectStatement } from '../utils.js';
10
- /**
11
- * Defines how a Replicated Row is mapped to source parameters for events.
12
- */
13
- // TODO: Use Sync Streams compiler infrastruture instead of legacy data queries
14
- export class SqlEventSourceQuery extends BaseSqlDataQuery {
15
- static fromSql(sql, options, compatibility) {
16
- const parsed = parse(sql, { locationTracking: true });
17
- const schema = options.schema;
18
- if (parsed.length > 1) {
19
- throw new SqlRuleError('Only a single SELECT statement is supported', sql, parsed[1]?._location);
20
- }
21
- const q = parsed[0];
22
- if (!isSelectStatement(q)) {
23
- throw new SqlRuleError('Only SELECT statements are supported', sql, q._location);
24
- }
25
- let errors = [];
26
- errors.push(...checkUnsupportedFeatures(sql, q));
27
- if (q.from == null || q.from.length != 1 || q.from[0].type != 'table') {
28
- throw new SqlRuleError('Must SELECT from a single table', sql, q.from?.[0]._location);
29
- }
30
- const tableRef = q.from?.[0].name;
31
- if (tableRef?.name == null) {
32
- throw new SqlRuleError('Must SELECT from a single table', sql, q.from?.[0]._location);
33
- }
34
- const alias = AvailableTable.fromAst(tableRef);
35
- const sourceTable = new TablePattern(tableRef.schema ?? options.defaultSchema, tableRef.name);
36
- let querySchema = undefined;
37
- if (schema) {
38
- const tables = schema.getTables(sourceTable);
39
- if (tables.length == 0) {
40
- const e = new SqlRuleError(`Table ${sourceTable.schema}.${sourceTable.tablePattern} not found`, sql, q.from?.[0]?._location);
41
- e.type = 'warning';
42
- errors.push(e);
43
- }
44
- else {
45
- querySchema = new TableQuerySchema(tables, alias);
46
- }
47
- }
48
- const tools = new SqlTools({
49
- table: alias,
50
- parameterTables: [],
51
- valueTables: [alias],
52
- sql,
53
- schema: querySchema,
54
- compatibilityContext: compatibility
55
- });
56
- let extractors = [];
57
- for (let column of q.columns ?? []) {
58
- const name = tools.getOutputName(column);
59
- if (name != '*') {
60
- const clause = tools.compileRowValueExtractor(column.expr);
61
- if (isClauseError(clause)) {
62
- // Error logged already
63
- continue;
64
- }
65
- extractors.push({
66
- extract: (tables, output) => {
67
- output[name] = clause.evaluate(tables);
68
- },
69
- getTypes(schema, into) {
70
- const def = clause.getColumnDefinition(schema);
71
- into[name] = { name, type: def?.type ?? ExpressionType.NONE, originalType: def?.originalType };
72
- }
73
- });
74
- }
75
- else {
76
- extractors.push({
77
- extract: (tables, output) => {
78
- const row = tables[alias.nameInSchema];
79
- for (let key in row) {
80
- if (key.startsWith('_')) {
81
- continue;
82
- }
83
- output[key] ??= row[key];
84
- }
85
- },
86
- getTypes(schema, into) {
87
- for (let column of schema.getColumns(alias.nameInSchema)) {
88
- into[column.name] ??= column;
89
- }
90
- }
91
- });
92
- }
93
- }
94
- errors.push(...tools.errors);
95
- return new SqlEventSourceQuery({
96
- sourceTable,
97
- table: alias,
98
- sql,
99
- columns: q.columns ?? [],
100
- extractors: extractors,
101
- tools,
102
- bucketParameters: [],
103
- errors: errors
104
- });
105
- }
106
- constructor(options) {
107
- super(options);
108
- }
109
- evaluateRowWithErrors(table, row) {
110
- try {
111
- const tables = { [this.table.nameInSchema]: this.addSpecialParameters(table, row) };
112
- const data = this.transformRow(tables);
113
- return {
114
- result: {
115
- data
116
- },
117
- errors: []
118
- };
119
- }
120
- catch (e) {
121
- return { errors: [e.message ?? `Evaluating data query failed`] };
122
- }
123
- }
124
- }
125
- //# sourceMappingURL=SqlEventSourceQuery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SqlEventSourceQuery.js","sourceRoot":"","sources":["../../src/events/SqlEventSourceQuery.ts"],"names":[],"mappings":"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"}