imodel 0.3.0 → 0.4.0

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/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * imodel v0.3.0
2
+ * imodel v0.4.0
3
3
  * (c) 2019-2025 undefined
4
4
  * @license undefined
5
5
  */
@@ -52,6 +52,7 @@ function isPseudo(model) {
52
52
  }
53
53
 
54
54
  const now = Symbol();
55
+ const uuid = Symbol();
55
56
  const increment$1 = Symbol();
56
57
  const decrement$1 = Symbol();
57
58
  const multiply$1 = Symbol();
@@ -63,38 +64,10 @@ var values = /*#__PURE__*/Object.freeze({
63
64
  divide: divide$1,
64
65
  increment: increment$1,
65
66
  multiply: multiply$1,
66
- now: now
67
+ now: now,
68
+ uuid: uuid
67
69
  });
68
70
 
69
- /** @import { Fields, FieldType } from './types' */
70
- /**
71
- *
72
- * @param {Fields} fields
73
- * @returns {Fields<keyof FieldType>}
74
- */
75
- function toBaseFields(fields) {
76
- /** @type {Fields<keyof FieldType>} */
77
- const allFields = {};
78
- for (const [k, v] of Object.entries(fields)) {
79
- const {
80
- type
81
- } = v;
82
- if (typeof type === 'string') {
83
- // @ts-ignore
84
- allFields[k] = v;
85
- continue;
86
- }
87
- if (!type.table) {
88
- allFields[k] = {
89
- ...v,
90
- type: 'object',
91
- primary: 0
92
- };
93
- }
94
- }
95
- return allFields;
96
- }
97
-
98
71
  /** @import { Options, Queryable } from '../types' */
99
72
  /**
100
73
  *
@@ -162,81 +135,45 @@ async function getSpecificValue(val) {
162
135
  return value;
163
136
  }
164
137
 
165
- /** @import { SetValue } from '../../set.mjs' */
166
- /** @import { Fields, Skip } from '../../types' */
167
- /**
168
- *
169
- * @param {Fields} fields
170
- * @param {Record<string, SetValue> | null | undefined} [update]
171
- * @param {boolean | Skip} [skip]
172
- * @returns {Promise<Record<string, SetValue>>}
173
- */
174
- async function getSetNewValue(fields, update, skip) {
175
- const data = {
176
- ...update
177
- };
178
- if (!(skip === true || skip && skip.specific)) {
179
- for (const [name, field] of Object.entries(fields)) {
180
- if (field.primary) {
181
- continue;
182
- }
183
- const updating = await getSpecificValue(field.updating);
184
- if (updating !== void 0) {
185
- data[name] = updating;
186
- }
187
- }
188
- }
189
- return Object.fromEntries(Object.entries(data).filter(([k, v]) => {
190
- const field = k in fields && fields[k];
191
- if (!field) {
192
- return;
193
- }
194
- if (field.immutable) {
195
- if (!skip) {
196
- return;
197
- }
198
- if (skip !== true && !skip.immutable) {
199
- return;
200
- }
201
- }
202
- return true;
203
- }));
204
- }
205
-
206
138
  /** @import { Fields } from '../../types' */
207
139
  /**
208
140
  *
209
141
  * @param {Record<string, any>} data
210
- * @param {Fields} fields
142
+ * @param {Fields} columns
143
+ * @param {Record<string, string> | null} fieldColumns
211
144
  * @returns {Promise<Record<string, any>>}
212
145
  */
