@powersync/service-sync-rules 0.31.1 → 0.33.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 (134) hide show
  1. package/dist/BaseSqlDataQuery.js +2 -1
  2. package/dist/BaseSqlDataQuery.js.map +1 -1
  3. package/dist/BucketDescription.d.ts +20 -1
  4. package/dist/BucketDescription.js +12 -0
  5. package/dist/BucketDescription.js.map +1 -1
  6. package/dist/BucketParameterQuerier.d.ts +5 -0
  7. package/dist/BucketParameterQuerier.js +15 -3
  8. package/dist/BucketParameterQuerier.js.map +1 -1
  9. package/dist/BucketSource.d.ts +1 -1
  10. package/dist/BucketSource.js +5 -4
  11. package/dist/BucketSource.js.map +1 -1
  12. package/dist/HydrationState.d.ts +4 -0
  13. package/dist/HydrationState.js +4 -2
  14. package/dist/HydrationState.js.map +1 -1
  15. package/dist/SqlParameterQuery.js +8 -12
  16. package/dist/SqlParameterQuery.js.map +1 -1
  17. package/dist/SqlSyncRules.d.ts +0 -7
  18. package/dist/SqlSyncRules.js +0 -1
  19. package/dist/SqlSyncRules.js.map +1 -1
  20. package/dist/StaticSqlParameterQuery.js +5 -12
  21. package/dist/StaticSqlParameterQuery.js.map +1 -1
  22. package/dist/SyncConfig.d.ts +5 -2
  23. package/dist/SyncConfig.js +6 -9
  24. package/dist/SyncConfig.js.map +1 -1
  25. package/dist/TableValuedFunctionSqlParameterQuery.js +3 -10
  26. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  27. package/dist/cast.d.ts +9 -0
  28. package/dist/cast.js +131 -0
  29. package/dist/cast.js.map +1 -0
  30. package/dist/compatibility.d.ts +2 -1
  31. package/dist/compatibility.js +1 -0
  32. package/dist/compatibility.js.map +1 -1
  33. package/dist/compiler/compiler.d.ts +4 -1
  34. package/dist/compiler/compiler.js +15 -2
  35. package/dist/compiler/compiler.js.map +1 -1
  36. package/dist/compiler/detect_dangerous_parameters.d.ts +10 -0
  37. package/dist/compiler/detect_dangerous_parameters.js +84 -0
  38. package/dist/compiler/detect_dangerous_parameters.js.map +1 -0
  39. package/dist/compiler/expression.d.ts +15 -3
  40. package/dist/compiler/expression.js +3 -2
  41. package/dist/compiler/expression.js.map +1 -1
  42. package/dist/compiler/filter.js +4 -2
  43. package/dist/compiler/filter.js.map +1 -1
  44. package/dist/compiler/filter_simplifier.js +5 -2
  45. package/dist/compiler/filter_simplifier.js.map +1 -1
  46. package/dist/compiler/ir_to_sync_plan.d.ts +4 -2
  47. package/dist/compiler/ir_to_sync_plan.js +16 -9
  48. package/dist/compiler/ir_to_sync_plan.js.map +1 -1
  49. package/dist/compiler/parser.js +3 -2
  50. package/dist/compiler/parser.js.map +1 -1
  51. package/dist/compiler/querier_graph.d.ts +2 -1
  52. package/dist/compiler/querier_graph.js +27 -10
  53. package/dist/compiler/querier_graph.js.map +1 -1
  54. package/dist/compiler/rows.d.ts +1 -2
  55. package/dist/compiler/rows.js +2 -7
  56. package/dist/compiler/rows.js.map +1 -1
  57. package/dist/compiler/sqlite.d.ts +2 -0
  58. package/dist/compiler/sqlite.js +61 -40
  59. package/dist/compiler/sqlite.js.map +1 -1
  60. package/dist/compiler/table.d.ts +15 -0
  61. package/dist/compiler/table.js +53 -9
  62. package/dist/compiler/table.js.map +1 -1
  63. package/dist/from_yaml.d.ts +0 -4
  64. package/dist/from_yaml.js +18 -10
  65. package/dist/from_yaml.js.map +1 -1
  66. package/dist/index.d.ts +2 -1
  67. package/dist/index.js +2 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/json_schema.js +1 -4
  70. package/dist/json_schema.js.map +1 -1
  71. package/dist/schema-generators/DartSchemaGenerator.d.ts +1 -9
  72. package/dist/schema-generators/DartSchemaGenerator.js +35 -56
  73. package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
  74. package/dist/schema-generators/DotNetSchemaGenerator.d.ts +2 -0
  75. package/dist/schema-generators/DotNetSchemaGenerator.js +73 -30
  76. package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
  77. package/dist/schema-generators/KotlinSchemaGenerator.d.ts +3 -0
  78. package/dist/schema-generators/KotlinSchemaGenerator.js +68 -5
  79. package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
  80. package/dist/schema-generators/RoomSchemaGenerator.js +3 -19
  81. package/dist/schema-generators/RoomSchemaGenerator.js.map +1 -1
  82. package/dist/schema-generators/SchemaGenerator.d.ts +7 -1
  83. package/dist/schema-generators/SchemaGenerator.js +35 -0
  84. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  85. package/dist/schema-generators/SwiftSchemaGenerator.d.ts +3 -0
  86. package/dist/schema-generators/SwiftSchemaGenerator.js +66 -2
  87. package/dist/schema-generators/SwiftSchemaGenerator.js.map +1 -1
  88. package/dist/schema-generators/TsSchemaGenerator.d.ts +2 -0
  89. package/dist/schema-generators/TsSchemaGenerator.js +45 -8
  90. package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
  91. package/dist/schema-generators/generators.d.ts +1 -2
  92. package/dist/schema-generators/generators.js +1 -2
  93. package/dist/schema-generators/generators.js.map +1 -1
  94. package/dist/sql_functions.d.ts +1 -5
  95. package/dist/sql_functions.js +1 -114
  96. package/dist/sql_functions.js.map +1 -1
  97. package/dist/streams/filter.d.ts +2 -4
  98. package/dist/streams/filter.js +2 -1
  99. package/dist/streams/filter.js.map +1 -1
  100. package/dist/streams/variant.js +4 -7
  101. package/dist/streams/variant.js.map +1 -1
  102. package/dist/sync_plan/engine/javascript.js +14 -3
  103. package/dist/sync_plan/engine/javascript.js.map +1 -1
  104. package/dist/sync_plan/engine/sqlite.js +2 -1
  105. package/dist/sync_plan/engine/sqlite.js.map +1 -1
  106. package/dist/sync_plan/evaluator/bucket_data_source.js +2 -1
  107. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
  108. package/dist/sync_plan/evaluator/bucket_source.d.ts +1 -1
  109. package/dist/sync_plan/evaluator/bucket_source.js +31 -36
  110. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -1
  111. package/dist/sync_plan/evaluator/index.d.ts +9 -1
  112. package/dist/sync_plan/evaluator/index.js +10 -1
  113. package/dist/sync_plan/evaluator/index.js.map +1 -1
  114. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +6 -12
  115. package/dist/sync_plan/evaluator/parameter_evaluator.js +51 -54
  116. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
  117. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +4 -1
  118. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -1
  119. package/dist/sync_plan/evaluator/table_processor_to_sql.js +0 -9
  120. package/dist/sync_plan/evaluator/table_processor_to_sql.js.map +1 -1
  121. package/dist/sync_plan/plan.d.ts +17 -7
  122. package/dist/sync_plan/schema_inference.d.ts +6 -2
  123. package/dist/sync_plan/schema_inference.js +104 -3
  124. package/dist/sync_plan/schema_inference.js.map +1 -1
  125. package/dist/sync_plan/serialize.d.ts +15 -10
  126. package/dist/sync_plan/serialize.js +30 -11
  127. package/dist/sync_plan/serialize.js.map +1 -1
  128. package/dist/types.d.ts +3 -0
  129. package/dist/types.js.map +1 -1
  130. package/dist/utils.d.ts +26 -4
  131. package/dist/utils.js +53 -17
  132. package/dist/utils.js.map +1 -1
  133. package/package.json +2 -1
  134. package/schema/sync_rules.json +1 -4
