@powersync/service-sync-rules 0.29.10 → 0.31.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 (188) 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 +11 -53
  28. package/dist/SqlSyncRules.js +11 -376
  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/SyncConfig.d.ts +43 -0
  34. package/dist/SyncConfig.js +102 -0
  35. package/dist/SyncConfig.js.map +1 -0
  36. package/dist/TablePattern.d.ts +22 -4
  37. package/dist/TablePattern.js +57 -19
  38. package/dist/TablePattern.js.map +1 -1
  39. package/dist/TableValuedFunctionSqlParameterQuery.d.ts +14 -4
  40. package/dist/TableValuedFunctionSqlParameterQuery.js +41 -7
  41. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  42. package/dist/compatibility.d.ts +7 -0
  43. package/dist/compatibility.js +34 -0
  44. package/dist/compatibility.js.map +1 -1
  45. package/dist/compiler/bucket_resolver.d.ts +70 -0
  46. package/dist/compiler/bucket_resolver.js +131 -0
  47. package/dist/compiler/bucket_resolver.js.map +1 -0
  48. package/dist/compiler/compatibility.d.ts +16 -0
  49. package/dist/compiler/compatibility.js +12 -0
  50. package/dist/compiler/compatibility.js.map +1 -0
  51. package/dist/compiler/compiler.d.ts +110 -0
  52. package/dist/compiler/compiler.js +130 -0
  53. package/dist/compiler/compiler.js.map +1 -0
  54. package/dist/compiler/equality.d.ts +99 -0
  55. package/dist/compiler/equality.js +284 -0
  56. package/dist/compiler/equality.js.map +1 -0
  57. package/dist/compiler/expression.d.ts +77 -0
  58. package/dist/compiler/expression.js +122 -0
  59. package/dist/compiler/expression.js.map +1 -0
  60. package/dist/compiler/filter.d.ts +71 -0
  61. package/dist/compiler/filter.js +110 -0
  62. package/dist/compiler/filter.js.map +1 -0
  63. package/dist/compiler/filter_simplifier.d.ts +26 -0
  64. package/dist/compiler/filter_simplifier.js +119 -0
  65. package/dist/compiler/filter_simplifier.js.map +1 -0
  66. package/dist/compiler/ir_to_sync_plan.d.ts +37 -0
  67. package/dist/compiler/ir_to_sync_plan.js +163 -0
  68. package/dist/compiler/ir_to_sync_plan.js.map +1 -0
  69. package/dist/compiler/parser.d.ts +99 -0
  70. package/dist/compiler/parser.js +556 -0
  71. package/dist/compiler/parser.js.map +1 -0
  72. package/dist/compiler/querier_graph.d.ts +42 -0
  73. package/dist/compiler/querier_graph.js +365 -0
  74. package/dist/compiler/querier_graph.js.map +1 -0
  75. package/dist/compiler/rows.d.ts +113 -0
  76. package/dist/compiler/rows.js +156 -0
  77. package/dist/compiler/rows.js.map +1 -0
  78. package/dist/compiler/scope.d.ts +22 -0
  79. package/dist/compiler/scope.js +47 -0
  80. package/dist/compiler/scope.js.map +1 -0
  81. package/dist/compiler/sqlite.d.ts +77 -0
  82. package/dist/compiler/sqlite.js +412 -0
  83. package/dist/compiler/sqlite.js.map +1 -0
  84. package/dist/compiler/table.d.ts +66 -0
  85. package/dist/compiler/table.js +67 -0
  86. package/dist/compiler/table.js.map +1 -0
  87. package/dist/errors.d.ts +4 -2
  88. package/dist/errors.js +16 -1
  89. package/dist/errors.js.map +1 -1
  90. package/dist/events/SqlEventDescriptor.js +1 -1
  91. package/dist/events/SqlEventDescriptor.js.map +1 -1
  92. package/dist/events/SqlEventSourceQuery.d.ts +1 -1
  93. package/dist/events/SqlEventSourceQuery.js +1 -2
  94. package/dist/events/SqlEventSourceQuery.js.map +1 -1
  95. package/dist/from_yaml.d.ts +28 -0
  96. package/dist/from_yaml.js +411 -0
  97. package/dist/from_yaml.js.map +1 -0
  98. package/dist/index.d.ts +9 -0
  99. package/dist/index.js +9 -0
  100. package/dist/index.js.map +1 -1
  101. package/dist/json_schema.js +17 -1
  102. package/dist/json_schema.js.map +1 -1
  103. package/dist/request_functions.js.map +1 -1
  104. package/dist/schema-generators/DartSchemaGenerator.d.ts +3 -3
  105. package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
  106. package/dist/schema-generators/DotNetSchemaGenerator.d.ts +2 -2
  107. package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
  108. package/dist/schema-generators/JsLegacySchemaGenerator.d.ts +2 -2
  109. package/dist/schema-generators/JsLegacySchemaGenerator.js.map +1 -1
  110. package/dist/schema-generators/KotlinSchemaGenerator.d.ts +2 -2
  111. package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
  112. package/dist/schema-generators/RoomSchemaGenerator.d.ts +2 -2
  113. package/dist/schema-generators/RoomSchemaGenerator.js.map +1 -1
  114. package/dist/schema-generators/SchemaGenerator.d.ts +8 -3
  115. package/dist/schema-generators/SchemaGenerator.js +21 -14
  116. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  117. package/dist/schema-generators/SqlSchemaGenerator.d.ts +2 -2
  118. package/dist/schema-generators/SqlSchemaGenerator.js.map +1 -1
  119. package/dist/schema-generators/SwiftSchemaGenerator.d.ts +2 -2
  120. package/dist/schema-generators/SwiftSchemaGenerator.js.map +1 -1
  121. package/dist/schema-generators/TsSchemaGenerator.d.ts +2 -2
  122. package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
  123. package/dist/sql_functions.d.ts +4 -3
  124. package/dist/sql_functions.js +1 -1
  125. package/dist/sql_functions.js.map +1 -1
  126. package/dist/streams/filter.d.ts +34 -4
  127. package/dist/streams/filter.js +93 -23
  128. package/dist/streams/filter.js.map +1 -1
  129. package/dist/streams/from_sql.js +2 -5
  130. package/dist/streams/from_sql.js.map +1 -1
  131. package/dist/streams/parameter.d.ts +7 -6
  132. package/dist/streams/stream.d.ts +25 -15
  133. package/dist/streams/stream.js +59 -87
  134. package/dist/streams/stream.js.map +1 -1
  135. package/dist/streams/variant.d.ts +14 -21
  136. package/dist/streams/variant.js +68 -46
  137. package/dist/streams/variant.js.map +1 -1
  138. package/dist/sync_plan/engine/javascript.d.ts +6 -0
  139. package/dist/sync_plan/engine/javascript.js +208 -0
  140. package/dist/sync_plan/engine/javascript.js.map +1 -0
  141. package/dist/sync_plan/engine/scalar_expression_engine.d.ts +48 -0
  142. package/dist/sync_plan/engine/scalar_expression_engine.js +99 -0
  143. package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -0
  144. package/dist/sync_plan/engine/sqlite.d.ts +12 -0
  145. package/dist/sync_plan/engine/sqlite.js +53 -0
  146. package/dist/sync_plan/engine/sqlite.js.map +1 -0
  147. package/dist/sync_plan/evaluator/bucket_data_source.d.ts +24 -0
  148. package/dist/sync_plan/evaluator/bucket_data_source.js +139 -0
  149. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -0
  150. package/dist/sync_plan/evaluator/bucket_source.d.ts +19 -0
  151. package/dist/sync_plan/evaluator/bucket_source.js +145 -0
  152. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -0
  153. package/dist/sync_plan/evaluator/index.d.ts +17 -0
  154. package/dist/sync_plan/evaluator/index.js +32 -0
  155. package/dist/sync_plan/evaluator/index.js.map +1 -0
  156. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +138 -0
  157. package/dist/sync_plan/evaluator/parameter_evaluator.js +359 -0
  158. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -0
  159. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +20 -0
  160. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +64 -0
  161. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -0
  162. package/dist/sync_plan/expression.d.ts +109 -0
  163. package/dist/sync_plan/expression.js +85 -0
  164. package/dist/sync_plan/expression.js.map +1 -0
  165. package/dist/sync_plan/expression_to_sql.d.ts +43 -0
  166. package/dist/sync_plan/expression_to_sql.js +190 -0
  167. package/dist/sync_plan/expression_to_sql.js.map +1 -0
  168. package/dist/sync_plan/expression_visitor.d.ts +57 -0
  169. package/dist/sync_plan/expression_visitor.js +181 -0
  170. package/dist/sync_plan/expression_visitor.js.map +1 -0
  171. package/dist/sync_plan/plan.d.ts +196 -0
  172. package/dist/sync_plan/plan.js +2 -0
  173. package/dist/sync_plan/plan.js.map +1 -0
  174. package/dist/sync_plan/schema_inference.d.ts +16 -0
  175. package/dist/sync_plan/schema_inference.js +123 -0
  176. package/dist/sync_plan/schema_inference.js.map +1 -0
  177. package/dist/sync_plan/serialize.d.ts +82 -0
  178. package/dist/sync_plan/serialize.js +214 -0
  179. package/dist/sync_plan/serialize.js.map +1 -0
  180. package/dist/types/custom_sqlite_value.d.ts +1 -1
  181. package/dist/types.d.ts +72 -29
  182. package/dist/types.js +30 -5
  183. package/dist/types.js.map +1 -1
  184. package/dist/utils.d.ts +10 -3
  185. package/dist/utils.js +26 -3
  186. package/dist/utils.js.map +1 -1
  187. package/package.json +4 -3
  188. package/schema/sync_rules.json +19 -3
