@syncular/core 0.0.2-128 → 0.0.2-133
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/dist/column-codecs.d.ts.map +1 -1
- package/dist/column-codecs.js +9 -2
- package/dist/column-codecs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/kysely-column-codecs.d.ts +15 -0
- package/dist/kysely-column-codecs.d.ts.map +1 -0
- package/dist/kysely-column-codecs.js +466 -0
- package/dist/kysely-column-codecs.js.map +1 -0
- package/package.json +1 -1
- package/src/column-codecs.ts +6 -2
- package/src/index.ts +2 -2
- package/src/kysely-column-codecs.ts +590 -0
- package/dist/kysely-serialize.d.ts +0 -22
- package/dist/kysely-serialize.d.ts.map +0 -1
- package/dist/kysely-serialize.js +0 -147
- package/dist/kysely-serialize.js.map +0 -1
- package/src/kysely-serialize.ts +0 -214
package/dist/kysely-serialize.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { OperationNodeTransformer, } from 'kysely';
|
|
2
|
-
const dateRegex = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?$/;
|
|
3
|
-
function isBufferLike(value) {
|
|
4
|
-
return 'buffer' in value;
|
|
5
|
-
}
|
|
6
|
-
function skipTransform(parameter) {
|
|
7
|
-
if (parameter === undefined ||
|
|
8
|
-
parameter === null ||
|
|
9
|
-
typeof parameter === 'bigint' ||
|
|
10
|
-
typeof parameter === 'number') {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
if (typeof parameter === 'object') {
|
|
14
|
-
return isBufferLike(parameter);
|
|
15
|
-
}
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
function maybeJson(parameter) {
|
|
19
|
-
return ((parameter.startsWith('{') && parameter.endsWith('}')) ||
|
|
20
|
-
(parameter.startsWith('[') && parameter.endsWith(']')));
|
|
21
|
-
}
|
|
22
|
-
const defaultSerializer = (parameter) => {
|
|
23
|
-
if (skipTransform(parameter) || typeof parameter === 'string') {
|
|
24
|
-
return parameter;
|
|
25
|
-
}
|
|
26
|
-
if (typeof parameter === 'boolean') {
|
|
27
|
-
return String(parameter);
|
|
28
|
-
}
|
|
29
|
-
if (parameter instanceof Date) {
|
|
30
|
-
return parameter.toISOString();
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
return JSON.stringify(parameter);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return parameter;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
const defaultDeserializer = (parameter) => {
|
|
40
|
-
if (skipTransform(parameter)) {
|
|
41
|
-
return parameter;
|
|
42
|
-
}
|
|
43
|
-
if (typeof parameter !== 'string') {
|
|
44
|
-
return parameter;
|
|
45
|
-
}
|
|
46
|
-
if (parameter === 'true')
|
|
47
|
-
return true;
|
|
48
|
-
if (parameter === 'false')
|
|
49
|
-
return false;
|
|
50
|
-
if (dateRegex.test(parameter))
|
|
51
|
-
return new Date(parameter);
|
|
52
|
-
if (maybeJson(parameter)) {
|
|
53
|
-
try {
|
|
54
|
-
return JSON.parse(parameter);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return parameter;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return parameter;
|
|
61
|
-
};
|
|
62
|
-
class SerializeParametersTransformer extends OperationNodeTransformer {
|
|
63
|
-
#serializer;
|
|
64
|
-
constructor(serializer) {
|
|
65
|
-
super();
|
|
66
|
-
this.#serializer = serializer;
|
|
67
|
-
}
|
|
68
|
-
transformPrimitiveValueList(node) {
|
|
69
|
-
return {
|
|
70
|
-
...node,
|
|
71
|
-
values: node.values.map((v) => this.#serializer(v)),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
transformColumnUpdate(node, queryId) {
|
|
75
|
-
const valueNode = node.value;
|
|
76
|
-
if (valueNode.kind !== 'ValueNode') {
|
|
77
|
-
return super.transformColumnUpdate(node, queryId);
|
|
78
|
-
}
|
|
79
|
-
const currentValue = valueNode.value;
|
|
80
|
-
const serializedValue = this.#serializer(currentValue);
|
|
81
|
-
if (currentValue === serializedValue) {
|
|
82
|
-
return super.transformColumnUpdate(node, queryId);
|
|
83
|
-
}
|
|
84
|
-
const updatedValue = {
|
|
85
|
-
...valueNode,
|
|
86
|
-
value: serializedValue,
|
|
87
|
-
};
|
|
88
|
-
return super.transformColumnUpdate({ ...node, value: updatedValue }, queryId);
|
|
89
|
-
}
|
|
90
|
-
transformValue(node) {
|
|
91
|
-
return { ...node, value: this.#serializer(node.value) };
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
class BaseSerializePlugin {
|
|
95
|
-
#transformer;
|
|
96
|
-
#deserializer;
|
|
97
|
-
#skipNodeSet;
|
|
98
|
-
#ctx;
|
|
99
|
-
/**
|
|
100
|
-
* Base class for {@link SerializePlugin}, without default options.
|
|
101
|
-
*/
|
|
102
|
-
constructor(serializer, deserializer, skipNodeKind) {
|
|
103
|
-
this.#transformer = new SerializeParametersTransformer(serializer);
|
|
104
|
-
this.#deserializer = deserializer;
|
|
105
|
-
if (skipNodeKind.length > 0) {
|
|
106
|
-
this.#skipNodeSet = new Set(skipNodeKind);
|
|
107
|
-
this.#ctx = new WeakSet();
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
this.#skipNodeSet = null;
|
|
111
|
-
this.#ctx = null;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
transformQuery({ node, queryId, }) {
|
|
115
|
-
if (this.#skipNodeSet?.has(node.kind)) {
|
|
116
|
-
this.#ctx?.add(queryId);
|
|
117
|
-
return node;
|
|
118
|
-
}
|
|
119
|
-
return this.#transformer.transformNode(node);
|
|
120
|
-
}
|
|
121
|
-
async transformResult({ result, queryId, }) {
|
|
122
|
-
if (this.#ctx?.has(queryId)) {
|
|
123
|
-
return result;
|
|
124
|
-
}
|
|
125
|
-
return { ...result, rows: this.#parseRows(result.rows) };
|
|
126
|
-
}
|
|
127
|
-
#parseRows(rows) {
|
|
128
|
-
const out = [];
|
|
129
|
-
for (const row of rows) {
|
|
130
|
-
if (!row)
|
|
131
|
-
continue;
|
|
132
|
-
const parsed = {};
|
|
133
|
-
for (const [key, value] of Object.entries(row)) {
|
|
134
|
-
parsed[key] = this.#deserializer(value);
|
|
135
|
-
}
|
|
136
|
-
out.push(parsed);
|
|
137
|
-
}
|
|
138
|
-
return out;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
export class SerializePlugin extends BaseSerializePlugin {
|
|
142
|
-
constructor(options = {}) {
|
|
143
|
-
const { serializer = defaultSerializer, deserializer = defaultDeserializer, skipNodeKind = [], } = options;
|
|
144
|
-
super(serializer, deserializer, skipNodeKind);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=kysely-serialize.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-serialize.js","sourceRoot":"","sources":["../src/kysely-serialize.ts"],"names":[],"mappings":"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"}
|
package/src/kysely-serialize.ts
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ColumnUpdateNode,
|
|
3
|
-
type KyselyPlugin,
|
|
4
|
-
OperationNodeTransformer,
|
|
5
|
-
type PluginTransformQueryArgs,
|
|
6
|
-
type PluginTransformResultArgs,
|
|
7
|
-
type PrimitiveValueListNode,
|
|
8
|
-
type QueryResult,
|
|
9
|
-
type RootOperationNode,
|
|
10
|
-
type UnknownRow,
|
|
11
|
-
type ValueNode,
|
|
12
|
-
} from 'kysely';
|
|
13
|
-
|
|
14
|
-
type Serializer = (parameter: unknown) => unknown;
|
|
15
|
-
type Deserializer = (parameter: unknown) => unknown;
|
|
16
|
-
|
|
17
|
-
const dateRegex = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?$/;
|
|
18
|
-
|
|
19
|
-
function isBufferLike(value: object): value is { buffer: unknown } {
|
|
20
|
-
return 'buffer' in value;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function skipTransform(parameter: unknown): boolean {
|
|
24
|
-
if (
|
|
25
|
-
parameter === undefined ||
|
|
26
|
-
parameter === null ||
|
|
27
|
-
typeof parameter === 'bigint' ||
|
|
28
|
-
typeof parameter === 'number'
|
|
29
|
-
) {
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (typeof parameter === 'object') {
|
|
34
|
-
return isBufferLike(parameter);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function maybeJson(parameter: string): boolean {
|
|
41
|
-
return (
|
|
42
|
-
(parameter.startsWith('{') && parameter.endsWith('}')) ||
|
|
43
|
-
(parameter.startsWith('[') && parameter.endsWith(']'))
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const defaultSerializer: Serializer = (parameter) => {
|
|
48
|
-
if (skipTransform(parameter) || typeof parameter === 'string') {
|
|
49
|
-
return parameter;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (typeof parameter === 'boolean') {
|
|
53
|
-
return String(parameter);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (parameter instanceof Date) {
|
|
57
|
-
return parameter.toISOString();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
return JSON.stringify(parameter);
|
|
62
|
-
} catch {
|
|
63
|
-
return parameter;
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const defaultDeserializer: Deserializer = (parameter) => {
|
|
68
|
-
if (skipTransform(parameter)) {
|
|
69
|
-
return parameter;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (typeof parameter !== 'string') {
|
|
73
|
-
return parameter;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (parameter === 'true') return true;
|
|
77
|
-
if (parameter === 'false') return false;
|
|
78
|
-
if (dateRegex.test(parameter)) return new Date(parameter);
|
|
79
|
-
|
|
80
|
-
if (maybeJson(parameter)) {
|
|
81
|
-
try {
|
|
82
|
-
return JSON.parse(parameter);
|
|
83
|
-
} catch {
|
|
84
|
-
return parameter;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return parameter;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
class SerializeParametersTransformer extends OperationNodeTransformer {
|
|
92
|
-
readonly #serializer: Serializer;
|
|
93
|
-
|
|
94
|
-
constructor(serializer: Serializer) {
|
|
95
|
-
super();
|
|
96
|
-
this.#serializer = serializer;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
protected override transformPrimitiveValueList(
|
|
100
|
-
node: PrimitiveValueListNode
|
|
101
|
-
): PrimitiveValueListNode {
|
|
102
|
-
return {
|
|
103
|
-
...node,
|
|
104
|
-
values: node.values.map((v) => this.#serializer(v)),
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
protected override transformColumnUpdate(
|
|
109
|
-
node: ColumnUpdateNode,
|
|
110
|
-
queryId?: { readonly queryId: string }
|
|
111
|
-
): ColumnUpdateNode {
|
|
112
|
-
const valueNode = node.value;
|
|
113
|
-
if (valueNode.kind !== 'ValueNode') {
|
|
114
|
-
return super.transformColumnUpdate(node, queryId);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const currentValue = (valueNode as ValueNode).value;
|
|
118
|
-
const serializedValue = this.#serializer(currentValue);
|
|
119
|
-
if (currentValue === serializedValue) {
|
|
120
|
-
return super.transformColumnUpdate(node, queryId);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const updatedValue: ValueNode = {
|
|
124
|
-
...(valueNode as ValueNode),
|
|
125
|
-
value: serializedValue,
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
return super.transformColumnUpdate(
|
|
129
|
-
{ ...node, value: updatedValue },
|
|
130
|
-
queryId
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
protected override transformValue(node: ValueNode): ValueNode {
|
|
135
|
-
return { ...node, value: this.#serializer(node.value) };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
class BaseSerializePlugin implements KyselyPlugin {
|
|
140
|
-
readonly #transformer: SerializeParametersTransformer;
|
|
141
|
-
readonly #deserializer: Deserializer;
|
|
142
|
-
readonly #skipNodeSet: Set<RootOperationNode['kind']> | null;
|
|
143
|
-
readonly #ctx: WeakSet<object> | null;
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Base class for {@link SerializePlugin}, without default options.
|
|
147
|
-
*/
|
|
148
|
-
constructor(
|
|
149
|
-
serializer: Serializer,
|
|
150
|
-
deserializer: Deserializer,
|
|
151
|
-
skipNodeKind: Array<RootOperationNode['kind']>
|
|
152
|
-
) {
|
|
153
|
-
this.#transformer = new SerializeParametersTransformer(serializer);
|
|
154
|
-
this.#deserializer = deserializer;
|
|
155
|
-
if (skipNodeKind.length > 0) {
|
|
156
|
-
this.#skipNodeSet = new Set(skipNodeKind);
|
|
157
|
-
this.#ctx = new WeakSet<object>();
|
|
158
|
-
} else {
|
|
159
|
-
this.#skipNodeSet = null;
|
|
160
|
-
this.#ctx = null;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
transformQuery({
|
|
165
|
-
node,
|
|
166
|
-
queryId,
|
|
167
|
-
}: PluginTransformQueryArgs): RootOperationNode {
|
|
168
|
-
if (this.#skipNodeSet?.has(node.kind)) {
|
|
169
|
-
this.#ctx?.add(queryId);
|
|
170
|
-
return node;
|
|
171
|
-
}
|
|
172
|
-
return this.#transformer.transformNode(node);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async transformResult({
|
|
176
|
-
result,
|
|
177
|
-
queryId,
|
|
178
|
-
}: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
179
|
-
if (this.#ctx?.has(queryId)) {
|
|
180
|
-
return result;
|
|
181
|
-
}
|
|
182
|
-
return { ...result, rows: this.#parseRows(result.rows) };
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
#parseRows(rows: UnknownRow[]): UnknownRow[] {
|
|
186
|
-
const out: UnknownRow[] = [];
|
|
187
|
-
for (const row of rows) {
|
|
188
|
-
if (!row) continue;
|
|
189
|
-
const parsed: Record<string, unknown> = {};
|
|
190
|
-
for (const [key, value] of Object.entries(row)) {
|
|
191
|
-
parsed[key] = this.#deserializer(value);
|
|
192
|
-
}
|
|
193
|
-
out.push(parsed);
|
|
194
|
-
}
|
|
195
|
-
return out;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
interface SerializePluginOptions {
|
|
200
|
-
serializer?: Serializer;
|
|
201
|
-
deserializer?: Deserializer;
|
|
202
|
-
skipNodeKind?: Array<RootOperationNode['kind']>;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export class SerializePlugin extends BaseSerializePlugin {
|
|
206
|
-
constructor(options: SerializePluginOptions = {}) {
|
|
207
|
-
const {
|
|
208
|
-
serializer = defaultSerializer,
|
|
209
|
-
deserializer = defaultDeserializer,
|
|
210
|
-
skipNodeKind = [],
|
|
211
|
-
} = options;
|
|
212
|
-
super(serializer, deserializer, skipNodeKind);
|
|
213
|
-
}
|
|
214
|
-
}
|