@powersync/service-sync-rules 0.29.9 → 0.30.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 (170) hide show
  1. package/dist/BaseSqlDataQuery.d.ts +3 -9
  2. package/dist/BaseSqlDataQuery.js +11 -21
  3. package/dist/BaseSqlDataQuery.js.map +1 -1
  4. package/dist/BucketParameterQuerier.d.ts +42 -9
  5. package/dist/BucketParameterQuerier.js +30 -7
  6. package/dist/BucketParameterQuerier.js.map +1 -1
  7. package/dist/BucketSource.d.ts +94 -25
  8. package/dist/BucketSource.js +67 -0
  9. package/dist/BucketSource.js.map +1 -1
  10. package/dist/ExpressionType.d.ts +4 -2
  11. package/dist/ExpressionType.js.map +1 -1
  12. package/dist/HydratedSyncRules.d.ts +46 -0
  13. package/dist/HydratedSyncRules.js +88 -0
  14. package/dist/HydratedSyncRules.js.map +1 -0
  15. package/dist/HydrationState.d.ts +45 -0
  16. package/dist/HydrationState.js +41 -0
  17. package/dist/HydrationState.js.map +1 -0
  18. package/dist/SqlBucketDescriptor.d.ts +31 -28
  19. package/dist/SqlBucketDescriptor.js +89 -112
  20. package/dist/SqlBucketDescriptor.js.map +1 -1
  21. package/dist/SqlDataQuery.d.ts +4 -4
  22. package/dist/SqlDataQuery.js +5 -6
  23. package/dist/SqlDataQuery.js.map +1 -1
  24. package/dist/SqlParameterQuery.d.ts +17 -9
  25. package/dist/SqlParameterQuery.js +49 -23
  26. package/dist/SqlParameterQuery.js.map +1 -1
  27. package/dist/SqlSyncRules.d.ts +13 -29
  28. package/dist/SqlSyncRules.js +48 -77
  29. package/dist/SqlSyncRules.js.map +1 -1
  30. package/dist/StaticSqlParameterQuery.d.ts +13 -3
  31. package/dist/StaticSqlParameterQuery.js +38 -4
  32. package/dist/StaticSqlParameterQuery.js.map +1 -1
  33. package/dist/TablePattern.d.ts +4 -1
  34. package/dist/TablePattern.js +11 -0
  35. package/dist/TablePattern.js.map +1 -1
  36. package/dist/TableValuedFunctionSqlParameterQuery.d.ts +14 -4
  37. package/dist/TableValuedFunctionSqlParameterQuery.js +41 -7
  38. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  39. package/dist/compatibility.d.ts +23 -1
  40. package/dist/compatibility.js +32 -4
  41. package/dist/compatibility.js.map +1 -1
  42. package/dist/compiler/bucket_resolver.d.ts +70 -0
  43. package/dist/compiler/bucket_resolver.js +131 -0
  44. package/dist/compiler/bucket_resolver.js.map +1 -0
  45. package/dist/compiler/compatibility.d.ts +16 -0
  46. package/dist/compiler/compatibility.js +12 -0
  47. package/dist/compiler/compatibility.js.map +1 -0
  48. package/dist/compiler/compiler.d.ts +104 -0
  49. package/dist/compiler/compiler.js +113 -0
  50. package/dist/compiler/compiler.js.map +1 -0
  51. package/dist/compiler/equality.d.ts +99 -0
  52. package/dist/compiler/equality.js +284 -0
  53. package/dist/compiler/equality.js.map +1 -0
  54. package/dist/compiler/expression.d.ts +77 -0
  55. package/dist/compiler/expression.js +122 -0
  56. package/dist/compiler/expression.js.map +1 -0
  57. package/dist/compiler/filter.d.ts +71 -0
  58. package/dist/compiler/filter.js +110 -0
  59. package/dist/compiler/filter.js.map +1 -0
  60. package/dist/compiler/filter_simplifier.d.ts +26 -0
  61. package/dist/compiler/filter_simplifier.js +119 -0
  62. package/dist/compiler/filter_simplifier.js.map +1 -0
  63. package/dist/compiler/ir_to_sync_plan.d.ts +37 -0
  64. package/dist/compiler/ir_to_sync_plan.js +163 -0
  65. package/dist/compiler/ir_to_sync_plan.js.map +1 -0
  66. package/dist/compiler/parser.d.ts +99 -0
  67. package/dist/compiler/parser.js +556 -0
  68. package/dist/compiler/parser.js.map +1 -0
  69. package/dist/compiler/querier_graph.d.ts +42 -0
  70. package/dist/compiler/querier_graph.js +365 -0
  71. package/dist/compiler/querier_graph.js.map +1 -0
  72. package/dist/compiler/rows.d.ts +113 -0
  73. package/dist/compiler/rows.js +156 -0
  74. package/dist/compiler/rows.js.map +1 -0
  75. package/dist/compiler/scope.d.ts +22 -0
  76. package/dist/compiler/scope.js +47 -0
  77. package/dist/compiler/scope.js.map +1 -0
  78. package/dist/compiler/sqlite.d.ts +77 -0
  79. package/dist/compiler/sqlite.js +412 -0
  80. package/dist/compiler/sqlite.js.map +1 -0
  81. package/dist/compiler/table.d.ts +67 -0
  82. package/dist/compiler/table.js +67 -0
  83. package/dist/compiler/table.js.map +1 -0
  84. package/dist/errors.d.ts +4 -2
  85. package/dist/errors.js +16 -1
  86. package/dist/errors.js.map +1 -1
  87. package/dist/events/SqlEventDescriptor.js +1 -1
  88. package/dist/events/SqlEventDescriptor.js.map +1 -1
  89. package/dist/events/SqlEventSourceQuery.d.ts +1 -1
  90. package/dist/events/SqlEventSourceQuery.js +1 -2
  91. package/dist/events/SqlEventSourceQuery.js.map +1 -1
  92. package/dist/index.d.ts +8 -0
  93. package/dist/index.js +8 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/json_schema.js +5 -1
  96. package/dist/json_schema.js.map +1 -1
  97. package/dist/request_functions.js +1 -1
  98. package/dist/request_functions.js.map +1 -1
  99. package/dist/schema-generators/SchemaGenerator.d.ts +5 -0
  100. package/dist/schema-generators/SchemaGenerator.js +21 -14
  101. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  102. package/dist/sql_functions.d.ts +2 -1
  103. package/dist/sql_functions.js +1 -1
  104. package/dist/sql_functions.js.map +1 -1
  105. package/dist/streams/filter.d.ts +34 -4
  106. package/dist/streams/filter.js +93 -23
  107. package/dist/streams/filter.js.map +1 -1
  108. package/dist/streams/from_sql.js +2 -5
  109. package/dist/streams/from_sql.js.map +1 -1
  110. package/dist/streams/parameter.d.ts +7 -6
  111. package/dist/streams/stream.d.ts +25 -15
  112. package/dist/streams/stream.js +59 -87
  113. package/dist/streams/stream.js.map +1 -1
  114. package/dist/streams/variant.d.ts +14 -21
  115. package/dist/streams/variant.js +68 -46
  116. package/dist/streams/variant.js.map +1 -1
  117. package/dist/sync_plan/engine/javascript.d.ts +6 -0
  118. package/dist/sync_plan/engine/javascript.js +208 -0
  119. package/dist/sync_plan/engine/javascript.js.map +1 -0
  120. package/dist/sync_plan/engine/scalar_expression_engine.d.ts +48 -0
  121. package/dist/sync_plan/engine/scalar_expression_engine.js +99 -0
  122. package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -0
  123. package/dist/sync_plan/engine/sqlite.d.ts +12 -0
  124. package/dist/sync_plan/engine/sqlite.js +53 -0
  125. package/dist/sync_plan/engine/sqlite.js.map +1 -0
  126. package/dist/sync_plan/evaluator/bucket_data_source.d.ts +23 -0
  127. package/dist/sync_plan/evaluator/bucket_data_source.js +137 -0
  128. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -0
  129. package/dist/sync_plan/evaluator/bucket_source.d.ts +19 -0
  130. package/dist/sync_plan/evaluator/bucket_source.js +145 -0
  131. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -0
  132. package/dist/sync_plan/evaluator/index.d.ts +7 -0
  133. package/dist/sync_plan/evaluator/index.js +26 -0
  134. package/dist/sync_plan/evaluator/index.js.map +1 -0
  135. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +138 -0
  136. package/dist/sync_plan/evaluator/parameter_evaluator.js +359 -0
  137. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -0
  138. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +19 -0
  139. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +62 -0
  140. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -0
  141. package/dist/sync_plan/expression.d.ts +109 -0
  142. package/dist/sync_plan/expression.js +85 -0
  143. package/dist/sync_plan/expression.js.map +1 -0
  144. package/dist/sync_plan/expression_to_sql.d.ts +43 -0
  145. package/dist/sync_plan/expression_to_sql.js +190 -0
  146. package/dist/sync_plan/expression_to_sql.js.map +1 -0
  147. package/dist/sync_plan/expression_visitor.d.ts +57 -0
  148. package/dist/sync_plan/expression_visitor.js +181 -0
  149. package/dist/sync_plan/expression_visitor.js.map +1 -0
  150. package/dist/sync_plan/plan.d.ts +196 -0
  151. package/dist/sync_plan/plan.js +2 -0
  152. package/dist/sync_plan/plan.js.map +1 -0
  153. package/dist/sync_plan/schema_inference.d.ts +15 -0
  154. package/dist/sync_plan/schema_inference.js +121 -0
  155. package/dist/sync_plan/schema_inference.js.map +1 -0
  156. package/dist/sync_plan/serialize.d.ts +82 -0
  157. package/dist/sync_plan/serialize.js +209 -0
  158. package/dist/sync_plan/serialize.js.map +1 -0
  159. package/dist/types/custom_sqlite_value.d.ts +1 -1
  160. package/dist/types/time.d.ts +24 -5
  161. package/dist/types/time.js +67 -12
  162. package/dist/types/time.js.map +1 -1
  163. package/dist/types.d.ts +52 -24
  164. package/dist/types.js +4 -1
  165. package/dist/types.js.map +1 -1
  166. package/dist/utils.d.ts +9 -2
  167. package/dist/utils.js +26 -3
  168. package/dist/utils.js.map +1 -1
  169. package/package.json +4 -3
  170. package/schema/sync_rules.json +9 -0
