@powersync/service-sync-rules 0.0.0-dev-20260203154303 → 0.0.0-dev-20260223080959

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 (105) hide show
  1. package/dist/ExpressionType.d.ts +4 -2
  2. package/dist/ExpressionType.js.map +1 -1
  3. package/dist/HydratedSyncRules.d.ts +3 -3
  4. package/dist/HydratedSyncRules.js.map +1 -1
  5. package/dist/SqlSyncRules.d.ts +11 -37
  6. package/dist/SqlSyncRules.js +11 -340
  7. package/dist/SqlSyncRules.js.map +1 -1
  8. package/dist/SyncConfig.d.ts +46 -0
  9. package/dist/SyncConfig.js +99 -0
  10. package/dist/SyncConfig.js.map +1 -0
  11. package/dist/TablePattern.d.ts +21 -6
  12. package/dist/TablePattern.js +57 -30
  13. package/dist/TablePattern.js.map +1 -1
  14. package/dist/compatibility.d.ts +7 -0
  15. package/dist/compatibility.js +34 -0
  16. package/dist/compatibility.js.map +1 -1
  17. package/dist/compiler/bucket_resolver.d.ts +3 -3
  18. package/dist/compiler/bucket_resolver.js.map +1 -1
  19. package/dist/compiler/compiler.d.ts +22 -3
  20. package/dist/compiler/compiler.js +22 -5
  21. package/dist/compiler/compiler.js.map +1 -1
  22. package/dist/compiler/filter.js +1 -1
  23. package/dist/compiler/filter.js.map +1 -1
  24. package/dist/compiler/ir_to_sync_plan.d.ts +6 -0
  25. package/dist/compiler/ir_to_sync_plan.js +57 -12
  26. package/dist/compiler/ir_to_sync_plan.js.map +1 -1
  27. package/dist/compiler/parser.js +53 -13
  28. package/dist/compiler/parser.js.map +1 -1
  29. package/dist/compiler/querier_graph.js +72 -24
  30. package/dist/compiler/querier_graph.js.map +1 -1
  31. package/dist/compiler/rows.d.ts +35 -5
  32. package/dist/compiler/rows.js +64 -2
  33. package/dist/compiler/rows.js.map +1 -1
  34. package/dist/compiler/scope.d.ts +4 -1
  35. package/dist/compiler/scope.js +13 -2
  36. package/dist/compiler/scope.js.map +1 -1
  37. package/dist/compiler/sqlite.d.ts +2 -11
  38. package/dist/compiler/sqlite.js +104 -79
  39. package/dist/compiler/sqlite.js.map +1 -1
  40. package/dist/compiler/table.d.ts +28 -10
  41. package/dist/compiler/table.js +28 -3
  42. package/dist/compiler/table.js.map +1 -1
  43. package/dist/from_yaml.d.ts +28 -0
  44. package/dist/from_yaml.js +411 -0
  45. package/dist/from_yaml.js.map +1 -0
  46. package/dist/index.d.ts +4 -3
  47. package/dist/index.js +4 -3
  48. package/dist/index.js.map +1 -1
  49. package/dist/json_schema.js +17 -1
  50. package/dist/json_schema.js.map +1 -1
  51. package/dist/schema-generators/DartSchemaGenerator.d.ts +3 -3
  52. package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
  53. package/dist/schema-generators/DotNetSchemaGenerator.d.ts +2 -2
  54. package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
  55. package/dist/schema-generators/JsLegacySchemaGenerator.d.ts +2 -2
  56. package/dist/schema-generators/JsLegacySchemaGenerator.js.map +1 -1
  57. package/dist/schema-generators/KotlinSchemaGenerator.d.ts +2 -2
  58. package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
  59. package/dist/schema-generators/RoomSchemaGenerator.d.ts +2 -2
  60. package/dist/schema-generators/RoomSchemaGenerator.js.map +1 -1
  61. package/dist/schema-generators/SchemaGenerator.d.ts +8 -3
  62. package/dist/schema-generators/SchemaGenerator.js +20 -13
  63. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  64. package/dist/schema-generators/SqlSchemaGenerator.d.ts +2 -2
  65. package/dist/schema-generators/SqlSchemaGenerator.js.map +1 -1
  66. package/dist/schema-generators/SwiftSchemaGenerator.d.ts +2 -2
  67. package/dist/schema-generators/SwiftSchemaGenerator.js.map +1 -1
  68. package/dist/schema-generators/TsSchemaGenerator.d.ts +2 -2
  69. package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
  70. package/dist/sql_functions.d.ts +2 -2
  71. package/dist/sync_plan/engine/scalar_expression_engine.d.ts +4 -2
  72. package/dist/sync_plan/engine/scalar_expression_engine.js +18 -0
  73. package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -1
  74. package/dist/sync_plan/evaluator/bucket_data_source.d.ts +1 -0
  75. package/dist/sync_plan/evaluator/bucket_data_source.js +29 -12
  76. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
  77. package/dist/sync_plan/evaluator/bucket_source.js +1 -1
  78. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -1
  79. package/dist/sync_plan/evaluator/index.d.ts +12 -2
  80. package/dist/sync_plan/evaluator/index.js +26 -20
  81. package/dist/sync_plan/evaluator/index.js.map +1 -1
  82. package/dist/sync_plan/evaluator/parameter_evaluator.js +22 -2
  83. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
  84. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +2 -1
  85. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +13 -10
  86. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -1
  87. package/dist/sync_plan/evaluator/table_processor_to_sql.d.ts +20 -0
  88. package/dist/sync_plan/evaluator/table_processor_to_sql.js +37 -0
  89. package/dist/sync_plan/evaluator/table_processor_to_sql.js.map +1 -0
  90. package/dist/sync_plan/expression_visitor.d.ts +1 -1
  91. package/dist/sync_plan/expression_visitor.js +11 -1
  92. package/dist/sync_plan/expression_visitor.js.map +1 -1
  93. package/dist/sync_plan/plan.d.ts +40 -8
  94. package/dist/sync_plan/schema_inference.d.ts +16 -0
  95. package/dist/sync_plan/schema_inference.js +123 -0
  96. package/dist/sync_plan/schema_inference.js.map +1 -0
  97. package/dist/sync_plan/serialize.d.ts +30 -7
  98. package/dist/sync_plan/serialize.js +148 -3
  99. package/dist/sync_plan/serialize.js.map +1 -1
  100. package/dist/types.d.ts +20 -5
  101. package/dist/types.js +27 -5
  102. package/dist/types.js.map +1 -1
  103. package/dist/utils.d.ts +1 -1
  104. package/package.json +1 -1
  105. package/schema/sync_rules.json +19 -3
