@powersync/service-sync-rules 0.17.10

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 (72) hide show
  1. package/LICENSE +67 -0
  2. package/README.md +3 -0
  3. package/dist/DartSchemaGenerator.d.ts +12 -0
  4. package/dist/DartSchemaGenerator.js +39 -0
  5. package/dist/DartSchemaGenerator.js.map +1 -0
  6. package/dist/ExpressionType.d.ts +33 -0
  7. package/dist/ExpressionType.js +61 -0
  8. package/dist/ExpressionType.js.map +1 -0
  9. package/dist/IdSequence.d.ts +4 -0
  10. package/dist/IdSequence.js +9 -0
  11. package/dist/IdSequence.js.map +1 -0
  12. package/dist/JsSchemaGenerator.d.ts +12 -0
  13. package/dist/JsSchemaGenerator.js +42 -0
  14. package/dist/JsSchemaGenerator.js.map +1 -0
  15. package/dist/SchemaGenerator.d.ts +14 -0
  16. package/dist/SchemaGenerator.js +26 -0
  17. package/dist/SchemaGenerator.js.map +1 -0
  18. package/dist/SourceTableInterface.d.ts +5 -0
  19. package/dist/SourceTableInterface.js +2 -0
  20. package/dist/SourceTableInterface.js.map +1 -0
  21. package/dist/SqlBucketDescriptor.d.ts +37 -0
  22. package/dist/SqlBucketDescriptor.js +111 -0
  23. package/dist/SqlBucketDescriptor.js.map +1 -0
  24. package/dist/SqlDataQuery.d.ts +39 -0
  25. package/dist/SqlDataQuery.js +237 -0
  26. package/dist/SqlDataQuery.js.map +1 -0
  27. package/dist/SqlParameterQuery.d.ts +43 -0
  28. package/dist/SqlParameterQuery.js +238 -0
  29. package/dist/SqlParameterQuery.js.map +1 -0
  30. package/dist/SqlSyncRules.d.ts +52 -0
  31. package/dist/SqlSyncRules.js +247 -0
  32. package/dist/SqlSyncRules.js.map +1 -0
  33. package/dist/StaticSchema.d.ts +26 -0
  34. package/dist/StaticSchema.js +61 -0
  35. package/dist/StaticSchema.js.map +1 -0
  36. package/dist/StaticSqlParameterQuery.d.ts +24 -0
  37. package/dist/StaticSqlParameterQuery.js +66 -0
  38. package/dist/StaticSqlParameterQuery.js.map +1 -0
  39. package/dist/TablePattern.d.ts +17 -0
  40. package/dist/TablePattern.js +56 -0
  41. package/dist/TablePattern.js.map +1 -0
  42. package/dist/TableQuerySchema.d.ts +9 -0
  43. package/dist/TableQuerySchema.js +34 -0
  44. package/dist/TableQuerySchema.js.map +1 -0
  45. package/dist/errors.d.ts +22 -0
  46. package/dist/errors.js +58 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/generators.d.ts +6 -0
  49. package/dist/generators.js +7 -0
  50. package/dist/generators.js.map +1 -0
  51. package/dist/index.d.ts +18 -0
  52. package/dist/index.js +19 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/json_schema.d.ts +3 -0
  55. package/dist/json_schema.js +48 -0
  56. package/dist/json_schema.js.map +1 -0
  57. package/dist/sql_filters.d.ts +91 -0
  58. package/dist/sql_filters.js +506 -0
  59. package/dist/sql_filters.js.map +1 -0
  60. package/dist/sql_functions.d.ts +54 -0
  61. package/dist/sql_functions.js +773 -0
  62. package/dist/sql_functions.js.map +1 -0
  63. package/dist/sql_support.d.ts +22 -0
  64. package/dist/sql_support.js +213 -0
  65. package/dist/sql_support.js.map +1 -0
  66. package/dist/types.d.ts +174 -0
  67. package/dist/types.js +10 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/utils.d.ts +45 -0
  70. package/dist/utils.js +173 -0
  71. package/dist/utils.js.map +1 -0
  72. package/package.json +29 -0