@@ -0,0 +1,209 @@
1
+ import { TablePattern } from '../TablePattern.js';
2
+ /**
3
+ * Serializes a sync plan into a simple JSON object.
4
+ *
5
+ * While {@link SyncPlan}s are already serializable for the most part, it contains a graph of references from e.g.
6
+ * queriers to bucket creators. To represent this efficiently, we assign numbers to referenced elements while
7
+ * serializing instead of duplicating definitions.
8
+ */
9
+ export function serializeSyncPlan(plan) {
10
+ const dataSourceIndex = new Map();
11
+ const bucketIndex = new Map();
12
+ const parameterIndex = new Map();
13
+ const expandingLookups = new Map();
14
+ function serializeTablePattern(pattern) {
15
+ return {
16
+ connection: pattern.connectionTag,
17
+ schema: pattern.schema,
18
+ table: pattern.tablePattern
19
+ };
20
+ }
21
+ function serializeDataSources() {
22
+ return plan.dataSources.map((source, i) => {
23
+ dataSourceIndex.set(source, i);
24
+ return {
25
+ hash: source.hashCode,
26
+ table: serializeTablePattern(source.sourceTable),
27
+ outputTableName: source.outputTableName,
28
+ filters: source.filters,
29
+ partitionBy: source.parameters,
30
+ columns: source.columns
31
+ };
32
+ });
33
+ }
34
+ function serializeParameterIndexes() {
35
+ return plan.parameterIndexes.map((source, i) => {
36
+ parameterIndex.set(source, i);
37
+ return {
38
+ hash: source.hashCode,
39
+ table: serializeTablePattern(source.sourceTable),
40
+ filters: source.filters,
41
+ partitionBy: source.parameters,
42
+ output: source.outputs,
43
+ lookupScope: source.defaultLookupScope
44
+ };
45
+ });
46
+ }
47
+ function serializeParameterValue(value) {
48
+ if (value.type == 'request') {
49
+ return { type: 'request', expr: value.expr };
50
+ }
51
+ else if (value.type == 'lookup') {
52
+ return { type: 'lookup', lookup: expandingLookups.get(value.lookup), resultIndex: value.resultIndex };
53
+ }
54
+ else {
55
+ return { type: 'intersection', values: value.values.map(serializeParameterValue) };
56
+ }
57
+ }
58
+ function serializeStreamQuerier(source) {
59
+ const stages = [];
60
+ source.lookupStages.map((stage, stageIndex) => {
61
+ stages.push(stage.map((e, indexInStage) => {
62
+ const ref = {
63
+ stageId: stageIndex,
64
+ idInStage: indexInStage
65
+ };
66
+ let mapped;
67
+ if (e.type == 'parameter') {
68
+ mapped = {
69
+ type: 'parameter',
70
+ lookup: parameterIndex.get(e.lookup),
71
+ instantiation: e.instantiation.map(serializeParameterValue)
72
+ };
73
+ }
74
+ else {
75
+ mapped = {
76
+ type: 'table_valued',
77
+ functionName: e.functionName,
78
+ functionInputs: e.functionInputs,
79
+ outputs: e.outputs,
80
+ filters: e.filters
81
+ };
82
+ }
83
+ expandingLookups.set(e, ref);
84
+ return mapped;
85
+ }));
86
+ });
87
+ return {
88
+ requestFilters: source.requestFilters,
89
+ lookupStages: stages,
90
+ bucket: bucketIndex.get(source.bucket),
91
+ sourceInstantiation: source.sourceInstantiation.map(serializeParameterValue)
92
+ };
93
+ }
94
+ return {
95
+ version: 'unstable', // TODO: Mature to 1 before storing in bucket storage
96
+ dataSources: serializeDataSources(),
97
+ buckets: plan.buckets.map((bkt, index) => {
98
+ bucketIndex.set(bkt, index);
99
+ return {
100
+ hash: bkt.hashCode,
101
+ uniqueName: bkt.uniqueName,
102
+ sources: bkt.sources.map((e) => dataSourceIndex.get(e))
103
+ };
104
+ }),
105
+ parameterIndexes: serializeParameterIndexes(),
106
+ streams: plan.streams.map((s) => ({
107
+ stream: s.stream,
108
+ queriers: s.queriers.map(serializeStreamQuerier)
109
+ }))
110
+ };
111
+ }
112
+ export function deserializeSyncPlan(serialized) {
113
+ // TODO: Mature to version 1
114
+ if (serialized.version != 'unstable') {
115
+ throw new Error('Unknown sync plan version passed to deserializeSyncPlan()');
116
+ }
117
+ function deserializeTablePattern(pattern) {
118
+ return new TablePattern(`${pattern.connection}.${pattern.schema}`, pattern.table);
119
+ }
120
+ const plan = serialized;
121
+ const dataSources = plan.dataSources.map((source) => {
122
+ return {
123
+ hashCode: source.hash,
124
+ sourceTable: deserializeTablePattern(source.table),
125
+ outputTableName: source.outputTableName,
126
+ filters: source.filters,
127
+ parameters: source.partitionBy,
128
+ columns: source.columns
129
+ };
130
+ });
131
+ const buckets = plan.buckets.map((bkt) => {
132
+ return {
133
+ hashCode: bkt.hash,
134
+ uniqueName: bkt.uniqueName,
135
+ sources: bkt.sources.map((idx) => dataSources[idx])
136
+ };
137
+ });
138
+ const parameterIndexes = plan.parameterIndexes.map((source) => {
139
+ return {
140
+ hashCode: source.hash,
141
+ sourceTable: deserializeTablePattern(source.table),
142
+ filters: source.filters,
143
+ parameters: source.partitionBy,
144
+ outputs: source.output,
145
+ defaultLookupScope: source.lookupScope
146
+ };
147
+ });
148
+ function deserializeParameterValue(stages, value) {
149
+ switch (value.type) {
150
+ case 'request':
151
+ return value;
152
+ case 'lookup':
153
+ return {
154
+ type: 'lookup',
155
+ lookup: stages[value.lookup.stageId][value.lookup.idInStage],
156
+ resultIndex: value.resultIndex
157
+ };
158
+ case 'intersection':
159
+ return { type: 'intersection', values: value.values.map((v) => deserializeParameterValue(stages, v)) };
160
+ }
161
+ }
162
+ function deserializeExpandingLookup(stages, source) {
163
+ switch (source.type) {
164
+ case 'parameter':
165
+ return {
166
+ type: 'parameter',
167
+ lookup: parameterIndexes[source.lookup],
168
+ instantiation: source.instantiation.map((v) => deserializeParameterValue(stages, v))
169
+ };
170
+ case 'table_valued':
171
+ return {
172
+ type: 'table_valued',
173
+ functionName: source.functionName,
174
+ functionInputs: source.functionInputs,
175
+ outputs: source.outputs,
176
+ filters: source.filters
177
+ };
178
+ }
179
+ }
180
+ function deserializeStreamQuerier(source) {
181
+ const lookupStages = [];
182
+ for (const serializedStage of source.lookupStages) {
183
+ const stage = [];
184
+ for (const serializedElement of serializedStage) {
185
+ stage.push(deserializeExpandingLookup(lookupStages, serializedElement));
186
+ }
187
+ lookupStages.push(stage);
188
+ }
189
+ return {
190
+ requestFilters: source.requestFilters,
191
+ lookupStages,
192
+ bucket: buckets[source.bucket],
193
+ sourceInstantiation: source.sourceInstantiation.map((v) => deserializeParameterValue(lookupStages, v))
194
+ };
195
+ }
196
+ const streams = plan.streams.map((source) => {
197
+ return {
198
+ stream: source.stream,
199
+ queriers: source.queriers.map(deserializeStreamQuerier)
200
+ };
201
+ });
202
+ return {
203
+ dataSources,
204
+ buckets,
205
+ parameterIndexes,
206
+ streams
207
+ };
208
+ }
209
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/sync_plan/serialize.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { CompatibilityContext } from '../compatibility.js';
2
- import { SqliteValue } from '../types.js';
3
2
  import { SqliteValueType } from '../ExpressionType.js';