@@ -0,0 +1,67 @@
1
+ import { equalsIgnoringResultSetList } from './compatibility.js';
2
+ /**
3
+ * The syntactic sources of a {@link SourceResultSet} being added to a table.
4
+ */
5
+ export class SyntacticResultSetSource {
6
+ origin;
7
+ explicitName;
8
+ constructor(origin, explicitName) {
9
+ this.origin = origin;
10
+ this.explicitName = explicitName;
11
+ }
12
+ }
13
+ export class BaseSourceResultSet {
14
+ source;
15
+ constructor(source) {
16
+ this.source = source;
17
+ }
18
+ }
19
+ /**
20
+ * A {@link SourceResultSet} selecting rows from a table in the source database.
21
+ *
22
+ * The primary result set of streams must be of this type. Also, indexed lookups can only operate on this type.
23
+ */
24
+ export class PhysicalSourceResultSet extends BaseSourceResultSet {
25
+ tablePattern;
26
+ schemaTablesForWarnings;
27
+ constructor(tablePattern, source,
28
+ /**
29
+ * Source tables that the {@link tablePattern} resolves to in the static schema context used when compiling sync
30
+ * streams.
31
+ *
32
+ * This information must only be used to generate analysis warnings, e.g. for column references that don't exist in
33
+ * resolved tables. It must not affect how sync streams are compiled, as that is always schema-independent.
34
+ */
35
+ schemaTablesForWarnings) {
36
+ super(source);
37
+ this.tablePattern = tablePattern;
38
+ this.schemaTablesForWarnings = schemaTablesForWarnings;
39
+ }
40
+ get description() {
41
+ return this.tablePattern.name;
42
+ }
43
+ }
44
+ /**
45
+ * A {@link SourceResultSet} applying a table-valued function with inputs that exclusively depend on request data.
46
+ */
47
+ export class RequestTableValuedResultSet extends BaseSourceResultSet {
48
+ tableValuedFunctionName;
49
+ parameters;
50
+ constructor(tableValuedFunctionName, parameters, source) {
51
+ super(source);
52
+ this.tableValuedFunctionName = tableValuedFunctionName;
53
+ this.parameters = parameters;
54
+ }
55
+ get description() {
56
+ return this.tableValuedFunctionName;
57
+ }
58
+ buildBehaviorHashCode(hasher) {
59
+ hasher.addString(this.tableValuedFunctionName);
60
+ equalsIgnoringResultSetList.hash(hasher, this.parameters);
61
+ }
62
+ behavesIdenticalTo(other) {
63
+ return (other.tableValuedFunctionName == this.tableValuedFunctionName &&
64
+ equalsIgnoringResultSetList.equals(other.parameters, this.parameters));
65
+ }
66
+ }
67
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/compiler/table.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAgBjE;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAExB;IACA;IAFX,YACW,MAAc,EACd,YAA2B;QAD3B,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAe;IACnC,CAAC;CACL;AAED,MAAM,OAAgB,mBAAmB;IAClB;IAArB,YAAqB,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;IAAG,CAAC;CAG1D;AAED;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,mBAAmB;IAEnD;IASA;IAVX,YACW,YAAwC,EACjD,MAAgC;IAChC;;;;;;OAMG;IACM,uBAA4C;QAErD,KAAK,CAAC,MAAM,CAAC,CAAC;QAXL,iBAAY,GAAZ,YAAY,CAA4B;QASxC,4BAAuB,GAAvB,uBAAuB,CAAqB;IAGvD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,mBAAmB;IAEvD;IACA;IAFX,YACW,uBAA+B,EAC/B,UAA+B,EACxC,MAAgC;QAEhC,KAAK,CAAC,MAAM,CAAC,CAAC;QAJL,4BAAuB,GAAvB,uBAAuB,CAAQ;QAC/B,eAAU,GAAV,UAAU,CAAqB;IAI1C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,qBAAqB,CAAC,MAAoB;QACxC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/C,2BAA2B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED,kBAAkB,CAAC,KAAkC;QACnD,OAAO,CACL,KAAK,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB;YAC7D,2BAA2B,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CACtE,CAAC;IACJ,CAAC;CACF"}
package/dist/errors.d.ts CHANGED
@@ -1,13 +1,15 @@
1
- import { Expr, NodeLocation } from 'pgsql-ast-parser';
1
+ import { NodeLocation, PGNode } from 'pgsql-ast-parser';
2
2
  export interface ErrorLocation {
3
3
  start: number;
4
4
  end: number;
5
5
  }
