@powersync/service-sync-rules 0.32.0 → 0.34.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.
Files changed (104) hide show
  1. package/dist/BaseSqlDataQuery.js +2 -1
  2. package/dist/BaseSqlDataQuery.js.map +1 -1
  3. package/dist/BucketDescription.d.ts +20 -1
  4. package/dist/BucketDescription.js +12 -0
  5. package/dist/BucketDescription.js.map +1 -1
  6. package/dist/BucketParameterQuerier.d.ts +5 -0
  7. package/dist/BucketParameterQuerier.js +15 -3
  8. package/dist/BucketParameterQuerier.js.map +1 -1
  9. package/dist/BucketSource.d.ts +1 -1
  10. package/dist/BucketSource.js +5 -4
  11. package/dist/BucketSource.js.map +1 -1
  12. package/dist/HydrationState.d.ts +4 -0
  13. package/dist/HydrationState.js +4 -2
  14. package/dist/HydrationState.js.map +1 -1
  15. package/dist/SqlParameterQuery.js +8 -12
  16. package/dist/SqlParameterQuery.js.map +1 -1
  17. package/dist/StaticSqlParameterQuery.js +5 -12
  18. package/dist/StaticSqlParameterQuery.js.map +1 -1
  19. package/dist/TableValuedFunctionSqlParameterQuery.js +3 -10
  20. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  21. package/dist/cast.d.ts +9 -0
  22. package/dist/cast.js +131 -0
  23. package/dist/cast.js.map +1 -0
  24. package/dist/compiler/bucket_resolver.d.ts +2 -0
  25. package/dist/compiler/bucket_resolver.js +18 -1
  26. package/dist/compiler/bucket_resolver.js.map +1 -1
  27. package/dist/compiler/equality.d.ts +1 -1
  28. package/dist/compiler/equality.js.map +1 -1
  29. package/dist/compiler/parser.js +12 -2
  30. package/dist/compiler/parser.js.map +1 -1
  31. package/dist/compiler/querier_graph.js +5 -2
  32. package/dist/compiler/querier_graph.js.map +1 -1
  33. package/dist/compiler/sqlite.js +1 -1
  34. package/dist/compiler/sqlite.js.map +1 -1
  35. package/dist/compiler/table.js +4 -1
  36. package/dist/compiler/table.js.map +1 -1
  37. package/dist/from_yaml.js +54 -24
  38. package/dist/from_yaml.js.map +1 -1
  39. package/dist/index.d.ts +1 -0
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/json_schema.js +9 -0
  43. package/dist/json_schema.js.map +1 -1
  44. package/dist/schema-generators/DartSchemaGenerator.d.ts +1 -0
  45. package/dist/schema-generators/DartSchemaGenerator.js +36 -2
  46. package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
  47. package/dist/schema-generators/DotNetSchemaGenerator.d.ts +12 -1
  48. package/dist/schema-generators/DotNetSchemaGenerator.js +104 -3
  49. package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
  50. package/dist/schema-generators/KotlinSchemaGenerator.d.ts +3 -0
  51. package/dist/schema-generators/KotlinSchemaGenerator.js +68 -5
  52. package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
  53. package/dist/schema-generators/RoomSchemaGenerator.js +3 -19
  54. package/dist/schema-generators/RoomSchemaGenerator.js.map +1 -1
  55. package/dist/schema-generators/SchemaGenerator.d.ts +7 -1
  56. package/dist/schema-generators/SchemaGenerator.js +35 -0
  57. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  58. package/dist/schema-generators/SwiftSchemaGenerator.d.ts +3 -0
  59. package/dist/schema-generators/SwiftSchemaGenerator.js +66 -2
  60. package/dist/schema-generators/SwiftSchemaGenerator.js.map +1 -1
  61. package/dist/schema-generators/TsSchemaGenerator.d.ts +2 -0
  62. package/dist/schema-generators/TsSchemaGenerator.js +45 -8
  63. package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
  64. package/dist/schema-generators/generators.d.ts +2 -1
  65. package/dist/schema-generators/generators.js +2 -1
  66. package/dist/schema-generators/generators.js.map +1 -1
  67. package/dist/sql_functions.d.ts +1 -5
  68. package/dist/sql_functions.js +31 -114
  69. package/dist/sql_functions.js.map +1 -1
  70. package/dist/streams/filter.d.ts +2 -4
  71. package/dist/streams/filter.js +2 -1
  72. package/dist/streams/filter.js.map +1 -1
  73. package/dist/streams/variant.js +4 -7
  74. package/dist/streams/variant.js.map +1 -1
  75. package/dist/sync_plan/engine/javascript.js +2 -2
  76. package/dist/sync_plan/engine/javascript.js.map +1 -1
  77. package/dist/sync_plan/evaluator/bucket_data_source.js +2 -1
  78. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
  79. package/dist/sync_plan/evaluator/bucket_source.d.ts +1 -1
  80. package/dist/sync_plan/evaluator/bucket_source.js +31 -36
  81. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -1
  82. package/dist/sync_plan/evaluator/index.d.ts +6 -0
  83. package/dist/sync_plan/evaluator/index.js +7 -0
  84. package/dist/sync_plan/evaluator/index.js.map +1 -1
  85. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +6 -12
  86. package/dist/sync_plan/evaluator/parameter_evaluator.js +51 -54
  87. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
  88. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +4 -1
  89. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -1
  90. package/dist/sync_plan/plan.d.ts +1 -1
  91. package/dist/sync_plan/schema_inference.d.ts +6 -2
  92. package/dist/sync_plan/schema_inference.js +104 -3
  93. package/dist/sync_plan/schema_inference.js.map +1 -1
  94. package/dist/sync_plan/serialize.d.ts +1 -1
  95. package/dist/types.d.ts +3 -0
  96. package/dist/types.js.map +1 -1
  97. package/dist/utils.d.ts +26 -4
  98. package/dist/utils.js +53 -17
  99. package/dist/utils.js.map +1 -1
  100. package/dist/yaml_scalar_map.d.ts +15 -0
  101. package/dist/yaml_scalar_map.js +126 -0
  102. package/dist/yaml_scalar_map.js.map +1 -0
  103. package/package.json +4 -2
  104. package/schema/sync_rules.json +9 -0