3
+ import { SqliteValue } from '../types.js';
4
4
  /**
5
5
  * A value that decays into a {@link SqliteValue} in a context-specific way.
6
6
  *
@@ -1,7 +1,24 @@
1
1
  import { SqliteValueType } from '../ExpressionType.js';
2
- import { CompatibilityContext } from '../compatibility.js';
2
+ import { CompatibilityContext, TimeValuePrecision } from '../compatibility.js';
3
3
  import { SqliteValue } from '../types.js';
4
4
  import { CustomSqliteValue } from './custom_sqlite_value.js';
5
+ export interface DateTimeSourceOptions {
6
+ /**
7
+ * The amount of sub-second digits provided by the source database.
8
+ *
9
+ * We can't infer this by parsing the iso representation alone, since trailing zeroes might be omitted from the
10
+ * representation.
11
+ */
12
+ subSecondPrecision: TimeValuePrecision;
13
+ /**
14
+ * The default precision to use when rendering {@link DateTimeValue}s in a compatibility context that doesn't have a
15
+ * {@link CompatibilityContext.maxTimeValuePrecision} set.
16
+ *
17
+ * This is usually the same as {@link subSecondPrecision}, except for MySQL, where we can provide microseconds
18
+ * precision but default to milliseconds.
19
+ */
20
+ defaultSubSecondPrecision: TimeValuePrecision;
21
+ }
5
22
  /**
6
23
  * In old versions of the sync service, timestamp values were formatted with a space between the date and time
7
24
  * components.
@@ -12,7 +29,8 @@ import { CustomSqliteValue } from './custom_sqlite_value.js';
12
29
  export declare class DateTimeValue extends CustomSqliteValue {
13
30
  readonly iso8601Representation: string;
14
31
  private readonly fixedLegacyRepresentation;
15
- constructor(iso8601Representation: string, fixedLegacyRepresentation?: string | undefined);
32
+ private readonly options;
33
+ constructor(iso8601Representation: string, fixedLegacyRepresentation: string | undefined, options: DateTimeSourceOptions);
16
34
  get legacyRepresentation(): string;
17
35
  get sqliteType(): SqliteValueType;
18
36
  toSqliteValue(context: CompatibilityContext): string;
@@ -25,9 +43,10 @@ export declare class DateTimeValue extends CustomSqliteValue {
25
43
  */
