@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.
- package/LICENSE +67 -0
- package/README.md +3 -0
- package/dist/DartSchemaGenerator.d.ts +12 -0
- package/dist/DartSchemaGenerator.js +39 -0
- package/dist/DartSchemaGenerator.js.map +1 -0
- package/dist/ExpressionType.d.ts +33 -0
- package/dist/ExpressionType.js +61 -0
- package/dist/ExpressionType.js.map +1 -0
- package/dist/IdSequence.d.ts +4 -0
- package/dist/IdSequence.js +9 -0
- package/dist/IdSequence.js.map +1 -0
- package/dist/JsSchemaGenerator.d.ts +12 -0
- package/dist/JsSchemaGenerator.js +42 -0
- package/dist/JsSchemaGenerator.js.map +1 -0
- package/dist/SchemaGenerator.d.ts +14 -0
- package/dist/SchemaGenerator.js +26 -0
- package/dist/SchemaGenerator.js.map +1 -0
- package/dist/SourceTableInterface.d.ts +5 -0
- package/dist/SourceTableInterface.js +2 -0
- package/dist/SourceTableInterface.js.map +1 -0
- package/dist/SqlBucketDescriptor.d.ts +37 -0
- package/dist/SqlBucketDescriptor.js +111 -0
- package/dist/SqlBucketDescriptor.js.map +1 -0
- package/dist/SqlDataQuery.d.ts +39 -0
- package/dist/SqlDataQuery.js +237 -0
- package/dist/SqlDataQuery.js.map +1 -0
- package/dist/SqlParameterQuery.d.ts +43 -0
- package/dist/SqlParameterQuery.js +238 -0
- package/dist/SqlParameterQuery.js.map +1 -0
- package/dist/SqlSyncRules.d.ts +52 -0
- package/dist/SqlSyncRules.js +247 -0
- package/dist/SqlSyncRules.js.map +1 -0
- package/dist/StaticSchema.d.ts +26 -0
- package/dist/StaticSchema.js +61 -0
- package/dist/StaticSchema.js.map +1 -0
- package/dist/StaticSqlParameterQuery.d.ts +24 -0
- package/dist/StaticSqlParameterQuery.js +66 -0
- package/dist/StaticSqlParameterQuery.js.map +1 -0
- package/dist/TablePattern.d.ts +17 -0
- package/dist/TablePattern.js +56 -0
- package/dist/TablePattern.js.map +1 -0
- package/dist/TableQuerySchema.d.ts +9 -0
- package/dist/TableQuerySchema.js +34 -0
- package/dist/TableQuerySchema.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.js +58 -0
- package/dist/errors.js.map +1 -0
- package/dist/generators.d.ts +6 -0
- package/dist/generators.js +7 -0
- package/dist/generators.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/json_schema.d.ts +3 -0
- package/dist/json_schema.js +48 -0
- package/dist/json_schema.js.map +1 -0
- package/dist/sql_filters.d.ts +91 -0
- package/dist/sql_filters.js +506 -0
- package/dist/sql_filters.js.map +1 -0
- package/dist/sql_functions.d.ts +54 -0
- package/dist/sql_functions.js +773 -0
- package/dist/sql_functions.js.map +1 -0
- package/dist/sql_support.d.ts +22 -0
- package/dist/sql_support.js +213 -0
- package/dist/sql_support.js.map +1 -0
- package/dist/types.d.ts +174 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +45 -0
- package/dist/utils.js +173 -0
- package/dist/utils.js.map +1 -0
- package/package.json +29 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { SQLITE_FALSE, SQLITE_TRUE } from './sql_support.js';
|
|
2
|
+
import { JsonContainer } from '@powersync/service-jsonbig';
|
|
3
|
+
import { JSONBig, stringifyRaw } from '@powersync/service-jsonbig';
|
|
4
|
+
export function isSelectStatement(q) {
|
|
5
|
+
return q.type == 'select';
|
|
6
|
+
}
|
|
7
|
+
export function getBucketId(descriptor_id, bucket_parameters, params) {
|
|
8
|
+
// Important: REAL and INTEGER values matching the same number needs the same representation in the bucket name.
|
|
9
|
+
const paramArray = bucket_parameters.map((name) => params[`bucket.${name}`]);
|
|
10
|
+
return `${descriptor_id}${JSONBucketNameSerialize.stringify(paramArray)}`;
|
|
11
|
+
}
|
|
12
|
+
const DEPTH_LIMIT = 10;
|
|
13
|
+
/**
|
|
14
|
+
* SqliteRow -> SqliteJsonRow.
|
|
15
|
+
*
|
|
16
|
+
* Use wherever data should be persisted.
|
|
17
|
+
*
|
|
18
|
+
* Basically just removes Uint8Array.
|
|
19
|
+
*/
|
|
20
|
+
export function filterJsonRow(data) {
|
|
21
|
+
let record = {};
|
|
22
|
+
for (let key of Object.keys(data)) {
|
|
23
|
+
const value = data[key];
|
|
24
|
+
if (isJsonValue(value)) {
|
|
25
|
+
record[key] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return record;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert a parsed JSON scalar value to SqliteValue.
|
|
32
|
+
*
|
|
33
|
+
* Types specifically not supported in output are `boolean` and `undefined`.
|
|
34
|
+
*/
|
|
35
|
+
export function jsonValueToSqlite(value) {
|
|
36
|
+
if (typeof value == 'boolean') {
|
|
37
|
+
return value ? SQLITE_TRUE : SQLITE_FALSE;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
return value ?? null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function isJsonValue(value) {
|
|
44
|
+
return value == null || typeof value == 'string' || typeof value == 'number' || typeof value == 'bigint';
|
|
45
|
+
}
|
|
46
|
+
function filterJsonData(data, depth = 0) {
|
|
47
|
+
if (depth > DEPTH_LIMIT) {
|
|
48
|
+
// This is primarily to prevent infinite recursion
|
|
49
|
+
throw new Error(`json nested object depth exceeds the limit of ${DEPTH_LIMIT}`);
|
|
50
|
+
}
|
|
51
|
+
if (data == null) {
|
|
52
|
+
return data; // null or undefined
|
|
53
|
+
}
|
|
54
|
+
else if (typeof data == 'string' || typeof data == 'number') {
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
else if (typeof data == 'boolean') {
|
|
58
|
+
return data ? SQLITE_TRUE : SQLITE_FALSE;
|
|
59
|
+
}
|
|
60
|
+
else if (typeof data == 'bigint') {
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
else if (Array.isArray(data)) {
|
|
64
|
+
return data.map((element) => filterJsonData(element, depth + 1));
|
|
65
|
+
}
|
|
66
|
+
else if (ArrayBuffer.isView(data)) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
else if (data instanceof JsonContainer) {
|
|
70
|
+
// Can be stringified directly when using our JSONBig implementation
|
|
71
|
+
return data;
|
|
72
|
+
}
|
|
73
|
+
else if (typeof data == 'object') {
|
|
74
|
+
let record = {};
|
|
75
|
+
for (let key of Object.keys(data)) {
|
|
76
|
+
record[key] = filterJsonData(data[key], depth + 1);
|
|
77
|
+
}
|
|
78
|
+
return record;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Map database row to SqliteRow for use in sync rules.
|
|
86
|
+
*/
|
|
87
|
+
export function toSyncRulesRow(row) {
|
|
88
|
+
let record = {};
|
|
89
|
+
for (let key of Object.keys(row)) {
|
|
90
|
+
record[key] = toSyncRulesValue(row[key], false, true);
|
|
91
|
+
}
|
|
92
|
+
return record;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Convert parameter query input to a SqliteJsonRow.
|
|
96
|
+
*
|
|
97
|
+
* @param parameters Generic JSON input
|
|
98
|
+
*/
|
|
99
|
+
export function toSyncRulesParameters(parameters) {
|
|
100
|
+
let record = {};
|
|
101
|
+
for (let key of Object.keys(parameters)) {
|
|
102
|
+
record[key] = toSyncRulesValue(parameters[key], true, false);
|
|
103
|
+
}
|
|
104
|
+
return record;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Convert to a SQLITE-equivalent value: NULL, TEXT, INTEGER, REAL or BLOB.
|
|
108
|
+
*
|
|
109
|
+
* Any object or array is converted to JSON TEXT.
|
|
110
|
+
*/
|
|
111
|
+
export function toSyncRulesValue(data, autoBigNum, keepUndefined) {
|
|
112
|
+
if (data == null) {
|
|
113
|
+
// null or undefined
|
|
114
|
+
if (keepUndefined) {
|
|
115
|
+
return data;
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
else if (typeof data == 'string') {
|
|
120
|
+
return data;
|
|
121
|
+
}
|
|
122
|
+
else if (typeof data == 'number') {
|
|
123
|
+
if (Number.isInteger(data) && autoBigNum) {
|
|
124
|
+
return BigInt(data);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
return data;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (typeof data == 'bigint') {
|
|
131
|
+
return data;
|
|
132
|
+
}
|
|
133
|
+
else if (typeof data == 'boolean') {
|
|
134
|
+
return data ? SQLITE_TRUE : SQLITE_FALSE;
|
|
135
|
+
}
|
|
136
|
+
else if (Array.isArray(data)) {
|
|
137
|
+
// We may be able to avoid some parse + stringify cycles here for JsonSqliteContainer.
|
|
138
|
+
return JSONBig.stringify(data.map((element) => filterJsonData(element)));
|
|
139
|
+
}
|
|
140
|
+
else if (data instanceof Uint8Array) {
|
|
141
|
+
return data;
|
|
142
|
+
}
|
|
143
|
+
else if (data instanceof JsonContainer) {
|
|
144
|
+
return data.toString();
|
|
145
|
+
}
|
|
146
|
+
else if (typeof data == 'object') {
|
|
147
|
+
let record = {};
|
|
148
|
+
for (let key of Object.keys(data)) {
|
|
149
|
+
record[key] = filterJsonData(data[key]);
|
|
150
|
+
}
|
|
151
|
+
return JSONBig.stringify(record);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function normalizeTokenParameters(token_parameters, user_parameters) {
|
|
158
|
+
return {
|
|
159
|
+
token_parameters: toSyncRulesParameters(token_parameters),
|
|
160
|
+
user_parameters: toSyncRulesParameters(user_parameters ?? {})
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Only use this for serializing bucket names. Bucket names should never be parsed except perhaps for debug purposes.
|
|
165
|
+
*
|
|
166
|
+
* Important: REAL and INTEGER values matching the same number needs the same representation in the bucket name.
|
|
167
|
+
*/
|
|
168
|
+
export const JSONBucketNameSerialize = {
|
|
169
|
+
stringify(value, replacer, space) {
|
|
170
|
+
return stringifyRaw(value, replacer, space);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@powersync/service-sync-rules",
|
|
3
|
+
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
+
"version": "0.17.10",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/**/*"
|
|
13
|
+
],
|
|
14
|
+
"type": "module",
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@syncpoint/wkx": "^0.5.0",
|
|
17
|
+
"ajv": "^8.12.0",
|
|
18
|
+
"pgsql-ast-parser": "^11.1.0",
|
|
19
|
+
"yaml": "^2.3.1",
|
|
20
|
+
"@powersync/service-jsonbig": "^0.17.10"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "18.11.11"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"clean": "rm -r ./dist && tsc -b --clean",
|
|
27
|
+
"build": "tsc -b"
|
|
28
|
+
}
|
|
29
|
+
}
|