@powersync/service-sync-rules 0.28.0 → 0.29.1

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 (97) hide show
  1. package/LICENSE +3 -3
  2. package/dist/BaseSqlDataQuery.d.ts +9 -1
  3. package/dist/BaseSqlDataQuery.js +42 -0
  4. package/dist/BaseSqlDataQuery.js.map +1 -1
  5. package/dist/BucketDescription.d.ts +16 -0
  6. package/dist/BucketParameterQuerier.d.ts +19 -3
  7. package/dist/BucketParameterQuerier.js.map +1 -1
  8. package/dist/BucketSource.d.ts +72 -0
  9. package/dist/BucketSource.js +6 -0
  10. package/dist/BucketSource.js.map +1 -0
  11. package/dist/ExpressionType.d.ts +2 -1
  12. package/dist/ExpressionType.js +1 -1
  13. package/dist/ExpressionType.js.map +1 -1
  14. package/dist/SqlBucketDescriptor.d.ts +40 -8
  15. package/dist/SqlBucketDescriptor.js +78 -10
  16. package/dist/SqlBucketDescriptor.js.map +1 -1
  17. package/dist/SqlDataQuery.d.ts +4 -3
  18. package/dist/SqlDataQuery.js +10 -30
  19. package/dist/SqlDataQuery.js.map +1 -1
  20. package/dist/SqlParameterQuery.d.ts +4 -4
  21. package/dist/SqlParameterQuery.js +9 -4
  22. package/dist/SqlParameterQuery.js.map +1 -1
  23. package/dist/SqlSyncRules.d.ts +55 -7
  24. package/dist/SqlSyncRules.js +126 -47
  25. package/dist/SqlSyncRules.js.map +1 -1
  26. package/dist/StaticSqlParameterQuery.d.ts +2 -2
  27. package/dist/StaticSqlParameterQuery.js +3 -2
  28. package/dist/StaticSqlParameterQuery.js.map +1 -1
  29. package/dist/TableValuedFunctionSqlParameterQuery.d.ts +2 -2
  30. package/dist/TableValuedFunctionSqlParameterQuery.js +11 -10
  31. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  32. package/dist/TableValuedFunctions.d.ts +2 -2
  33. package/dist/TableValuedFunctions.js +38 -35
  34. package/dist/TableValuedFunctions.js.map +1 -1
  35. package/dist/compatibility.d.ts +40 -0
  36. package/dist/compatibility.js +56 -0
  37. package/dist/compatibility.js.map +1 -0
  38. package/dist/events/SqlEventDescriptor.d.ts +3 -1
  39. package/dist/events/SqlEventDescriptor.js +4 -2
  40. package/dist/events/SqlEventDescriptor.js.map +1 -1
  41. package/dist/events/SqlEventSourceQuery.d.ts +2 -1
  42. package/dist/events/SqlEventSourceQuery.js +3 -2
  43. package/dist/events/SqlEventSourceQuery.js.map +1 -1
  44. package/dist/index.d.ts +7 -0
  45. package/dist/index.js +7 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/json_schema.js +54 -1
  48. package/dist/json_schema.js.map +1 -1
  49. package/dist/request_functions.d.ts +24 -4
  50. package/dist/request_functions.js +68 -17
  51. package/dist/request_functions.js.map +1 -1
  52. package/dist/schema-generators/SchemaGenerator.js +2 -12
  53. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  54. package/dist/sql_filters.d.ts +25 -2
  55. package/dist/sql_filters.js +223 -119
  56. package/dist/sql_filters.js.map +1 -1
  57. package/dist/sql_functions.d.ts +13 -31
  58. package/dist/sql_functions.js +191 -114
  59. package/dist/sql_functions.js.map +1 -1
  60. package/dist/sql_support.d.ts +20 -0
  61. package/dist/sql_support.js +67 -14
  62. package/dist/sql_support.js.map +1 -1
  63. package/dist/streams/filter.d.ts +148 -0
  64. package/dist/streams/filter.js +426 -0
  65. package/dist/streams/filter.js.map +1 -0
  66. package/dist/streams/from_sql.d.ts +4 -0
  67. package/dist/streams/from_sql.js +375 -0
  68. package/dist/streams/from_sql.js.map +1 -0
  69. package/dist/streams/functions.d.ts +2 -0
  70. package/dist/streams/functions.js +38 -0
  71. package/dist/streams/functions.js.map +1 -0
  72. package/dist/streams/parameter.d.ts +67 -0
  73. package/dist/streams/parameter.js +2 -0
  74. package/dist/streams/parameter.js.map +1 -0
  75. package/dist/streams/stream.d.ts +40 -0
  76. package/dist/streams/stream.js +139 -0
  77. package/dist/streams/stream.js.map +1 -0
  78. package/dist/streams/utils.d.ts +1 -0
  79. package/dist/streams/utils.js +13 -0
  80. package/dist/streams/utils.js.map +1 -0
  81. package/dist/streams/variant.d.ts +122 -0
  82. package/dist/streams/variant.js +266 -0
  83. package/dist/streams/variant.js.map +1 -0
  84. package/dist/types/custom_sqlite_value.d.ts +38 -0
  85. package/dist/types/custom_sqlite_value.js +50 -0
  86. package/dist/types/custom_sqlite_value.js.map +1 -0
  87. package/dist/types/time.d.ts +33 -0
  88. package/dist/types/time.js +67 -0
  89. package/dist/types/time.js.map +1 -0
  90. package/dist/types.d.ts +52 -9
  91. package/dist/types.js +28 -2
  92. package/dist/types.js.map +1 -1
  93. package/dist/utils.d.ts +9 -6
  94. package/dist/utils.js +42 -17
  95. package/dist/utils.js.map +1 -1
  96. package/package.json +3 -3
  97. package/schema/sync_rules.json +84 -2
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,aAAa,CAAC;AAC5B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0CAA0C,CAAC;AACzD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0CAA0C,CAAC;AACzD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import ajvModule from 'ajv';
2
+ import { CompatibilityEdition, CompatibilityOption } from './compatibility.js';
2
3
  // Hack to make this work both in NodeJS and a browser