@@ -0,0 +1,247 @@
1
+ import { LineCounter, parseDocument, Scalar, YAMLSeq } from 'yaml';
2
+ import { SqlRuleError, SyncRulesErrors, YamlError } from './errors.js';
3
+ import { IdSequence } from './IdSequence.js';
4
+ import { validateSyncRulesSchema } from './json_schema.js';
5
+ import { SqlBucketDescriptor } from './SqlBucketDescriptor.js';
6
+ import { isEvaluatedParameters, isEvaluatedRow, isEvaluationError } from './types.js';
7
+ export class SqlSyncRules {
8
+ static validate(yaml, options) {
9
+ try {
10
+ const rules = this.fromYaml(yaml, options);
11
+ return rules.errors;
12
+ }
13
+ catch (e) {
14
+ if (e instanceof SyncRulesErrors) {
15
+ return e.errors;
16
+ }
17
+ else if (e instanceof YamlError) {
18
+ return [e];
19
+ }
20
+ else {
21
+ return [new YamlError(e)];
22
+ }
23
+ }
24
+ }
25
+ static fromYaml(yaml, options) {
26
+ const throwOnError = options?.throwOnError ?? true;
27
+ const schema = options?.schema;
28
+ const lineCounter = new LineCounter();
29
+ const parsed = parseDocument(yaml, { schema: 'core', keepSourceTokens: true, lineCounter });
30
+ const rules = new SqlSyncRules(yaml);
31
+ if (parsed.errors.length > 0) {
32
+ rules.errors.push(...parsed.errors.map((error) => {
33
+ return new YamlError(error);
34
+ }));
35
+ if (throwOnError) {
36
+ rules.throwOnError();
37
+ }
38
+ return rules;
39
+ }
40
+ const bucketMap = parsed.get('bucket_definitions');
41
+ if (bucketMap == null) {
42
+ rules.errors.push(new YamlError(new Error(`'bucket_definitions' is required`)));
43
+ if (throwOnError) {
44
+ rules.throwOnError();
45
+ }
46
+ return rules;
47
+ }
48
+ for (let entry of bucketMap.items) {
49
+ const { key: keyScalar, value } = entry;
50
+ const key = keyScalar.toString();
51
+ const parameters = value.get('parameters', true);
52
+ const dataQueries = value.get('data', true);
53
+ const descriptor = new SqlBucketDescriptor(key, rules.idSequence);
54
+ if (parameters instanceof Scalar) {
55
+ rules.withScalar(parameters, (q) => {
56
+ return descriptor.addParameterQuery(q);
57
+ });
58
+ }
59
+ else if (parameters instanceof YAMLSeq) {
60
+ for (let item of parameters.items) {
61
+ rules.withScalar(item, (q) => {
62
+ return descriptor.addParameterQuery(q, schema);
63
+ });
64
+ }
65
+ }
66
+ else {
67
+ descriptor.addParameterQuery('SELECT', schema);
68
+ }
69
+ if (!(dataQueries instanceof YAMLSeq)) {
70
+ rules.errors.push(this.tokenError(dataQueries ?? value, `'data' must be an array`));
71
+ continue;
72
+ }
73
+ for (let query of dataQueries.items) {
74
+ rules.withScalar(query, (q) => {
75
+ return descriptor.addDataQuery(q, schema);
76
+ });
77
+ }
78
+ rules.bucket_descriptors.push(descriptor);
79
+ }
80
+ // Validate that there are no additional properties.
81
+ // Since these errors don't contain line numbers, do this last.
82
+ const valid = validateSyncRulesSchema(parsed.toJSON());
83
+ if (!valid) {
84
+ rules.errors.push(...validateSyncRulesSchema.errors.map((e) => {
85
+ return new YamlError(e);
86
+ }));
87
+ }
88
+ if (throwOnError) {
89
+ rules.throwOnError();
90
+ }
91
+ return rules;
92
+ }
93
+ throwOnError() {
94
+ if (this.errors.filter((e) => e.type != 'warning').length > 0) {
95
+ throw new SyncRulesErrors(this.errors);
96
+ }
97
+ }
98
+ static tokenError(token, message) {
99
+ const start = token?.srcToken?.offset ?? 0;
100
+ const end = start + 1;
101
+ return new YamlError(new Error(message), { start, end });
102
+ }
103
+ withScalar(scalar, cb) {
104
+ const value = scalar.toString();
105
+ const wrapped = (value) => {
106
+ try {
107
+ return cb(value);
108
+ }
109
+ catch (e) {
110
+ return {
111
+ parsed: false,
112
+ errors: [e]
113
+ };
114
+ }
115
+ };
116
+ const result = wrapped(value);
117
+ for (let err of result.errors) {
118
+ let sourceOffset = scalar.srcToken.offset;
119
+ if (scalar.type == Scalar.QUOTE_DOUBLE || scalar.type == Scalar.QUOTE_SINGLE) {
120
+ // TODO: Is there a better way to do this?
121
+ sourceOffset += 1;
122
+ }
123
+ let offset;
124
+ let end;
125
+ if (err instanceof SqlRuleError && err.location) {
126
+ offset = err.location.start + sourceOffset;
127
+ end = err.location.end + sourceOffset;
128
+ }
129
+ else if (typeof err.token?._location?.start == 'number') {
130
+ offset = sourceOffset + err.token?._location?.start;
131
+ end = sourceOffset + err.token?._location?.end;
132
+ }
133
+ else {
134
+ offset = sourceOffset;
135
+ end = sourceOffset + Math.max(value.length, 1);
136
+ }
137
+ const pos = { start: offset, end };
138
+ this.errors.push(new YamlError(err, pos));
139
+ }
140
+ return result;
141
+ }
142
+ constructor(content) {
143
+ this.bucket_descriptors = [];
144
+ this.idSequence = new IdSequence();
145
+ this.errors = [];
146
+ this.content = content;
147
+ }
148
+ /**
149
+ * Throws errors.
150
+ */
151
+ evaluateRow(options) {
152
+ const { results, errors } = this.evaluateRowWithErrors(options);
153
+ if (errors.length > 0) {
154
+ throw new Error(errors[0].error);
155
+ }
156
+ return results;
157
+ }
158
+ evaluateRowWithErrors(options) {
159
+ let rawResults = [];
160
+ for (let query of this.bucket_descriptors) {
161
+ rawResults.push(...query.evaluateRow(options));
162
+ }
163
+ const results = rawResults.filter(isEvaluatedRow);
164
+ const errors = rawResults.filter(isEvaluationError);
165
+ return { results, errors };
166
+ }
167
+ /**
168
+ * Throws errors.
169
+ */
170
+ evaluateParameterRow(table, row) {
171
+ const { results, errors } = this.evaluateParameterRowWithErrors(table, row);
172
+ if (errors.length > 0) {
173
+ throw new Error(errors[0].error);
174
+ }
175
+ return results;
176
+ }
177
+ evaluateParameterRowWithErrors(table, row) {
178
+ let rawResults = [];
179
+ for (let query of this.bucket_descriptors) {
180
+ rawResults.push(...query.evaluateParameterRow(table, row));
181
+ }
182
+ const results = rawResults.filter(isEvaluatedParameters);
183
+ const errors = rawResults.filter(isEvaluationError);
184
+ return { results, errors };
185
+ }
186
+ /**
187
+ * @deprecated For testing only.
188
+ */
189
+ getStaticBucketIds(parameters) {
190
+ let results = [];
191
+ for (let bucket of this.bucket_descriptors) {
192
+ results.push(...bucket.getStaticBucketIds(parameters));
193
+ }
194
+ return results;
195
+ }
196
+ /**
197
+ * Note: This can error hard.
198
+ */
199
+ async queryBucketIds(options) {
200
+ let results = [];
201
+ for (let bucket of this.bucket_descriptors) {
202
+ results.push(...(await bucket.queryBucketIds(options)));
203
+ }
204
+ return results;
205
+ }
206
+ getSourceTables() {
207
+ let sourceTables = new Map();
208
+ for (let bucket of this.bucket_descriptors) {
209
+ for (let r of bucket.getSourceTables()) {
210
+ const key = `${r.connectionTag}.${r.schema}.${r.tablePattern}`;
211
+ sourceTables.set(key, r);
212
+ }
213
+ }
214
+ return [...sourceTables.values()];
215
+ }
216
+ tableSyncsData(table) {
217
+ for (let bucket of this.bucket_descriptors) {
218
+ if (bucket.tableSyncsData(table)) {
219
+ return true;
220
+ }
221
+ }
222
+ return false;
223
+ }
224
+ tableSyncsParameters(table) {
225
+ for (let bucket of this.bucket_descriptors) {
226
+ if (bucket.tableSyncsParameters(table)) {
227
+ return true;
228
+ }
229
+ }
230
+ return false;
231
+ }
232
+ debugGetOutputTables() {
233
+ var _a;
234
+ let result = {};
235
+ for (let bucket of this.bucket_descriptors) {
236
+ for (let q of bucket.data_queries) {
237
+ result[_a = q.table] ?? (result[_a] = []);
238
+ const r = {
239
+ query: q.sql
240
+ };
241
+ result[q.table].push(r);
242
+ }
243
+ }
244
+ return result;
245
+ }
246
+ }
247
+ //# sourceMappingURL=SqlSyncRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlSyncRules.js","sourceRoot":"","sources":["../src/SqlSyncRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { TablePattern } from './TablePattern.js';
2
+ import { SourceSchema, SourceSchemaTable } from './types.js';
3
+ export interface SourceSchemaDefinition {
4
+ name: string;
5
+ tables: SourceTableDefinition[];
6
+ }
7
+ export interface SourceTableDefinition {
8
+ name: string;
9
+ columns: SourceColumnDefinition[];
10
+ }
11
+ export interface SourceColumnDefinition {
12
+ name: string;
13
+ /**
14
+ * Postgres type.
15
+ */
16
+ pg_type: string;
17
+ }
18
+ export interface SourceConnectionDefinition {
19
+ tag: string;
20
+ schemas: SourceSchemaDefinition[];
21
+ }
22
+ export declare class StaticSchema implements SourceSchema {
23
+ private tables;
24
+ constructor(connections: SourceConnectionDefinition[]);
25
+ getTables(sourceTable: TablePattern): SourceSchemaTable[];
26
+ }
@@ -0,0 +1,61 @@
1
+ import { ExpressionType } from './ExpressionType.js';
2
+ class SourceTableDetails {
3
+ constructor(connection, schema, table) {
4
+ this.connectionTag = connection.tag;
5
+ this.schema = schema.name;
6
+ this.table = table.name;
7
+ this.columns = Object.fromEntries(table.columns.map((column) => {
8
+ return [column.name, mapColumn(column)];
9
+ }));
10
+ }
11
+ getType(column) {
12
+ return this.columns[column]?.type;
13
+ }
14
+ getColumns() {
15
+ return Object.values(this.columns);
16
+ }
17
+ }
18
+ export class StaticSchema {
19
+ constructor(connections) {
20
+ this.tables = [];
21
+ for (let connection of connections) {
22
+ for (let schema of connection.schemas) {
23
+ for (let table of schema.tables) {
24
+ this.tables.push(new SourceTableDetails(connection, schema, table));
25
+ }
26
+ }
27
+ }
28
+ }
29
+ getTables(sourceTable) {
30
+ const filtered = this.tables.filter((t) => sourceTable.matches(t));
31
+ return filtered;
32
+ }
33
+ }
34
+ function mapColumn(column) {
35
+ return {
36
+ name: column.name,
37
+ type: mapType(column.pg_type)
38
+ };
39
+ }
40
+ function mapType(type) {
41
+ if (type?.endsWith('[]')) {
42
+ return ExpressionType.TEXT;
43
+ }
44
+ switch (type) {
45
+ case 'bool':
46
+ return ExpressionType.INTEGER;
47
+ case 'bytea':
48
+ return ExpressionType.BLOB;
49
+ case 'int2':
50
+ case 'int4':
51
+ case 'int8':
52
+ case 'oid':
53
+ return ExpressionType.INTEGER;
54
+ case 'float4':
55
+ case 'float8':
56
+ return ExpressionType.REAL;
57
+ default:
58
+ return ExpressionType.TEXT;
59
+ }
60
+ }
61
+ //# sourceMappingURL=StaticSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticSchema.js","sourceRoot":"","sources":["../src/StaticSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA4BvE,MAAM,kBAAkB;IAMtB,YAAY,UAAsC,EAAE,MAA8B,EAAE,KAA4B;QAC9G,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAC/B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IACpC,CAAC;IAED,UAAU;QACR,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IAGvB,YAAY,WAAyC;QACnD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,UAAU,IAAI,WAAW,EAAE;YAClC,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE;gBACrC,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;oBAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;iBACrE;aACF;SACF;IACH,CAAC;IAED,SAAS,CAAC,WAAyB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,MAA8B;IAC/C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAwB;IACvC,IAAI,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;QACxB,OAAO,cAAc,CAAC,IAAI,CAAC;KAC5B;IACD,QAAQ,IAAI,EAAE;QACZ,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,OAAO,CAAC;QAChC,KAAK,OAAO;YACV,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,cAAc,CAAC,OAAO,CAAC;QAChC,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B;YACE,OAAO,cAAc,CAAC,IAAI,CAAC;KAC9B;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { SelectedColumn, SelectFromStatement } from 'pgsql-ast-parser';
2
+ import { ParameterMatchClause, StaticRowValueClause, SyncParameters } from './types.js';
3
+ import { SqlTools } from './sql_filters.js';
4
+ import { SqlRuleError } from './errors.js';
5
+ /**
6
+ * Represents a bucket parameter query without any tables, e.g.:
7
+ *
8
+ * SELECT token_parameters.user_id
9
+ * SELECT token_parameters.user_id as user_id WHERE token_parameters.is_admin
10
+ */
11
+ export declare class StaticSqlParameterQuery {
12
+ static fromSql(descriptor_name: string, sql: string, q: SelectFromStatement): StaticSqlParameterQuery;
13
+ sql?: string;
14
+ columns?: SelectedColumn[];
15
+ static_extractors: Record<string, StaticRowValueClause>;
16
+ descriptor_name?: string;
17
+ /** _Output_ bucket parameters */
18
+ bucket_parameters?: string[];
19
+ id?: string;
20
+ tools?: SqlTools;
21
+ filter?: ParameterMatchClause;
22
+ errors: SqlRuleError[];
23
+ getStaticBucketIds(parameters: SyncParameters): string[];
24
+ }
@@ -0,0 +1,66 @@
1
+ import { SqlTools } from './sql_filters.js';
2
+ import { getBucketId, isJsonValue } from './utils.js';
3
+ import { checkUnsupportedFeatures, isClauseError } from './sql_support.js';
4
+ /**
5
+ * Represents a bucket parameter query without any tables, e.g.:
6
+ *
7
+ * SELECT token_parameters.user_id
8
+ * SELECT token_parameters.user_id as user_id WHERE token_parameters.is_admin
9
+ */
10
+ export class StaticSqlParameterQuery {
11
+ constructor() {
12
+ this.static_extractors = {};
13
+ this.errors = [];
14
+ }
15
+ static fromSql(descriptor_name, sql, q) {
16
+ const query = new StaticSqlParameterQuery();
17
+ query.errors.push(...checkUnsupportedFeatures(sql, q));
18
+ const tools = new SqlTools({
19
+ table: undefined,
20
+ value_tables: ['token_parameters', 'user_parameters'],
21
+ sql
22
+ });
23
+ const where = q.where;
24
+ const filter = tools.compileWhereClause(where);
25
+ const columns = q.columns ?? [];
26
+ const bucket_parameters = columns.map((column) => tools.getOutputName(column));
27
+ query.sql = sql;
28
+ query.descriptor_name = descriptor_name;
29
+ query.bucket_parameters = bucket_parameters;
30
+ query.columns = columns;
31
+ query.tools = tools;
32
+ query.filter = filter;
33
+ for (let column of columns) {
34
+ const name = tools.getSpecificOutputName(column);
35
+ const extractor = tools.compileStaticExtractor(column.expr);
36
+ if (isClauseError(extractor)) {
37
+ // Error logged already
38
+ continue;
39
+ }
40
+ query.static_extractors[name] = extractor;
41
+ }
42
+ query.errors.push(...tools.errors);
43
+ return query;
44
+ }
45
+ getStaticBucketIds(parameters) {
46
+ const tables = { token_parameters: parameters.token_parameters, user_parameters: parameters.user_parameters };
47
+ const filtered = this.filter.filter(tables);
48
+ if (filtered.length == 0) {
49
+ return [];
50
+ }
51
+ let result = {};
52
+ for (let name of this.bucket_parameters) {
53
+ const value = this.static_extractors[name].evaluate(tables);
54
+ if (isJsonValue(value)) {
55
+ result[`bucket.${name}`] = value;
56
+ }
57
+ else {
58
+ // Not valid.
59
+ // Should we error instead?
60
+ return [];
61
+ }
62
+ }
63
+ return [getBucketId(this.descriptor_name, this.bucket_parameters, result)];
64
+ }
65
+ }
66
+ //# sourceMappingURL=StaticSqlParameterQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticSqlParameterQuery.js","sourceRoot":"","sources":["../src/StaticSqlParameterQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { SourceTableInterface } from './SourceTableInterface.js';
2
+ export declare const DEFAULT_TAG = "default";
3
+ export declare const DEFAULT_SCHEMA = "public";
4
+ /**
5
+ * Some pattern matching SourceTables.
6
+ */
7
+ export declare class TablePattern {
8
+ readonly connectionTag: string;
9
+ readonly schema: string;
10
+ readonly tablePattern: string;
11
+ constructor(schema: string | undefined, tablePattern: string);
12
+ get isWildcard(): boolean;
13
+ get tablePrefix(): string;
14
+ get name(): string;
15
+ matches(table: SourceTableInterface): boolean;
16
+ suffix(table: string): string;
17
+ }
@@ -0,0 +1,56 @@
1
+ export const DEFAULT_TAG = 'default';
2
+ export const DEFAULT_SCHEMA = 'public';
3
+ /**
4
+ * Some pattern matching SourceTables.
5
+ */
6
+ export class TablePattern {
7
+ constructor(schema, tablePattern) {
8
+ schema ?? (schema = DEFAULT_SCHEMA);
9
+ const splitSchema = schema.split('.');
10
+ if (splitSchema.length > 2) {
11
+ throw new Error(`Invalid schema: ${schema}`);
12
+ }
13
+ if (splitSchema.length == 2) {
14
+ this.connectionTag = splitSchema[0];
15
+ this.schema = splitSchema[1];
16
+ }
17
+ else {
18
+ this.connectionTag = DEFAULT_TAG;
19
+ this.schema = schema;
20
+ }
21
+ this.tablePattern = tablePattern;
22
+ }
23
+ get isWildcard() {
24
+ return this.tablePattern.endsWith('%');
25
+ }
26
+ get tablePrefix() {
27
+ if (!this.isWildcard) {
28
+ throw new Error('Not a wildcard table');
29
+ }
30
+ return this.tablePattern.substring(0, this.tablePattern.length - 1);
31
+ }
32
+ get name() {
33
+ if (this.isWildcard) {
34
+ throw new Error('Cannot get name for wildcard table');
35
+ }
36
+ return this.tablePattern;
37
+ }
38
+ matches(table) {
39
+ if (this.connectionTag != table.connectionTag || this.schema != table.schema) {
40
+ return false;
41
+ }
42
+ if (this.isWildcard) {
43
+ return table.table.startsWith(this.tablePrefix);
44
+ }
45
+ else {
46
+ return this.tablePattern == table.table;
47
+ }
48
+ }
49
+ suffix(table) {
50
+ if (!this.isWildcard) {
51
+ return '';
52
+ }
53
+ return table.substring(this.tablePrefix.length);
54
+ }
55
+ }
56
+ //# sourceMappingURL=TablePattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePattern.js","sourceRoot":"","sources":["../src/TablePattern.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC;;GAEG;AACH,MAAM,OAAO,YAAY;IAMvB,YAAY,MAA0B,EAAE,YAAoB;QAC1D,MAAM,KAAN,MAAM,GAAK,cAAc,EAAC;QAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;SAC9C;QACD,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;YAC3B,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;SAC9B;aAAM;YACL,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,WAAW;QACb,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SACzC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACvD;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,KAA2B;QACjC,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;YAC5E,OAAO,KAAK,CAAC;SACd;QACD,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACjD;aAAM;YACL,OAAO,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC;SACzC;IACH,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,EAAE,CAAC;SACX;QACD,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { ColumnDefinition, ExpressionType } from './ExpressionType.js';
2
+ import { QuerySchema, SourceSchemaTable } from './types.js';
3
+ export declare class TableQuerySchema implements QuerySchema {
4
+ private tables;
5
+ private alias;
6
+ constructor(tables: SourceSchemaTable[], alias: string);
7
+ getType(table: string, column: string): ExpressionType;
8
+ getColumns(table: string): ColumnDefinition[];
9
+ }
@@ -0,0 +1,34 @@
1
+ import { ExpressionType } from './ExpressionType.js';
2
+ export class TableQuerySchema {
3
+ constructor(tables, alias) {
4
+ this.tables = tables;
5
+ this.alias = alias;
6
+ }
7
+ getType(table, column) {
8
+ if (table != this.alias) {
9
+ return ExpressionType.NONE;
10
+ }
11
+ for (let table of this.tables) {
12
+ const t = table.getType(column);
13
+ if (t != null) {
14
+ return t;
15
+ }
16
+ }
17
+ return ExpressionType.NONE;
18
+ }
19
+ getColumns(table) {
20
+ if (table != this.alias) {
21
+ return [];
22
+ }
23
+ let columns = {};
24
+ for (let table of this.tables) {
25
+ for (let col of table.getColumns()) {
26
+ if (!(col.name in columns)) {
27
+ columns[col.name] = col;
28
+ }
29
+ }
30
+ }
31
+ return Object.values(columns);
32
+ }
33
+ }
34
+ //# sourceMappingURL=TableQuerySchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableQuerySchema.js","sourceRoot":"","sources":["../src/TableQuerySchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGvE,MAAM,OAAO,gBAAgB;IAC3B,YAAoB,MAA2B,EAAU,KAAa;QAAlD,WAAM,GAAN,MAAM,CAAqB;QAAU,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAE1E,OAAO,CAAC,KAAa,EAAE,MAAc;QACnC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;YACvB,OAAO,cAAc,CAAC,IAAI,CAAC;SAC5B;QACD,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,IAAI,EAAE;gBACb,OAAO,CAAC,CAAC;aACV;SACF;QACD,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;YACvB,OAAO,EAAE,CAAC;SACX;QACD,IAAI,OAAO,GAAqC,EAAE,CAAC;QAEnD,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC7B,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE;gBAClC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE;oBAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;iBACzB;aACF;SACF;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { Expr, NodeLocation } from 'pgsql-ast-parser';
2
+ export interface ErrorLocation {
3
+ start: number;
4
+ end: number;
5
+ }
6
+ export declare class SqlRuleError extends Error {
7
+ sql: string;
8
+ location?: ErrorLocation;
9
+ type: 'warning' | 'fatal';
10
+ constructor(message: string, sql: string, location?: NodeLocation | Expr);
11
+ }
12
+ export declare class YamlError extends Error {
13
+ source: Error;
14
+ location: ErrorLocation;
15
+ type: 'warning' | 'fatal';
16
+ constructor(source: Error, location?: ErrorLocation);
17
+ }
18
+ export declare class SyncRulesErrors extends Error {
19
+ errors: YamlError[];
20
+ static constructMessage(errors: YamlError[]): string;
21
+ constructor(errors: YamlError[]);
22
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,58 @@
1
+ import * as yaml from 'yaml';
2
+ function getLocation(location) {
3
+ if (location != null && !isLocation(location)) {
4
+ return location._location;
5
+ }
6
+ else if (isLocation(location)) {
7
+ return location;
8
+ }
9
+ else {
10
+ return undefined;
11
+ }
12
+ }
13
+ function isLocation(location) {
14
+ return (location != null &&
15
+ typeof location.start == 'number' &&
16
+ typeof location.end == 'number');
17
+ }
18
+ export class SqlRuleError extends Error {
19
+ constructor(message, sql, location) {
20
+ super(message);
21
+ this.sql = sql;
22
+ this.type = 'fatal';
23
+ this.location = getLocation(location) ?? { start: 0, end: sql.length };
24
+ }
25
+ }
26
+ export class YamlError extends Error {
27
+ constructor(source, location) {
28
+ super(source.message);
29
+ this.source = source;
30
+ this.type = 'fatal';
31
+ if (location == null && source instanceof yaml.YAMLError) {
32
+ location = {
33
+ start: source.pos[0],
34
+ end: source.pos[1]
35
+ };
36
+ }
37
+ else if (location == null) {
38
+ location = {
39
+ start: 0,
40
+ end: 10
41
+ };
42
+ }
43
+ if (source instanceof YamlError || source instanceof SqlRuleError) {
44
+ this.type = source.type;
45
+ }
46
+ this.location = location;
47
+ }
48
+ }
49
+ export class SyncRulesErrors extends Error {
50
+ static constructMessage(errors) {
51
+ return errors.map((e) => e.message).join(', ');
52
+ }
53
+ constructor(errors) {
54
+ super(SyncRulesErrors.constructMessage(errors));
55
+ this.errors = errors;
56
+ }
57
+ }
58
+ //# sourceMappingURL=errors.js.map