@@ -1,5 +1,5 @@
1
1
  import { TYPE_INTEGER, TYPE_REAL, TYPE_TEXT } from '../ExpressionType.js';
2
- import { SchemaGenerator } from './SchemaGenerator.js';
2
+ import { SchemaGenerator, toCamelCase } from './SchemaGenerator.js';
3
3
  export class DotNetSchemaGenerator extends SchemaGenerator {
4
4
  key = 'dotnet';
5
5
  label = '.Net';
@@ -7,61 +7,104 @@ export class DotNetSchemaGenerator extends SchemaGenerator {
7
7
  fileName = 'Schema.cs';
8
8
  generate(source, schema, options) {
9
9
  const tables = super.getAllTables(source, schema);
10
- return `using PowerSync.Common.DB.Schema;
10
+ let generated = `using PowerSync.Common.DB.Schema;
11
11
 
12
12
  class AppSchema
13
13
  {
14
- ${tables.map((table) => this.generateTable(table.name, table.columns, options)).join('\n\n ')}
14
+ ${tables.map((table) => this.generateTable(table.name, table.columns, options)).join('\n\n')}
15
15
 
16
- public static Schema PowerSyncSchema = new Schema(new Dictionary<string, Table>
17
- {
18
- ${tables.map((table) => `{"${table.name}", ${this.toUpperCaseFirstLetter(table.name)}}`).join(',\n ')}
19
- });
16
+ public static Schema PowerSyncSchema = new Schema(${tables.map((table) => this.toUpperCaseFirstLetter(table.name)).join(', ')});
20
17
  }`;
18
+ const streamHelper = this.generateStreamHelper(source, schema);
19
+ generated += `\n${streamHelper}\n`;
20
+ return generated;
21
21
  }
22
22
  toUpperCaseFirstLetter(str) {
23
23
  return str.charAt(0).toUpperCase() + str.slice(1);
24
24
  }
25
25
  generateTable(name, columns, options) {
26
- const generated = columns.map((c, i) => {
27
- const last = i === columns.length - 1;
26
+ const includeComments = options?.includeTypeComments;
27
+ const generated = columns.map((c) => {
28
28
  const base = this.generateColumn(c);
29
- let withFormatting;
30
- if (last) {
31
- withFormatting = ` ${base}`;
32
- }
33
- else {
34
- withFormatting = ` ${base},`;
35
- }
36
- if (options?.includeTypeComments && c.originalType != null) {
37
- return `${withFormatting} // ${c.originalType}`;
38
- }
39
- else {
40
- return withFormatting;
29
+ let line = ` ${base},`;
30
+ if (includeComments && c.originalType != null) {
31
+ line += ` // ${c.originalType}`;
41
32
  }
33
+ return line;
42
34
  });
43
- return `public static Table ${this.toUpperCaseFirstLetter(name)} = new Table(new Dictionary<string, ColumnType>
44
- {
45
- ${generated.join('\n ')}
46
- });`;
35
+ return ` public static Table ${this.toUpperCaseFirstLetter(name)} = new Table
36
+ {
37
+ Name = "${name}",
38
+ Columns =
39
+ {
40
+ ${generated.join('\n')}
41
+ },
42
+ };`;
47
43
  }