26
44
  export declare class TimeValue extends CustomSqliteValue {
27
45
  readonly timeSeconds: string;
28
- readonly fraction: string | undefined;
29
- constructor(timeSeconds: string, fraction?: string | undefined);
30
- static parse(value: string): TimeValue | null;
46
+ readonly fraction: string;
47
+ private readonly options;
48
+ constructor(timeSeconds: string, fraction: string, options: DateTimeSourceOptions);
49
+ static parse(value: string, options: DateTimeSourceOptions): TimeValue | null;
31
50
  toSqliteValue(context: CompatibilityContext): SqliteValue;
32
51
  get sqliteType(): SqliteValueType;
33
52
  }
@@ -1,4 +1,4 @@
1
- import { CompatibilityOption } from '../compatibility.js';
1
+ import { CompatibilityOption, TimeValuePrecision } from '../compatibility.js';
2
2
  import { CustomSqliteValue } from './custom_sqlite_value.js';
3
3
  /**
4
4
  * In old versions of the sync service, timestamp values were formatted with a space between the date and time
@@ -10,11 +10,13 @@ import { CustomSqliteValue } from './custom_sqlite_value.js';
10
10
  export class DateTimeValue extends CustomSqliteValue {
11
11
  iso8601Representation;
12
12
  fixedLegacyRepresentation;
13
+ options;
13
14
  // YYYY-MM-DDThh:mm:ss.sss / YYYY-MM-DDThh:mm:ss.sssZ
14
- constructor(iso8601Representation, fixedLegacyRepresentation = undefined) {
15
+ constructor(iso8601Representation, fixedLegacyRepresentation = undefined, options) {
15
16
  super();
16
17
  this.iso8601Representation = iso8601Representation;
17
18
  this.fixedLegacyRepresentation = fixedLegacyRepresentation;
19
+ this.options = options;
18
20
  }
19
21
  // YYYY-MM-DD hh:mm:ss.sss / YYYY-MM-DD hh:mm:ss.sssZ
20
22
  get legacyRepresentation() {
@@ -24,9 +26,25 @@ export class DateTimeValue extends CustomSqliteValue {
24
26
  return 'text';
25
27
  }
26
28
  toSqliteValue(context) {
27
- return context.isEnabled(CompatibilityOption.timestampsIso8601)
28
- ? this.iso8601Representation
29
- : this.legacyRepresentation;
29
+ if (context.isEnabled(CompatibilityOption.timestampsIso8601)) {
30
+ return renderSubseconds(() => {
31
+ // Match the `.123` subsecond part and/or a `Z` suffix.
32
+ const matchSubSeconds = /(?:\.(\d+))?([zZ]?)$/.exec(this.iso8601Representation);
33
+ if (matchSubSeconds == null || matchSubSeconds[0].length == 0) {
34
+ return [this.iso8601Representation, '', ''];
35
+ }
36
+ else {
37
+ return [
38
+ this.iso8601Representation.slice(0, -matchSubSeconds[0].length),
39
+ matchSubSeconds[1] ?? '',
40
+ matchSubSeconds[2] ?? ''
41
+ ];
42
+ }
43
+ }, this.options, context);
44
+ }
45
+ else {
46
+ return this.legacyRepresentation;
47
+ }
30
48
  }
31
49
  }
32
50
  /**
@@ -38,30 +56,67 @@ export class DateTimeValue extends CustomSqliteValue {
38
56
  export class TimeValue extends CustomSqliteValue {
39
57
  timeSeconds;
40
58
  fraction;
41
- constructor(timeSeconds, fraction = undefined) {
59
+ options;
60
+ constructor(timeSeconds, fraction, options) {
42
61
  super();
43
62
  this.timeSeconds = timeSeconds;
44
63
  this.fraction = fraction;
64
+ this.options = options;
45
65
  }
46
- static parse(value) {
47
- const match = /^([\d:]+)(\.\d+)?$/.exec(value);
66
+ static parse(value, options) {
67
+ const match = /^([\d:]+)(?:\.(\d+))?$/.exec(value);
48
68
  if (match == null) {
49
69
  return null;
50
70
  }
51
71
  const [_, timeSeconds, fraction] = match;
52
- return new TimeValue(timeSeconds, fraction);
72
+ return new TimeValue(timeSeconds, fraction, options);
53
73
  }
54
74
  toSqliteValue(context) {
55
75
  if (context.isEnabled(CompatibilityOption.timestampsIso8601)) {
56
- const fraction = this.fraction?.padEnd(7, '0') ?? '.000000';
57
- return `${this.timeSeconds}${fraction}`;
76
+ return renderSubseconds(() => [this.timeSeconds, this.fraction ?? '', ''], this.options, context);
58
77
  }
59
78
  else {
60
- return `${this.timeSeconds}${this.fraction ?? ''}`;
79
+ if (this.fraction) {
80
+ return `${this.timeSeconds}.${this.fraction}`;
81
+ }
82
+ else {
83
+ return this.timeSeconds;
84
+ }
61
85
  }
62
86
  }
63
87
  get sqliteType() {
64
88
  return 'text';
65
89
  }
66
90
  }
91
+ /**
92
+ * Renders a time value with a designated precision.
93
+ *
94
+ * @param split Returns the original time value, split into the part before the sub-second fraction and the subsecond
95
+ * fraction. The `.` separator should not be part of either string.
96
+ * @param options Information about precision overred by the source database.
97
+ * @param context The {@link CompatibilityContext} to take into consideration.
98
+ * @returns The rendered value.
99
+ */
100
+ function renderSubseconds(split, options, context) {
101
+ const maxPrecision = context.maxTimeValuePrecision ?? options.defaultSubSecondPrecision;
102
+ const maxSubSecondDigits = Math.min(maxPrecision.subSecondDigits, options.subSecondPrecision.subSecondDigits);
103
+ // Note: We are deliberately not rounding here, we always trim precision away. Rounding would require a parsed date
104
+ // with subsecond precision, which is just painful in JS. Maybe with the temporal API in Node 25...
105
+ let [withoutSubseconds, subseconds, suffix] = split();
106
+ if (maxPrecision == TimeValuePrecision.seconds) {
107
+ // Avoid a trailing `.` if we only care about seconds.
108
+ return `${withoutSubseconds}${suffix}`;
109
+ }
110
+ if (subseconds.length > maxSubSecondDigits) {
111
+ // Trim unwanted precision.
112
+ subseconds = subseconds.substring(0, maxSubSecondDigits);
113
+ }
114
+ else if (subseconds.length < maxSubSecondDigits) {
115
+ // Let's say we had a source database stripping trailing zeroes from the subsecond field. Perhaps the
116
+ // subSecondPrecision is generally micros, but one value has .123456 and one has .1234 instead of .123400. For
117
+ // consistency, we pad those value.
118
+ subseconds = subseconds.padEnd(maxSubSecondDigits, '0');
119
+ }
120
+ return `${withoutSubseconds}.${subseconds}${suffix}`;
121
+ }
67
122
  //# sourceMappingURL=time.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/types/time.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,iBAAiB;IAIvC;IACQ;IAJnB,qDAAqD;IAErD,YACW,qBAA6B,EACrB,4BAAgD,SAAS;QAE1E,KAAK,EAAE,CAAC;QAHC,0BAAqB,GAArB,qBAAqB,CAAQ;QACrB,8BAAyB,GAAzB,yBAAyB,CAAgC;IAG5E,CAAC;IAED,qDAAqD;IACrD,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,aAAa,CAAC,OAA6B;QACzC,OAAO,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;YAC7D,CAAC,CAAC,IAAI,CAAC,qBAAqB;YAC5B,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAChC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,SAAU,SAAQ,iBAAiB;IAEnC;IACA;IAFX,YACW,WAAmB,EACnB,WAA+B,SAAS;QAEjD,KAAK,EAAE,CAAC;QAHC,gBAAW,GAAX,WAAW,CAAQ;QACnB,aAAQ,GAAR,QAAQ,CAAgC;IAGnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAa;QACxB,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,KAAY,CAAC;QAChD,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,aAAa,CAAC,OAA6B;QACzC,IAAI,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;YAC5D,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/types/time.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,17 +1,13 @@