3
4
  const Ajv = ajvModule.default ?? ajvModule;
4
5
  const ajv = new Ajv({ allErrors: true, verbose: true });
@@ -48,6 +49,36 @@ export const syncRulesSchema = {
48
49
  }
49
50
  }
50
51
  },
52
+ streams: {
53
+ type: 'object',
54
+ description: 'List of stream definitions',
55
+ examples: [{ user_details: { query: 'select * from users where id = auth.user_id()' } }],
56
+ patternProperties: {
57
+ '.*': {
58
+ type: 'object',
59
+ required: ['query'],
60
+ examples: [{ query: ['select * from mytable'] }],
61
+ properties: {
62
+ accept_potentially_dangerous_queries: {
63
+ description: 'If true, disables warnings on potentially dangerous queries',
64
+ type: 'boolean'
65
+ },
66
+ auto_subscribe: {
67
+ description: 'Whether clients will subscribe to this stream by default.',
68
+ type: 'boolean'
69
+ },
70
+ priority: {
71
+ description: 'Priority for the bucket (lower values indicate higher priority).',
72
+ type: 'integer'
73
+ },
74
+ query: {
75
+ description: 'The SQL query defining content to sync in this stream.',
76
+ type: 'string'
77
+ }
78
+ }
79
+ }
80
+ }
81
+ },
51
82
  event_definitions: {
52
83
  type: 'object',
53
84
  description: 'Record of sync replication event definitions',
@@ -76,9 +107,31 @@ export const syncRulesSchema = {
76
107
  }
77
108
  }
78
109
  }
110
+ },
111
+ config: {
112
+ type: 'object',
113
+ description: 'Config declaring the compatibility level used to parse these definitions.',
114
+ properties: {
115
+ edition: {
116
+ type: 'integer',
117
+ default: CompatibilityEdition.LEGACY,
118
+ minimum: CompatibilityEdition.LEGACY,
119
+ exclusiveMaximum: CompatibilityEdition.SYNC_STREAMS + 1
120
+ },
121
+ ...Object.fromEntries(Object.entries(CompatibilityOption.byName).map((e) => {
122
+ return [
123
+ e[0],
124
+ {
125
+ type: 'boolean',
126
+ description: `Enabled by default starting from edition ${e[1].fixedIn}: ${e[1].description}`
127
+ }
128
+ ];
129
+ }))
130
+ },
131
+ additionalProperties: false
79
132
  }
80
133
  },