48
44
  generateColumn(column) {
49
- return `{ "${column.name}", ${cSharpColumnType(column)} }`;
45
+ return `["${column.name}"] = ${cSharpColumnType(column)}`;
46
+ }
47
+ generateStreamHelper(source, schema) {
48
+ const optionalSyncStreams = this.getOptionalStreams(source, schema);
49
+ if (optionalSyncStreams.length) {
50
+ let generatedCode = `
51
+ public readonly ref struct TypedSyncStreams(PowerSyncDatabase db)
52
+ {
53
+ private PowerSyncDatabase db { get; } = db;
54
+ `;
55
+ for (const stream of optionalSyncStreams) {
56
+ const entries = Object.entries(stream.parameters);
57
+ let methodParameters = entries
58
+ .map(([parameter, type]) => `${this.cSharpType(type)} ${toCamelCase(parameter)}`)
59
+ .join(', ');
60
+ let parameterDictionary;
61
+ if (entries.length) {
62
+ parameterDictionary =
63
+ entries.map(([parameter]) => `\n { "${parameter}", ${toCamelCase(parameter)} }`).join(',') +
64
+ '\n ';
65
+ }
66
+ else {
67
+ parameterDictionary = '';
68
+ }
69
+ generatedCode += ` public ISyncStream ${toCamelCase(stream.name, true)}(${methodParameters})
70
+ {
71
+ var parameters = new Dictionary<string, object>() {${parameterDictionary}};
72
+ return db.SyncStream("${stream.name}", parameters);
73
+ }
74
+ `;
75
+ }
76
+ generatedCode += `}`;
77
+ return generatedCode;
78
+ }
79
+ }
80
+ cSharpType({ type }) {
81
+ if (type.typeFlags & TYPE_TEXT) {
82
+ return 'string';
83
+ }
84
+ else if (type.typeFlags & TYPE_REAL) {
85
+ return 'double';
86
+ }
87
+ else if (type.typeFlags & TYPE_INTEGER) {
88
+ return 'int';
89
+ }
90
+ else {
91
+ return 'string';
92
+ }
50
93
  }
51
94
  }
52
95
  const cSharpColumnType = (def) => {
53
96
  const t = def.type;
54
97
  if (t.typeFlags & TYPE_TEXT) {
55
- return 'ColumnType.TEXT';
98
+ return 'ColumnType.Text';
56
99
  }
57
100
  else if (t.typeFlags & TYPE_REAL) {
58
- return 'ColumnType.REAL';
101
+ return 'ColumnType.Real';
59
102
  }
60
103
  else if (t.typeFlags & TYPE_INTEGER) {
61
- return 'ColumnType.INTEGER';
104
+ return 'ColumnType.Integer';
62
105
  }
63
106
  else {
64
- return 'ColumnType.TEXT';
107
+ return 'ColumnType.Text';
65
108
  }
66
109
  };