1
1
  import { JsonContainer } from '@powersync/service-jsonbig';
2
+ import { BucketPriority } from './BucketDescription.js';
3
+ import { ScopedParameterLookup, UnscopedParameterLookup } from './BucketParameterQuerier.js';
4
+ import { CompatibilityContext } from './compatibility.js';
2
5
  import { ColumnDefinition } from './ExpressionType.js';
6
+ import { RequestFunctionCall } from './request_functions.js';
3
7
  import { SourceTableInterface } from './SourceTableInterface.js';
4
8
  import { SyncRulesOptions } from './SqlSyncRules.js';
5
9
  import { TablePattern } from './TablePattern.js';
6
- import { BucketPriority } from './BucketDescription.js';
7
- import { ParameterLookup } from './BucketParameterQuerier.js';
8
10
  import { CustomSqliteValue } from './types/custom_sqlite_value.js';
9
- import { CompatibilityContext } from './compatibility.js';
10
- import { RequestFunctionCall } from './request_functions.js';
11
- export interface SyncRules {
12
- evaluateRow(options: EvaluateRowOptions): EvaluationResult[];
13
- evaluateParameterRow(table: SourceTableInterface, row: SqliteRow): EvaluatedParametersResult[];
14
- }
15
11
  export interface QueryParseOptions extends SyncRulesOptions {
16
12
  accept_potentially_dangerous_queries?: boolean;
17
13
  priority?: BucketPriority;
@@ -21,7 +17,16 @@ export interface StreamParseOptions extends QueryParseOptions {
21
17
  auto_subscribe?: boolean;
22
18
  }
23
19
  export interface EvaluatedParameters {
24
- lookup: ParameterLookup;
20
+ lookup: ScopedParameterLookup;
21
+ /**
22
+ * Parameters used to generate bucket id. May be incomplete.
23
+ *
24
+ * JSON-serializable.
25
+ */
26
+ bucketParameters: Record<string, SqliteJsonValue>[];
27
+ }
28
+ export interface UnscopedEvaluatedParameters {
29
+ lookup: UnscopedParameterLookup;
25
30
  /**
26
31
  * Parameters used to generate bucket id. May be incomplete.
27
32
  *
@@ -30,6 +35,7 @@ export interface EvaluatedParameters {
30
35
  bucketParameters: Record<string, SqliteJsonValue>[];
31
36
  }
32
37
  export type EvaluatedParametersResult = EvaluatedParameters | EvaluationError;
38
+ export type UnscopedEvaluatedParametersResult = UnscopedEvaluatedParameters | EvaluationError;
33
39
  export interface EvaluatedRow {
34
40
  bucket: string;
35
41
  /** Output table - may be different from input table. */
@@ -41,13 +47,41 @@ export interface EvaluatedRow {
41
47
  /** Must be JSON-serializable. */
42
48
  data: SqliteJsonRow;
43
49
  }
50
+ /**
51
+ * Bucket data as evaluated by the BucketDataSource.
52
+ *
53
+ * The bucket name must still be resolved, external to this.
54
+ */
55
+ export interface UnscopedEvaluatedRow {
56
+ /**
57
+ * Serialized evaluated parameters used to generate the bucket id. Serialized as a JSON array.
58
+ *
59
+ * Examples:
60
+ * [] // no bucket parameters
61
+ * [1] // single numeric parameter
62
+ * [1,"foo"] // multiple parameters
63
+ *
64
+ * The bucket name is derived by using concetenating these parameters with the generated bucket name.
65
+ */
66
+ serializedBucketParameters: string;
67
+ /** Output table - may be different from input table. */
68
+ table: string;
69
+ /**
70
+ * Convenience attribute. Must match data.id.
71
+ */
72
+ id: string;
73
+ /** Must be JSON-serializable. */
74
+ data: SqliteJsonRow;
75
+ }
44
76
  export interface EvaluationError {
45
77
  error: string;
46
78
  }
47
- export declare function isEvaluationError(e: any): e is EvaluationError;
79
+ export declare function isEvaluationError(e: EvaluationResult | UnscopedEvaluationResult | EvaluatedParametersResult | UnscopedEvaluatedParametersResult): e is EvaluationError;
48
80
  export declare function isEvaluatedRow(e: EvaluationResult): e is EvaluatedRow;
81
+ export declare function isSourceEvaluatedRow(e: UnscopedEvaluationResult): e is UnscopedEvaluatedRow;
49
82
  export declare function isEvaluatedParameters(e: EvaluatedParametersResult): e is EvaluatedParameters;
50
83
  export type EvaluationResult = EvaluatedRow | EvaluationError;
84
+ export type UnscopedEvaluationResult = UnscopedEvaluatedRow | EvaluationError;
51
85
  export interface RequestJwtPayload {
52
86
  /**
53
87
  * user_id
@@ -101,6 +135,14 @@ export declare class RequestParameters implements ParameterValueSet {
101
135
  * Uint8Array is not supported.
102
136
  */
103
137
  export type SqliteJsonValue = number | string | bigint | null;
138
+ /**
139
+ * A value that can be used as a bucket parameter.
140
+ *
141
+ * We don't support binary bucket parameters, so this needs to be a {@link SqliteJsonValue}. Further, bucket parameters
142
+ * are always instantiated through the `=` operator, and `NULL` values in SQLite don't compare via `=`. So, `null`
143
+ * values also aren't allowed as parameters.
144
+ */
145
+ export type SqliteParameterValue = NonNullable<SqliteJsonValue>;
104
146
  /**
105
147
  * A value supported by the SQLite type system.
106
148
  */
@@ -190,21 +232,7 @@ export interface InputParameter {
190
232
  */
191
233
  parametersToLookupValue(parameters: ParameterValueSet): SqliteValue;
192
234
  }
193
- /**
194
- * Transforms bucket ids generated when evaluating the row by e.g. encoding version information.
195
- *
196
- * Because buckets are recreated on a sync rule redeploy, it makes sense to use different bucket ids (otherwise, clients
197
- * may run into checksum errors causing a sync to take longer than necessary or breaking progress).
198
- *
199
- * So, this transformer receives the original bucket id as generated by defined sync rules, and can prepend a version
200
- * identifier.
201
- *
202
- * Note that this transformation has not been present in older versions of the sync service. To preserve backwards
203
- * compatibility, sync rules will not use this function without an opt-in.
204
- */
205
- export type BucketIdTransformer = (regularId: string) => string;
206
235
  export interface EvaluateRowOptions extends TableRow {
207
- bucketIdTransformer: BucketIdTransformer;
208
236
  }
209
237
  /**
210
238
  * A row associated with the table it's coming from.
package/dist/types.js CHANGED
@@ -1,12 +1,15 @@
1
1
  import { JSONBig } from '@powersync/service-jsonbig';
2
- import { toSyncRulesParameters } from './utils.js';
3
2
  import { CompatibilityContext } from './compatibility.js';
3
+ import { toSyncRulesParameters } from './utils.js';
4
4
  export function isEvaluationError(e) {
5
5
  return typeof e.error == 'string';
6
6
  }
7
7
  export function isEvaluatedRow(e) {
8
8
  return typeof e.bucket == 'string';
9
9
  }
10
+ export function isSourceEvaluatedRow(e) {
11
+ return typeof e.serializedBucketParameters == 'string';
12
+ }
10
13
  export function isEvaluatedParameters(e) {
11
14
  return 'lookup' in e;
12
15
  }
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import { Replacer } from '@powersync/service-jsonbig';
2
2
  import { SelectFromStatement, Statement } from 'pgsql-ast-parser';
3
3
  import { CompatibilityContext } from './compatibility.js';
4
- import { BucketIdTransformer, DatabaseInputRow, DatabaseInputValue, SqliteInputRow, SqliteInputValue, SqliteJsonRow, SqliteJsonValue, SqliteRow, SqliteValue } from './types.js';
4
+ import { BucketDataScope } from './HydrationState.js';
5
+ import { DatabaseInputRow, DatabaseInputValue, SqliteInputRow, SqliteInputValue, SqliteJsonRow, SqliteJsonValue, SqliteParameterValue, SqliteRow, SqliteValue } from './types.js';
5
6
  export declare function isSelectStatement(q: Statement): q is SelectFromStatement;
6
- export declare function getBucketId(descriptor_id: string, bucket_parameters: string[], params: Record<string, SqliteJsonValue>, transformer: BucketIdTransformer): string;
7
+ export declare function buildBucketName(scope: BucketDataScope, serializedParameters: string): string;
8
+ export declare function serializeBucketParameters(bucketParameters: string[], params: Record<string, SqliteJsonValue>): string;
7
9
  /**
8
10
  * SqliteRow -> SqliteJsonRow.
9
11
  *
@@ -19,6 +21,7 @@ export declare function filterJsonRow(data: SqliteRow): SqliteJsonRow;
19
21
  */
20
22
  export declare function jsonValueToSqlite(fixedJsonBehavior: boolean, value: null | undefined | string | number | bigint | boolean | any): SqliteValue;
21
23
  export declare function isJsonValue(value: SqliteValue): value is SqliteJsonValue;
24
+ export declare function isValidParameterValue(value: SqliteValue): value is SqliteParameterValue;
22
25
  /**
23
26
  * Map database row to SqliteRow for use in sync rules.
24
27
  */
@@ -49,3 +52,7 @@ export declare const JSONBucketNameSerialize: {
49
52
  * Lookup serialization must be number-agnostic. I.e. normalize numbers, instead of preserving numbers.
50
53
  */
51
54
  export declare function normalizeParameterValue(value: SqliteJsonValue): SqliteJsonValue;
55
+ /**
56
+ * Extracts and normalizes the ID column from a row.
57
+ */
58
+ export declare function idFromData(data: SqliteJsonRow): string;
package/dist/utils.js CHANGED
@@ -2,13 +2,17 @@ import { JSONBig, JsonContainer, stringifyRaw } from '@powersync/service-jsonbig
2
2
  import { SyncRuleProcessingError as SyncRulesProcessingError } from './errors.js';
3
3
  import { SQLITE_FALSE, SQLITE_TRUE } from './sql_support.js';
4
4
  import { CustomArray, CustomObject, CustomSqliteValue } from './types/custom_sqlite_value.js';
5
+ import { castAsText } from './sql_functions.js';
5
6
  export function isSelectStatement(q) {
6
7
  return q.type == 'select';
7
8
  }
8
- export function getBucketId(descriptor_id, bucket_parameters, params, transformer) {
9
+ export function buildBucketName(scope, serializedParameters) {
10
+ return scope.bucketPrefix + serializedParameters;
11
+ }
12
+ export function serializeBucketParameters(bucketParameters, params) {
9
13
  // Important: REAL and INTEGER values matching the same number needs the same representation in the bucket name.
10
- const paramArray = bucket_parameters.map((name) => params[`bucket.${name}`]);
11
- return transformer(`${descriptor_id}${JSONBucketNameSerialize.stringify(paramArray)}`);
14
+ const paramArray = bucketParameters.map((name) => params[`bucket.${name}`]);
15
+ return JSONBucketNameSerialize.stringify(paramArray);
12
16
  }
13
17
  const DEPTH_LIMIT = 10;
14
18
  /**
@@ -54,6 +58,9 @@ export function jsonValueToSqlite(fixedJsonBehavior, value) {
54
58
  export function isJsonValue(value) {
55
59
  return value == null || typeof value == 'string' || typeof value == 'number' || typeof value == 'bigint';
56
60
  }
61
+ export function isValidParameterValue(value) {
62
+ return value != null && isJsonValue(value);
63
+ }
57
64
  function filterJsonData(data, context, depth = 0) {
58
65
  if (depth > DEPTH_LIMIT) {
59
66
  // This is primarily to prevent infinite recursion
@@ -210,4 +217,20 @@ export function normalizeParameterValue(value) {
210
217
  }
211
218
  return value;
212
219
  }
220
+ /**
221
+ * Extracts and normalizes the ID column from a row.
222
+ */
223
+ export function idFromData(data) {
224
+ let id = data.id;
225
+ if (typeof id != 'string') {
226
+ // While an explicit cast would be better, this covers against very common
227
+ // issues when initially testing out sync, for example when the id column is an
228
+ // auto-incrementing integer.
229
+ // If there is no id column, we use a blank id. This will result in the user syncing
230
+ // a single arbitrary row for this table - better than just not being able to sync
231
+ // anything.
232
+ id = castAsText(id) ?? '';
233
+ }
234
+ return id;
235
+ }
213
236
  //# sourceMappingURL=utils.js.map