81
- required: ['bucket_definitions'],
134
+ anyOf: [{ required: ['bucket_definitions'] }, { required: ['streams'] }],
82
135
  additionalProperties: false
83
136
  };
84
137
  export const validateSyncRulesSchema = ajv.compile(syncRulesSchema);
@@ -1 +1 @@
1
- {"version":3,"file":"json_schema.js","sourceRoot":"","sources":["../src/json_schema.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,sDAAsD;AACtD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC;AAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,kBAAkB,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,CAAC;YACzD,iBAAiB,EAAE;gBACjB,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,MAAM,CAAC;oBAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC;oBAC/C,UAAU,EAAE;wBACV,oCAAoC,EAAE;4BACpC,WAAW,EAAE,6DAA6D;4BAC1E,IAAI,EAAE,SAAS;yBAChB;wBACD,QAAQ,EAAE;4BACR,WAAW,EAAE,kEAAkE;4BAC/E,IAAI,EAAE,SAAS;yBAChB;wBACD,UAAU,EAAE;4BACV,WAAW,EAAE,sBAAsB;4BACnC,KAAK,EAAE;gCACL,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;gCAClD;oCACE,IAAI,EAAE,OAAO;oCACb,WAAW,EAAE,mBAAmB;oCAChC,KAAK,EAAE;wCACL,IAAI,EAAE,QAAQ;qCACf;iCACF;6BACF;yBACF;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,OAAO;4BACb,WAAW,EAAE,cAAc;4BAC3B,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;6BACf;yBACF;qBACF;oBACD,oBAAoB,EAAE,KAAK;iBAC5B;aACF;SACF;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE;gBACR;oBACE,iBAAiB,EAAE;wBACjB,QAAQ,EAAE,CAAC,wDAAwD,CAAC;qBACrE;iBACF;aACF;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE;oBACJ,IAAI,EAAE,CAAC,QAAQ,CAAC;oBAChB,QAAQ,EAAE,CAAC,UAAU,CAAC;oBACtB,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,wDAAwD,CAAC,EAAE,CAAC;oBACpF,UAAU,EAAE;wBACV,QAAQ,EAAE;4BACR,WAAW,EAAE,wEAAwE;4BACrF,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;6BACf;yBACF;wBACD,oBAAoB,EAAE,KAAK;wBAC3B,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF;SACF;KACF;IACD,QAAQ,EAAE,CAAC,oBAAoB,CAAC;IAChC,oBAAoB,EAAE,KAAK;CACnB,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAQ,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC"}
1
+ {"version":3,"file":"json_schema.js","sourceRoot":"","sources":["../src/json_schema.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@ import { ExpressionType } from './ExpressionType.js';
2
2
  import { ParameterValueSet, SqliteValue } from './types.js';
3
3
  export interface SqlParameterFunction {
4
4
  readonly debugName: string;
5
- call: (parameters: ParameterValueSet) => SqliteValue;
5
+ call: (parameters: ParameterValueSet, ...args: SqliteValue[]) => SqliteValue;
6
6
  getReturnType(): ExpressionType;
7
+ parameterCount: number;
7
8
  /** request.user_id(), request.jwt(), token_parameters.* */
8
9
  usesAuthenticatedRequestParameters: boolean;
9
10
  /** request.parameters(), user_parameters.* */
@@ -11,9 +12,28 @@ export interface SqlParameterFunction {
11
12
  detail: string;
12
13
  documentation: string;
13
14
  }
14
- export declare const REQUEST_FUNCTIONS_NAMED: {
15
+ /**
16
+ * Defines a `parameters` function and a `parameter` function.
17
+ *
18
+ * The `parameters` function extracts a JSON object from the {@link ParameterValueSet} while the `parameter` function
19
+ * takes a second argument (a JSON path or a single key) to extract.
20
+ */
21
+ export declare function parameterFunctions(options: {
22
+ schema: string;
23
+ extractJsonString: (v: ParameterValueSet) => string;
24
+ extractJsonParsed: (v: ParameterValueSet) => any;
25
+ sourceDescription: string;
26
+ sourceDocumentation: string;
27
+ usesAuthenticatedRequestParameters: boolean;
28
+ usesUnauthenticatedRequestParameters: boolean;
29
+ }): {
30
+ parameters: SqlParameterFunction;
31
+ parameter: SqlParameterFunction;
32
+ };
33
+ export declare function globalRequestParameterFunctions(schema: string): {
15
34
  parameters: SqlParameterFunction;
16
- jwt: SqlParameterFunction;
17
- user_id: SqlParameterFunction;
35
+ parameter: SqlParameterFunction;
18
36
  };
37
+ export declare const request_jwt: SqlParameterFunction;
38
+ export declare const request_user_id: SqlParameterFunction;
19
39
  export declare const REQUEST_FUNCTIONS: Record<string, SqlParameterFunction>;
@@ -1,19 +1,69 @@
1
1
  import { ExpressionType } from './ExpressionType.js';
2
- const request_parameters = {
3
- debugName: 'request.parameters',
4
- call(parameters) {
5
- return parameters.rawUserParameters;
6
- },
7
- getReturnType() {
8
- return ExpressionType.TEXT;
9
- },
10
- detail: 'Unauthenticated request parameters as JSON',
11
- documentation: 'Returns parameters passed by the client as a JSON string. These parameters are not authenticated - any value can be passed in by the client.',
12
- usesAuthenticatedRequestParameters: false,
13
- usesUnauthenticatedRequestParameters: true
14
- };
15
- const request_jwt = {
2
+ import { CompatibilityContext, CompatibilityEdition } from './compatibility.js';
3
+ import { generateSqlFunctions } from './sql_functions.js';
4
+ const jsonExtractFromRecord = generateSqlFunctions(new CompatibilityContext(CompatibilityEdition.SYNC_STREAMS)).jsonExtractFromRecord;
5
+ /**
6
+ * Defines a `parameters` function and a `parameter` function.
7
+ *
8
+ * The `parameters` function extracts a JSON object from the {@link ParameterValueSet} while the `parameter` function
9
+ * takes a second argument (a JSON path or a single key) to extract.
10
+ */
11
+ export function parameterFunctions(options) {
12
+ const allParameters = {
13
+ debugName: `${options.schema}.parameters`,
14
+ parameterCount: 0,
15
+ call(parameters) {
16
+ return options.extractJsonString(parameters);
17
+ },
18
+ getReturnType() {
19
+ return ExpressionType.TEXT;
20
+ },
21
+ detail: options.sourceDescription,
22
+ documentation: `Returns ${options.sourceDocumentation}`,
23
+ usesAuthenticatedRequestParameters: options.usesAuthenticatedRequestParameters,
24
+ usesUnauthenticatedRequestParameters: options.usesUnauthenticatedRequestParameters
25
+ };
26
+ const extractParameter = {
27
+ debugName: `${options.schema}.parameter`,
28
+ parameterCount: 1,
29
+ call(parameters, path) {
30
+ const parsed = options.extractJsonParsed(parameters);
31
+ // jsonExtractFromRecord uses the correct behavior of only splitting the path if it starts with $.
32
+ // This particular JSON extract function always had that behavior, so we don't need to take backwards
33
+ // compatibility into account.
34
+ if (typeof path == 'string') {
35
+ return jsonExtractFromRecord(parsed, path, '->>');
36
+ }
37
+ return null;
38
+ },
39
+ getReturnType() {
40
+ return ExpressionType.ANY;
41
+ },
42
+ detail: `Extract value from ${options.sourceDescription}`,
43
+ documentation: `Returns an extracted value (via the key as the second argument) from ${options.sourceDocumentation}`,
44
+ usesAuthenticatedRequestParameters: options.usesAuthenticatedRequestParameters,
45
+ usesUnauthenticatedRequestParameters: options.usesUnauthenticatedRequestParameters
46
+ };
47
+ return { parameters: allParameters, parameter: extractParameter };
48
+ }
49
+ export function globalRequestParameterFunctions(schema) {
50
+ return parameterFunctions({
51
+ schema,
52
+ extractJsonString: function (v) {
53
+ return v.rawUserParameters;
54
+ },
55
+ extractJsonParsed: function (v) {
56
+ return v.userParameters;
57
+ },
58
+ sourceDescription: 'Unauthenticated request parameters as JSON',
59
+ sourceDocumentation: 'parameters passed by the client as a JSON string. These parameters are not authenticated - any value can be passed in by the client.',
60
+ usesAuthenticatedRequestParameters: false,
61
+ usesUnauthenticatedRequestParameters: true
62
+ });
63
+ }
64
+ export const request_jwt = {
16
65
  debugName: 'request.jwt',
66
+ parameterCount: 0,
17
67
  call(parameters) {
18
68
  return parameters.rawTokenPayload;
19
69
  },
@@ -25,8 +75,9 @@ const request_jwt = {
25
75
  usesAuthenticatedRequestParameters: true,
26
76
  usesUnauthenticatedRequestParameters: false
27
77
  };
28
- const request_user_id = {
78
+ export const request_user_id = {
29
79
  debugName: 'request.user_id',
80
+ parameterCount: 0,
30
81
  call(parameters) {
31
82
  return parameters.userId;
32
83
  },
@@ -38,8 +89,8 @@ const request_user_id = {
38
89
  usesAuthenticatedRequestParameters: true,
39
90
  usesUnauthenticatedRequestParameters: false
40
91
  };
41
- export const REQUEST_FUNCTIONS_NAMED = {
42
- parameters: request_parameters,
92
+ const REQUEST_FUNCTIONS_NAMED = {
93
+ ...globalRequestParameterFunctions('request'),
43
94
  jwt: request_jwt,
44
95
  user_id: request_user_id
45
96
  };
@@ -1 +1 @@
1
- {"version":3,"file":"request_functions.js","sourceRoot":"","sources":["../src/request_functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAerD,MAAM,kBAAkB,GAAyB;IAC/C,SAAS,EAAE,oBAAoB;IAC/B,IAAI,CAAC,UAA6B;QAChC,OAAO,UAAU,CAAC,iBAAiB,CAAC;IACtC,CAAC;IACD,aAAa;QACX,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,MAAM,EAAE,4CAA4C;IACpD,aAAa,EACX,8IAA8I;IAChJ,kCAAkC,EAAE,KAAK;IACzC,oCAAoC,EAAE,IAAI;CAC3C,CAAC;AAEF,MAAM,WAAW,GAAyB;IACxC,SAAS,EAAE,aAAa;IACxB,IAAI,CAAC,UAA6B;QAChC,OAAO,UAAU,CAAC,eAAe,CAAC;IACpC,CAAC;IACD,aAAa;QACX,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,MAAM,EAAE,qBAAqB;IAC7B,aAAa,EAAE,kFAAkF;IACjG,kCAAkC,EAAE,IAAI;IACxC,oCAAoC,EAAE,KAAK;CAC5C,CAAC;AAEF,MAAM,eAAe,GAAyB;IAC5C,SAAS,EAAE,iBAAiB;IAC5B,IAAI,CAAC,UAA6B;QAChC,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,aAAa;QACX,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,MAAM,EAAE,uBAAuB;IAC/B,aAAa,EAAE,uEAAuE;IACtF,kCAAkC,EAAE,IAAI;IACxC,oCAAoC,EAAE,KAAK;CAC5C,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,kBAAkB;IAC9B,GAAG,EAAE,WAAW;IAChB,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAyC,uBAAuB,CAAC"}
1
+ {"version":3,"file":"request_functions.js","sourceRoot":"","sources":["../src/request_functions.ts"],"names":[],"mappings":"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"}
@@ -2,18 +2,8 @@ import { TYPE_INTEGER, TYPE_REAL, TYPE_TEXT } from '../ExpressionType.js';
2
2
  export class SchemaGenerator {
3
3
  getAllTables(source, schema) {
4
4
  let tables = {};
5
- for (let descriptor of source.bucketDescriptors) {
6
- for (let query of descriptor.dataQueries) {
7
- const outTables = query.getColumnOutputs(schema);
8
- for (let table of outTables) {
9
- tables[table.name] ??= {};
10
- for (let column of table.columns) {
11
- if (column.name != 'id') {
12
- tables[table.name][column.name] ??= column;
13
- }
14
- }
15
- }
16
- }
5
+ for (let descriptor of source.bucketSources) {
6
+ descriptor.resolveResultSets(schema, tables);
17
7
  }
18
8
  return Object.entries(tables).map(([name, columns]) => {
19
9
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/SchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAQ5F,MAAM,OAAgB,eAAe;IACzB,YAAY,CAAC,MAAoB,EAAE,MAAoB;QAC/D,IAAI,MAAM,GAAqD,EAAE,CAAC;QAElE,KAAK,IAAI,UAAU,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAChD,KAAK,IAAI,KAAK,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACjD,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC1B,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACjC,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;4BACxB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,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,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../../src/schema-generators/SchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAQ5F,MAAM,OAAgB,eAAe;IACzB,YAAY,CAAC,MAAoB,EAAE,MAAoB;QAC/D,IAAI,MAAM,GAAqD,EAAE,CAAC;QAElE,KAAK,IAAI,UAAU,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5C,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,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
@@ -2,8 +2,10 @@ import { Expr, ExprRef, Name, NodeLocation, QName, QNameAliased, SelectedColumn
2
2
  import { nil } from 'pgsql-ast-parser/src/utils.js';
3
3
  import { BucketPriority } from './BucketDescription.js';
4
4
  import { SqlRuleError } from './errors.js';
5
- import { SqlFunction } from './sql_functions.js';
6
- import { ClauseError, CompiledClause, ParameterMatchClause, ParameterValueClause, QuerySchema, RowValueClause, StaticValueClause, TrueIfParametersMatch } from './types.js';
5
+ import { SqlParameterFunction } from './request_functions.js';
6
+ import { SqlFunction, generateSqlFunctions } from './sql_functions.js';
7
+ import { ClauseError, CompiledClause, InputParameter, ParameterMatchClause, ParameterValueClause, QueryParameters, QuerySchema, RowValueClause, StaticValueClause, TrueIfParametersMatch } from './types.js';
8
+ import { CompatibilityContext } from './compatibility.js';
7
9
  export declare const MATCH_CONST_FALSE: TrueIfParametersMatch;
8
10
  export declare const MATCH_CONST_TRUE: TrueIfParametersMatch;
9
11
  export interface SqlToolsOptions {
@@ -41,10 +43,18 @@ export interface SqlToolsOptions {
41
43
  * true if expressions on parameters are supported, e.g. upper(token_parameters.user_id)
42
44
  */
43
45
  supportsParameterExpressions?: boolean;
46
+ /**
47
+ * For each schema, all available parameter functions.
48
+ */
49
+ parameterFunctions?: Record<string, Record<string, SqlParameterFunction>>;
44
50
  /**
45
51
  * Schema for validations.
46
52
  */
47
53
  schema?: QuerySchema;
54
+ /**
55
+ * Context controling how functions should behave if we've made backwards-incompatible change to them.
56
+ */
57
+ compatibilityContext: CompatibilityContext;
48
58
  }
49
59
  export declare class SqlTools {
50
60
  readonly defaultTable?: string;
@@ -58,6 +68,9 @@ export declare class SqlTools {
58
68
  readonly errors: SqlRuleError[];
59
69
  readonly supportsExpandingParameters: boolean;
60
70
  readonly supportsParameterExpressions: boolean;
71
+ readonly parameterFunctions: Record<string, Record<string, SqlParameterFunction>>;
72
+ readonly compatibilityContext: CompatibilityContext;
73
+ readonly functions: ReturnType<typeof generateSqlFunctions>;
61
74
  schema?: QuerySchema;
62
75
  constructor(options: SqlToolsOptions);
63
76
  error(message: string, expr: NodeLocation | Expr | undefined): ClauseError;
@@ -75,6 +88,16 @@ export declare class SqlTools {
75
88
  * Given an expression, return a compiled clause.
76
89
  */
77
90
  compileClause(expr: Expr | nil): CompiledClause;
91
+ compileInClause(left: Expr, leftFilter: CompiledClause, right: Expr, rightFilter: CompiledClause): CompiledClause;
92
+ compileOverlapClause(left: Expr, leftFilter: CompiledClause, right: Expr, rightFilter: CompiledClause): CompiledClause;
93
+ parameterMatchClause(staticFilter: RowValueClause, otherFilter: ParameterValueClause): {
94
+ error: false;
95
+ inputParameters: InputParameter[];
96
+ unbounded: false;
97
+ filterRow(tables: QueryParameters): TrueIfParametersMatch;
98
+ usesAuthenticatedRequestParameters: boolean;
99
+ usesUnauthenticatedRequestParameters: boolean;
100
+ };
78
101
  /**
79
102
  * "some_column" => "some_column"
80
103
  * "table.some_column" => "some_column".