@xata.io/client 0.0.0-beta.26144eb → 0.0.0-beta.2781f49
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/.eslintrc.cjs +13 -0
- package/CHANGELOG.md +36 -0
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.js +8 -5
- package/dist/api/components.d.ts +27 -31
- package/dist/api/components.js +27 -31
- package/dist/api/fetcher.d.ts +15 -0
- package/dist/api/fetcher.js +23 -22
- package/dist/api/providers.js +3 -2
- package/dist/api/responses.d.ts +6 -0
- package/dist/schema/filters.d.ts +93 -17
- package/dist/schema/filters.js +0 -22
- package/dist/schema/filters.spec.d.ts +1 -0
- package/dist/schema/filters.spec.js +175 -0
- package/dist/schema/index.d.ts +5 -3
- package/dist/schema/index.js +8 -4
- package/dist/schema/operators.d.ts +17 -27
- package/dist/schema/operators.js +1 -14
- package/dist/schema/pagination.d.ts +18 -14
- package/dist/schema/pagination.js +5 -2
- package/dist/schema/query.d.ts +48 -44
- package/dist/schema/query.js +46 -31
- package/dist/schema/record.d.ts +28 -3
- package/dist/schema/record.js +11 -0
- package/dist/schema/repository.d.ts +73 -34
- package/dist/schema/repository.js +190 -99
- package/dist/schema/selection.d.ts +24 -13
- package/dist/schema/selection.spec.d.ts +1 -0
- package/dist/schema/selection.spec.js +203 -0
- package/dist/schema/sorting.d.ts +17 -0
- package/dist/schema/sorting.js +28 -0
- package/dist/schema/sorting.spec.d.ts +1 -0
- package/dist/schema/sorting.spec.js +9 -0
- package/dist/util/lang.d.ts +3 -0
- package/dist/util/lang.js +13 -1
- package/dist/util/types.d.ts +22 -1
- package/package.json +2 -2
@@ -26,21 +26,24 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
26
26
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
27
27
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
28
28
|
};
|
29
|
-
var _RestRepository_instances, _RestRepository_client, _RestRepository_fetch, _RestRepository_table, _RestRepository_getFetchProps, _BaseClient_links, _BaseClient_branch;
|
29
|
+
var _RestRepository_instances, _RestRepository_client, _RestRepository_fetch, _RestRepository_table, _RestRepository_getFetchProps, _RestRepository_insertRecordWithoutId, _RestRepository_insertRecordWithId, _RestRepository_bulkInsertTableRecords, _RestRepository_updateRecordWithID, _RestRepository_upsertRecordWithID, _RestRepository_deleteRecord, _BaseClient_links, _BaseClient_branch;
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
31
31
|
exports.BaseClient = exports.RestRespositoryFactory = exports.RestRepository = exports.Repository = void 0;
|
32
32
|
const api_1 = require("../api");
|
33
|
-
const
|
33
|
+
const lang_1 = require("../util/lang");
|
34
34
|
const pagination_1 = require("./pagination");
|
35
35
|
const query_1 = require("./query");
|
36
|
+
const record_1 = require("./record");
|
37
|
+
const sorting_1 = require("./sorting");
|
36
38
|
/**
|
37
39
|
* Common interface for performing operations on a table.
|
38
40
|
*/
|
39
41
|
class Repository extends query_1.Query {
|
40
42
|
}
|
41
43
|
exports.Repository = Repository;
|
42
|
-
class RestRepository extends
|
44
|
+
class RestRepository extends query_1.Query {
|
43
45
|
constructor(client, table) {
|
46
|
+
var _a;
|
44
47
|
super(null, table, {});
|
45
48
|
_RestRepository_instances.add(this);
|
46
49
|
_RestRepository_client.set(this, void 0);
|
@@ -49,104 +52,134 @@ class RestRepository extends Repository {
|
|
49
52
|
__classPrivateFieldSet(this, _RestRepository_client, client, "f");
|
50
53
|
__classPrivateFieldSet(this, _RestRepository_table, table, "f");
|
51
54
|
// TODO: Remove when integrating with API client
|
52
|
-
const
|
55
|
+
const globalFetch = typeof fetch !== 'undefined' ? fetch : undefined;
|
56
|
+
const fetchImpl = (_a = __classPrivateFieldGet(this, _RestRepository_client, "f").options.fetch) !== null && _a !== void 0 ? _a : globalFetch;
|
53
57
|
if (!fetchImpl) {
|
58
|
+
/** @todo add a link after docs exist */
|
54
59
|
throw new Error(`The \`fetch\` option passed to the Xata client is resolving to a falsy value and may not be correctly imported.`);
|
55
60
|
}
|
56
61
|
__classPrivateFieldSet(this, _RestRepository_fetch, fetchImpl, "f");
|
57
62
|
}
|
58
|
-
create(
|
63
|
+
create(a, b) {
|
59
64
|
return __awaiter(this, void 0, void 0, function* () {
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
workspace: '{workspaceId}',
|
64
|
-
dbBranchName: '{dbBranch}',
|
65
|
-
tableName: __classPrivateFieldGet(this, _RestRepository_table, "f")
|
66
|
-
}, body: record }, fetchProps));
|
67
|
-
const finalObject = yield this.read(response.id);
|
68
|
-
if (!finalObject) {
|
69
|
-
throw new Error('The server failed to save the record');
|
65
|
+
// Create many records
|
66
|
+
if (Array.isArray(a)) {
|
67
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_bulkInsertTableRecords).call(this, a);
|
70
68
|
}
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
69
|
+
// Create one record with id as param
|
70
|
+
if ((0, lang_1.isString)(a) && (0, lang_1.isObject)(b)) {
|
71
|
+
if (a === '')
|
72
|
+
throw new Error("The id can't be empty");
|
73
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_insertRecordWithId).call(this, a, b);
|
74
|
+
}
|
75
|
+
// Create one record with id as property
|
76
|
+
if ((0, lang_1.isObject)(a) && (0, lang_1.isString)(a.id)) {
|
77
|
+
if (a.id === '')
|
78
|
+
throw new Error("The id can't be empty");
|
79
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_insertRecordWithId).call(this, a.id, Object.assign(Object.assign({}, a), { id: undefined }));
|
80
|
+
}
|
81
|
+
// Create one record without id
|
82
|
+
if ((0, lang_1.isObject)(a)) {
|
83
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_insertRecordWithoutId).call(this, a);
|
82
84
|
}
|
83
|
-
|
85
|
+
throw new Error('Invalid arguments for create method');
|
84
86
|
});
|
85
87
|
}
|
88
|
+
// TODO: Add column support: https://github.com/xataio/openapi/issues/139
|
86
89
|
read(recordId) {
|
87
90
|
return __awaiter(this, void 0, void 0, function* () {
|
88
91
|
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
throw new Error('The server failed to save the record');
|
100
|
-
return item;
|
92
|
+
try {
|
93
|
+
const response = yield (0, api_1.getRecord)(Object.assign({ pathParams: { workspace: '{workspaceId}', dbBranchName: '{dbBranch}', tableName: __classPrivateFieldGet(this, _RestRepository_table, "f"), recordId } }, fetchProps));
|
94
|
+
return __classPrivateFieldGet(this, _RestRepository_client, "f").initObject(__classPrivateFieldGet(this, _RestRepository_table, "f"), response);
|
95
|
+
}
|
96
|
+
catch (e) {
|
97
|
+
if ((0, lang_1.isObject)(e) && e.status === 404) {
|
98
|
+
return null;
|
99
|
+
}
|
100
|
+
throw e;
|
101
|
+
}
|
101
102
|
});
|
102
103
|
}
|
103
|
-
|
104
|
+
update(a, b) {
|
104
105
|
return __awaiter(this, void 0, void 0, function* () {
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
if (
|
115
|
-
|
106
|
+
// Update many records
|
107
|
+
if (Array.isArray(a)) {
|
108
|
+
if (a.length > 100) {
|
109
|
+
// TODO: Implement bulk update when API has support for it
|
110
|
+
console.warn('Bulk update operation is not optimized in the Xata API yet, this request might be slow');
|
111
|
+
}
|
112
|
+
return Promise.all(a.map((object) => this.update(object)));
|
113
|
+
}
|
114
|
+
// Update one record with id as param
|
115
|
+
if ((0, lang_1.isString)(a) && (0, lang_1.isObject)(b)) {
|
116
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_updateRecordWithID).call(this, a, b);
|
117
|
+
}
|
118
|
+
// Update one record with id as property
|
119
|
+
if ((0, lang_1.isObject)(a) && (0, lang_1.isString)(a.id)) {
|
120
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_updateRecordWithID).call(this, a.id, Object.assign(Object.assign({}, a), { id: undefined }));
|
116
121
|
}
|
117
|
-
|
122
|
+
throw new Error('Invalid arguments for update method');
|
118
123
|
});
|
119
124
|
}
|
120
|
-
|
125
|
+
createOrUpdate(a, b) {
|
121
126
|
return __awaiter(this, void 0, void 0, function* () {
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
127
|
+
// Create or update many records
|
128
|
+
if (Array.isArray(a)) {
|
129
|
+
if (a.length > 100) {
|
130
|
+
// TODO: Implement bulk update when API has support for it
|
131
|
+
console.warn('Bulk update operation is not optimized in the Xata API yet, this request might be slow');
|
132
|
+
}
|
133
|
+
return Promise.all(a.map((object) => this.createOrUpdate(object)));
|
134
|
+
}
|
135
|
+
// Create or update one record with id as param
|
136
|
+
if ((0, lang_1.isString)(a) && (0, lang_1.isObject)(b)) {
|
137
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_upsertRecordWithID).call(this, a, b);
|
138
|
+
}
|
139
|
+
// Create or update one record with id as property
|
140
|
+
if ((0, lang_1.isObject)(a) && (0, lang_1.isString)(a.id)) {
|
141
|
+
return __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_upsertRecordWithID).call(this, a.id, Object.assign(Object.assign({}, a), { id: undefined }));
|
142
|
+
}
|
143
|
+
throw new Error('Invalid arguments for createOrUpdate method');
|
128
144
|
});
|
129
145
|
}
|
130
146
|
delete(recordId) {
|
131
147
|
return __awaiter(this, void 0, void 0, function* () {
|
132
|
-
|
133
|
-
|
148
|
+
// Delete many records
|
149
|
+
if (Array.isArray(recordId)) {
|
150
|
+
if (recordId.length > 100) {
|
151
|
+
// TODO: Implement bulk delete when API has support for it
|
152
|
+
console.warn('Bulk delete operation is not optimized in the Xata API yet, this request might be slow');
|
153
|
+
}
|
154
|
+
yield Promise.all(recordId.map((id) => this.delete(id)));
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
// Delete one record with id as param
|
158
|
+
if ((0, lang_1.isString)(recordId)) {
|
159
|
+
yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_deleteRecord).call(this, recordId);
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
// Delete one record with id as property
|
163
|
+
if ((0, lang_1.isObject)(recordId) && (0, lang_1.isString)(recordId.id)) {
|
164
|
+
yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_deleteRecord).call(this, recordId.id);
|
165
|
+
return;
|
166
|
+
}
|
167
|
+
throw new Error('Invalid arguments for delete method');
|
134
168
|
});
|
135
169
|
}
|
136
|
-
query(query
|
137
|
-
var _a
|
170
|
+
query(query) {
|
171
|
+
var _a;
|
138
172
|
return __awaiter(this, void 0, void 0, function* () {
|
139
173
|
const data = query.getQueryOptions();
|
140
174
|
const body = {
|
141
|
-
filter: Object.values(data.filter).some(Boolean) ? data.filter : undefined,
|
142
|
-
sort:
|
143
|
-
page:
|
144
|
-
columns:
|
175
|
+
filter: Object.values((_a = data.filter) !== null && _a !== void 0 ? _a : {}).some(Boolean) ? data.filter : undefined,
|
176
|
+
sort: data.sort ? (0, sorting_1.buildSortFilter)(data.sort) : undefined,
|
177
|
+
page: data.page,
|
178
|
+
columns: data.columns
|
145
179
|
};
|
146
180
|
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
147
181
|
const { meta, records: objects } = yield (0, api_1.queryTable)(Object.assign({ pathParams: { workspace: '{workspaceId}', dbBranchName: '{dbBranch}', tableName: __classPrivateFieldGet(this, _RestRepository_table, "f") }, body }, fetchProps));
|
148
182
|
const records = objects.map((record) => __classPrivateFieldGet(this, _RestRepository_client, "f").initObject(__classPrivateFieldGet(this, _RestRepository_table, "f"), record));
|
149
|
-
// TODO: We should properly type this any
|
150
183
|
return new pagination_1.Page(query, meta, records);
|
151
184
|
});
|
152
185
|
}
|
@@ -169,6 +202,72 @@ _RestRepository_client = new WeakMap(), _RestRepository_fetch = new WeakMap(), _
|
|
169
202
|
}
|
170
203
|
};
|
171
204
|
});
|
205
|
+
}, _RestRepository_insertRecordWithoutId = function _RestRepository_insertRecordWithoutId(object) {
|
206
|
+
return __awaiter(this, void 0, void 0, function* () {
|
207
|
+
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
208
|
+
const record = transformObjectLinks(object);
|
209
|
+
const response = yield (0, api_1.insertRecord)(Object.assign({ pathParams: {
|
210
|
+
workspace: '{workspaceId}',
|
211
|
+
dbBranchName: '{dbBranch}',
|
212
|
+
tableName: __classPrivateFieldGet(this, _RestRepository_table, "f")
|
213
|
+
}, body: record }, fetchProps));
|
214
|
+
const finalObject = yield this.read(response.id);
|
215
|
+
if (!finalObject) {
|
216
|
+
throw new Error('The server failed to save the record');
|
217
|
+
}
|
218
|
+
return finalObject;
|
219
|
+
});
|
220
|
+
}, _RestRepository_insertRecordWithId = function _RestRepository_insertRecordWithId(recordId, object) {
|
221
|
+
return __awaiter(this, void 0, void 0, function* () {
|
222
|
+
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
223
|
+
const record = transformObjectLinks(object);
|
224
|
+
const response = yield (0, api_1.insertRecordWithID)(Object.assign({ pathParams: {
|
225
|
+
workspace: '{workspaceId}',
|
226
|
+
dbBranchName: '{dbBranch}',
|
227
|
+
tableName: __classPrivateFieldGet(this, _RestRepository_table, "f"),
|
228
|
+
recordId
|
229
|
+
}, body: record, queryParams: { createOnly: true } }, fetchProps));
|
230
|
+
const finalObject = yield this.read(response.id);
|
231
|
+
if (!finalObject) {
|
232
|
+
throw new Error('The server failed to save the record');
|
233
|
+
}
|
234
|
+
return finalObject;
|
235
|
+
});
|
236
|
+
}, _RestRepository_bulkInsertTableRecords = function _RestRepository_bulkInsertTableRecords(objects) {
|
237
|
+
return __awaiter(this, void 0, void 0, function* () {
|
238
|
+
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
239
|
+
const records = objects.map((object) => transformObjectLinks(object));
|
240
|
+
const response = yield (0, api_1.bulkInsertTableRecords)(Object.assign({ pathParams: { workspace: '{workspaceId}', dbBranchName: '{dbBranch}', tableName: __classPrivateFieldGet(this, _RestRepository_table, "f") }, body: { records } }, fetchProps));
|
241
|
+
const finalObjects = yield this.any(...response.recordIDs.map((id) => this.filter('id', id))).getAll();
|
242
|
+
if (finalObjects.length !== objects.length) {
|
243
|
+
throw new Error('The server failed to save some records');
|
244
|
+
}
|
245
|
+
return finalObjects;
|
246
|
+
});
|
247
|
+
}, _RestRepository_updateRecordWithID = function _RestRepository_updateRecordWithID(recordId, object) {
|
248
|
+
return __awaiter(this, void 0, void 0, function* () {
|
249
|
+
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
250
|
+
const record = transformObjectLinks(object);
|
251
|
+
const response = yield (0, api_1.updateRecordWithID)(Object.assign({ pathParams: { workspace: '{workspaceId}', dbBranchName: '{dbBranch}', tableName: __classPrivateFieldGet(this, _RestRepository_table, "f"), recordId }, body: record }, fetchProps));
|
252
|
+
const item = yield this.read(response.id);
|
253
|
+
if (!item)
|
254
|
+
throw new Error('The server failed to save the record');
|
255
|
+
return item;
|
256
|
+
});
|
257
|
+
}, _RestRepository_upsertRecordWithID = function _RestRepository_upsertRecordWithID(recordId, object) {
|
258
|
+
return __awaiter(this, void 0, void 0, function* () {
|
259
|
+
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
260
|
+
const response = yield (0, api_1.upsertRecordWithID)(Object.assign({ pathParams: { workspace: '{workspaceId}', dbBranchName: '{dbBranch}', tableName: __classPrivateFieldGet(this, _RestRepository_table, "f"), recordId }, body: object }, fetchProps));
|
261
|
+
const item = yield this.read(response.id);
|
262
|
+
if (!item)
|
263
|
+
throw new Error('The server failed to save the record');
|
264
|
+
return item;
|
265
|
+
});
|
266
|
+
}, _RestRepository_deleteRecord = function _RestRepository_deleteRecord(recordId) {
|
267
|
+
return __awaiter(this, void 0, void 0, function* () {
|
268
|
+
const fetchProps = yield __classPrivateFieldGet(this, _RestRepository_instances, "m", _RestRepository_getFetchProps).call(this);
|
269
|
+
yield (0, api_1.deleteRecord)(Object.assign({ pathParams: { workspace: '{workspaceId}', dbBranchName: '{dbBranch}', tableName: __classPrivateFieldGet(this, _RestRepository_table, "f"), recordId } }, fetchProps));
|
270
|
+
});
|
172
271
|
};
|
173
272
|
class RestRespositoryFactory {
|
174
273
|
createRepository(client, table) {
|
@@ -185,45 +284,41 @@ class BaseClient {
|
|
185
284
|
}
|
186
285
|
this.options = options;
|
187
286
|
__classPrivateFieldSet(this, _BaseClient_links, links, "f");
|
287
|
+
const factory = options.repositoryFactory || new RestRespositoryFactory();
|
288
|
+
this.db = new Proxy({}, {
|
289
|
+
get: (_target, prop) => {
|
290
|
+
if (typeof prop !== 'string')
|
291
|
+
throw new Error('Invalid table name');
|
292
|
+
return factory.createRepository(this, prop);
|
293
|
+
}
|
294
|
+
});
|
188
295
|
}
|
189
296
|
initObject(table, object) {
|
190
|
-
const
|
191
|
-
Object.assign(
|
297
|
+
const result = {};
|
298
|
+
Object.assign(result, object);
|
192
299
|
const tableLinks = __classPrivateFieldGet(this, _BaseClient_links, "f")[table] || [];
|
193
300
|
for (const link of tableLinks) {
|
194
301
|
const [field, linkTable] = link;
|
195
|
-
const value =
|
196
|
-
if (value &&
|
197
|
-
|
198
|
-
if (Object.keys(value).find((col) => col === 'id')) {
|
199
|
-
o[field] = this.initObject(linkTable, value);
|
200
|
-
}
|
201
|
-
else if (id) {
|
202
|
-
o[field] = {
|
203
|
-
id,
|
204
|
-
get: () => {
|
205
|
-
this.db[linkTable].read(id);
|
206
|
-
}
|
207
|
-
};
|
208
|
-
}
|
302
|
+
const value = result[field];
|
303
|
+
if (value && (0, lang_1.isObject)(value)) {
|
304
|
+
result[field] = this.initObject(linkTable, value);
|
209
305
|
}
|
210
306
|
}
|
211
307
|
const db = this.db;
|
212
|
-
|
213
|
-
return db[table].read(
|
308
|
+
result.read = function () {
|
309
|
+
return db[table].read(result['id']);
|
214
310
|
};
|
215
|
-
|
216
|
-
return db[table].update(
|
311
|
+
result.update = function (data) {
|
312
|
+
return db[table].update(result['id'], data);
|
217
313
|
};
|
218
|
-
|
219
|
-
return db[table].delete(
|
314
|
+
result.delete = function () {
|
315
|
+
return db[table].delete(result['id']);
|
220
316
|
};
|
221
317
|
for (const prop of ['read', 'update', 'delete']) {
|
222
|
-
Object.defineProperty(
|
318
|
+
Object.defineProperty(result, prop, { enumerable: false });
|
223
319
|
}
|
224
|
-
|
225
|
-
|
226
|
-
return o;
|
320
|
+
Object.freeze(result);
|
321
|
+
return result;
|
227
322
|
}
|
228
323
|
getBranch() {
|
229
324
|
var e_1, _a;
|
@@ -261,12 +356,8 @@ _BaseClient_links = new WeakMap(), _BaseClient_branch = new WeakMap();
|
|
261
356
|
const isBranchStrategyBuilder = (strategy) => {
|
262
357
|
return typeof strategy === 'function';
|
263
358
|
};
|
264
|
-
// TODO: We can find a better implementation for links
|
265
359
|
const transformObjectLinks = (object) => {
|
266
360
|
return Object.entries(object).reduce((acc, [key, value]) => {
|
267
|
-
|
268
|
-
return Object.assign(Object.assign({}, acc), { [key]: value.id });
|
269
|
-
}
|
270
|
-
return Object.assign(Object.assign({}, acc), { [key]: value });
|
361
|
+
return Object.assign(Object.assign({}, acc), { [key]: (0, record_1.isIdentifiable)(value) ? value.id : value });
|
271
362
|
}, {});
|
272
363
|
};
|
@@ -1,14 +1,25 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
}
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
import { If, IsArray, IsObject, StringKeys, UnionToIntersection, Values } from '../util/types';
|
2
|
+
import { Link, XataRecord } from './record';
|
3
|
+
export declare type SelectableColumn<O, RecursivePath extends any[] = []> = '*' | 'id' | DataProps<O> | NestedColumns<O, RecursivePath>;
|
4
|
+
export declare type SelectedPick<O extends XataRecord, Key extends SelectableColumn<O>[]> = XataRecord & UnionToIntersection<Values<{
|
5
|
+
[K in Key[number]]: NestedValueAtColumn<O, K> & XataRecord;
|
6
|
+
}>>;
|
7
|
+
export declare type ValueAtColumn<O, P extends SelectableColumn<O>> = P extends '*' ? Values<O> : P extends 'id' ? string : P extends keyof O ? O[P] : P extends `${infer K}.${infer V}` ? K extends keyof O ? Values<O[K] extends XataRecord ? (V extends SelectableColumn<O[K]> ? {
|
8
|
+
V: ValueAtColumn<O[K], V>;
|
9
|
+
} : never) : O[K]> : never : never;
|
10
|
+
declare type MAX_RECURSION = 5;
|
11
|
+
declare type NestedColumns<O, RecursivePath extends any[]> = RecursivePath['length'] extends MAX_RECURSION ? never : If<IsObject<O>, Values<{
|
12
|
+
[K in DataProps<O>]: If<IsArray<NonNullable<O[K]>>, K, // If the property is an array, we stop recursion. We don't support object arrays yet
|
13
|
+
If<IsObject<NonNullable<O[K]>>, NonNullable<O[K]> extends XataRecord ? SelectableColumn<NonNullable<O[K]>, [...RecursivePath, O[K]]> extends string ? K | `${K}.${SelectableColumn<NonNullable<O[K]>, [...RecursivePath, O[K]]>}` : never : `${K}.${StringKeys<NonNullable<O[K]>> | '*'}`, // This allows usage of objects that are not links
|
14
|
+
K>>;
|
15
|
+
}>, never>;
|
16
|
+
declare type DataProps<O> = Exclude<StringKeys<O>, StringKeys<XataRecord>>;
|
17
|
+
declare type NestedValueAtColumn<O, Key extends SelectableColumn<O>> = Key extends `${infer N}.${infer M}` ? N extends DataProps<O> ? {
|
18
|
+
[K in N]: M extends SelectableColumn<NonNullable<O[K]>> ? NonNullable<O[K]> extends XataRecord ? ForwardNullable<O[K], NestedValueAtColumn<NonNullable<O[K]>, M> & XataRecord> : ForwardNullable<O[K], NestedValueAtColumn<NonNullable<O[K]>, M>> : unknown;
|
19
|
+
} : unknown : Key extends DataProps<O> ? {
|
20
|
+
[K in Key]: NonNullable<O[K]> extends XataRecord ? ForwardNullable<O[K], SelectedPick<NonNullable<O[K]>, ['*']>> : O[K];
|
21
|
+
} : Key extends '*' ? {
|
22
|
+
[K in StringKeys<O>]: NonNullable<O[K]> extends XataRecord ? ForwardNullable<O[K], Link<NonNullable<O[K]>>> : O[K];
|
23
|
+
} : unknown;
|
24
|
+
declare type ForwardNullable<T, R> = T extends NonNullable<T> ? R : R | null;
|
14
25
|
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,203 @@
|
|
1
|
+
"use strict";
|
2
|
+
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-floating-promises */
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
+
// SelectableColumn<O> //
|
5
|
+
// --------------------------------------------------------------------------- //
|
6
|
+
const validTeamColumns = [
|
7
|
+
'*',
|
8
|
+
'id',
|
9
|
+
'name',
|
10
|
+
'owner.*',
|
11
|
+
'owner.address.*',
|
12
|
+
'owner.address',
|
13
|
+
'owner.address.street'
|
14
|
+
];
|
15
|
+
// @ts-expect-error
|
16
|
+
const invalidFullNameTeamColumn = 'full_name';
|
17
|
+
// @ts-expect-error
|
18
|
+
const invalidPartialTeamColumn = 'owner.address.';
|
19
|
+
// @ts-expect-error
|
20
|
+
const invalidDeleteTeamColumn = 'owner.delete';
|
21
|
+
// @ts-expect-error
|
22
|
+
const invalidReadTeamColumn = 'owner.read.*';
|
23
|
+
// ValueAtColumn<O, P> //
|
24
|
+
// --------------------------------------------------------------------------- //
|
25
|
+
const labelsValue = ['foo'];
|
26
|
+
// @ts-expect-error
|
27
|
+
const invalidLabelsValue = [1];
|
28
|
+
// SelectedRecordPick<O, Key> //
|
29
|
+
// ---------------------------------------------------------------------------- //
|
30
|
+
function test1(user) {
|
31
|
+
var _a, _b, _c, _d;
|
32
|
+
user.id;
|
33
|
+
user.read();
|
34
|
+
user.full_name;
|
35
|
+
(_a = user.address) === null || _a === void 0 ? void 0 : _a.street;
|
36
|
+
// @ts-expect-error
|
37
|
+
user.team.id;
|
38
|
+
(_b = user.team) === null || _b === void 0 ? void 0 : _b.id;
|
39
|
+
(_c = user.team) === null || _c === void 0 ? void 0 : _c.read();
|
40
|
+
// @ts-expect-error
|
41
|
+
(_d = user.team) === null || _d === void 0 ? void 0 : _d.name;
|
42
|
+
user.partner.id;
|
43
|
+
user.partner.read();
|
44
|
+
// @ts-expect-error
|
45
|
+
user.partner.full_name;
|
46
|
+
user.team = null;
|
47
|
+
// @ts-expect-error
|
48
|
+
user.partner = null;
|
49
|
+
}
|
50
|
+
function test2(user) {
|
51
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
52
|
+
user.id;
|
53
|
+
user.read();
|
54
|
+
user.full_name;
|
55
|
+
(_a = user.team) === null || _a === void 0 ? void 0 : _a.id;
|
56
|
+
(_b = user.team) === null || _b === void 0 ? void 0 : _b.read();
|
57
|
+
(_c = user.team) === null || _c === void 0 ? void 0 : _c.name;
|
58
|
+
(_d = user.team) === null || _d === void 0 ? void 0 : _d.owner;
|
59
|
+
(_f = (_e = user.team) === null || _e === void 0 ? void 0 : _e.owner) === null || _f === void 0 ? void 0 : _f.id;
|
60
|
+
(_h = (_g = user.team) === null || _g === void 0 ? void 0 : _g.owner) === null || _h === void 0 ? void 0 : _h.read();
|
61
|
+
// @ts-expect-error
|
62
|
+
(_k = (_j = user.team) === null || _j === void 0 ? void 0 : _j.owner) === null || _k === void 0 ? void 0 : _k.full_name;
|
63
|
+
// @ts-expect-error
|
64
|
+
user.full_name = null;
|
65
|
+
user.email = null;
|
66
|
+
user.email = '';
|
67
|
+
// @ts-expect-error
|
68
|
+
user.email = 2;
|
69
|
+
if (user.team) {
|
70
|
+
// @ts-expect-error
|
71
|
+
user.team.name = null;
|
72
|
+
user.team.labels = null;
|
73
|
+
user.team.labels = ['foo'];
|
74
|
+
// @ts-expect-error
|
75
|
+
user.team.labels = [1];
|
76
|
+
}
|
77
|
+
}
|
78
|
+
function test3(user) {
|
79
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
80
|
+
user.id;
|
81
|
+
user.read();
|
82
|
+
// @ts-expect-error
|
83
|
+
user.full_name;
|
84
|
+
(_a = user.team) === null || _a === void 0 ? void 0 : _a.id;
|
85
|
+
(_b = user.team) === null || _b === void 0 ? void 0 : _b.read();
|
86
|
+
// @ts-expect-error
|
87
|
+
(_c = user.team) === null || _c === void 0 ? void 0 : _c.name;
|
88
|
+
(_e = (_d = user.team) === null || _d === void 0 ? void 0 : _d.owner) === null || _e === void 0 ? void 0 : _e.id;
|
89
|
+
(_g = (_f = user.team) === null || _f === void 0 ? void 0 : _f.owner) === null || _g === void 0 ? void 0 : _g.read();
|
90
|
+
(_j = (_h = user.team) === null || _h === void 0 ? void 0 : _h.owner) === null || _j === void 0 ? void 0 : _j.full_name;
|
91
|
+
}
|
92
|
+
function test4(user) {
|
93
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
94
|
+
user.id;
|
95
|
+
user.read();
|
96
|
+
// @ts-expect-error
|
97
|
+
user.full_name;
|
98
|
+
(_a = user.team) === null || _a === void 0 ? void 0 : _a.id;
|
99
|
+
(_b = user.team) === null || _b === void 0 ? void 0 : _b.read();
|
100
|
+
// @ts-expect-error
|
101
|
+
(_c = user.team) === null || _c === void 0 ? void 0 : _c.name;
|
102
|
+
(_e = (_d = user.team) === null || _d === void 0 ? void 0 : _d.owner) === null || _e === void 0 ? void 0 : _e.id;
|
103
|
+
(_g = (_f = user.team) === null || _f === void 0 ? void 0 : _f.owner) === null || _g === void 0 ? void 0 : _g.read();
|
104
|
+
// @ts-expect-error
|
105
|
+
(_j = (_h = user.team) === null || _h === void 0 ? void 0 : _h.owner) === null || _j === void 0 ? void 0 : _j.full_name;
|
106
|
+
(_l = (_k = user.team) === null || _k === void 0 ? void 0 : _k.owner) === null || _l === void 0 ? void 0 : _l.address;
|
107
|
+
(_p = (_o = (_m = user.team) === null || _m === void 0 ? void 0 : _m.owner) === null || _o === void 0 ? void 0 : _o.address) === null || _p === void 0 ? void 0 : _p.street;
|
108
|
+
(_s = (_r = (_q = user.team) === null || _q === void 0 ? void 0 : _q.owner) === null || _r === void 0 ? void 0 : _r.address) === null || _s === void 0 ? void 0 : _s.zipcode;
|
109
|
+
}
|
110
|
+
function test5(user) {
|
111
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
112
|
+
user.id;
|
113
|
+
user.read();
|
114
|
+
// @ts-expect-error
|
115
|
+
user.full_name;
|
116
|
+
user.settings;
|
117
|
+
(_a = user.settings) === null || _a === void 0 ? void 0 : _a.theme;
|
118
|
+
(_b = user.settings) === null || _b === void 0 ? void 0 : _b.language;
|
119
|
+
(_c = user.settings) === null || _c === void 0 ? void 0 : _c.signin;
|
120
|
+
(_e = (_d = user.settings) === null || _d === void 0 ? void 0 : _d.signin) === null || _e === void 0 ? void 0 : _e.email;
|
121
|
+
(_g = (_f = user.settings) === null || _f === void 0 ? void 0 : _f.signin) === null || _g === void 0 ? void 0 : _g.github;
|
122
|
+
// @ts-expect-error
|
123
|
+
(_h = user.settings) === null || _h === void 0 ? void 0 : _h.id;
|
124
|
+
// @ts-expect-error
|
125
|
+
(_j = user.settings) === null || _j === void 0 ? void 0 : _j.read();
|
126
|
+
// @ts-expect-error
|
127
|
+
(_l = (_k = user.settings) === null || _k === void 0 ? void 0 : _k.signin) === null || _l === void 0 ? void 0 : _l.id;
|
128
|
+
user.settings = null;
|
129
|
+
user.nonNullable.nested.value = 2;
|
130
|
+
// @ts-expect-error
|
131
|
+
user.nonNullable = null;
|
132
|
+
// @ts-expect-error
|
133
|
+
user.nonNullable.nested.value = null;
|
134
|
+
}
|
135
|
+
function test6(user) {
|
136
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
137
|
+
user.id;
|
138
|
+
user.read();
|
139
|
+
// @ts-expect-error
|
140
|
+
user.full_name;
|
141
|
+
user.settings;
|
142
|
+
(_a = user.settings) === null || _a === void 0 ? void 0 : _a.theme;
|
143
|
+
(_b = user.settings) === null || _b === void 0 ? void 0 : _b.language;
|
144
|
+
(_c = user.settings) === null || _c === void 0 ? void 0 : _c.signin;
|
145
|
+
(_e = (_d = user.settings) === null || _d === void 0 ? void 0 : _d.signin) === null || _e === void 0 ? void 0 : _e.email;
|
146
|
+
(_g = (_f = user.settings) === null || _f === void 0 ? void 0 : _f.signin) === null || _g === void 0 ? void 0 : _g.github;
|
147
|
+
// @ts-expect-error
|
148
|
+
(_h = user.settings) === null || _h === void 0 ? void 0 : _h.id;
|
149
|
+
// @ts-expect-error
|
150
|
+
(_j = user.settings) === null || _j === void 0 ? void 0 : _j.read();
|
151
|
+
// @ts-expect-error
|
152
|
+
(_l = (_k = user.settings) === null || _k === void 0 ? void 0 : _k.signin) === null || _l === void 0 ? void 0 : _l.id;
|
153
|
+
user.nonNullable.nested.value = 2;
|
154
|
+
user.nonNullable.nested.deep.depths.of.numbers = [1, 2, 3];
|
155
|
+
// @ts-expect-error
|
156
|
+
user.nonNullable.nested.deep.depths.of.numbers = 'invalid-string';
|
157
|
+
user.settings = null;
|
158
|
+
// @ts-expect-error
|
159
|
+
user.nonNullable = null;
|
160
|
+
// @ts-expect-error
|
161
|
+
user.nonNullable.nested.value = null;
|
162
|
+
}
|
163
|
+
function test7(user) {
|
164
|
+
var _a, _b;
|
165
|
+
user.partner;
|
166
|
+
user.partner.id;
|
167
|
+
user.partner.read();
|
168
|
+
user.partner.full_name;
|
169
|
+
// @ts-expect-error
|
170
|
+
user.partner.full_name = null;
|
171
|
+
user.partner.address;
|
172
|
+
// @ts-expect-error
|
173
|
+
user.team.id;
|
174
|
+
(_a = user.team) === null || _a === void 0 ? void 0 : _a.id;
|
175
|
+
// @ts-expect-error
|
176
|
+
user.team.read();
|
177
|
+
(_b = user.team) === null || _b === void 0 ? void 0 : _b.read();
|
178
|
+
// @ts-expect-error
|
179
|
+
user.partner = null;
|
180
|
+
user.team = null;
|
181
|
+
}
|
182
|
+
function test8(user) {
|
183
|
+
var _a, _b;
|
184
|
+
user.partner;
|
185
|
+
user.partner.id;
|
186
|
+
user.partner.read();
|
187
|
+
user.partner.full_name;
|
188
|
+
// @ts-expect-error
|
189
|
+
user.partner.full_name = null;
|
190
|
+
user.partner.address;
|
191
|
+
// @ts-expect-error
|
192
|
+
user.team.id;
|
193
|
+
(_a = user.team) === null || _a === void 0 ? void 0 : _a.id;
|
194
|
+
// @ts-expect-error
|
195
|
+
user.team.read();
|
196
|
+
(_b = user.team) === null || _b === void 0 ? void 0 : _b.read();
|
197
|
+
// @ts-expect-error
|
198
|
+
user.partner = null;
|
199
|
+
user.team = null;
|
200
|
+
}
|
201
|
+
test('fake test', () => {
|
202
|
+
// This is a fake test to make sure that the type definitions in this file are working
|
203
|
+
});
|