213
- async function getInsertValue(data, fields) {
146
+ async function getInsertValue(data, columns, fieldColumns) {
214
147
  const insertValue = {};
215
- for (const [k, field] of Object.entries(fields)) {
216
- const creating = await getSpecificValue(field.creating);
148
+ for (const [k, col] of fieldColumns ? Object.entries(fieldColumns) : Object.keys(columns).map(v => [v, v])) {
149
+ const column = columns[col];
150
+ if (!column) {
151
+ continue;
152
+ }
153
+ const creating = await getSpecificValue(column.creating);
217
154
  if (creating !== void 0) {
218
- insertValue[k] = creating;
155
+ insertValue[col] = creating;
219
156
  continue;
220
157
  }
221
- const updating = await getSpecificValue(field.updating);
158
+ const updating = await getSpecificValue(column.updating);
222
159
  if (updating !== void 0) {
223
- insertValue[k] = updating;
160
+ insertValue[col] = updating;
224
161
  continue;
225
162
  }
226
163
  const val = data[k];
227
164
  if (val !== undefined) {
228
- insertValue[k] = val;
165
+ insertValue[col] = val;
229
166
  continue;
230
167
  }
231
- const def = field.default;
168
+ const def = column.default;
232
169
  if (def === undefined) {
233
170
  continue;
234
171
  }
235
172
  if (typeof def === 'function') {
236
- insertValue[k] = def(data);
173
+ insertValue[col] = def(data);
237
174
  continue;
238
175
  }
239
- insertValue[k] = def;
176
+ insertValue[col] = def;
240
177
  }
241
178
  return insertValue;
242
179
  }
@@ -288,58 +225,91 @@ function setDefaultOptions(v) {
288
225
  return v;
289
226
  }
290
227
 
228
+ /**
229
+ *
230
+ * @param {*} item
231
+ * @param {[string, string][]} mapList
232
+ * @returns
233
+ */
234
+ function createFilter(item, mapList) {
235
+ /** @type {[string, any][]} */
236
+ const values = mapList.map(([k, v]) => [k, item[v]]);
237
+ return sub => {
238
+ for (const [k, v] of values) {
239
+ // eslint-disable-next-line eqeqeq
240
+ if (sub[k] != v) {
241
+ return false;
242
+ }
243
+ }
244
+ return true;
245
+ };
246
+ }
247
+
291
248
  /** @import { FieldDefine, Fields, FieldType, TableDefine } from '../../types' */
292
249
  /**
293
250
  *
294
251
  * @param {Fields} fields
295
- * @returns {[Fields<keyof FieldType>, [string, FieldDefine<TableDefine>][]]}
252
+ * @returns {[columns: Fields<keyof FieldType>, fieldColumns: Record<string, string> | null, [string, FieldDefine<TableDefine>][], baseFields: Fields<keyof FieldType>]}
296
253
  */
297
- function separateFields(fields) {
254
+ function toColumns(fields) {
255
+ /** @type {Fields<keyof FieldType>} */
256
+ const baseFields = Object.create(null);
298
257
  /** @type {Fields<keyof FieldType>} */
299
- const base = Object.create(null);
258
+ const columns = Object.create(null);
259
+ /** @type {Record<string, string>} */
260
+ const fieldColumns = Object.create(null);
261
+ let named = false;
300
262
  /** @type {[string, FieldDefine<TableDefine>][]} */
301
263
  const sub = [];
302
264
  for (const [k, v] of Object.entries(fields)) {
303
265
  const {
304
266
  type
305
267
  } = v;
268
+ if (!type) {
269
+ continue;
270
+ }
271
+ const column = v.column || k;
306
272
  if (typeof type === 'string') {
307
273
  // @ts-ignore
308
- base[k] = v;
309
- } else if (!type.table) {
310
- base[k] = {
274
+ baseFields[k] = columns[column] = v;
275
+ fieldColumns[k] = column;
276
+ if (k !== column) {
277
+ named = true;
278
+ }
279
+ continue;
280
+ }
281
+ if (!type.table) {
282
+ baseFields[k] = columns[column] = {
311
283
  ...v,
312
284
  type: 'object',
313
285
  primary: 0
314
286
  };
315
- } else {
316
- // @ts-ignore
317
- sub.push([k, v]);
287
+ fieldColumns[k] = column;
288
+ if (k !== column) {
289
+ named = true;
290
+ }
291
+ continue;
318
292
  }
293
+ // @ts-ignore
294
+ sub.push([k, v]);
319
295
  }
320
- return [base, sub];
296
+ return [columns, named ? fieldColumns : null, sub, baseFields];
321
297
  }
322
298
 
323
299
  /**
324
300
  *
325
- * @param {*} item
326
- * @param {[string, string][]} mapList
327
- * @returns
301
+ * @param {Record<string, any>[]} list
302
+ * @param {Record<string, string>?} fieldColumns
328
303
  */
329
- function createFilter(item, mapList) {
330
- /** @type {[string, any][]} */
331
- const values = mapList.map(([k, v]) => [k, item[v]]);
332
- return sub => {
333
- for (const [k, v] of values) {
334
- if (sub[k] !== v) {
335
- return false;
336
- }
337
- }
338
- return true;
339
- };
304
+ function toFieldList(list, fieldColumns) {
305
+ if (!fieldColumns) {
306
+ return list;
307
+ }
308
+ const map = Object.entries(fieldColumns);
309
+ return list.map(it => Object.fromEntries(map.map(([k, v]) => [k, it[v]])));
340
310
  }
341
311
 
342
- /** @import { Environment, FieldDefine, Fields, GetName, IConnection, TableDefine } from '../types' */
312
+ /** @import { Environment, FieldDefine, Fields, IConnection, TableDefine } from '../types' */
343
313
  /**
344
314
  *
345
315
  * @param {any} p
@@ -447,13 +417,13 @@ async function createSub(conn, env, fields, newList, list) {
447
417
  }
448
418
  continue;
449
419
  }
450
- const [baseFields, tableFields] = separateFields(fields);
451
- const insertKeys = Object.entries(baseFields).map(v => v[0]);
452
- const insertValues = await Promise.all(fieldValues.map(d => getInsertValue(d, fields)));
420
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
421
+ const insertKeys = Object.entries(columns).map(v => v[0]);
422
+ const insertValues = await Promise.all(fieldValues.map(d => getInsertValue(d, columns, fieldColumns)));
453
423
  const {
454
424
  table
455
425
  } = type;
456
- const result = table && typeof table === 'object' ? table.insert(env, conn, '', baseFields, insertValues, insertKeys) : conn.insert(env, table || '', baseFields, insertValues, insertKeys);
426
+ const result = (table && typeof table === 'object' ? table.insert(env, conn, columns, insertValues, insertKeys) : conn.insert(env, table || '', columns, insertValues, insertKeys)).then(r => toFieldList(r, fieldColumns));
457
427
  promises.push(result.then(r => createSub(conn, env, tableFields, fieldValues, r)));
458
428
  promises.push(array ? result.then(values => {
459
429
  for (const [value] of allList) {
@@ -498,16 +468,16 @@ async function create(conn, env, model, p, mapDo = defaultMap) {
498
468
  }
499
469
  records.push(data);
500
470
  }
501
- const [baseFields, tableFields] = separateFields(fields);
502
- const insertValues = await Promise.all(records.map(d => getInsertValue(d, baseFields)));
471
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
472
+ const insertValues = await Promise.all(records.map(d => getInsertValue(d, columns, fieldColumns)));
503
473
  let insertKeys = [];
504
474
  if (!insertKeys.length && !isArray) {
505
- insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in baseFields).map(([k]) => k);
475
+ insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in columns).map(([k]) => k);
506
476
  }
507
477
  if (!insertKeys.length) {
508
- insertKeys = Object.entries(baseFields).map(([k]) => k);
478
+ insertKeys = Object.entries(columns).map(([k]) => k);
509
479
  }
510
- const list = table && typeof table === 'object' ? await table.insert(env, conn, '', baseFields, insertValues, insertKeys) : await conn.insert(env, table || '', baseFields, insertValues, insertKeys);
480
+ const list = toFieldList(table && typeof table === 'object' ? await table.insert(env, conn, columns, insertValues, insertKeys) : await conn.insert(env, table || '', columns, insertValues, insertKeys), fieldColumns);
511
481
  await createSub(conn, env, tableFields, records, list);
512
482
  const value = list.map((v, i) => mapDo(v, getOtherValues(records[i], fields)));
513
483
  return isArray ? value : value[0];
@@ -516,12 +486,12 @@ async function create(conn, env, model, p, mapDo = defaultMap) {
516
486
  /** @import { Fields } from './types' */
517
487
  /**
518
488
  *
519
- * @param {Fields} fields
489
+ * @param {Fields} fieldsOrColumns
520
490
  * @returns {string[]}
521
491
  */
522
- function getPrimaryKeys(fields) {
523
- const list = Object.entries(fields);
524
- const primaryKeys = list.filter(([v, o]) => typeof o.type === 'string' && o.primary);
492
+ function getPrimaryKeys(fieldsOrColumns) {
493
+ const list = Object.entries(fieldsOrColumns);
494
+ const primaryKeys = list.filter(([v, o]) => o.type && typeof o.type === 'string' && o.primary);
525
495
  if (primaryKeys.length) {
526
496
  return primaryKeys.map(([k]) => k);
527
497
  }
@@ -530,8 +500,8 @@ function getPrimaryKeys(fields) {
530
500
 
531
501
  /** @import { Constraint, Fields, FieldType } from '../../types' */
532
502
  /**
533
- * @param {Fields<keyof FieldType>} fields
534
- * @param {Fields<keyof FieldType>} parentFields
503
+ * @param {Fields} fields
504
+ * @param {Set<string>} parentFields
535
505
  * @param {Record<string, string | Constraint> | undefined} constraints
536
506
  * @returns {[string, string][]?}
537
507
  */
@@ -549,7 +519,7 @@ function getMapList(fields, parentFields, constraints) {
549
519
  if (typeof field !== 'string') {
550
520
  continue;
551
521
  }
552
- if (!(field in parentFields)) {
522
+ if (!parentFields.has(field)) {
553
523
  continue;
554
524
  }
555
525
  where.push([k, field]);
@@ -564,17 +534,17 @@ function getMapList(fields, parentFields, constraints) {
564
534
  /**
565
535
  *
566
536
  * @param {Record<string, Constraint> | undefined} value
567
- * @param {Fields<keyof FieldType>} fields
537
+ * @param {Fields<keyof FieldType>} columns
568
538
  * @returns {[string, unknown][]}
569
539
  */
570
- function getValueEntries(value, fields) {
540
+ function getValueEntries(value, columns) {
571
541
  if (!value) {
572
542
  return [];
573
543
  }
574
544
  /** @type {[string, unknown][]} */
575
545
  const where = [];
576
546
  for (const [k, v] of Object.entries(value)) {
577
- if (!(k in fields)) {
547
+ if (!(k in columns)) {
578
548
  continue;
579
549
  }
580
550
  if (!v || typeof v !== 'object') {
@@ -620,18 +590,68 @@ function valueEntries2where(value) {
620
590
  }));
621
591
  }
622
592
 
623
- /** @import { Environment, FieldDefine, Fields, FieldType, GetName, IConnection, MatchArg, Queryable, TableDefine } from '../types' */
593
+ /** @import { WhereValue } from '../../Where.mjs' */
594
+ /**
595
+ *
596
+ * @param {WhereValue['field']} field
597
+ * @param {Record<string, string>} fieldColumns
598
+ * @returns {WhereValue['field']}
599
+ */
600
+ function field$2(field, fieldColumns) {
601
+ if (!field) {
602
+ return field;
603
+ }
604
+ if (!Array.isArray(field)) {
605
+ if (typeof field === 'string') {
606
+ return fieldColumns[field];
607
+ }
608
+ return {
609
+ ...field,
610
+ field: fieldColumns[field.field]
611
+ };
612
+ }
613
+ return field.map(field => {
614
+ if (typeof field === 'string') {
615
+ return fieldColumns[field];
616
+ }
617
+ return {
618
+ ...field,
619
+ field: fieldColumns[field.field]
620
+ };
621
+ });
622
+ }
623
+ /**
624
+ *
625
+ * @param {WhereValue[] | null | undefined} where
626
+ * @param {Record<string, string>?} fieldColumns
627
+ * @returns {WhereValue[]}
628
+ */
629
+ function where2column(where, fieldColumns) {
630
+ if (!where) {
631
+ return [];
632
+ }
633
+ if (!fieldColumns) {
634
+ return where;
635
+ }
636
+ // @ts-ignore
637
+ return where.map(v => ({
638
+ ...v,
639
+ field: field$2(v.field, fieldColumns)
640
+ }));
641
+ }
642
+
643
+ /** @import { Environment, FieldDefine, IConnection, Queryable, TableDefine } from '../types' */
624
644
  /**
625
645
  *
626
646
  * @param {IConnection} conn
627
647
  * @param {any[]} list
628
648
  * @param {[string, FieldDefine<TableDefine>][]} fields
629
- * @param {Fields<keyof FieldType>} baseFields
649
+ * @param {Set<string>} baseFieldSet
630
650
  * @param {Environment} env
631
651
  * @param {boolean} [hasResult]
632
652
  * @returns
633
653
  */
634
- async function deleteSub(conn, list, fields, baseFields, env, hasResult) {
654
+ async function deleteSub(conn, list, fields, baseFieldSet, env, hasResult) {
635
655
  if (!list.length) {
636
656
  return list;
637
657
  }
@@ -646,29 +666,25 @@ async function deleteSub(conn, list, fields, baseFields, env, hasResult) {
646
666
  const {
647
667
  fields
648
668
  } = type;
649
- const [subfields, tableFields] = separateFields(fields);
650
- const mapList = getMapList(subfields, baseFields, constraints);
669
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
670
+ const mapList = getMapList(fields, baseFieldSet, constraints);
651
671
  if (!mapList) {
652
672
  continue;
653
673
  }
654
- const value = getValueEntries(constraints, subfields);
655
- const where = [subList2where(list, mapList), ...valueEntries2where(value)];
674
+ const value = getValueEntries(constraints, columns);
675
+ const where = where2column([subList2where(list, mapList), ...valueEntries2where(value)], fieldColumns);
656
676
  const {
657
677
  table
658
678
  } = type;
659
- /** @type {MatchArg} */
660
- const argv = {
661
- table: typeof table === 'string' ? table : '',
662
- fields: subfields,
663
- where
664
- };
679
+ const tableName = typeof table === 'string' ? table : '';
665
680
  if (!tableFields.length && !hasResult) {
666
- const result = table && typeof table === 'object' ? table.delete(env, conn, argv) : conn.delete(env, argv);
681
+ const result = table && typeof table === 'object' ? table.delete(env, conn, columns, where) : conn.delete(env, tableName, columns, where);
667
682
  promises.push(result);
668
683
  continue;
669
684
  }
670
- const result = table && typeof table === 'object' ? table.deleteReturn(env, conn, argv, Object.keys(subfields)) : conn.deleteReturn(env, argv, Object.keys(subfields));
671
- promises.push(result.then(l => deleteSub(conn, l, tableFields, subfields, env, hasResult)));
685
+ const result = (table && typeof table === 'object' ? table.deleteReturn(env, conn, Object.keys(columns), columns, where) : conn.deleteReturn(env, Object.keys(columns), tableName, columns, where)).then(r => toFieldList(r, fieldColumns));
686
+ const subFieldSet = new Set(Object.keys(fieldColumns || columns));
687
+ promises.push(result.then(l => deleteSub(conn, l, tableFields, subFieldSet, env, hasResult)));
672
688
  constraintEntries.find(([k, v]) => v.noField)?.[0];
673
689
  promises.push(array ? result.then(subList => {
674
690
  for (const item of list) {
@@ -696,39 +712,93 @@ async function deleteMany(conn, queryable, env) {
696
712
  table,
697
713
  fields
698
714
  } = queryable;
699
- const {
700
- where
701
- } = queryable.options;
702
- const [baseFields, tableFields] = separateFields(fields);
715
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
716
+ const where = where2column(queryable.options.where, fieldColumns);
703
717
  if (!tableFields.length) {
704
- return table && typeof table === 'object' ? table.delete(env, conn, {
705
- table: '',
706
- fields: baseFields,
707
- where
708
- }) : conn.delete(env, {
709
- table: table || '',
710
- fields: baseFields,
711
- where
712
- });
718
+ return table && typeof table === 'object' ? table.delete(env, conn, columns, where) : conn.delete(env, table || '', columns, where);
713
719
  }
714
- const list = table && typeof table === 'object' ? await table.deleteReturn(env, conn, {
715
- table: '',
716
- fields: baseFields,
717
- where
718
- }, Object.keys(baseFields)) : await conn.deleteReturn(env, {
719
- table: table || '',
720
- fields: baseFields,
721
- where
722
- }, Object.keys(baseFields));
720
+ const list = toFieldList(table && typeof table === 'object' ? await table.deleteReturn(env, conn, Object.keys(columns), columns, where) : await conn.deleteReturn(env, Object.keys(columns), table || '', columns, where), fieldColumns);
723
721
  if (!list) {
724
722
  return 0;
725
723
  }
726
- await deleteSub(conn, list, tableFields, baseFields, env);
724
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
725
+ await deleteSub(conn, list, tableFields, baseFieldSet, env);
727
726
  return list.length;
728
727
  }
729
728
 
729
+ /**
730
+ *
731
+ * @param {string[]} list
732
+ * @param {Record<string, string>?} fieldColumns
733
+ */
734
+ function field2column(list, fieldColumns) {
735
+ if (!fieldColumns) {
736
+ return list;
737
+ }
738
+ return list.map(k => fieldColumns[k]);
739
+ }
740
+
741
+ /**
742
+ *
743
+ * @param {Record<string, any>[]} list
744
+ * @param {Record<string, string>?} fieldColumns
745
+ */
746
+ function toColumnList(list, fieldColumns) {
747
+ if (!fieldColumns) {
748
+ return list;
749
+ }
750
+ const map = Object.entries(fieldColumns);
751
+ return list.map(it => Object.fromEntries(map.map(([k, v]) => [v, it[k]])));
752
+ }
753
+
754
+ /** @import { SetValue } from '../../set.mjs' */
755
+ /** @import { Fields, Skip, FieldType } from '../../types' */
756
+ /**
757
+ *
758
+ * @param {Fields<keyof FieldType>} columns
759
+ * @param {Record<string, string> | null} fieldColumns
760
+ * @param {Record<string, SetValue> | null | undefined} [update]
761
+ * @param {boolean | Skip} [skip]
762
+ * @returns {Promise<Record<string, SetValue>>}
763
+ */
764
+ async function getSetValue$1(columns, fieldColumns, update, skip) {
765
+ /** @type {Record<string, SetValue>} */
766
+ const data = {};
767
+ if (update) {
768
+ for (const [k, v] of Object.entries(update)) {
769
+ const key = fieldColumns ? fieldColumns[k] : k;
770
+ const field = columns[key];
771
+ if (!field) {
772
+ continue;
773
+ }
774
+ if (field.immutable) {
775
+ if (!skip) {
776
+ continue;
777
+ }
778
+ if (skip !== true && !skip.immutable) {
779
+ continue;
780
+ }
781
+ }
782
+ data[key] = v;
783
+ }
784
+ }
785
+ if (!(skip === true || skip && skip.specific)) {
786
+ for (const [name, field] of Object.entries(columns)) {
787
+ if (field.primary) {
788
+ continue;
789
+ }
790
+ const updating = await getSpecificValue(field.updating);
791
+ if (updating === void 0) {
792
+ continue;
793
+ }
794
+ data[name] = updating;
795
+ }
796
+ }
797
+ return data;
798
+ }
799
+
730
800
  /* eslint-disable no-labels */
731
- /** @import { Constraint, Environment, FieldDefine, GetName, IConnection, TableDefine } from '../types' */
801
+ /** @import { Constraint, Environment, FieldDefine, IConnection, TableDefine } from '../types' */
732
802
  /** @import { WhereValue } from '../Where.mjs' */
733
803
  /**
734
804
  *
@@ -743,9 +813,6 @@ function classify(newList, oldList, keys, notFound, found) {
743
813
  oldValue: for (let i = 0; i < oldList.length; i++) {
744
814
  const old = oldList[i];
745
815
  for (const k of keys) {
746
- if (n[k] === undefined) {
747
- continue;
748
- }
749
816
  if (old[k] !== n[k]) {
750
817
  continue oldValue;
751
818
  }
@@ -835,24 +902,23 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
835
902
  if (!has) {
836
903
  return;
837
904
  }
838
- const oldList = oldListValues.flat();
839
- const newList = newListValues.flat();
840
- const {
841
- fields
842
- } = type;
905
+ const [columns, fieldColumns, tableFields, fields] = toColumns(type.fields);
843
906
  /** @type {Record<string, any>} */
844
- const commonKeys = {};
845
- for (const [k, v] of Object.entries(constraints || {})) {
907
+ const commonValues = {};
908
+ for (const [k, v] of constraintEntries) {
846
909
  const {
847
910
  field,
848
911
  value
849
912
  } = v;
850
- if (field || value !== undefined) {
851
- commonKeys[k] = 1;
913
+ if (!field && value !== undefined) {
914
+ commonValues[k] = value;
852
915
  }
853
916
  }
854
- const [baseFields, tableFields] = separateFields(fields);
855
- const primaryKeys = getPrimaryKeys(baseFields);
917
+ const oldList = oldListValues.flat();
918
+ const newList = newListValues.flat();
919
+ const primaryKeys = getPrimaryKeys(fields);
920
+ const fieldKeys = Object.keys(fields);
921
+ const columnKeys = Object.keys(columns);
856
922
  // 分离出新建、修改、删除
857
923
  // TODO: 优化分离逻辑
858
924
  const needDelete = oldList;
@@ -864,9 +930,9 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
864
930
  const needUpdate = [];
865
931
  /** @type {Record<string, any>[]} */
866
932
  const unmatched = [];
867
- const aKeys = Object.keys(baseFields).filter(v => !(v in commonKeys));
933
+ const aKeys = fieldKeys.filter(v => !(v in commonValues));
934
+ const pKeys = primaryKeys.filter(v => !(v in commonValues));
868
935
  classify(newList, needDelete, aKeys, unmatched, eq);
869
- const pKeys = primaryKeys.filter(v => !(v in commonKeys));
870
936
  classify(unmatched, needDelete, pKeys, needCreate, needUpdate);
871
937
  const {
872
938
  table
@@ -874,10 +940,10 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
874
940
  if (needDelete.length) {
875
941
  // 批量删除
876
942
  /** @type {WhereValue[]} */
877
- const where = primaryKeys.filter(v => v in commonKeys).map(k => ({
943
+ const where = primaryKeys.filter(v => v in commonValues).map(k => ({
878
944
  field: k,
879
945
  operator: '=',
880
- value: commonKeys[k] ?? null
946
+ value: commonValues[k] ?? null
881
947
  }));
882
948
  if (pKeys.length === 1) {
883
949
  const [key] = pKeys;
@@ -893,16 +959,8 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
893
959
  value: needDelete.map(v => pKeys.map(k => v[k] ?? null))
894
960
  });
895
961
  }
896
- const promise = typeof table === 'object' ? table.deleteReturn(env, conn, {
897
- table: '',
898
- fields: baseFields,
899
- where
900
- }, Object.keys(baseFields)) : conn.deleteReturn(env, {
901
- table: table || '',
902
- fields: baseFields,
903
- where
904
- }, Object.keys(baseFields));
905
- promises.push(promise.then(list => deleteSub(conn, list, tableFields, baseFields, env)));
962
+ const promise = typeof table === 'object' ? table.deleteReturn(env, conn, columnKeys, columns, where2column(where, fieldColumns)) : conn.deleteReturn(env, columnKeys, table || '', columns, where2column(where, fieldColumns));
963
+ promises.push(promise.then(list => deleteSub(conn, toFieldList(list, fieldColumns), tableFields, new Set(Object.keys(fieldColumns || columns)), env)));
906
964
  }
907
965
  /** @type {typeof updatedOldNewList} */
908
966
  const list = eq.map(([n, o]) => [{
@@ -914,34 +972,37 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
914
972
  const subPromises = [list];
915
973
  // 批量修改
916
974
  if (needUpdate.length) {
917
- const keys = new Set(needUpdate.map(v => Object.keys(v[0])).flat());
918
- const update = await getSetNewValue(baseFields);
919
- for (const k of Object.keys(update)) {
920
- keys.delete(k);
975
+ let keysColumn = new Set(needUpdate.map(v => Object.keys(v[0])).flat());
976
+ if (fieldColumns) {
977
+ keysColumn = new Set(field2column([...keysColumn], fieldColumns));
921
978
  }
922
- const setKeys = Object.entries(baseFields).filter(([, v]) => typeof v.type === 'string' && !v.primary && !v.immutable).map(v => v[0]).filter(v => keys.has(v));
979
+ const updateColumn = await getSetValue$1(columns, fieldColumns);
980
+ for (const k of Object.keys(updateColumn)) {
981
+ keysColumn.delete(k);
982
+ }
983
+ const setKeysColumn = Object.entries(columns).filter(([, v]) => !v.primary && !v.immutable).map(v => v[0]).filter(v => keysColumn.has(v));
923
984
  /** @type {WhereValue[]} */
924
- const where = Object.entries(commonKeys).filter(([k]) => primaryKeys.includes(k)).map(([k, v]) => ({
985
+ const where = Object.entries(commonValues).filter(([k]) => primaryKeys.includes(k)).map(([k, v]) => ({
925
986
  field: k,
926
987
  operator: '=',
927
988
  value: v
928
989
  }));
929
990
  for (const [value, old] of needUpdate) {
930
- for (const key of setKeys) {
991
+ for (const key of fieldKeys) {
931
992
  if (value[key] !== undefined) {
932
993
  continue;
933
994
  }
934
995
  value[key] = old[key];
935
996
  }
936
997
  }
937
- const list = typeof table === 'object' ? table.updateManyReturn(env, conn, '', baseFields, update, pKeys, setKeys, needUpdate.map(v => v[0]), where, Object.keys(baseFields)) : conn.updateManyReturn(env, table || '', baseFields, update, pKeys, setKeys, needUpdate.map(v => v[0]), where, Object.keys(baseFields));
998
+ const list = (typeof table === 'object' ? table.updateManyReturn(env, conn, columns, updateColumn, field2column(pKeys, fieldColumns), setKeysColumn, toColumnList(needUpdate.map(v => v[0]), fieldColumns), where2column(where, fieldColumns), columnKeys) : conn.updateManyReturn(env, table || '', columns, updateColumn, field2column(pKeys, fieldColumns), setKeysColumn, toColumnList(needUpdate.map(v => v[0]), fieldColumns), where2column(where, fieldColumns), columnKeys)).then(l => toFieldList(l, fieldColumns));
938
999
  listPromises.push(list);
939
1000
  subPromises.push(list.then(u => u.map((u, i) => [u, ...needUpdate[i]])));
940
1001
  }
941
1002
  // 批量新建
942
1003
  if (needCreate.length) {
943
- const key = Object.entries(baseFields);
944
- const list = typeof table === 'object' ? table.insert(env, conn, '', baseFields, await Promise.all(needCreate.map(d => getInsertValue(d, baseFields))), key.map(v => v[0])) : conn.insert(env, table || '', baseFields, await Promise.all(needCreate.map(d => getInsertValue(d, baseFields))), key.map(v => v[0]));
1004
+ const subColumnData = await Promise.all(needCreate.map(d => getInsertValue(d, columns, fieldColumns)));
1005
+ const list = (typeof table === 'object' ? table.insert(env, conn, columns, subColumnData, Object.keys(columns)) : conn.insert(env, table || '', columns, subColumnData, Object.keys(columns))).then(l => toFieldList(l, fieldColumns));
945
1006
  listPromises.push(list);
946
1007
  promises.push(list.then(list => createSub(conn, env, tableFields, needCreate, list)));
947
1008
  }
@@ -1014,29 +1075,21 @@ async function updateData (conn, model, data, newData, env) {
1014
1075
  fields
1015
1076
  } = model;
1016
1077
  const savedData = data;
1017
- const has = keys.filter(v => v in fields && (typeof fields[v]?.type === 'string' || !fields[v]?.type.table)).length;
1078
+ const has = keys.filter(v => v in fields && (typeof fields[v]?.type === 'string' || fields[v]?.type && !fields[v]?.type.table)).length;
1018
1079
  /** @type {WhereValue[]} */
1019
1080
  const where = getPrimaryKeys(fields).map(k => ({
1020
1081
  field: k,
1021
1082
  operator: '=',
1022
1083
  value: savedData[k]
1023
1084
  }));
1024
- const [baseFields, tableFields] = separateFields(fields);
1085
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1025
1086
  let list = [];
1026
1087
  if (!has) {
1027
1088
  list = [data];
1028
1089
  } else if (table && typeof table === 'object') {
1029
- list = await table.updateReturn(env, conn, {
1030
- table: '',
1031
- fields: baseFields,
1032
- where
1033
- }, await getSetNewValue(fields, newData), Object.keys(baseFields));
1090
+ list = toFieldList(await table.updateReturn(env, conn, Object.keys(columns), columns, await getSetValue$1(columns, fieldColumns, newData), where2column(where, fieldColumns)), fieldColumns);
1034
1091
  } else {
1035
- list = await conn.updateReturn(env, {
1036
- table: table || '',
1037
- fields: baseFields,
1038
- where
1039
- }, await getSetNewValue(fields, newData), Object.keys(baseFields));
1092
+ list = toFieldList(await conn.updateReturn(env, Object.keys(columns), table || '', columns, await getSetValue$1(columns, fieldColumns, newData), where2column(where, fieldColumns)), fieldColumns);
1040
1093
  }
1041
1094
  const oldList = [data];
1042
1095
  const newList = [newData];
@@ -1046,16 +1099,31 @@ async function updateData (conn, model, data, newData, env) {
1046
1099
  return list[0];
1047
1100
  }
1048
1101
 
1102
+ /** @import { SetValue } from '../../set.mjs' */
1103
+ /**
1104
+ *
1105
+ * @param {Record<string, SetValue>} update
1106
+ * @param {Record<string, string>?} fieldColumns
1107
+ * @returns {Record<string, SetValue>}
1108
+ */
1109
+ function set2column(update, fieldColumns) {
1110
+ if (!fieldColumns) {
1111
+ return update;
1112
+ }
1113
+ // @ts-ignore
1114
+ return Object.fromEntries(Object.entries(update).map(([k, v]) => [fieldColumns[k], v]));
1115
+ }
1116
+
1049
1117
  /** @import { SetValue } from '../../set.mjs' */
1050
1118
  /** @import { Fields } from '../../types' */
1051
1119
  /**
1052
1120
  *
1053
- * @param {Fields} fields
1121
+ * @param {Fields} columns
1054
1122
  * @param {Record<string, SetValue>} update
1055
1123
  * @returns
1056
1124
  */
1057
- async function setDeleteTimestamp(fields, update) {
1058
- for (const [name, field] of Object.entries(fields)) {
1125
+ async function setDeleteTimestamp(columns, update) {
1126
+ for (const [name, field] of Object.entries(columns)) {
1059
1127
  if (field.primary) {
1060
1128
  continue;
1061
1129
  }
@@ -1069,7 +1137,7 @@ async function setDeleteTimestamp(fields, update) {
1069
1137
 
1070
1138
  /** @import { WhereValue } from '../Where.mjs' */
1071
1139
  /** @import { SetValue } from '../set.mjs' */
1072
- /** @import { Environment, IConnection, GetName, TableDefine } from '../types' */
1140
+ /** @import { Environment, IConnection, TableDefine } from '../types' */
1073
1141
  /**
1074
1142
  *
1075
1143
  * @param {IConnection} conn
@@ -1084,13 +1152,13 @@ async function pseudoDestroy (conn, tableDef, data, update, env) {
1084
1152
  table,
1085
1153
  fields
1086
1154
  } = tableDef;
1087
- const baseFields = toBaseFields(fields);
1088
1155
  /** @type {WhereValue[]} */
1089
1156
  const where = getPrimaryKeys(fields).map(k => ({
1090
1157
  field: k,
1091
1158
  operator: '=',
1092
1159
  value: data[k]
1093
1160
  }));
1161
+ const [columns, fieldColumns] = toColumns(fields);
1094
1162
  const pseudo = tableDef.pseudo || '';
1095
1163
  where.push({
1096
1164
  field: pseudo,
@@ -1102,24 +1170,13 @@ async function pseudoDestroy (conn, tableDef, data, update, env) {
1102
1170
  };
1103
1171
  const pseudoValue = Number(new Date());
1104
1172
  value[pseudo] = pseudoValue;
1105
- await setDeleteTimestamp(fields, value);
1106
- const [dataUpdated] = table && typeof table === 'object' ? await table.updateReturn(env, conn, {
1107
- table: '',
1108
- fields: baseFields,
1109
- where
1110
- }, value, Object.keys(baseFields)) : await conn.updateReturn(env, {
1111
- table: table || '',
1112
- fields: baseFields,
1113
- where
1114
- }, value, Object.keys(baseFields));
1115
- if (!dataUpdated) {
1116
- return null;
1117
- }
1118
- return dataUpdated;
1173
+ const set = set2column(value, fieldColumns);
1174
+ await setDeleteTimestamp(columns, set);
1175
+ const dataUpdated = table && typeof table === 'object' ? await table.updateReturn(env, conn, Object.keys(columns), columns, set, where2column(where, fieldColumns)) : await conn.updateReturn(env, Object.keys(columns), table || '', columns, set, where2column(where, fieldColumns));
1176
+ return toFieldList(dataUpdated, fieldColumns)[0] || null;
1119
1177
  }
1120
1178
 
1121
- /** @import { WhereValue } from '../Where.mjs' */
1122
- /** @import { IConnection, TableDefine, Environment, GetName } from '../types' */
1179
+ /** @import { IConnection, TableDefine, Environment } from '../types' */
1123
1180
  /**
1124
1181
  *
1125
1182
  * @param {IConnection} conn
@@ -1133,23 +1190,15 @@ async function completelyDelete (conn, tableDef, data, env) {
1133
1190
  table,
1134
1191
  fields
1135
1192
  } = tableDef;
1136
- const [baseFields, tableFields] = separateFields(fields);
1137
- /** @type {WhereValue[]} */
1138
- const where = getPrimaryKeys(fields).map(k => ({
1193
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1194
+ const where = where2column(getPrimaryKeys(fields).map(k => ({
1139
1195
  field: k,
1140
1196
  operator: '=',
1141
1197
  value: data[k]
1142
- }));
1143
- const list = table && typeof table === 'object' ? await table.deleteReturn(env, conn, {
1144
- table: '',
1145
- fields: baseFields,
1146
- where
1147
- }, Object.keys(baseFields)) : await conn.deleteReturn(env, {
1148
- table: table || '',
1149
- fields: baseFields,
1150
- where
1151
- }, Object.keys(baseFields));
1152
- const [deleted] = await deleteSub(conn, list, tableFields, baseFields, env, true);
1198
+ })), fieldColumns);
1199
+ const list = toFieldList(table && typeof table === 'object' ? await table.deleteReturn(env, conn, Object.keys(columns), columns, where) : await conn.deleteReturn(env, Object.keys(columns), table || '', columns, where), fieldColumns);
1200
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
1201
+ const [deleted] = await deleteSub(conn, list, tableFields, baseFieldSet, env, true);
1153
1202
  return deleted || null;
1154
1203
  }
1155
1204
 
@@ -1159,15 +1208,39 @@ const Save = Symbol();
1159
1208
  const Create = Symbol();
1160
1209
  const Build = Symbol();
1161
1210
 
1162
- /** @import { Fields, FieldType, Select } from '../types' */
1211
+ /** @import { Fields, FieldType, Select } from '../../types' */
1163
1212
  /**
1164
- * @param {Fields<keyof FieldType>} fields
1213
+ * @param {Select} select
1214
+ * @param {Record<string, string>} fieldColumns
1215
+ * @returns {Select}
1216
+ */
1217
+ function toSelectItem(select, fieldColumns) {
1218
+ return {
1219
+ ...select,
1220
+ field: fieldColumns[select.field]
1221
+ };
1222
+ }
1223
+ /**
1224
+ * @param {Fields<keyof FieldType>} columns
1225
+ * @param {Record<string, string>?} fieldColumns
1165
1226
  * @param {Record<string, Select>?} [select]
1166
1227
  * @returns {[string, Select][]}
1167
1228
  */
1168
- function toSelect(fields, select) {
1229
+ function select2column(columns, fieldColumns, select) {
1169
1230
  const list = select ? Object.entries(select) : [];
1170
- return list.length ? list : Object.keys(fields).map(k => [k, {
1231
+ if (list.length) {
1232
+ if (!fieldColumns) {
1233
+ return list;
1234
+ }
1235
+ return list.map(([k, s]) => [k, toSelectItem(s, fieldColumns)]);
1236
+ }
1237
+ if (fieldColumns) {
1238
+ return Object.entries(fieldColumns).map(([f, c]) => [f, {
1239
+ field: c
1240
+ }]);
1241
+ }
1242
+ let keys = Object.keys(columns);
1243
+ return keys.map(k => [k, {
1171
1244
  field: k
1172
1245
  }]);
1173
1246
  }
@@ -1175,32 +1248,45 @@ function toSelect(fields, select) {
1175
1248
  /** @import { Fields, FieldType } from '../../types' */
1176
1249
  /**
1177
1250
  *
1178
- * @param {Fields<keyof FieldType>} fields
1179
- * @param {string} [noField]
1251
+ * @param {Fields<keyof FieldType>} columns
1252
+ * @param {string} [noColumn]
1180
1253
  * @returns {[string, boolean][]}
1181
1254
  */
1182
- function getDefaultSort(fields, noField) {
1255
+ function getDefaultSort(columns, noColumn) {
1183
1256
  /** @type {[string, boolean, number][]} */
1184
- const sorted = Object.entries(fields).map(([f, d]) => [f, (d.sort || 0) < 0, Math.abs(d.sort || 0)]);
1257
+ const sorted = Object.entries(columns).map(([f, d]) => [f, (d.sort || 0) < 0, Math.abs(d.sort || 0)]);
1185
1258
  /** @type {[string, boolean][]} */
1186
1259
  const sort = sorted.filter(v => v[2]).sort(([,, a], [,, b]) => a - b).map(([a, b]) => [a, b]);
1187
- if (noField) {
1188
- sort.unshift([noField, false]);
1260
+ if (noColumn) {
1261
+ sort.unshift([noColumn, false]);
1189
1262
  }
1190
1263
  return sort;
1191
1264
  }
1192
1265
 
1193
- /** @import { Environment, FieldDefine, Fields, FieldType, GetName, IConnection, TableDefine } from '../types' */
1266
+ /**
1267
+ *
1268
+ * @param {[field: string, desc: boolean][]} sort
1269
+ * @param {Record<string, string>?} fieldColumns
1270
+ * @returns {[field: string, desc: boolean][]}
1271
+ */
1272
+ function sort2column(sort, fieldColumns) {
1273
+ if (!fieldColumns) {
1274
+ return sort;
1275
+ }
1276
+ return sort.map(([f, d]) => [fieldColumns[f], d]);
1277
+ }
1278
+
1279
+ /** @import { Environment, FieldDefine, Fields, FieldType, IConnection, TableDefine } from '../types' */
1194
1280
  /**
1195
1281
  *
1196
1282
  * @param {IConnection} conn
1197
1283
  * @param {any[]} list
1198
1284
  * @param {[string, FieldDefine<TableDefine>][]} fields
1199
- * @param {Fields<keyof FieldType>} baseFields
1285
+ * @param {Set<string>} baseFieldSet
1200
1286
  * @param {Environment} env
1201
1287
  * @returns {Promise<any[]>}
1202
1288
  */
1203
- async function findSub(conn, list, fields, baseFields, env) {
1289
+ async function findSub(conn, list, fields, baseFieldSet, env) {
1204
1290
  if (!list.length) {
1205
1291
  return list;
1206
1292
  }
@@ -1216,31 +1302,29 @@ async function findSub(conn, list, fields, baseFields, env) {
1216
1302
  const {
1217
1303
  fields
1218
1304
  } = type;
1219
- const [subfields, tableFields] = separateFields(fields);
1220
- const mapList = getMapList(subfields, baseFields, constraints);
1305
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1306
+ const noColumn = noField && fieldColumns ? fieldColumns[noField] : noField;
1307
+ const mapList = getMapList(fields, baseFieldSet, constraints);
1221
1308
  if (!mapList) {
1222
1309
  continue;
1223
1310
  }
1224
- const value = getValueEntries(constraints, subfields);
1225
- const where = [subList2where(list, mapList), ...valueEntries2where(value)];
1311
+ const value = getValueEntries(constraints, columns);
1312
+ const where = where2column([subList2where(list, mapList), ...valueEntries2where(value)], fieldColumns);
1313
+ const select = select2column(columns, fieldColumns);
1226
1314
  const {
1227
1315
  table
1228
1316
  } = type;
1229
1317
  /** @type {PromiseLike<object[] | object>} */
1230
- const result = table && typeof table === 'object' ? table.select(env, conn, {
1231
- table: '',
1232
- fields: subfields,
1318
+ const result = table && typeof table === 'object' ? table.find(env, conn, columns, {
1233
1319
  where,
1234
- sort: getDefaultSort(subfields, noField),
1235
- select: toSelect(subfields)
1236
- }) : conn.select(env, {
1237
- table: table || '',
1238
- fields: subfields,
1320
+ sort: getDefaultSort(columns, noColumn),
1321
+ select
1322
+ }) : conn.find(env, table || '', columns, {
1239
1323
  where,
1240
- sort: getDefaultSort(subfields, noField),
1241
- select: toSelect(subfields)
1324
+ sort: getDefaultSort(columns, noColumn),
1325
+ select
1242
1326
  });
1243
- promises.push(result.then(list => findSub(conn, list, tableFields, subfields, env)));
1327
+ promises.push(result.then(list => findSub(conn, list, tableFields, new Set(Object.keys(fieldColumns || columns)), env)));
1244
1328
  promises.push(array ? result.then(subList => {
1245
1329
  for (const item of list) {
1246
1330
  item[key] = subList.filter(createFilter(item, mapList));
@@ -1271,33 +1355,27 @@ async function find(conn, p, env) {
1271
1355
  where,
1272
1356
  sort,
1273
1357
  offset,
1274
- limit,
1275
- alias
1358
+ limit
1276
1359
  } = getOptions(p);
1277
- const [baseFields, tableFields] = separateFields(fields);
1278
- const list = table && typeof table === 'object' ? await table.select(env, conn, {
1279
- table: '',
1280
- fields: baseFields,
1281
- alias,
1282
- where,
1360
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1361
+ const list = table && typeof table === 'object' ? await table.find(env, conn, columns, {
1362
+ where: where2column(where, fieldColumns),
1283
1363
  offset,
1284
1364
  limit,
1285
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1286
- select: toSelect(baseFields)
1287
- }) : await conn.select(env, {
1288
- table: table || '',
1289
- fields: baseFields,
1290
- alias,
1291
- where,
1365
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1366
+ select: select2column(columns, fieldColumns)
1367
+ }) : await conn.find(env, table || '', columns, {
1368
+ where: where2column(where, fieldColumns),
1292
1369
  offset,
1293
1370
  limit,
1294
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1295
- select: toSelect(baseFields)
1371
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1372
+ select: select2column(columns, fieldColumns)
1296
1373
  });
1297
1374
  if (!list.length) {
1298
1375
  return [];
1299
1376
  }
1300
- await findSub(conn, list, tableFields, baseFields, env);
1377
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
1378
+ await findSub(conn, list, tableFields, baseFieldSet, env);
1301
1379
  if (typeof p[Build] !== 'function') {
1302
1380
  return list;
1303
1381
  }
@@ -1306,7 +1384,7 @@ async function find(conn, p, env) {
1306
1384
  return list.map(it => R(it, true, env));
1307
1385
  }
1308
1386
 
1309
- /** @import { Environment, TableDefine, IConnection, GetName } from '../types' */
1387
+ /** @import { Environment, TableDefine, IConnection } from '../types' */
1310
1388
  /**
1311
1389
  *
1312
1390
  * @template {TableDefine} T
@@ -1323,28 +1401,22 @@ async function first(conn, p, env) {
1323
1401
  // @ts-ignore
1324
1402
  const {
1325
1403
  where,
1326
- sort,
1327
- alias
1404
+ sort
1328
1405
  } = getOptions(p);
1329
- const [baseFields, tableFields] = separateFields(fields);
1330
- const list = table && typeof table === 'object' ? await table.select(env, conn, {
1331
- table: '',
1332
- fields: baseFields,
1333
- alias,
1334
- where,
1406
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1407
+ const list = table && typeof table === 'object' ? await table.find(env, conn, columns, {
1408
+ where: where2column(where, fieldColumns),
1335
1409
  limit: 1,
1336
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1337
- select: toSelect(baseFields)
1338
- }) : await conn.select(env, {
1339
- table: table || '',
1340
- fields: baseFields,
1341
- alias,
1342
- where,
1410
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1411
+ select: select2column(columns, fieldColumns)
1412
+ }) : await conn.find(env, table || '', columns, {
1413
+ where: where2column(where, fieldColumns),
1343
1414
  limit: 1,
1344
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1345
- select: toSelect(baseFields)
1415
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1416
+ select: select2column(columns, fieldColumns)
1346
1417
  });
1347
- const [item] = await findSub(conn, list, tableFields, baseFields, env);
1418
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
1419
+ const [item] = await findSub(conn, list, tableFields, baseFieldSet, env);
1348
1420
  if (!item) {
1349
1421
  return null;
1350
1422
  }
@@ -1354,7 +1426,7 @@ async function first(conn, p, env) {
1354
1426
  return p[Build](item, true, env);
1355
1427
  }
1356
1428
 
1357
- /** @import { Environment, GetName, IConnection, Queryable } from '../types' */
1429
+ /** @import { Environment, IConnection, Queryable } from '../types' */
1358
1430
  /**
1359
1431
  * @param {IConnection} conn
1360
1432
  * @param {Queryable} queryable
@@ -1369,35 +1441,127 @@ async function pseudoDeleteMany(conn, queryable, update, env) {
1369
1441
  const {
1370
1442
  where
1371
1443
  } = getOptions(queryable);
1444
+ const [columns, fieldColumns] = toColumns(fields);
1372
1445
  const value = typeof update !== 'object' ? {} : {
1373
1446
  ...update
1374
1447
  };
1375
1448
  const pseudoValue = Number(new Date());
1376
1449
  const pseudo = queryable.pseudo || '';
1377
1450
  value[pseudo] = pseudoValue;
1378
- await setDeleteTimestamp(fields, value);
1379
- const baseFields = toBaseFields(fields);
1380
- const list = table && typeof table === 'object' ? await table.updateReturn(env, conn, {
1381
- table: '',
1382
- fields: baseFields,
1383
- where
1384
- }, value, Object.keys(baseFields)) : await conn.updateReturn(env, {
1385
- table: table || '',
1386
- fields: baseFields,
1387
- where
1388
- }, value, Object.keys(baseFields));
1451
+ const set = set2column(value, fieldColumns);
1452
+ await setDeleteTimestamp(columns, set);
1453
+ const list = table && typeof table === 'object' ? await table.updateReturn(env, conn, Object.keys(columns), columns, set, where2column(where, fieldColumns)) : await conn.updateReturn(env, Object.keys(columns), table || '', columns, set, where2column(where, fieldColumns));
1389
1454
  return list.length;
1390
1455
  }
1391
1456
 
1457
+ /** @import { TableDefine } from '../types/table' */
1458
+ /** @import { DBIndex, DBTable } from '../types/connection' */
1459
+ /**
1460
+ *
1461
+ * @param {(TableDefine | DBTable)[]} tables
1462
+ */
1463
+ function table2db(tables) {
1464
+ /** @type {DBTable[]} */
1465
+ const allTables = [];
1466
+ /** @type {Map<string, DBTable & {indexes: DBIndex[]}>} */
1467
+ const map = new Map();
1468
+ const saved = new Set();
1469
+ /** @type {(TableDefine | DBTable)[]} */
1470
+ const list = [...tables];
1471
+ for (let define = list.pop(); define; define = list.pop()) {
1472
+ if (saved.has(define)) {
1473
+ continue;
1474
+ }
1475
+ saved.add(define);
1476
+ const {
1477
+ table,
1478
+ fields,
1479
+ indexes
1480
+ } = define;
1481
+ if (table && typeof table === 'string') {
1482
+ let t = map.get(table);
1483
+ if (!t) {
1484
+ t = {
1485
+ table,
1486
+ fields: Object.create(null),
1487
+ indexes: []
1488
+ };
1489
+ map.set(table, t);
1490
+ allTables.push(t);
1491
+ }
1492
+ const dbColumns = t.fields;
1493
+ for (const [name, field] of Object.entries(fields)) {
1494
+ const {
1495
+ type,
1496
+ size,
1497
+ scale,
1498
+ default: value,
1499
+ nullable,
1500
+ array,
1501
+ primary
1502
+ } = field;
1503
+ if (!type) {
1504
+ continue;
1505
+ }
1506
+ const key = field.column || name;
1507
+ const old = dbColumns[key];
1508
+ if (typeof type === 'string') {
1509
+ if (!old) {
1510
+ t.fields[key] = {
1511
+ type,
1512
+ size,
1513
+ scale,
1514
+ default: value,
1515
+ nullable,
1516
+ array,
1517
+ primary
1518
+ };
1519
+ } else {
1520
+ t.fields[key] = {
1521
+ type,
1522
+ size: size || old.size,
1523
+ scale: scale || old.scale,
1524
+ default: value ?? old.default,
1525
+ nullable: nullable ?? old.nullable,
1526
+ array: array ?? old.array,
1527
+ primary: primary || old.primary
1528
+ };
1529
+ }
1530
+ continue;
1531
+ }
1532
+ if (type.table) {
1533
+ continue;
1534
+ }
1535
+ if (!old) {
1536
+ t.fields[key] = {
1537
+ type: 'object',
1538
+ nullable,
1539
+ array
1540
+ };
1541
+ } else {
1542
+ old.type = 'object';
1543
+ old.array = array ?? old.array;
1544
+ old.nullable = nullable ?? old.nullable;
1545
+ }
1546
+ }
1547
+ for (const index of indexes || []) {
1548
+ t.indexes.push(index);
1549
+ }
1550
+ }
1551
+ for (const {
1552
+ type
1553
+ } of Object.values(fields)) {
1554
+ if (!type || typeof type === 'string') {
1555
+ continue;
1556
+ }
1557
+ list.push(type);
1558
+ }
1559
+ }
1560
+ return allTables;
1561
+ }
1562
+
1392
1563
  /* eslint-disable max-lines */
1393
1564
  /* eslint-disable max-len */
1394
- /** @import { WhereValue } from '../Where.mjs' */
1395
- /** @import { SetValue } from '../set.mjs' */
1396
- /** @import { Environment, IConnection } from '../types' */
1397
- /** @import { Fields, FieldType, FieldValue, IndexOptions, MainFieldType, TableDefine } from '../types/table' */
1398
- /** @import { Queryable } from '../types/options' */
1399
- /** @import { Column, ColumnOptions } from '../types/column' */
1400
- /** @import { DBTable, GetName, Skip, TableType } from '../types/connection' */
1401
1565
  /**
1402
1566
  *
1403
1567
  * @param {Fields<keyof FieldType>} fields
@@ -1610,6 +1774,7 @@ class Connection {
1610
1774
  if (newData) {
1611
1775
  /** @type {any} */
1612
1776
  const doc = data;
1777
+ // @ts-ignore
1613
1778
  return updateData(conn, model, doc, newData, this.#env);
1614
1779
  }
1615
1780
  return create(conn, this.#env, model, data);
@@ -1660,6 +1825,7 @@ class Connection {
1660
1825
  };
1661
1826
  if (typeof data[PseudoDestroy] !== 'function') {
1662
1827
  const conn = await this.#getConnection();
1828
+ // @ts-ignore
1663
1829
  return pseudoDestroy(conn, tableDef, data, update, this.#env);
1664
1830
  }
1665
1831
  const r = /** @type {PseudoDestroy} */data;
@@ -1730,22 +1896,24 @@ class Connection {
1730
1896
  table,
1731
1897
  fields
1732
1898
  }, data, keys) {
1733
- const baseFields = toBaseFields(fields);
1899
+ const [columns, fieldColumns] = toColumns(fields);
1734
1900
  const isArray = Array.isArray(data);
1735
- const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d, fields));
1901
+ const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d, columns, fieldColumns));
1736
1902
  if (!insertValues.length) {
1737
1903
  throw new Error();
1738
1904
  }
1739
- let insertKeys = [...new Set(keys || [])].filter(k => k in baseFields);
1905
+ let insertKeys = fieldColumns ? [...new Set(keys || [])].map(k => fieldColumns[k]).filter(Boolean) : [...new Set(keys || [])].filter(k => k in columns);
1740
1906
  if (!insertKeys.length && !isArray) {
1741
- insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in baseFields).map(([k]) => k);
1907
+ insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in columns).map(([k]) => k);
1742
1908
  }
1743
1909
  if (!insertKeys.length) {
1744
- insertKeys = Object.entries(baseFields).map(v => v[0]);
1910
+ insertKeys = Object.entries(columns).map(v => v[0]);
1745
1911
  }
1746
1912
  const conn = await this.#getConnection();
1747
- const p = table && typeof table === 'object' ? await table.insert(this.#env, conn, '', baseFields, insertValues, insertKeys) : await conn.insert(this.#env, table || '', baseFields, insertValues, insertKeys);
1748
- return isArray ? (/** @type {*}*/p) : p[0];
1913
+ const result = table && typeof table === 'object' ? await table.insert(this.#env, conn, columns, insertValues, insertKeys) : await conn.insert(this.#env, table || '', columns, insertValues, insertKeys);
1914
+ const list = toFieldList(result, fieldColumns);
1915
+ // @ts-ignore
1916
+ return isArray ? list : list[0];
1749
1917
  }
1750
1918
  /**
1751
1919
  * @param {TableDefine} tableDefine
@@ -1758,16 +1926,9 @@ class Connection {
1758
1926
  table,
1759
1927
  fields
1760
1928
  }, update, where, skip) {
1929
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1761
1930
  const conn = await this.#getConnection();
1762
- return table && typeof table === 'object' ? table.update(this.#env, conn, {
1763
- table: '',
1764
- fields: toBaseFields(fields),
1765
- where: where || undefined
1766
- }, await getSetNewValue(fields, update, skip)) : conn.update(this.#env, {
1767
- table: table || '',
1768
- fields: toBaseFields(fields),
1769
- where: where || undefined
1770
- }, await getSetNewValue(fields, update, skip));
1931
+ return table && typeof table === 'object' ? table.update(this.#env, conn, columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns)) : conn.update(this.#env, table || '', columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns));
1771
1932
  }
1772
1933
  /**
1773
1934
  * @template {Fields<MainFieldType>} T
@@ -1782,17 +1943,10 @@ class Connection {
1782
1943
  table,
1783
1944
  fields
1784
1945
  }, update, returning, where, skip) {
1946
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1785
1947
  const conn = await this.#getConnection();
1786
- const baseFields = toBaseFields(fields);
1787
- return table && typeof table === 'object' ? table.updateReturn(this.#env, conn, {
1788
- table: '',
1789
- fields: baseFields,
1790
- where: where || undefined
1791
- }, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields)) : conn.updateReturn(this.#env, {
1792
- table: table || '',
1793
- fields: baseFields,
1794
- where: where || undefined
1795
- }, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields));
1948
+ const result = table && typeof table === 'object' ? await table.updateReturn(this.#env, conn, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns)) : await conn.updateReturn(this.#env, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), table || '', columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns));
1949
+ return toFieldList(result, fieldColumns);
1796
1950
  }
1797
1951
  /**
1798
1952
  * @param {TableDefine} tableDefine
@@ -1806,11 +1960,11 @@ class Connection {
1806
1960
  table,
1807
1961
  fields
1808
1962
  }, pKeys, setKeys, list, skip) {
1809
- const baseFields = toBaseFields(fields);
1810
- const update = await getSetNewValue(fields, null, skip);
1811
- const [whereFields, setFields] = getKeys(baseFields, update, pKeys, setKeys);
1963
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1964
+ const update = await getSetValue$1(columns, fieldColumns, null, skip);
1965
+ const [whereColumns, setColumns] = getKeys(columns, update, field2column(pKeys, fieldColumns), field2column(setKeys, fieldColumns));
1812
1966
  const conn = await this.#getConnection();
1813
- return table && typeof table === 'object' ? table.updateMany(this.#env, conn, '', baseFields, update, whereFields, setFields, list, []) : conn.updateMany(this.#env, table || '', baseFields, update, whereFields, setFields, list, []);
1967
+ return table && typeof table === 'object' ? table.updateMany(this.#env, conn, columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), []) : conn.updateMany(this.#env, table || '', columns, update, whereColumns, setColumns, list, []);
1814
1968
  }
1815
1969
  /**
1816
1970
  * @template {Fields<MainFieldType>} T
@@ -1826,11 +1980,12 @@ class Connection {
1826
1980
  table,
1827
1981
  fields
1828
1982
  }, pKeys, setKeys, list, returning, skip) {
1829
- const baseFields = toBaseFields(fields);
1830
- const update = getSetNewValue(fields, null, skip);
1831
- const [whereFields, setFields] = getKeys(baseFields, update, pKeys, setKeys);
1983
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1984
+ const update = getSetValue$1(columns, fieldColumns, null, skip);
1985
+ const [whereColumns, setColumns] = getKeys(columns, update, field2column(pKeys, fieldColumns), field2column(setKeys, fieldColumns));
1832
1986
  const conn = await this.#getConnection();
1833
- return table && typeof table === 'object' ? table.updateManyReturn(this.#env, conn, '', baseFields, update, whereFields, setFields, list, [], returning?.length ? returning : Object.keys(baseFields)) : conn.updateManyReturn(this.#env, table || '', baseFields, update, whereFields, setFields, list, [], returning?.length ? returning : Object.keys(baseFields));
1987
+ const result = table && typeof table === 'object' ? await table.updateManyReturn(this.#env, conn, columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), [], returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns)) : await conn.updateManyReturn(this.#env, table || '', columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), [], returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns));
1988
+ return toFieldList(result, fieldColumns);
1834
1989
  }
1835
1990
  /**
1836
1991
  * @param {TableDefine} tableDefine
@@ -1841,16 +1996,9 @@ class Connection {
1841
1996
  table,
1842
1997
  fields
1843
1998
  }, where) {
1999
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1844
2000
  const conn = await this.#getConnection();
1845
- return table && typeof table === 'object' ? table.delete(this.#env, conn, {
1846
- table: '',
1847
- fields: toBaseFields(fields),
1848
- where
1849
- }) : conn.delete(this.#env, {
1850
- table: table || '',
1851
- fields: toBaseFields(fields),
1852
- where
1853
- });
2001
+ return table && typeof table === 'object' ? table.delete(this.#env, conn, columns, where2column(where, fieldColumns)) : conn.delete(this.#env, table || '', columns, where2column(where, fieldColumns));
1854
2002
  }
1855
2003
  /**
1856
2004
  * @template {Fields<MainFieldType>} T
@@ -1863,17 +2011,10 @@ class Connection {
1863
2011
  table,
1864
2012
  fields
1865
2013
  }, returning, where) {
2014
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1866
2015
  const conn = await this.#getConnection();
1867
- const baseFields = toBaseFields(fields);
1868
- return table && typeof table === 'object' ? table.deleteReturn(this.#env, conn, {
1869
- table: '',
1870
- fields: baseFields,
1871
- where
1872
- }, returning?.length ? returning : Object.keys(baseFields)) : conn.deleteReturn(this.#env, {
1873
- table: table || '',
1874
- fields: baseFields,
1875
- where
1876
- }, returning?.length ? returning : Object.keys(baseFields));
2016
+ const result = table && typeof table === 'object' ? await table.deleteReturn(this.#env, conn, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), columns, where2column(where, fieldColumns)) : await conn.deleteReturn(this.#env, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), table || '', columns, where2column(where, fieldColumns));
2017
+ return toFieldList(result, fieldColumns);
1877
2018
  }
1878
2019
  /**
1879
2020
  *
@@ -1881,50 +2022,49 @@ class Connection {
1881
2022
  * @returns {Promise<number>}
1882
2023
  */
1883
2024
  async count(queryable) {
2025
+ const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
1884
2026
  const {
1885
- table,
1886
- fields
2027
+ table
1887
2028
  } = queryable;
1888
2029
  const options = getOptions(queryable);
2030
+ const where = where2column(options.where, fieldColumns);
1889
2031
  const conn = await this.#getConnection();
1890
- return table && typeof table === 'object' ? table.count(this.#env, conn, {
1891
- ...options,
1892
- table: '',
1893
- fields: toBaseFields(fields)
1894
- }) : conn.count(this.#env, {
1895
- ...options,
1896
- table: table || '',
1897
- fields: toBaseFields(fields)
1898
- });
2032
+ return table && typeof table === 'object' ? table.count(this.#env, conn, columns, where) : conn.count(this.#env, table || '', columns, where);
1899
2033
  }
1900
2034
  /**
1901
2035
  * @param {Queryable} queryable
1902
2036
  * @returns {Promise<any[]>}
1903
2037
  */
1904
2038
  async select(queryable) {
2039
+ const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
1905
2040
  const {
1906
2041
  table
1907
2042
  } = queryable;
1908
- const fields = toBaseFields(queryable.fields);
1909
2043
  const options = getOptions(queryable);
2044
+ const {
2045
+ offset,
2046
+ limit
2047
+ } = options;
2048
+ const where = where2column(options.where, fieldColumns);
1910
2049
  const conn = await this.#getConnection();
1911
- const select = toSelect(fields, options.select);
2050
+ const select = select2column(columns, fieldColumns, options.select);
1912
2051
  const {
1913
2052
  sort
1914
2053
  } = options;
1915
- return table && typeof table === 'object' ? table.select(this.#env, conn, {
1916
- ...options,
1917
- table: '',
1918
- fields,
2054
+ const result = table && typeof table === 'object' ? await table.find(this.#env, conn, columns, {
2055
+ offset,
2056
+ limit,
2057
+ where,
1919
2058
  select,
1920
- sort: sort?.length ? sort : getDefaultSort(fields)
1921
- }) : conn.select(this.#env, {
1922
- ...options,
1923
- table: table || '',
1924
- fields,
2059
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
2060
+ }) : await conn.find(this.#env, table || '', columns, {
2061
+ offset,
2062
+ limit,
2063
+ where,
1925
2064
  select,
1926
- sort: sort?.length ? sort : getDefaultSort(fields)
2065
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
1927
2066
  });
2067
+ return result;
1928
2068
  }
1929
2069
  /**
1930
2070
  * @param {string} table
@@ -2023,62 +2163,6 @@ class Connection {
2023
2163
  const conn = await this.#getConnection();
2024
2164
  return conn.renameTable(this.#env, table, newName);
2025
2165
  }
2026
- /**
2027
- * @param {string} view
2028
- * @param {Queryable} queryable
2029
- * @returns {Promise<number>}
2030
- */
2031
- async createView(view, queryable) {
2032
- const conn = await this.#getConnection();
2033
- const {
2034
- table
2035
- } = queryable;
2036
- const fields = toBaseFields(queryable.fields);
2037
- const options = getOptions(queryable);
2038
- const select = toSelect(fields, options.select);
2039
- return conn.createView(this.#env, view, {
2040
- ...options,
2041
- table: typeof table === 'string' ? table : '',
2042
- fields,
2043
- select
2044
- });
2045
- }
2046
- /**
2047
- * @param {string} view
2048
- * @returns {Promise<number>}
2049
- */
2050
- async dropView(view) {
2051
- const conn = await this.#getConnection();
2052
- return conn.dropView(this.#env, view);
2053
- }
2054
- /**
2055
- * @param {string} view
2056
- * @param {Queryable} queryable
2057
- * @returns {Promise<number>}
2058
- */
2059
- async createMaterializedView(view, queryable) {
2060
- const conn = await this.#getConnection();
2061
- const {
2062
- table
2063
- } = queryable;
2064
- const fields = toBaseFields(queryable.fields);
2065
- const options = getOptions(queryable);
2066
- const select = toSelect(fields, options.select);
2067
- return conn.createMaterializedView(this.#env, view, {
2068
- ...options,
2069
- table: typeof table === 'string' ? table : '',
2070
- fields,
2071
- select
2072
- });
2073
- }
2074
- /**
2075
- * @param {string} view
2076
- * @returns {Promise<number>}
2077
- */
2078
- async dropMaterializedView(view) {
2079
- const conn = await this.#getConnection();
2080
- return conn.dropMaterializedView(this.#env, view);
2081
- }
2082
2166
  /** @type {AbortController[]} */
2083
2167
  #layers = [];
2084
2168
  /**
@@ -2164,12 +2248,20 @@ class Connection {
2164
2248
  return conn.loadTables(this.#env, tables);
2165
2249
  }
2166
2250
  /**
2167
- * @param {DBTable[]} tables
2251
+ * @param {TableDefine | DBTable} table
2252
+ * @returns {Promise<void>}
2253
+ */
2254
+ async syncTable(table) {
2255
+ const conn = await this.#getConnection();
2256
+ return conn.syncTables(this.#env, table2db([table]));
2257
+ }
2258
+ /**
2259
+ * @param {(TableDefine | DBTable)[]} tables
2168
2260
  * @returns {Promise<void>}
2169
2261
  */
2170
2262
  async syncTables(tables) {
2171
2263
  const conn = await this.#getConnection();
2172
- return conn.syncTables(this.#env, tables);
2264
+ return conn.syncTables(this.#env, table2db(tables));
2173
2265
  }
2174
2266
  /**
2175
2267
  * @template T
@@ -2411,12 +2503,7 @@ function submodel(type, constraints, p1, p2) {
2411
2503
  const define = {
2412
2504
  ...p,
2413
2505
  constraints,
2414
- type: {
2415
- table: type.table,
2416
- fields: type.fields,
2417
- pseudo: type.pseudo,
2418
- indexes: type.indexes
2419
- },
2506
+ type,
2420
2507
  array,
2421
2508
  nullable: false,
2422
2509
  immutable
@@ -2782,6 +2869,16 @@ function prop(prop, value) {
2782
2869
  return (_, ctx) => setProp(ctx, prop, value);
2783
2870
  }
2784
2871
 
2872
+ /** @import { FieldDecorator } from './index.mjs' */
2873
+ /**
2874
+ *
2875
+ * @param {string} [column]
2876
+ * @returns {FieldDecorator<any>}
2877
+ */
2878
+ function column(column) {
2879
+ return (_, ctx) => setProp(ctx, 'column', column);
2880
+ }
2881
+
2785
2882
  /** @import { FieldDecorator } from './index.mjs' */
2786
2883
  /**
2787
2884
  *
@@ -3543,7 +3640,7 @@ class Where {
3543
3640
  }
3544
3641
  }
3545
3642
 
3546
- /** @typedef {SetValue.Increment | SetValue.Decrement | SetValue.Multiply | SetValue.Divide | string | number | bigint | boolean | null | typeof now | (string | number | bigint | boolean)[]} SetValue */
3643
+ /** @typedef {SetValue.Increment | SetValue.Decrement | SetValue.Multiply | SetValue.Divide | string | number | bigint | boolean | null | typeof now | typeof uuid | (string | number | bigint | boolean)[]} SetValue */
3547
3644
  /** @typedef {{[values.increment]: number | bigint}} SetValue.Increment */
3548
3645
  /** @typedef {{[values.decrement]: number | bigint}} SetValue.Decrement */
3549
3646
  /** @typedef {{[values.multiply]: number | bigint}} SetValue.Multiply */
@@ -4305,7 +4402,7 @@ function getInitValue(field, value) {
4305
4402
  if (typeof type === 'string') {
4306
4403
  return getBaseTypeValue(type, field.array, value, true);
4307
4404
  }
4308
- if (!type.table) {
4405
+ if (!type?.table) {
4309
4406
  return getBaseTypeValue('object', field.array, value, true);
4310
4407
  }
4311
4408
  const {
@@ -4335,6 +4432,9 @@ function getInitValue(field, value) {
4335
4432
  const {
4336
4433
  type
4337
4434
  } = field;
4435
+ if (!type) {
4436
+ continue;
4437
+ }
4338
4438
  if (typeof type === 'string') {
4339
4439
  doc[key] = getBaseTypeValue(type, field.array, values[key]);
4340
4440
  } else if (!type.table) {
@@ -4362,6 +4462,9 @@ function getSetValue(field, value, immutable) {
4362
4462
  }
4363
4463
  return getBaseTypeValue(type, field.array, value, true);
4364
4464
  }
4465
+ if (!type) {
4466
+ return;
4467
+ }
4365
4468
  if (!type.table) {
4366
4469
  return getBaseTypeValue('object', field.array, value, true);
4367
4470
  }
@@ -4393,6 +4496,9 @@ function getSetValue(field, value, immutable) {
4393
4496
  const {
4394
4497
  type
4395
4498
  } = field;
4499
+ if (!type) {
4500
+ continue;
4501
+ }
4396
4502
  if (typeof type === 'string') {
4397
4503
  if (typeof type !== 'string') {
4398
4504
  continue;
@@ -4552,6 +4658,9 @@ class Model {
4552
4658
  const {
4553
4659
  type
4554
4660
  } = field;
4661
+ if (!type) {
4662
+ continue;
4663
+ }
4555
4664
  // eslint-disable-next-line no-nested-ternary
4556
4665
  values[key] = typeof type === 'string' ? getBaseTypeValue(type, field.array)
4557
4666
  // eslint-disable-next-line no-nested-ternary
@@ -5095,4 +5204,4 @@ function field(type, {
5095
5204
  };
5096
5205
  }
5097
5206
 
5098
- export { Build, Connection, Create, Destroy, Model, PseudoDestroy, Query, Save, Submodel, Where, creating, decrement, field as define, deleted, deleting, divide, field$1 as field, getPrimaryFields, getPrimaryKeys, immutable, increment, index, isDevelopment, isPseudo, submodel as model, multiply, now, primary, prop, pseudo, setDevelopment, sort, submodel, toNot, toPrimaries, toPrimary, undeleted, updating, values, withDeleted };
5207
+ export { Build, Connection, Create, Destroy, Model, PseudoDestroy, Query, Save, Submodel, Where, column, creating, decrement, field as define, deleted, deleting, divide, field$1 as field, getPrimaryFields, getPrimaryKeys, immutable, increment, index, isDevelopment, isPseudo, submodel as model, multiply, now, primary, prop, pseudo, setDevelopment, sort, submodel, toNot, toPrimaries, toPrimary, undeleted, updating, uuid, values, withDeleted };