@@ -0,0 +1,126 @@
1
+ import { Scalar } from 'yaml';
2
+ export function isBlockScalar(type) {
3
+ return type === Scalar.BLOCK_LITERAL || type === Scalar.BLOCK_FOLDED;
4
+ }
5
+ export function isQuotedScalar(type) {
6
+ return type === Scalar.QUOTE_DOUBLE || type === Scalar.QUOTE_SINGLE;
7
+ }
8
+ /**
9
+ * Builds a map from indexes in parsed YAML scalars to indexes in the source YAML file.
10
+ *
11
+ * Quoted scalars (", ') have escape sequences that take up more chars in the source relative to the parsed value.
12
+ * Multi-line scalars (|, >) have line folding where newline + surrounding whitespace collapses
13
+ * to a single space. In both cases value offsets don't map 1:1 to source offsets.
14
+ *
15
+ * For unrecognised scalar types the map is empty, so all lookups fall back via ??.
16
+ *
17
+ * @param src The raw YAML source of the scalar token.
18
+ * @param scalarType The Scalar.type value.
19
+ */
20
+ export function buildParsedToSourceValueMap(src, scalarType) {
21
+ const map = [];
22
+ if (isQuotedScalar(scalarType)) {
23
+ const isDoubleQuoted = scalarType === Scalar.QUOTE_DOUBLE;
24
+ let srcIdx = 0;
25
+ let valIdx = 0;
26
+ while (srcIdx < src.length) {
27
+ map[valIdx] = srcIdx;
28
+ const current = src[srcIdx];
29
+ const next = src[srcIdx + 1];
30
+ if (isDoubleQuoted && current === '\\') {
31
+ // Handle escape chars / unicode
32
+ if (next === 'x')
33
+ srcIdx += 4; // \xXX
34
+ else if (next === 'u')
35
+ srcIdx += 6; // \uXXXX
36
+ else if (next === 'U')
37
+ srcIdx += 10; // \UXXXXXXXX
38
+ else
39
+ srcIdx += 2; // \n, \", \\, etc.
40
+ }
41
+ else if (!isDoubleQuoted && current === "'" && next === "'") {
42
+ // Handle '' in single quotes
43
+ srcIdx += 2;
44
+ }
45
+ else {
46
+ srcIdx++;
47
+ }
48
+ valIdx++;
49
+ }
50
+ map[valIdx] = srcIdx;
51
+ }
52
+ else if (isBlockScalar(scalarType)) {
53
+ // Detect indentation using first non-empty line
54
+ let trimIndent = 0;
55
+ let i = 0;
56
+ outer: while (i < src.length) {
57
+ // Skip to end of line
58
+ const lineStart = i;
59
+ while (i < src.length && src[i] !== '\n')
60
+ i++;
61
+ // Count chars from start of line until first non-whitespace char
62
+ for (let j = lineStart; j < i; j++) {
63
+ if (src[j] !== ' ' && src[j] !== '\t') {
64
+ trimIndent = j - lineStart;
65
+ break outer;
66
+ }
67
+ }
68
+ // No non-whitespace char found; go to next line
69
+ i++;
70
+ }
71
+ // Skip trimIndent chars for each line
72
+ let valIdx = 0;
73
+ let srcIdx = 0;
74
+ while (srcIdx < src.length) {
75
+ let lineEnd = srcIdx;
76
+ while (lineEnd < src.length && src[lineEnd] !== '\n')
77
+ lineEnd++;
78
+ const lineLen = lineEnd - srcIdx;
79
+ // Prevent skipping into next line for zero-length or very short lines
80
+ const contentStart = srcIdx + Math.min(trimIndent, lineLen);
81
+ for (let p = contentStart; p <= lineEnd && p < src.length; p++) {
82
+ map[valIdx++] = p;
83
+ }
84
+ srcIdx = lineEnd + 1;
85
+ }
86
+ map[valIdx] = src.length; // Sentinel
87
+ }
88
+ else if (scalarType === Scalar.PLAIN) {
89
+ // Plain scalars may span multiple lines. Line folding collapses each
90
+ // (trailing whitespace + newline + leading whitespace of next line) into a single space.
91
+ let valIdx = 0;
92
+ let srcIdx = 0;
93
+ let firstLine = true;
94
+ while (srcIdx <= src.length) {
95
+ // Find content bounds for this line
96
+ let lineEnd = srcIdx;
97
+ while (lineEnd < src.length && src[lineEnd] !== '\n' && src[lineEnd] !== '\r')
98
+ lineEnd++;
99
+ let contentStart = srcIdx;
100
+ if (!firstLine) {
101
+ // Strip leading whitespace from continuation lines
102
+ while (contentStart < lineEnd && (src[contentStart] === ' ' || src[contentStart] === '\t'))
103
+ contentStart++;
104
+ }
105
+ let contentEnd = lineEnd;
106
+ while (contentEnd > contentStart && (src[contentEnd - 1] === ' ' || src[contentEnd - 1] === '\t'))
107
+ contentEnd--;
108
+ if (!firstLine) {
109
+ // The folded newline becomes a single space; map it to the start of this line's content
110
+ map[valIdx++] = contentStart;
111
+ }
112
+ for (let p = contentStart; p < contentEnd; p++) {
113
+ map[valIdx++] = p;
114
+ }
115
+ if (lineEnd >= src.length)
116
+ break;
117
+ srcIdx = lineEnd + 1;
118
+ if (src[lineEnd] === '\r' && src[srcIdx] === '\n')
119
+ srcIdx++; // \r\n counts as one newline
120
+ firstLine = false;
121
+ }
122
+ map[valIdx] = src.length; // Sentinel
123
+ }
124
+ return map;
125
+ }
126
+ //# sourceMappingURL=yaml_scalar_map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml_scalar_map.js","sourceRoot":"","sources":["../src/yaml_scalar_map.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.32.0",
4
+ "version": "0.34.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "FSL-1.1-ALv2",
@@ -24,6 +24,7 @@
24
24
  "devDependencies": {
25
25
  "@types/node": "^22.16.2",
26
26
  "ebnf": "^1.9.1",
27
+ "railroad-diagrams": "^1.0.0",
27
28
  "vitest": "^4.0.16"
28
29
  },
29
30
  "scripts": {
@@ -32,6 +33,7 @@
32
33
  "build": "pnpm build:tsc && pnpm run build:extra",
33
34
  "build:extra": "node scripts/compile-schema.js",
34
35
  "build:tests": "tsc -b test/tsconfig.json",
35
- "test": "vitest"
36
+ "test": "vitest",
37
+ "generate:grammar": "node --experimental-strip-types scripts/generate-grammar-docs.ts"
36
38
  }
37
39
  }
@@ -61,6 +61,15 @@
61
61
  }
62
62
  }
63
63
  },
64
+ "with": {
65
+ "type": "object",
66
+ "description": "Common-table expressions available to all sync streams",
67
+ "patternProperties": {
68
+ ".*": {
69
+ "type": "string"
70
+ }
71
+ }
72
+ },
64
73
  "streams": {
65
74
  "type": "object",
66
75
  "description": "List of stream definitions",