67
110
  //# sourceMappingURL=DotNetSchemaGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DotNetSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/DotNetSchemaGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5F,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAC/C,GAAG,GAAG,QAAQ,CAAC;IACf,KAAK,GAAG,MAAM,CAAC;IACf,SAAS,GAAG,eAAe,CAAC;IAC5B,QAAQ,GAAG,WAAW,CAAC;IAEhC,QAAQ,CAAC,MAAkB,EAAE,MAAoB,EAAE,OAA+B;QAChF,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO;;;;IAIP,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;MAI1F,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;;EAE1G,CAAC;IACD,CAAC;IAEO,sBAAsB,CAAC,GAAW;QACxC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,OAA2B,EAAE,OAA+B;QAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,cAAsB,CAAC;YAC3B,IAAI,IAAI,EAAE,CAAC;gBACT,cAAc,GAAG,OAAO,IAAI,EAAE,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,OAAO,IAAI,GAAG,CAAC;YAClC,CAAC;YAED,IAAI,OAAO,EAAE,mBAAmB,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;gBAC3D,OAAO,GAAG,cAAc,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,uBAAuB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;;IAE/D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;MACpB,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,MAAwB;QAC7C,OAAO,MAAM,MAAM,CAAC,IAAI,MAAM,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,CAAC,GAAqB,EAAU,EAAE;IACzD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACnB,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QAC5B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACtC,OAAO,oBAAoB,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"DotNetSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/DotNetSchemaGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAExG,OAAO,EAAyB,eAAe,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE3F,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAC/C,GAAG,GAAG,QAAQ,CAAC;IACf,KAAK,GAAG,MAAM,CAAC;IACf,SAAS,GAAG,eAAe,CAAC;IAC5B,QAAQ,GAAG,WAAW,CAAC;IAEhC,QAAQ,CAAC,MAAkB,EAAE,MAAoB,EAAE,OAA+B;QAChF,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,SAAS,GAAG;;;;EAIlB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;wDAEpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EAC/H,CAAC;QACC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/D,SAAS,IAAI,KAAK,YAAY,IAAI,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,sBAAsB,CAAC,GAAW;QACxC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,OAA2B,EAAE,OAA+B;QAC9F,MAAM,eAAe,GAAG,OAAO,EAAE,mBAAmB,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,eAAe,IAAI,GAAG,CAAC;YAClC,IAAI,eAAe,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;gBAC9C,IAAI,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,2BAA2B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;;kBAErD,IAAI;;;EAGpB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;OAEf,CAAC;IACN,CAAC;IAEO,cAAc,CAAC,MAAwB;QAC7C,OAAO,KAAK,MAAM,CAAC,IAAI,QAAQ,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5D,CAAC;IAEO,oBAAoB,CAAC,MAAkB,EAAE,MAAoB;QACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,aAAa,GAAG;;;;CAIzB,CAAC;YAEI,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,gBAAgB,GAAG,OAAO;qBAC3B,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;qBAChF,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,IAAI,mBAA2B,CAAC;gBAChC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,mBAAmB;wBACjB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,oBAAoB,SAAS,MAAM,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;4BACrG,YAAY,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,mBAAmB,GAAG,EAAE,CAAC;gBAC3B,CAAC;gBAED,aAAa,IAAI,0BAA0B,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,gBAAgB;;6DAExC,mBAAmB;gCAChD,MAAM,CAAC,IAAI;;CAE1C,CAAC;YACI,CAAC;YAED,aAAa,IAAI,GAAG,CAAC;YACrB,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,EAAE,IAAI,EAAc;QACrC,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;YACtC,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,CAAC,GAAqB,EAAU,EAAE;IACzD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACnB,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QAC5B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACtC,OAAO,oBAAoB,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC,CAAC"}
@@ -9,4 +9,7 @@ export declare class KotlinSchemaGenerator extends SchemaGenerator {
9
9
  generate(source: SyncConfig, schema: SourceSchema, options?: GenerateSchemaOptions): string;
10
10
  private generateTable;
11
11
  private generateColumn;
12
+ private generateStreamHelperForKotlin;
13
+ private kotlinType;
14
+ private kotlinJsonParamType;
12
15
  }