6
+ export declare function expandNodeLocations(nodes: Iterable<PGNode | NodeLocation | undefined>): NodeLocation | undefined;
7
+ export declare function getLocation(location?: NodeLocation | PGNode): NodeLocation | undefined;
6
8
  export declare class SqlRuleError extends Error {
7
9
  sql: string;
8
10
  location?: ErrorLocation;
9
11
  type: 'warning' | 'fatal';
10
- constructor(message: string, sql: string, location?: NodeLocation | Expr);
12
+ constructor(message: string, sql: string, location?: NodeLocation | PGNode);
11
13
  }
12
14
  export declare class YamlError extends Error {
13
15
  source: Error;
package/dist/errors.js CHANGED
@@ -1,5 +1,20 @@
1
1
  import * as yaml from 'yaml';
2
- function getLocation(location) {
2
+ export function expandNodeLocations(nodes) {
3
+ let location = undefined;
4
+ for (const node of nodes) {
5
+ const nodeLocation = getLocation(node);
6
+ if (nodeLocation == null)
7
+ continue;
8
+ if (location == null) {
9
+ location = nodeLocation;
10
+ }
11
+ else {
12
+ location = { start: Math.min(location.start, nodeLocation.start), end: Math.max(location.end, nodeLocation.end) };
13
+ }
14
+ }
15
+ return location;
16
+ }
17
+ export function getLocation(location) {
3
18
  if (location != null && !isLocation(location)) {
4
19
  return location._location;
5
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,SAAS,WAAW,CAAC,QAA8B;IACjD,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,QAA8B;IAChD,OAAO,CACL,QAAQ,IAAI,IAAI;QAChB,OAAQ,QAAyB,CAAC,KAAK,IAAI,QAAQ;QACnD,OAAQ,QAAyB,CAAC,GAAG,IAAI,QAAQ,CAClD,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAM5B;IALT,QAAQ,CAAiB;IACzB,IAAI,GAAwB,OAAO,CAAC;IAEpC,YACE,OAAe,EACR,GAAW,EAClB,QAA8B;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,QAAG,GAAH,GAAG,CAAQ;QAKlB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACzE,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IAKzB;IAJT,QAAQ,CAAgB;IACxB,IAAI,GAAwB,OAAO,CAAC;IAEpC,YACS,MAAa,EACpB,QAAwB;QAExB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAHf,WAAM,GAAN,MAAM,CAAO;QAKpB,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC;YACzD,QAAQ,GAAG;gBACT,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aACnB,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC5B,QAAQ,GAAG;gBACT,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACR,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,YAAY,SAAS,IAAI,MAAM,YAAY,YAAY,EAAE,CAAC;YAClE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAIrB;IAHnB,MAAM,CAAC,gBAAgB,CAAC,MAAmB;QACzC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,YAAmB,MAAmB;QACpC,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QAD/B,WAAM,GAAN,MAAM,CAAa;IAEtC,CAAC;CACF;AAGD,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACzC,IAAI,CAAqB;IAEhC,YAAY,IAAwB,EAAE,OAAe;QACnD,KAAK,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ export class SqlEventDescriptor {
12
12
  this.name = name;
13
13
  }
14
14
  addSourceQuery(sql, options) {
15
- const source = SqlEventSourceQuery.fromSql(this.name, sql, options, this.compatibility);
15
+ const source = SqlEventSourceQuery.fromSql(sql, options, this.compatibility);
16
16
  // Each source query should be for a unique table
17
17
  const existingSourceQuery = this.sourceQueries.find((q) => q.table == source.table);
18
18
  if (existingSourceQuery) {
@@ -1 +1 @@
1
- {"version":3,"file":"SqlEventDescriptor.js","sourceRoot":"","sources":["../../src/events/SqlEventDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,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,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAExF,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,KAA2B;QAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;CACF"}
1
+ {"version":3,"file":"SqlEventDescriptor.js","sourceRoot":"","sources":["../../src/events/SqlEventDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,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,KAA2B;QAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -14,7 +14,7 @@ export type EvaluatedEventRowWithErrors = {
14
14
  * Defines how a Replicated Row is mapped to source parameters for events.
15
15
  */
16
16
  export declare class SqlEventSourceQuery extends BaseSqlDataQuery {
17
- static fromSql(descriptor_name: string, sql: string, options: SyncRulesOptions, compatibility: CompatibilityContext): SqlEventSourceQuery;
17
+ static fromSql(sql: string, options: SyncRulesOptions, compatibility: CompatibilityContext): SqlEventSourceQuery;
18
18
  constructor(options: BaseSqlDataQueryOptions);
19
19
  evaluateRowWithErrors(table: SourceTableInterface, row: SqliteRow): EvaluatedEventRowWithErrors;
20
20
  }
@@ -11,7 +11,7 @@ import { isSelectStatement } from '../utils.js';
11
11
  * Defines how a Replicated Row is mapped to source parameters for events.
12
12
  */
13
13
  export class SqlEventSourceQuery extends BaseSqlDataQuery {
14
- static fromSql(descriptor_name, sql, options, compatibility) {
14
+ static fromSql(sql, options, compatibility) {
15
15
  const parsed = parse(sql, { locationTracking: true });
16
16
  const schema = options.schema;
17
17
  if (parsed.length > 1) {
@@ -95,7 +95,6 @@ export class SqlEventSourceQuery extends BaseSqlDataQuery {
95
95
  sourceTable,
96
96
  table: alias,
97
97
  sql,
98
- descriptorName: descriptor_name,
99
98
  columns: q.columns ?? [],
100
99
  extractors: extractors,
101
100
  tools,
@@ -1 +1 @@
1
- {"version":3,"file":"SqlEventSourceQuery.js","sourceRoot":"","sources":["../../src/events/SqlEventSourceQuery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqlEventSourceQuery.js","sourceRoot":"","sources":["../../src/events/SqlEventSourceQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { SourceSchema } from './types.js';
2
+ import { SyncConfigWithErrors } from './SyncConfig.js';
3
+ /**
4
+ * Reads `sync_rules.yaml` files containing a sync configuration.
5
+ *
6
+ * @internal Only exposed through `SqlSyncRules.fromYaml`.
7
+ */
8
+ export declare class SyncConfigFromYaml {
9
+ #private;
10
+ private readonly options;
11
+ private readonly yaml;
12
+ constructor(options: SyncConfigFromYamlOptions, yaml: string);
13
+ read(): SyncConfigWithErrors;
14
+ }
15
+ export interface SyncConfigFromYamlOptions {
16
+ readonly throwOnError: boolean;
17
+ readonly schema?: SourceSchema;
18
+ /**
19
+ * The default schema to use when only a table name is specified.
20
+ *
21
+ * 'public' for Postgres, default database for MongoDB/MySQL.
22
+ */
23
+ readonly defaultSchema: string;
24
+ /**
25
+ * Whether to allow the option of using the new sync compiler.
26
+ */
27
+ readonly allowNewSyncCompiler: boolean;
28
+ }
@@ -0,0 +1,411 @@
1
+ import { isScalar, LineCounter, parseDocument, Scalar, YAMLMap, YAMLSeq } from 'yaml';
2
+ import { SqlRuleError, SyncRulesErrors, YamlError } from './errors.js';
3
+ import { DEFAULT_BUCKET_PRIORITY, isValidPriority } from './BucketDescription.js';
4
+ import { CompatibilityContext, CompatibilityEdition, CompatibilityOption, TimeValuePrecision } from './compatibility.js';
5
+ import { SqlSyncRules } from './SqlSyncRules.js';
6
+ import { validateSyncRulesSchema } from './json_schema.js';
7
+ import { SqlEventDescriptor } from './events/SqlEventDescriptor.js';
8
+ import { SqlBucketDescriptor } from './SqlBucketDescriptor.js';
9
+ import { SyncStreamsCompiler } from './compiler/compiler.js';
10
+ import { syncStreamFromSql } from './streams/from_sql.js';
11
+ import { PrecompiledSyncConfig } from './sync_plan/evaluator/index.js';
12
+ import { javaScriptExpressionEngine } from './sync_plan/engine/javascript.js';
13
+ const ACCEPT_POTENTIALLY_DANGEROUS_QUERIES = Symbol('ACCEPT_POTENTIALLY_DANGEROUS_QUERIES');
14
+ /**
15
+ * Reads `sync_rules.yaml` files containing a sync configuration.
16
+ *
17
+ * @internal Only exposed through `SqlSyncRules.fromYaml`.
18
+ */
19
+ export class SyncConfigFromYaml {
20
+ options;
21
+ yaml;
22
+ #errors = [];
23
+ #lineCounter = new LineCounter();
24
+ // Names of bucket definitions and sync streams, to prevent duplicates.
25
+ #definitionNames = new Set();
26
+ constructor(options, yaml) {
27
+ this.options = options;
28
+ this.yaml = yaml;
29
+ }
30
+ read() {
31
+ return { config: this.#read(), errors: this.#errors };
32
+ }
33
+ #read() {
34
+ const parsed = parseDocument(this.yaml, {
35
+ schema: 'core',
36
+ keepSourceTokens: true,
37
+ lineCounter: this.#lineCounter,
38
+ customTags: [
39
+ {
40
+ tag: '!accept_potentially_dangerous_queries',
41
+ resolve(_text, _onError) {
42
+ return ACCEPT_POTENTIALLY_DANGEROUS_QUERIES;
43
+ }
44
+ }
45
+ ]
46
+ });
47
+ if (parsed.errors.length > 0) {
48
+ this.#errors.push(...parsed.errors.map((e) => new YamlError(e)));
49
+ this.#throwOnErrorIfRequested();
50
+ // Return an empty sync rules instance if we couldn't parse YAML, it doesn't make sense to try parsing the broken
51
+ // structure further.
52
+ return new SqlSyncRules(this.yaml);
53
+ }
54
+ let compatibility;
55
+ let useNewCompiler;
56
+ if (parsed.has('config')) {
57
+ const declaredOptions = parsed.get('config');
58
+ const compatibilityOptions = this.#parseCompatibilityOptions(declaredOptions);
59
+ compatibility = compatibilityOptions.compatibility;
60
+ useNewCompiler = compatibilityOptions.useNewCompiler;
61
+ }
62
+ else {
63
+ compatibility = CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY;
64
+ useNewCompiler = false;
65
+ }
66
+ // Bucket definitions using explicit parameter and data queries.
67
+ const bucketMap = parsed.get('bucket_definitions');
68
+ const streamMap = parsed.get('streams');
69
+ let result;
70
+ if (useNewCompiler && this.options.allowNewSyncCompiler) {
71
+ result = this.#compileSyncPlan(bucketMap, streamMap, compatibility);
72
+ }
73
+ else {
74
+ result = this.#legacyParseBucketDefinitionsAndStreams(bucketMap, streamMap, compatibility);
75
+ }
76
+ const eventDefinitions = this.#parseEventDefinitions(parsed, compatibility);
77
+ result.eventDescriptors.push(...eventDefinitions);
78
+ // Validate that there are no additional properties.
79
+ // Since these errors don't contain line numbers, do this last.
80
+ const valid = validateSyncRulesSchema(parsed.toJSON());
81
+ if (!valid) {
82
+ this.#errors.push(...validateSyncRulesSchema.errors.map((e) => {
83
+ return new YamlError(e);
84
+ }));
85
+ }
86
+ this.#throwOnErrorIfRequested();
87
+ return result;
88
+ }
89
+ #throwOnErrorIfRequested() {
90
+ if (this.options.throwOnError && this.#errors.find((e) => e.type != 'warning') != null) {
91
+ throw new SyncRulesErrors(this.#errors);
92
+ }
93
+ }
94
+ /**
95
+ * Parses the `config` block of a sync configuration.
96
+ *
97
+ * @see https://docs.powersync.com/sync/advanced/compatibility
98
+ */
99
+ #parseCompatibilityOptions(declaredOptions) {
100
+ const edition = (declaredOptions.get('edition') ?? CompatibilityEdition.LEGACY);
101
+ const options = new Map();
102
+ let maxTimeValuePrecision = undefined;
103
+ let useNewCompiler = false;
104
+ for (const entry of declaredOptions.items) {
105
+ const { key: { value: key }, value: { value } } = entry;
106
+ if (key == 'timestamp_max_precision') {
107
+ maxTimeValuePrecision = TimeValuePrecision.byName[value];
108
+ }
109
+ if (key == 'sync_config_compiler') {
110
+ useNewCompiler = Boolean(value);
111
+ continue;
112
+ }
113
+ const option = CompatibilityOption.byName[key];
114
+ if (option) {
115
+ options.set(option, Boolean(value));
116
+ }
117
+ }
118
+ const compatibility = new CompatibilityContext({ edition, overrides: options, maxTimeValuePrecision });
119
+ if (maxTimeValuePrecision && !compatibility.isEnabled(CompatibilityOption.timestampsIso8601)) {
120
+ this.#errors.push(new YamlError(new Error(`'timestamp_max_precision' requires 'timestamps_iso8601' to be enabled.`)));
121
+ }
122
+ return { compatibility, useNewCompiler };
123
+ }
124
+ #compileSyncPlan(bucketMap, streamMap, compatibility) {
125
+ if (bucketMap != null) {
126
+ this.#errors.push(this.#yamlError(bucketMap, `'bucket_definitions' are not supported by the new compiler. Consider using https://powersync-community.github.io/bucket-definitions-to-sync-streams/ to translate them to streams.`));
127
+ }
128
+ if (streamMap == null) {
129
+ this.#errors.push(new YamlError(new Error(`'streams' are required.`)));
130
+ }
131
+ const compiler = new SyncStreamsCompiler(this.options);
132
+ for (const entry of streamMap?.items ?? []) {
133
+ const { key: keyScalar, value } = entry;
134
+ if (!(value instanceof YAMLMap)) {
135
+ // The json schema validator will flag this later.
136
+ continue;
137
+ }
138
+ const key = keyScalar.toString();
139
+ if (!this.#checkUniqueName(key, keyScalar)) {
140
+ continue;
141
+ }
142
+ const $with = value.get('with');
143
+ const streamCompiler = compiler.stream({
144
+ name: key,
145
+ isSubscribedByDefault: value.get('auto_subscribe', true)?.value == true,
146
+ priority: this.#parsePriority(value) ?? DEFAULT_BUCKET_PRIORITY
147
+ });
148
+ if ($with != null) {
149
+ for (const entry of $with.items ?? []) {
150
+ const { key: cteName, value: cteQuery } = entry;
151
+ const [sql, errorListener] = this.#scalarErrorListener(cteQuery);
152
+ const parsed = compiler.commonTableExpression(sql, errorListener);
153
+ if (parsed) {
154
+ streamCompiler.registerCommonTableExpression(cteName.value, parsed);
155
+ }
156
+ }
157
+ }
158
+ const addQuery = (query) => {
159
+ const [sql, errorListener] = this.#scalarErrorListener(query);
160
+ streamCompiler.addQuery(sql, errorListener);
161
+ };
162
+ const queries = value.get('queries');
163
+ const query = value.get('query', true);
164
+ if ((queries == null) == (query == null)) {
165
+ this.#errors.push(this.#yamlError(value, 'One of `queries` or `query` must be given.'));
166
+ }
167
+ if (query) {
168
+ addQuery(query);
169
+ }
170
+ if (queries) {
171
+ for (const queryEntry of queries.items) {
172
+ if (queryEntry instanceof Scalar) {
173
+ addQuery(queryEntry);
174
+ }
175
+ }
176
+ }
177
+ streamCompiler.finish();
178
+ }
179
+ return new PrecompiledSyncConfig(compiler.output.toSyncPlan(), {
180
+ defaultSchema: this.options.defaultSchema,
181
+ engine: javaScriptExpressionEngine(compatibility),
182
+ sourceText: this.yaml
183
+ });
184
+ }
185
+ #legacyParseBucketDefinitionsAndStreams(bucketMap, streamMap, compatibility) {
186
+ const rules = new SqlSyncRules(this.yaml);
187
+ rules.compatibility = compatibility;
188
+ if (bucketMap == null && streamMap == null) {
189
+ this.#errors.push(new YamlError(new Error(`'bucket_definitions' or 'streams' is required`)));
190
+ this.#throwOnErrorIfRequested();
191
+ }
192
+ for (let entry of bucketMap?.items ?? []) {
193
+ const { key: keyScalar, value } = entry;
194
+ const key = keyScalar.toString();
195
+ if (!this.#checkUniqueName(key, keyScalar)) {
196
+ continue;
197
+ }
198
+ if (value == null || !(value instanceof YAMLMap)) {
199
+ this.#errors.push(this.#tokenError(keyScalar, `'${key}' bucket definition must be an object`));
200
+ continue;
201
+ }
202
+ const accept_potentially_dangerous_queries = value.get('accept_potentially_dangerous_queries', true)?.value == true;
203
+ const parseOptionPriority = this.#parsePriority(value);
204
+ const queryOptions = {
205
+ ...this.options,
206
+ accept_potentially_dangerous_queries,
207
+ priority: parseOptionPriority,
208
+ compatibility
209
+ };
210
+ const parameters = value.get('parameters', true);
211
+ const dataQueries = value.get('data', true);
212
+ const descriptor = new SqlBucketDescriptor(key);
213
+ if (parameters instanceof Scalar) {
214
+ this.#withScalar(parameters, (q) => {
215
+ return descriptor.addParameterQuery(q, queryOptions);
216
+ });
217
+ }
218
+ else if (parameters instanceof YAMLSeq) {
219
+ for (let item of parameters.items) {
220
+ this.#withScalar(item, (q) => {
221
+ return descriptor.addParameterQuery(q, queryOptions);
222
+ });
223
+ }
224
+ }
225
+ else {
226
+ descriptor.addParameterQuery('SELECT', queryOptions);
227
+ }
228
+ if (!(dataQueries instanceof YAMLSeq)) {
229
+ this.#errors.push(this.#tokenError((dataQueries ?? value), `'data' must be an array`));
230
+ continue;
231
+ }
232
+ for (let query of dataQueries.items) {
233
+ this.#withScalar(query, (q) => {
234
+ return descriptor.addDataQuery(q, queryOptions, compatibility);
235
+ });
236
+ }
237
+ rules.bucketSources.push(descriptor);
238
+ rules.bucketDataSources.push(...descriptor.dataSources);
239
+ rules.bucketParameterLookupSources.push(...descriptor.parameterIndexLookupCreators);
240
+ }
241
+ for (const entry of streamMap?.items ?? []) {
242
+ const { key: keyScalar, value } = entry;
243
+ const key = keyScalar.toString();
244
+ if (!this.#checkUniqueName(key, keyScalar)) {
245
+ continue;
246
+ }
247
+ // We don't support with or multiple queries in streams, those are only supported by the new compiler.
248
+ const $with = value.get('with');
249
+ if ($with != null) {
250
+ this.#errors.push(this.#yamlError($with, 'Common table expressions are not supported without the `sync_config_compiler` option.'));
251
+ }
252
+ const queries = value.get('queries');
253
+ if (queries != null) {
254
+ this.#errors.push(this.#yamlError(queries, 'Multiple queries not supported without the `sync_config_compiler` option.'));
255
+ }
256
+ const accept_potentially_dangerous_queries = value.get('accept_potentially_dangerous_queries', true)?.value == true;
257
+ const queryOptions = {
258
+ ...this.options,
259
+ accept_potentially_dangerous_queries,
260
+ priority: this.#parsePriority(value),
261
+ auto_subscribe: value.get('auto_subscribe', true)?.value == true,
262
+ compatibility
263
+ };
264
+ const data = value.get('query', true);
265
+ if (data instanceof Scalar) {
266
+ this.#withScalar(data, (q) => {
267
+ const [parsed, errors] = syncStreamFromSql(key, q, queryOptions);
268
+ rules.bucketSources.push(parsed);
269
+ rules.bucketDataSources.push(...parsed.dataSources);
270
+ rules.bucketParameterLookupSources.push(...parsed.parameterIndexLookupCreators);
271
+ return {
272
+ parsed: true,
273
+ errors
274
+ };
275
+ });
276
+ }
277
+ else {
278
+ this.#errors.push(this.#tokenError(data, 'Must be a string.'));
279
+ continue;
280
+ }
281
+ }
282
+ return rules;
283
+ }
284
+ #parseEventDefinitions(parsed, compatibility) {
285
+ const eventMap = parsed.get('event_definitions');
286
+ const eventDescriptors = [];
287
+ for (const event of eventMap?.items ?? []) {
288
+ const { key, value } = event;
289
+ if (false == value instanceof YAMLMap) {
290
+ this.#errors.push(new YamlError(new Error(`Event definitions must be objects.`)));
291
+ continue;
292
+ }
293
+ const payloads = value.get('payloads');
294
+ if (false == payloads instanceof YAMLSeq) {
295
+ this.#errors.push(new YamlError(new Error(`Event definition payloads must be an array.`)));
296
+ continue;
297
+ }
298
+ const eventDescriptor = new SqlEventDescriptor(key.toString(), compatibility);
299
+ for (let item of payloads.items) {
300
+ if (!isScalar(item)) {
301
+ this.#errors.push(new YamlError(new Error(`Payload queries for events must be scalar.`)));
302
+ continue;
303
+ }
304
+ this.#withScalar(item, (q) => {
305
+ return eventDescriptor.addSourceQuery(q, this.options);
306
+ });
307
+ }
308
+ eventDescriptors.push(eventDescriptor);
309
+ }
310
+ return eventDescriptors;
311
+ }
312
+ #checkUniqueName(name, literal) {
313
+ if (this.#definitionNames.has(name)) {
314
+ this.#errors.push(this.#tokenError(literal, 'Duplicate stream or bucket definition.'));
315
+ return false;
316
+ }
317
+ this.#definitionNames.add(name);
318
+ return true;
319
+ }
320
+ #parsePriority(value) {
321
+ if (value.has('priority')) {
322
+ const priorityValue = value.get('priority', true);
323
+ if (typeof priorityValue.value != 'number' || !isValidPriority(priorityValue.value)) {
324
+ this.#errors.push(this.#tokenError(priorityValue, 'Invalid priority, expected a number between 0 and 3 (inclusive).'));
325
+ }
326
+ else {
327
+ return priorityValue.value;
328
+ }
329
+ }
330
+ }
331
+ #yamlError(node, message) {
332
+ if (node.range != null) {
333
+ const [start, _, end] = node.range;
334
+ return new YamlError(new Error(message), { start, end });
335
+ }
336
+ else {
337
+ return new YamlError(new Error(message));
338
+ }
339
+ }
340
+ #tokenError(token, message) {
341
+ const start = token?.srcToken?.offset ?? 0;
342
+ const end = start + 1;
343
+ return new YamlError(new Error(message), { start, end });
344
+ }
345
+ #withScalar(scalar, cb) {
346
+ const value = scalar.toString();
347
+ const wrapped = (value) => {
348
+ try {
349
+ return cb(value);
350
+ }
351
+ catch (e) {
352
+ return {
353
+ parsed: false,
354
+ errors: [e]
355
+ };
356
+ }
357
+ };
358
+ const result = wrapped(value);
359
+ for (let err of result.errors) {
360
+ this.#addErrorFromScalar(scalar, value, err);
361
+ }
362
+ return result;
363
+ }
364
+ /**
365
+ * Reads string contents from a YAML scalar and returns an error listener for the sync stream compiler.
366
+ */
367
+ #scalarErrorListener(scalar) {
368
+ const value = scalar.toString();
369
+ const listener = {
370
+ report: (message, location, options) => {
371
+ const error = new SqlRuleError(message, value, location);
372
+ if (options?.isWarning) {
373
+ error.type = 'warning';
374
+ }
375
+ this.#addErrorFromScalar(scalar, value, error);
376
+ }
377
+ };
378
+ return [value, listener];
379
+ }
380
+ /**
381
+ * Adds an error originally added while parsing a YAML scalar string.
382
+ *
383
+ * @param scalar The scalar being parsed.
384
+ * @param value String contents of the scalar.
385
+ * @param error An error in the scalar content. Offsets will be translated to point at the full YAML source.
386
+ */
387
+ #addErrorFromScalar(scalar, value, err) {
388
+ let sourceOffset = scalar.srcToken.offset;
389
+ if (scalar.type == Scalar.QUOTE_DOUBLE || scalar.type == Scalar.QUOTE_SINGLE) {
390
+ // TODO: Is there a better way to do this?
391
+ sourceOffset += 1;
392
+ }
393
+ let offset;
394
+ let end;
395
+ if (err instanceof SqlRuleError && err.location) {
396
+ offset = err.location.start + sourceOffset;
397
+ end = err.location.end + sourceOffset;
398
+ }
399
+ else if (typeof err.token?._location?.start == 'number') {
400
+ offset = sourceOffset + err.token?._location?.start;
401
+ end = sourceOffset + err.token?._location?.end;
402
+ }
403
+ else {
404
+ offset = sourceOffset;
405
+ end = sourceOffset + Math.max(value.length, 1);
406
+ }
407
+ const pos = { start: offset, end };
408
+ this.#errors.push(new YamlError(err, pos));
409
+ }
410
+ }
411
+ //# sourceMappingURL=from_yaml.js.map