@@ -0,0 +1,123 @@
1
+ import { CompatibilityContext } from '../compatibility.js';
2
+ import { ExpressionType } from '../ExpressionType.js';
3
+ import { generateSqlFunctions, getOperatorReturnType } from '../sql_functions.js';
4
+ import { visitExpr } from './expression_visitor.js';
5
+ /**
6
+ * Infers the output schema of sync streams by resolving references against a statically-known source schema.
7
+ */
8
+ export class SyncPlanSchemaAnalyzer {
9
+ defaultSchema;
10
+ schema;
11
+ constructor(defaultSchema, schema) {
12
+ this.defaultSchema = defaultSchema;
13
+ this.schema = schema;
14
+ }
15
+ /**
16
+ * Populates an output record of tables with the inferred result sets for a stream data source against a source
17
+ * schema.
18
+ */
19
+ resolveResultSets(source, tables) {
20
+ for (const table of this.schema.getTables(source.sourceTable.toTablePattern(this.defaultSchema))) {
21
+ const typeResolver = new ExpressionTypeInference(table);
22
+ const outputName = source.outputTableName ?? table.name;
23
+ const outputTable = (tables[outputName] ??= {});
24
+ function addOutputColumn(definition) {
25
+ if (definition.name == 'id') {
26
+ return; // Is implicit
27
+ }
28
+ const existing = outputTable[definition.name];
29
+ if (existing != null) {
30
+ outputTable[definition.name] = {
31
+ name: definition.name,
32
+ type: existing.type.or(definition.type),
33
+ originalType: definition.originalType == existing.originalType ? existing.originalType : undefined
34
+ };
35
+ }
36
+ else {
37
+ outputTable[definition.name] = definition;
38
+ }
39
+ }
40
+ for (const column of source.columns) {
41
+ if (column === 'star') {
42
+ for (const actualColumn of table.getColumns()) {
43
+ addOutputColumn(actualColumn);
44
+ }
45
+ }
46
+ else {
47
+ const type = visitExpr(typeResolver, column.expr, null);
48
+ addOutputColumn({ name: column.alias, ...type });
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Infers the type of expressions, resolving column references against a fixed schema table.
56
+ */
57
+ class ExpressionTypeInference {
58
+ sourceTable;
59
+ constructor(sourceTable) {
60
+ this.sourceTable = sourceTable;
61
+ }
62
+ visitExternalData(expr) {
63
+ const column = this.sourceTable.getColumn(expr.source.column);
64
+ if (column) {
65
+ return { type: column.type, originalType: column.originalType };
66
+ }
67
+ return { type: ExpressionType.NONE };
68
+ }
69
+ visitUnaryExpression(expr) {
70
+ switch (expr.operator) {
71
+ case 'not':
72
+ return ExpressionTypeInference.BOOLEAN;
73
+ case '+':
74
+ return visitExpr(this, expr.operand, null);
75
+ }
76
+ }
77
+ visitBinaryExpression(expr) {
78
+ return {
79
+ type: getOperatorReturnType(expr.operator.toUpperCase(), visitExpr(this, expr.left, null).type, visitExpr(this, expr.right, null).type)
80
+ };
81
+ }
82
+ visitBetweenExpression() {
83
+ return ExpressionTypeInference.BOOLEAN;
84
+ }
85
+ visitScalarInExpression() {
86
+ return ExpressionTypeInference.BOOLEAN;
87
+ }
88
+ visitCaseWhenExpression(expr) {
89
+ let type = ExpressionType.NONE;
90
+ // Create a union of all THEN expressions (and ELSE, if present).
91
+ for (const { then } of expr.whens) {
92
+ type = type.or(visitExpr(this, then, null).type);
93
+ }
94
+ if (expr.else) {
95
+ type = type.or(visitExpr(this, expr.else, null).type);
96
+ }
97
+ return { type };
98
+ }
99
+ visitCastExpression(expr) {
100
+ return { type: ExpressionType.fromTypeText(expr.cast_as) };
101
+ }
102
+ visitScalarFunctionCallExpression(expr) {
103
+ const resolved = ExpressionTypeInference.functions.named[expr.function.toLowerCase()];
104
+ const args = expr.parameters.map((p) => visitExpr(this, p, null).type);
105
+ return { type: resolved.getReturnType(args) };
106
+ }
107
+ visitLiteralExpression(expr) {
108
+ switch (expr.type) {
109
+ case 'lit_null':
110
+ return { type: ExpressionType.NONE };
111
+ case 'lit_double':
112
+ return { type: ExpressionType.REAL };
113
+ case 'lit_int':
114
+ return { type: ExpressionType.INTEGER };
115
+ case 'lit_string':
116
+ return { type: ExpressionType.TEXT };
117
+ }
118
+ }
119
+ // We don't care about compatibility as these functions are only used to infer types.
120
+ static functions = generateSqlFunctions(CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY);
121
+ static BOOLEAN = { type: ExpressionType.INTEGER, originalType: 'bool' };
122
+ }
123
+ //# sourceMappingURL=schema_inference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_inference.js","sourceRoot":"","sources":["../../src/sync_plan/schema_inference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAgC,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAWlF,OAAO,EAAqB,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGvE;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAEd;IACA;IAFnB,YACmB,aAAqB,EACrB,MAAoB;QADpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,WAAM,GAAN,MAAM,CAAc;IACpC,CAAC;IAEJ;;;OAGG;IACH,iBAAiB,CAAC,MAAwB,EAAE,MAAwD;QAClG,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACjG,MAAM,YAAY,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,CAAC;YACxD,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAEhD,SAAS,eAAe,CAAC,UAA4B;gBACnD,IAAI,UAAU,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;oBAC5B,OAAO,CAAC,cAAc;gBACxB,CAAC;gBAED,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;oBACrB,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;wBAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;wBACvC,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;qBACnG,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;wBAC9C,eAAe,CAAC,YAAY,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACxD,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,uBAAuB;IACE;IAA7B,YAA6B,WAA8B;QAA9B,gBAAW,GAAX,WAAW,CAAmB;IAAG,CAAC;IAE/D,iBAAiB,CAAC,IAA2C;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QAClE,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,IAA8C;QACjE,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,KAAK;gBACR,OAAO,uBAAuB,CAAC,OAAO,CAAC;YACzC,KAAK,GAAG;gBACN,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,qBAAqB,CAAC,IAA+C;QACnE,OAAO;YACL,IAAI,EAAE,qBAAqB,CACzB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAC3B,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EACrC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CACvC;SACF,CAAC;IACJ,CAAC;IAED,sBAAsB;QACpB,OAAO,uBAAuB,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,uBAAuB;QACrB,OAAO,uBAAuB,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,uBAAuB,CAAC,IAAiD;QACvE,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QAC/B,iEAAiE;QACjE,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAED,mBAAmB,CAAC,IAA6C;QAC/D,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,iCAAiC,CAAC,IAA2D;QAC3F,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAEvE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,sBAAsB,CAAC,IAAuB;QAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,UAAU;gBACb,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,YAAY;gBACf,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC;YAC1C,KAAK,YAAY;gBACf,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED,qFAAqF;IAC7E,MAAM,CAAU,SAAS,GAAG,oBAAoB,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;IACpG,MAAM,CAAU,OAAO,GAAe,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC"}
@@ -1,5 +1,6 @@
1
+ import { ParameterLookupScope } from '../HydrationState.js';
1
2
  import { SqlExpression } from './expression.js';
2
- import { ColumnSource, ColumnSqlParameterValue, PartitionKey, RequestSqlParameterValue, StreamOptions, SyncPlan } from './plan.js';
3
+ import { ColumnSource, ColumnSqlParameterValue, RequestSqlParameterValue, StreamOptions, SyncPlan, TableProcessorTableValuedFunction } from './plan.js';
3
4
  /**
4
5
  * Serializes a sync plan into a simple JSON object.
5
6
  *
@@ -8,6 +9,7 @@ import { ColumnSource, ColumnSqlParameterValue, PartitionKey, RequestSqlParamete
8
9
  * serializing instead of duplicating definitions.
9
10
  */
10
11
  export declare function serializeSyncPlan(plan: SyncPlan): SerializedSyncPlanUnstable;
12
+ export declare function deserializeSyncPlan(serialized: unknown): SyncPlan;
11
13
  interface SerializedSyncPlanUnstable {
12
14
  version: 'unstable';
13
15
  dataSources: SerializedDataSource[];
@@ -21,24 +23,34 @@ interface SerializedBucketDataSource {
21
23
  sources: number[];
22
24
  }
23
25
  interface SerializedTablePattern {
24
- connection: string;
25
- schema: string;
26
+ connection: string | null;
27
+ schema: string | null;
26
28
  table: string;
27
29
  }
30
+ interface SerializedTableProcessorTableValuedFunctionOutput {
31
+ function: number;
32
+ outputName: string;
33
+ }
34
+ interface SerializedPartitionKey {
35
+ expr: SqlExpression<ColumnSqlParameterValue | SerializedTableProcessorTableValuedFunctionOutput>;
36
+ }
28
37
  interface SerializedDataSource {
29
38
  table: SerializedTablePattern;
30
39
  outputTableName?: string;
31
40
  hash: number;
32
41
  columns: ColumnSource[];
33
42
  filters: SqlExpression<ColumnSqlParameterValue>[];
34
- partitionBy: PartitionKey[];
43
+ tableValuedFunctions: TableProcessorTableValuedFunction[];
44
+ partitionBy: SerializedPartitionKey[];
35
45
  }
36
46
  interface SerializedParameterIndexLookupCreator {
37
47
  table: SerializedTablePattern;
38
48
  hash: number;
39
- output: SqlExpression<ColumnSqlParameterValue>[];
49
+ lookupScope: ParameterLookupScope;
50
+ output: SqlExpression<ColumnSqlParameterValue | SerializedTableProcessorTableValuedFunctionOutput>[];
40
51
  filters: SqlExpression<ColumnSqlParameterValue>[];
41
- partitionBy: PartitionKey[];
52
+ tableValuedFunctions: TableProcessorTableValuedFunction[];
53
+ partitionBy: SerializedPartitionKey[];
42
54
  }
43
55
  interface SerializedStream {
44
56
  stream: StreamOptions;
@@ -46,10 +58,21 @@ interface SerializedStream {
46
58
  }
47
59
  interface SerializedStreamQuerier {
48
60
  requestFilters: SqlExpression<RequestSqlParameterValue>[];
49
- lookupStages: any[][];
61
+ lookupStages: SerializedExpandingLookup[][];
50
62
  bucket: number;
51
63
  sourceInstantiation: SerializedParameterValue[];
52
64
  }
65
+ type SerializedExpandingLookup = {
66
+ type: 'parameter';
67
+ lookup: number;
68
+ instantiation: SerializedParameterValue[];
69
+ } | {
70
+ type: 'table_valued';
71
+ functionName: string;
72
+ functionInputs: SqlExpression<RequestSqlParameterValue>[];
73
+ outputs: SqlExpression<ColumnSqlParameterValue>[];
74
+ filters: SqlExpression<ColumnSqlParameterValue>[];
75
+ };
53
76
  interface LookupReference {
54
77
  stageId: number;
55
78
  idInStage: number;
@@ -1,3 +1,5 @@
1
+ import { ImplicitSchemaTablePattern, TablePattern } from '../TablePattern.js';
2
+ import { MapSourceVisitor, visitExpr } from './expression_visitor.js';
1
3
  /**
2
4
  * Serializes a sync plan into a simple JSON object.
3
5
  *
@@ -10,6 +12,15 @@ export function serializeSyncPlan(plan) {
10
12
  const bucketIndex = new Map();
11
13
  const parameterIndex = new Map();
12
14
  const expandingLookups = new Map();
15
+ const addedTableValuedFunctions = new Map();
16
+ const replaceFunctionReferenceWithIndex = new MapSourceVisitor((value) => {
17
+ if ('function' in value) {
18
+ return { function: addedTableValuedFunctions.get(value.function), outputName: value.outputName };
19
+ }
20
+ else {
21
+ return value;
22
+ }
23
+ });
13
24
  function serializeTablePattern(pattern) {
14
25
  return {
15
26
  connection: pattern.connectionTag,
@@ -17,6 +28,17 @@ export function serializeSyncPlan(plan) {
17
28
  table: pattern.tablePattern
18
29
  };
19
30
  }
31
+ function serializeTableValued(source) {
32
+ return source.tableValuedFunctions.map((fn, i) => {
33
+ addedTableValuedFunctions.set(fn, i);
34
+ return fn;
35
+ });
36
+ }
37
+ function translateParameters(source) {
38
+ return source.parameters.map((key) => {
39
+ return { expr: visitExpr(replaceFunctionReferenceWithIndex, key.expr, null) };
40
+ });
41
+ }
20
42
  function serializeDataSources() {
21
43
  return plan.dataSources.map((source, i) => {
22
44
  dataSourceIndex.set(source, i);
@@ -25,7 +47,8 @@ export function serializeSyncPlan(plan) {
25
47
  table: serializeTablePattern(source.sourceTable),
26
48
  outputTableName: source.outputTableName,
27
49
  filters: source.filters,
28
- partitionBy: source.parameters,
50
+ tableValuedFunctions: serializeTableValued(source),
51
+ partitionBy: translateParameters(source),
29
52
  columns: source.columns
30
53
  };
31
54
  });
@@ -37,8 +60,10 @@ export function serializeSyncPlan(plan) {
37
60
  hash: source.hashCode,
38
61
  table: serializeTablePattern(source.sourceTable),
39
62
  filters: source.filters,
40
- partitionBy: source.parameters,
41
- output: source.outputs
63
+ tableValuedFunctions: serializeTableValued(source),
64
+ partitionBy: translateParameters(source),
65
+ output: source.outputs.map((out) => visitExpr(replaceFunctionReferenceWithIndex, out, null)),
66
+ lookupScope: source.defaultLookupScope
42
67
  };
43
68
  });
44
69
  }
@@ -107,4 +132,124 @@ export function serializeSyncPlan(plan) {
107
132
  }))
108
133
  };
109
134
  }
135
+ export function deserializeSyncPlan(serialized) {
136
+ // TODO: Mature to version 1
137
+ if (serialized.version != 'unstable') {
138
+ throw new Error('Unknown sync plan version passed to deserializeSyncPlan()');
139
+ }
140
+ function deserializeTablePattern(pattern) {
141
+ if (pattern.schema) {
142
+ return new TablePattern(`${pattern.connection}.${pattern.schema}`, pattern.table);
143
+ }
144
+ else {
145
+ return new ImplicitSchemaTablePattern(null, pattern.table);
146
+ }
147
+ }
148
+ let tableValuedFunctionsInScope = [];
149
+ const replaceFunctionIndexWithReference = new MapSourceVisitor((value) => {
150
+ if ('function' in value) {
151
+ return { function: tableValuedFunctionsInScope[value.function], outputName: value.outputName };
152
+ }
153
+ else {
154
+ return value;
155
+ }
156
+ });
157
+ function deserializeParameters(source) {
158
+ return source.map((serializedKey) => {
159
+ return { expr: visitExpr(replaceFunctionIndexWithReference, serializedKey.expr, null) };
160
+ });
161
+ }
162
+ const plan = serialized;
163
+ const dataSources = plan.dataSources.map((source) => {
164
+ const functions = (tableValuedFunctionsInScope = source.tableValuedFunctions);
165
+ return {
166
+ hashCode: source.hash,
167
+ sourceTable: deserializeTablePattern(source.table),
168
+ tableValuedFunctions: functions,
169
+ outputTableName: source.outputTableName,
170
+ filters: source.filters,
171
+ parameters: deserializeParameters(source.partitionBy),
172
+ columns: source.columns
173
+ };
174
+ });
175
+ const buckets = plan.buckets.map((bkt) => {
176
+ return {
177
+ hashCode: bkt.hash,
178
+ uniqueName: bkt.uniqueName,
179
+ sources: bkt.sources.map((idx) => dataSources[idx])
180
+ };
181
+ });
182
+ const parameterIndexes = plan.parameterIndexes.map((source) => {
183
+ const functions = (tableValuedFunctionsInScope = source.tableValuedFunctions);
184
+ return {
185
+ hashCode: source.hash,
186
+ sourceTable: deserializeTablePattern(source.table),
187
+ tableValuedFunctions: functions,
188
+ filters: source.filters,
189
+ parameters: deserializeParameters(source.partitionBy),
190
+ outputs: source.output.map((out) => visitExpr(replaceFunctionIndexWithReference, out, null)),
191
+ defaultLookupScope: source.lookupScope
192
+ };
193
+ });
194
+ function deserializeParameterValue(stages, value) {
195
+ switch (value.type) {
196
+ case 'request':
197
+ return value;
198
+ case 'lookup':
199
+ return {
200
+ type: 'lookup',
201
+ lookup: stages[value.lookup.stageId][value.lookup.idInStage],
202
+ resultIndex: value.resultIndex
203
+ };
204
+ case 'intersection':
205
+ return { type: 'intersection', values: value.values.map((v) => deserializeParameterValue(stages, v)) };
206
+ }
207
+ }
208
+ function deserializeExpandingLookup(stages, source) {
209
+ switch (source.type) {
210
+ case 'parameter':
211
+ return {
212
+ type: 'parameter',
213
+ lookup: parameterIndexes[source.lookup],
214
+ instantiation: source.instantiation.map((v) => deserializeParameterValue(stages, v))
215
+ };
216
+ case 'table_valued':
217
+ return {
218
+ type: 'table_valued',
219
+ functionName: source.functionName,
220
+ functionInputs: source.functionInputs,
221
+ outputs: source.outputs,
222
+ filters: source.filters
223
+ };
224
+ }
225
+ }
226
+ function deserializeStreamQuerier(source) {
227
+ const lookupStages = [];
228
+ for (const serializedStage of source.lookupStages) {
229
+ const stage = [];
230
+ for (const serializedElement of serializedStage) {
231
+ stage.push(deserializeExpandingLookup(lookupStages, serializedElement));
232
+ }
233
+ lookupStages.push(stage);
234
+ }
235
+ return {
236
+ requestFilters: source.requestFilters,
237
+ lookupStages,
238
+ bucket: buckets[source.bucket],
239
+ sourceInstantiation: source.sourceInstantiation.map((v) => deserializeParameterValue(lookupStages, v))
240
+ };
241
+ }
242
+ const streams = plan.streams.map((source) => {
243
+ return {
244
+ stream: source.stream,
245
+ queriers: source.queriers.map(deserializeStreamQuerier)
246
+ };
247
+ });
248
+ return {
249
+ dataSources,
250
+ buckets,
251
+ parameterIndexes,
252
+ streams
253
+ };
254
+ }
110
255
  //# sourceMappingURL=serialize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/sync_plan/serialize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/sync_plan/serialize.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -83,11 +83,26 @@ export declare function isEvaluatedParameters(e: EvaluatedParametersResult): e i
83
83
  export type EvaluationResult = EvaluatedRow | EvaluationError;
84
84
  export type UnscopedEvaluationResult = UnscopedEvaluatedRow | EvaluationError;
85
85
  export interface RequestJwtPayload {
86
+ userIdJson: SqliteJsonValue;
87
+ parsedPayload: Record<string, any>;
88
+ /** Legacy token_parameters */
89
+ parameters?: Record<string, any> | undefined;
90
+ }
91
+ export declare class BaseJwtPayload implements RequestJwtPayload {
86
92
  /**
87
- * user_id
93
+ * Raw payload from JSON.parse.
94
+ *
95
+ * May contain arbitrary nested values.
96
+ */
97
+ readonly parsedPayload: Record<string, any>;
98
+ /**
99
+ * sub, converted to a SQLite-compatible value (number | string | bigint | null).
100
+ *
101
+ * This is the value used for sync rules and in logs.
88
102
  */
89
- sub: string;
90
- [key: string]: any;
103
+ readonly userIdJson: SqliteJsonValue;
104
+ constructor(parsedPayload: Record<string, any>);
105
+ get parameters(): Record<string, any> | undefined;
91
106
  }
92
107
  export interface ParameterValueSet {
93
108
  lookup(table: string, column: string): SqliteValue;
@@ -107,7 +122,7 @@ export interface ParameterValueSet {
107
122
  rawTokenPayload: string;
108
123
  parsedTokenPayload: SqliteJsonRow;
109
124
  legacyTokenParameters: SqliteJsonRow;
110
- userId: string;
125
+ userId: SqliteJsonValue;
111
126
  }
112
127
  export declare class RequestParameters implements ParameterValueSet {
113
128
  parsedTokenPayload: SqliteJsonRow;
@@ -123,7 +138,7 @@ export declare class RequestParameters implements ParameterValueSet {
123
138
  * JSON string of raw request parameters.
124
139
  */
125
140
  rawTokenPayload: string;
126
- userId: string;
141
+ userId: SqliteJsonValue;
127
142
  constructor(tokenPayload: RequestJwtPayload, clientParameters: Record<string, any>);
128
143
  constructor(params: RequestParameters);
129
144
  lookup(table: string, column: string): SqliteJsonValue;
package/dist/types.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { JSONBig } from '@powersync/service-jsonbig';
2
2
  import { CompatibilityContext } from './compatibility.js';
3
- import { toSyncRulesParameters } from './utils.js';
3
+ import { jsonValueToSqlite, toSyncRulesParameters } from './utils.js';
4
4
  export function isEvaluationError(e) {
5
5
  return typeof e.error == 'string';
6
6
  }
@@ -13,6 +13,28 @@ export function isSourceEvaluatedRow(e) {
13
13
  export function isEvaluatedParameters(e) {
14
14
  return 'lookup' in e;
15
15
  }
16
+ export class BaseJwtPayload {
17
+ /**
18
+ * Raw payload from JSON.parse.
19
+ *
20
+ * May contain arbitrary nested values.
21
+ */
22
+ parsedPayload;
23
+ /**
24
+ * sub, converted to a SQLite-compatible value (number | string | bigint | null).
25
+ *
26
+ * This is the value used for sync rules and in logs.
27
+ */
28
+ userIdJson;
29
+ constructor(parsedPayload) {
30
+ this.parsedPayload = parsedPayload;
31
+ this.userIdJson = jsonValueToSqlite(true, parsedPayload.sub);
32
+ }
33
+ get parameters() {
34
+ // Verified to be either undefined or an object when parsing the token.
35
+ return this.parsedPayload.parameters;
36
+ }
37
+ }
16
38
  export class RequestParameters {
17
39
  parsedTokenPayload;
18
40
  legacyTokenParameters;
@@ -45,14 +67,14 @@ export class RequestParameters {
45
67
  const tokenParameters = {
46
68
  ...legacyParameters,
47
69
  // sub takes presedence over any embedded parameters
48
- user_id: tokenPayload.sub
70
+ user_id: tokenPayload.userIdJson
49
71
  };
50
72
  // Client and token parameters don't contain DateTime values or other custom types, so we don't need to consider
51
73
  // compatibility.
52
- this.parsedTokenPayload = tokenPayload;
74
+ this.parsedTokenPayload = tokenPayload.parsedPayload;
53
75
  this.legacyTokenParameters = toSyncRulesParameters(tokenParameters, CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY);
54
- this.userId = tokenPayload.sub;
55
- this.rawTokenPayload = JSONBig.stringify(tokenPayload);
76
+ this.userId = tokenPayload.userIdJson;
77
+ this.rawTokenPayload = JSONBig.stringify(tokenPayload.parsedPayload);
56
78
  this.rawUserParameters = JSONBig.stringify(clientParameters);
57
79
  this.userParameters = toSyncRulesParameters(clientParameters, CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY);
58
80
  this.streamParameters = null;
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
@@ -19,7 +19,7 @@ export declare function filterJsonRow(data: SqliteRow): SqliteJsonRow;
19
19
  *
20
20
  * Types specifically not supported in output are `boolean` and `undefined`.
21
21
  */
22
- export declare function jsonValueToSqlite(fixedJsonBehavior: boolean, value: null | undefined | string | number | bigint | boolean | any): SqliteValue;
22
+ export declare function jsonValueToSqlite(fixedJsonBehavior: boolean, value: null | undefined | string | number | bigint | boolean | any): SqliteJsonValue;
23
23
  export declare function isJsonValue(value: SqliteValue): value is SqliteJsonValue;
24
24
  export declare function isValidParameterValue(value: SqliteValue): value is SqliteParameterValue;
25
25
  /**
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-20260203154303",
4
+ "version": "0.0.0-dev-20260223080959",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "FSL-1.1-ALv2",
@@ -74,9 +74,6 @@
74
74
  "patternProperties": {
75
75
  ".*": {
76
76
  "type": "object",
77
- "required": [
78
- "query"
79
- ],
80
77
  "examples": [
81
78
  {
82
79
  "query": [
@@ -100,6 +97,22 @@
100
97
  "query": {
101
98
  "description": "The SQL query defining content to sync in this stream.",
102
99
  "type": "string"
100
+ },
101
+ "queries": {
102
+ "description": "SQL queries defining content to sync in this stream.",
103
+ "type": "array",
104
+ "items": {
105
+ "type": "string"
106
+ }
107
+ },
108
+ "with": {
109
+ "type": "object",
110
+ "description": "Common table expressions defining subqueries available in queries.",
111
+ "patternProperties": {
112
+ ".*": {
113
+ "type": "string"
114
+ }
115
+ }
103
116
  }
104
117
  }
105
118
  }
@@ -165,6 +178,9 @@
165
178
  "nanoseconds"
166
179
  ]
167
180
  },
181
+ "sync_config_compiler": {
182
+ "type": "boolean"
183
+ },
168
184
  "timestamps_iso8601": {
169
185
  "type": "boolean",
170
186
  "description": "Enabled by default starting from edition 2: Consistently renders timestamps with an ISO 8601-compatible format (previous versions used a space instead of a T to separate date and time)."