@@ -1,4 +1,5 @@
1
- import { SchemaGenerator } from './SchemaGenerator.js';
1
+ import { TYPE_INTEGER, TYPE_REAL, TYPE_TEXT } from '../ExpressionType.js';
2
+ import { SchemaGenerator, toCamelCase } from './SchemaGenerator.js';
2
3
  export class KotlinSchemaGenerator extends SchemaGenerator {
3
4
  key = 'kotlin';
4
5
  label = 'Kotlin';
@@ -6,13 +7,24 @@ export class KotlinSchemaGenerator extends SchemaGenerator {
6
7
  fileName = 'schema.kt';
7
8
  generate(source, schema, options) {
8
9
  const tables = super.getAllTables(source, schema);
9
- return `import com.powersync.db.schema.Column
10
+ let imports = `import com.powersync.db.schema.Column
10
11
  import com.powersync.db.schema.Schema
11
12
  import com.powersync.db.schema.Table
12
-
13
- val schema = Schema(
13
+ `;
14
+ const generatedSchema = `val schema = Schema(
14
15
  ${tables.map((table) => this.generateTable(table.name, table.columns, options)).join(',\n ')}
15
- )`;
16
+ )
17
+ `;
18
+ const streams = this.generateStreamHelperForKotlin(source, schema);
19
+ if (streams != null) {
20
+ imports += `import com.powersync.PowerSyncDatabase
21
+ import com.powersync.sync.SyncStream
22
+ import com.powersync.utils.JsonParam
23
+ import kotlin.jvm.JvmInline
24
+ `;
25
+ return `${imports}\n${generatedSchema}\n${streams}`;
26
+ }
27
+ return `${imports}\n${generatedSchema}`;
16
28
  }
17
29
  generateTable(name, columns, options) {
18
30
  const generated = columns.map((c, i) => {
@@ -42,5 +54,56 @@ ${generated.join('\n')}
42
54
  generateColumn(column) {
43
55
  return `Column.${this.columnType(column)}("${column.name}")`;
44
56
  }
57
+ generateStreamHelperForKotlin(source, schema) {
58
+ const optionalSyncStreams = this.getOptionalStreams(source, schema);
59
+ if (optionalSyncStreams.length) {
60
+ let generatedCode = `@JvmInline
61
+ value class TypedSyncStreams(private val db: PowerSyncDatabase) {
62
+ `;
63
+ for (const stream of optionalSyncStreams) {
64
+ const entries = Object.entries(stream.parameters);
65
+ let kotlinParameters = entries
66
+ .map(([parameter, type]) => `${toCamelCase(parameter)}: ${this.kotlinType(type)}`)
67
+ .join(', ');
68
+ let parameterMap;
69
+ if (entries.length) {
70
+ parameterMap = 'buildMap {\n';
71
+ for (const [parameter, type] of entries) {
72
+ parameterMap += ` put("${parameter}", ${this.kotlinJsonParamType(type)}(${toCamelCase(parameter)}))\n`;
73
+ }
74
+ parameterMap += ' }';
75
+ }
76
+ else {
77
+ parameterMap = 'emptyMap()';
78
+ }
79
+ generatedCode += ` fun ${toCamelCase(stream.name)}(${kotlinParameters}): SyncStream = db.syncStream("${stream.name}", ${parameterMap})\n`;
80
+ }
81
+ generatedCode += `}
82
+ `;
83
+ return generatedCode;
84
+ }
85
+ }
86
+ kotlinType({ type }) {
87
+ if (type.typeFlags & TYPE_TEXT) {
88
+ return 'String';
89
+ }
90
+ else if (type.typeFlags & TYPE_REAL) {
91
+ return 'Double';
92
+ }
93
+ else if (type.typeFlags & TYPE_INTEGER) {
94
+ return 'Int';
95
+ }
96
+ else {
97
+ return 'String';
98
+ }
99
+ }
100
+ kotlinJsonParamType({ type }) {
101
+ if (type.typeFlags & (TYPE_INTEGER | TYPE_REAL)) {
102
+ return 'JsonParam.Number';
103
+ }
104
+ else {
105
+ return 'JsonParam.String';
106
+ }
107
+ }
45
108
  }
46
109
  //# sourceMappingURL=KotlinSchemaGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KotlinSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/KotlinSchemaGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAC/C,GAAG,GAAG,QAAQ,CAAC;IACf,KAAK,GAAG,QAAQ,CAAC;IACjB,SAAS,GAAG,eAAe,CAAC;IAC5B,QAAQ,GAAG,WAAW,CAAC;IAEhC,QAAQ,CAAC,MAAkB,EAAE,MAAoB,EAAE,OAA+B;QAChF,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO;;;;;IAKP,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;EAC7F,CAAC;IACD,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,OAA2B,EAAE,OAA+B;QAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,cAAsB,CAAC;YAC3B,IAAI,IAAI,EAAE,CAAC;gBACT,cAAc,GAAG,WAAW,IAAI,EAAE,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,WAAW,IAAI,GAAG,CAAC;YACtC,CAAC;YAED,IAAI,OAAO,EAAE,mBAAmB,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;gBAC3D,OAAO,GAAG,cAAc,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO;cACG,IAAI;;EAEhB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;IAElB,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,MAAwB;QAC7C,OAAO,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;IAC/D,CAAC;CACF"}
1
+ {"version":3,"file":"KotlinSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/KotlinSchemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { SchemaGenerator } from './SchemaGenerator.js';
1
+ import { SchemaGenerator, toCamelCase } from './SchemaGenerator.js';
2
2
  /**
3
3
  * Generates a schema to use with the [Room library](https://docs.powersync.com/client-sdk-references/kotlin-multiplatform/libraries/room).
4
4
  */
@@ -16,7 +16,7 @@ import androidx.room.PrimaryKey
16
16
  for (const table of tables) {
17
17
  // @Entity(tableName = "todo_list_items") data class TodoListItems(
18
18
  buffer += `\n@Entity(tableName = "${table.name}")\n`;
19
- buffer += `data class ${snakeCaseToKotlin(table.name, true)}(\n`;
19
+ buffer += `data class ${toCamelCase(table.name, true)}(\n`;
20
20
  // Id column
21
21
  buffer += ' @PrimaryKey val id: String,\n';
22
22
  for (const column of table.columns) {
@@ -27,27 +27,11 @@ import androidx.room.PrimaryKey
27
27
  integer: 'Long'
28
28
  }[sqliteType];
29
29
  // @ColumnInfo(name = "author_id") val authorId: String,
30
- buffer += ` @ColumnInfo("${column.name}") val ${snakeCaseToKotlin(column.name, false)}: ${kotlinType},\n`;
30
+ buffer += ` @ColumnInfo("${column.name}") val ${toCamelCase(column.name)}: ${kotlinType},\n`;
31
31
  }
32
32
  buffer += ')\n';
33
33
  }
34
34
  return buffer;
35
35
  }
36
36
  }
37
- function snakeCaseToKotlin(source, initialUpper) {
38
- let result = '';
39
- for (const chunk of source.split('_')) {
40
- if (chunk.length == 0)
41
- continue;
42
- const firstCharUpper = result.length > 0 || initialUpper;
43
- if (firstCharUpper) {
44
- result += chunk.charAt(0).toUpperCase();
45
- result += chunk.substring(1);
46
- }
47
- else {
48
- result += chunk;
49
- }
50
- }
51
- return result;
52
- }
53
37
  //# sourceMappingURL=RoomSchemaGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RoomSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/RoomSchemaGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,GAAG,GAAG,aAAa,CAAC;IACpB,KAAK,GAAG,6BAA6B,CAAC;IACtC,SAAS,GAAG,eAAe,CAAC;IAC5B,QAAQ,GAAG,aAAa,CAAC;IAElC,QAAQ,CAAC,MAAkB,EAAE,MAAoB;QAC/C,IAAI,MAAM,GAAG;;;CAGhB,CAAC;QACE,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,mEAAmE;YACnE,MAAM,IAAI,0BAA0B,KAAK,CAAC,IAAI,MAAM,CAAC;YACrD,MAAM,IAAI,cAAc,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;YAEjE,YAAY;YACZ,MAAM,IAAI,iCAAiC,CAAC;YAE5C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG;oBACjB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,MAAM;iBAChB,CAAC,UAAU,CAAC,CAAC;gBAEd,wDAAwD;gBACxD,MAAM,IAAI,kBAAkB,MAAM,CAAC,IAAI,UAAU,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,UAAU,KAAK,CAAC;YAC7G,CAAC;YAED,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,YAAqB;IAC9D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,SAAS;QAEhC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC;QACzD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"RoomSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/RoomSchemaGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,GAAG,GAAG,aAAa,CAAC;IACpB,KAAK,GAAG,6BAA6B,CAAC;IACtC,SAAS,GAAG,eAAe,CAAC;IAC5B,QAAQ,GAAG,aAAa,CAAC;IAElC,QAAQ,CAAC,MAAkB,EAAE,MAAoB;QAC/C,IAAI,MAAM,GAAG;;;CAGhB,CAAC;QACE,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,mEAAmE;YACnE,MAAM,IAAI,0BAA0B,KAAK,CAAC,IAAI,MAAM,CAAC;YACrD,MAAM,IAAI,cAAc,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;YAE3D,YAAY;YACZ,MAAM,IAAI,iCAAiC,CAAC;YAE5C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG;oBACjB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,MAAM;iBAChB,CAAC,UAAU,CAAC,CAAC;gBAEd,wDAAwD;gBACxD,MAAM,IAAI,kBAAkB,MAAM,CAAC,IAAI,UAAU,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,KAAK,CAAC;YAChG,CAAC;YAED,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import { SyncConfig } from '../SyncConfig.js';
2
- import { ColumnDefinition } from '../ExpressionType.js';
2
+ import { ColumnDefinition, ColumnType } from '../ExpressionType.js';
3
3
  import { SourceSchema } from '../types.js';
4
4
  export interface GenerateSchemaOptions {
5
5
  includeTypeComments?: boolean;
@@ -9,6 +9,7 @@ export declare abstract class SchemaGenerator {
9
9
  name: string;
10
10
  columns: ColumnDefinition[];
11
11
  }[];
12
+ protected getOptionalStreams(source: SyncConfig, schema: SourceSchema): OptionalStream[];
12
13
  abstract readonly key: string;
13
14
  abstract readonly label: string;
14
15
  abstract readonly mediaType: string;
@@ -25,3 +26,8 @@ export declare abstract class SchemaGenerator {
25
26
  * @returns The default SQL column type name for that type.
26
27
  */
27
28
  export declare function sqlTypeName(def: ColumnDefinition): 'text' | 'real' | 'integer';
29
+ export interface OptionalStream {
30
+ name: string;
31
+ parameters: Record<string, ColumnType>;
32
+ }
33
+ export declare function toCamelCase(source: string, initialUpper?: boolean): string;
@@ -1,4 +1,6 @@
1
1
  import { TYPE_INTEGER, TYPE_REAL, TYPE_TEXT } from '../ExpressionType.js';
2
+ import { PrecompiledSyncConfig } from '../sync_plan/evaluator/index.js';
3
+ import { SyncPlanSchemaAnalyzer } from '../sync_plan/schema_inference.js';
2
4
  export class SchemaGenerator {
3
5
  getAllTables(source, schema) {
4
6
  let tables = {};
@@ -12,6 +14,23 @@ export class SchemaGenerator {
12
14
  };
13
15
  });
14
16
  }
17
+ getOptionalStreams(source, schema) {
18
+ const streams = [];
19
+ if (source instanceof PrecompiledSyncConfig) {
20
+ const analyzer = new SyncPlanSchemaAnalyzer(source.defaultSchema, schema);
21
+ for (const { stream, queriers } of source.plan.streams) {
22
+ if (stream.isSubscribedByDefault) {
23
+ // Not an optional stream
24
+ continue;
25
+ }
26
+ streams.push({
27
+ name: stream.name,
28
+ parameters: analyzer.resolveReferencedParameters(queriers)
29
+ });
30
+ }
31
+ }
32
+ return streams;
33
+ }
15
34
  /**
16
35
  * @param def The column definition to generate the type for.
17
36
  * @returns The SDK column type for the given column definition.
@@ -39,4 +58,20 @@ export function sqlTypeName(def) {
39
58
  return 'text';
40
59
  }
41
60
  }
61
+ export function toCamelCase(source, initialUpper = false) {
62
+ let result = '';
63
+ for (const chunk of source.split(/[_-]/)) {
64
+ if (chunk.length == 0)
65
+ continue;
66
+ const firstCharUpper = result.length > 0 || initialUpper;
67
+ if (firstCharUpper) {
68
+ result += chunk.charAt(0).toUpperCase();
69
+ result += chunk.substring(1);
70
+ }
71
+ else {
72
+ result += chunk;
73
+ }
74
+ }
75
+ return result;
76
+ }
42
77
  //# sourceMappingURL=SchemaGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/SchemaGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAO5F,MAAM,OAAgB,eAAe;IACzB,YAAY,CAAC,MAAkB,EAAE,MAAoB;QAC7D,IAAI,MAAM,GAAqD,EAAE,CAAC;QAElE,KAAK,IAAI,UAAU,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAChD,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;YACpD,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;aAChC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IASD;;;OAGG;IACH,UAAU,CAAC,GAAqB;QAC9B,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAqB;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACrB,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/SchemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,7 @@ export declare class SwiftSchemaGenerator extends SchemaGenerator {
9
9
  generate(source: SyncConfig, schema: SourceSchema, options?: GenerateSchemaOptions): string;
10
10
  private generateTable;
11
11
  private generateColumn;
12
+ private generateStreamHelper;
13
+ private swiftType;
14
+ private swiftJsonParamType;
12
15
  }
@@ -1,4 +1,5 @@
1
- import { SchemaGenerator } from './SchemaGenerator.js';
1
+ import { TYPE_INTEGER, TYPE_REAL, TYPE_TEXT } from '../ExpressionType.js';
2
+ import { SchemaGenerator, toCamelCase } from './SchemaGenerator.js';
2
3
  export class SwiftSchemaGenerator extends SchemaGenerator {
3
4
  key = 'swift';
4
5
  label = 'Swift';
@@ -6,11 +7,14 @@ export class SwiftSchemaGenerator extends SchemaGenerator {
6
7
  fileName = 'schema.swift';
7
8
  generate(source, schema, options) {
8
9
  const tables = super.getAllTables(source, schema);
10
+ const streamsHelper = this.generateStreamHelper(source, schema);
9
11
  return `import PowerSync
10
12
 
11
13
  let schema = Schema(
12
14
  ${tables.map((table) => this.generateTable(table.name, table.columns, options)).join(',\n ')}
13
- )`;
15
+ )
16
+ ${streamsHelper ?? ''}
17
+ `;
14
18
  }
15
19
  generateTable(name, columns, options) {
16
20
  const generated = columns.map((c, i) => {
@@ -40,5 +44,65 @@ ${generated.join('\n')}
40
44
  generateColumn(column) {
41
45
  return `.${this.columnType(column)}("${column.name}")`;
42
46
  }
47
+ generateStreamHelper(source, schema) {
48
+ const optionalSyncStreams = this.getOptionalStreams(source, schema);
49
+ if (optionalSyncStreams.length) {
50
+ let generatedCode = `
51
+ struct TypedSyncStreams {
52
+ private var db: PowerSyncDatabaseProtocol
53
+ init(_ db: PowerSyncDatabaseProtocol) {
54
+ self.db = db
55
+ }
56
+ `;
57
+ for (const stream of optionalSyncStreams) {
58
+ const entries = Object.entries(stream.parameters);
59
+ let swiftParameters = entries
60
+ .map(([parameter, type]) => `${toCamelCase(parameter)}: ${this.swiftType(type)}`)
61
+ .join(', ');
62
+ let parameterMap;
63
+ if (entries.length) {
64
+ parameterMap = '[\n';
65
+ for (const [parameter, type] of entries) {
66
+ parameterMap += ` "${parameter}": ${this.swiftJsonParamType(type)}(${toCamelCase(parameter)})\n`;
67
+ }
68
+ parameterMap += ' ]';
69
+ }
70
+ else {
71
+ parameterMap = '[:]';
72
+ }
73
+ generatedCode += ` func ${toCamelCase(stream.name)}(${swiftParameters}) -> SyncStream {
74
+ return db.syncStream(name: "${stream.name}", params: ${parameterMap})
75
+ }
76
+ `;
77
+ }
78
+ generatedCode += `}`;
79
+ return generatedCode;
80
+ }
81
+ }
82
+ swiftType({ type }) {
83
+ if (type.typeFlags & TYPE_TEXT) {
84
+ return 'String';
85
+ }
86
+ else if (type.typeFlags & TYPE_REAL) {
87
+ return 'Double';
88
+ }
89
+ else if (type.typeFlags & TYPE_INTEGER) {
90
+ return 'Int';
91
+ }
92
+ else {
93
+ return 'String';
94
+ }
95
+ }
96
+ swiftJsonParamType({ type }) {
97
+ if (type.typeFlags & TYPE_INTEGER) {
98
+ return 'JsonValue.int';
99
+ }
100
+ else if (type.typeFlags & TYPE_REAL) {
101
+ return 'JsonValue.double';
102
+ }
103
+ else {
104
+ return 'JsonValue.string';
105
+ }
106
+ }
43
107
  }
44
108
  //# sourceMappingURL=SwiftSchemaGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwiftSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/SwiftSchemaGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,OAAO,oBAAqB,SAAQ,eAAe;IAC9C,GAAG,GAAG,OAAO,CAAC;IACd,KAAK,GAAG,OAAO,CAAC;IAChB,SAAS,GAAG,cAAc,CAAC;IAC3B,QAAQ,GAAG,cAAc,CAAC;IAEnC,QAAQ,CAAC,MAAkB,EAAE,MAAoB,EAAE,OAA+B;QAChF,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO;;;IAGP,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;EAC7F,CAAC;IACD,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,OAA2B,EAAE,OAA+B;QAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,cAAsB,CAAC;YAC3B,IAAI,IAAI,EAAE,CAAC;gBACT,cAAc,GAAG,WAAW,IAAI,EAAE,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,WAAW,IAAI,GAAG,CAAC;YACtC,CAAC;YAED,IAAI,OAAO,EAAE,mBAAmB,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;gBAC3D,OAAO,GAAG,cAAc,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO;aACE,IAAI;;EAEf,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;IAElB,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,MAAwB;QAC7C,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"SwiftSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/SwiftSchemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -30,5 +30,7 @@ export declare class TsSchemaGenerator extends SchemaGenerator {
30
30
  private generateTypeExports;
31
31
  private generateImports;
32
32
  private generateTable;
33
+ private generateStreamHelper;
33
34
  private generateColumn;
35
+ private valueType;
34
36
  }
@@ -1,5 +1,5 @@
1
1
  import { TYPE_INTEGER, TYPE_REAL, TYPE_TEXT } from '../ExpressionType.js';
2
- import { SchemaGenerator } from './SchemaGenerator.js';
2
+ import { SchemaGenerator, toCamelCase } from './SchemaGenerator.js';
3
3
  export var TsSchemaLanguage;
4
4
  (function (TsSchemaLanguage) {
5
5
  TsSchemaLanguage["ts"] = "ts";
@@ -40,7 +40,8 @@ export class TsSchemaGenerator extends SchemaGenerator {
40
40
  }
41
41
  generate(source, schema, options) {
42
42
  const tables = super.getAllTables(source, schema);
43
- return `${this.generateImports()}
43
+ const streamsHelper = this.generateStreamHelper(source, schema);
44
+ return `${this.generateImports(streamsHelper != null)}
44
45
 
45
46
  ${tables.map((table) => this.generateTable(table.name, table.columns, options)).join('\n\n')}
46
47
 
@@ -48,7 +49,8 @@ export const AppSchema = new Schema({
48
49
  ${tables.map((table) => table.name).join(',\n ')}
49
50
  });
50
51
 
51
- ${this.generateTypeExports()}`;
52
+ ${this.generateTypeExports()}
53
+ ${streamsHelper ?? ''}`;
52
54
  }
53
55
  generateTypeExports() {
54
56
  if (this.language == TsSchemaLanguage.ts) {
@@ -58,17 +60,22 @@ ${this.generateTypeExports()}`;
58
60
  return ``;
59
61
  }
60
62
  }
61
- generateImports() {
63
+ generateImports(includeSyncStreams) {
62
64
  const importStyle = this.options.imports ?? 'auto';
65
+ const importedNames = ['column', 'Schema', 'Table'];
66
+ if (includeSyncStreams) {
67
+ importedNames.push(...['PowerSyncDatabase', 'SyncStream']);
68
+ }
69
+ const importStart = `import { ${importedNames.join(', ')} } from`;
63
70
  if (importStyle == TsSchemaImports.web) {
64
- return `import { column, Schema, Table } from '@powersync/web';`;
71
+ return `${importStart} '@powersync/web';`;
65
72
  }
66
73
  else if (importStyle == TsSchemaImports.reactNative) {
67
- return `import { column, Schema, Table } from '@powersync/react-native';`;
74
+ return `${importStart} '@powersync/react-native';`;
68
75
  }
69
76
  else {
70
- return `import { column, Schema, Table } from '@powersync/web';
71
- // OR: import { column, Schema, Table } from '@powersync/react-native';`;
77
+ return `${importStart} '@powersync/web';
78
+ // OR: ${importStart} '@powersync/react-native';`;
72
79
  }
73
80
  }
74
81
  generateTable(name, columns, options) {
@@ -97,6 +104,28 @@ ${generated.join('\n')}
97
104
  { indexes: {} }
98
105
  );`;
99
106
  }
107
+ generateStreamHelper(source, schema) {
108
+ const optionalSyncStreams = this.getOptionalStreams(source, schema);
109
+ if (optionalSyncStreams.length) {
110
+ let generatedCode = `export function typedStreams(db: PowerSyncDatabase) {
111
+ return {
112
+ `;
113
+ const methods = optionalSyncStreams.map((stream) => {
114
+ const allParams = Object.entries(stream.parameters);
115
+ let args = '';
116
+ if (allParams.length) {
117
+ const paramsType = allParams.map(([name, type]) => `${name}: ${this.valueType(type)}`).join(', ');
118
+ args += `params: { ${paramsType} }`;
119
+ }
120
+ return ` ${toCamelCase(stream.name)}(${args}): SyncStream {
121
+ return db.syncStream('${stream.name}', ${allParams.length ? 'params' : '{}'});
122
+ }`;
123
+ });
124
+ generatedCode += methods.join(',\n');
125
+ generatedCode += `\n };\n}\n`;
126
+ return generatedCode;
127
+ }
128
+ }
100
129
  generateColumn(column) {
101
130
  const t = column.type;
102
131
  if (t.typeFlags & TYPE_TEXT) {
@@ -112,5 +141,13 @@ ${generated.join('\n')}
112
141
  return `${column.name}: column.text`;
113
142
  }
114
143
  }
144
+ valueType({ type }) {
145
+ if (type.typeFlags & (TYPE_INTEGER | TYPE_REAL)) {
146
+ return 'number';
147
+ }
148
+ else {
149
+ return 'string';
150
+ }
151
+ }
115
152
  }
116
153
  //# sourceMappingURL=TsSchemaGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TsSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/TsSchemaGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TsSchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/TsSchemaGenerator.ts"],"names":[],"mappings":"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"}