@atscript/moost-db 0.1.51 → 0.1.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -329,12 +329,14 @@ let AsDbReadableController = class AsDbReadableController {
329
329
  }
330
330
  /**
331
331
  * Transform filter before querying. Override to add tenant filtering, etc.
332
+ * May return a Promise for async lookups (session, permissions).
332
333
  */
333
334
  transformFilter(filter) {
334
335
  return filter;
335
336
  }
336
337
  /**
337
338
  * Transform projection before querying.
339
+ * May return a Promise for async lookups.
338
340
  */
339
341
  transformProjection(projection) {
340
342
  return projection;
@@ -393,7 +395,7 @@ let AsDbReadableController = class AsDbReadableController {
393
395
  const insightsError = this.validateInsights(parsed.insights);
394
396
  if (insightsError) return new _moostjs_event_http.HttpError(400, insightsError);
395
397
  }
396
- const filter = this.transformFilter(parsed.filter);
398
+ const filter = await this.transformFilter(parsed.filter);
397
399
  return this.readable.aggregate({
398
400
  filter,
399
401
  controls,
@@ -402,8 +404,7 @@ let AsDbReadableController = class AsDbReadableController {
402
404
  }
403
405
  const error = this.validateParsed(parsed, "query");
404
406
  if (error) return error;
405
- const filter = this.transformFilter(parsed.filter);
406
- const select = this.transformProjection(controls.$select);
407
+ const [filter, select] = await Promise.all([this.transformFilter(parsed.filter), this.transformProjection(controls.$select)]);
407
408
  if (controls.$count) return this.readable.count({
408
409
  filter,
409
410
  controls: {
@@ -443,8 +444,7 @@ let AsDbReadableController = class AsDbReadableController {
443
444
  const page = Math.max(Number(controls.$page || 1), 1);
444
445
  const size = Math.max(Number(controls.$size || 10), 1);
445
446
  const skip = (page - 1) * size;
446
- const filter = this.transformFilter(parsed.filter);
447
- const select = this.transformProjection(controls.$select);
447
+ const [filter, select] = await Promise.all([this.transformFilter(parsed.filter), this.transformProjection(controls.$select)]);
448
448
  const searchTerm = controls.$search;
449
449
  const indexName = controls.$index;
450
450
  const vectorField = controls.$vector;
@@ -482,7 +482,7 @@ let AsDbReadableController = class AsDbReadableController {
482
482
  if (Object.keys(parsed.filter).length > 0) return new _moostjs_event_http.HttpError(400, "Filtering is not allowed for \"one\" endpoint");
483
483
  const error = this.validateParsed(parsed, "getOne");
484
484
  if (error) return error;
485
- const select = this.transformProjection(parsed.controls.$select);
485
+ const select = await this.transformProjection(parsed.controls.$select);
486
486
  const controls = {
487
487
  ...parsed.controls,
488
488
  $select: select
@@ -497,7 +497,7 @@ let AsDbReadableController = class AsDbReadableController {
497
497
  const idObj = this.extractCompositeId(query);
498
498
  if (idObj instanceof _moostjs_event_http.HttpError) return idObj;
499
499
  const parsed = this.parseQueryString(url);
500
- const select = this.transformProjection(parsed.controls.$select);
500
+ const select = await this.transformProjection(parsed.controls.$select);
501
501
  const controls = {
502
502
  ...parsed.controls,
503
503
  $select: select
@@ -506,6 +506,11 @@ let AsDbReadableController = class AsDbReadableController {
506
506
  }
507
507
  /**
508
508
  * **GET /meta** — returns table/view metadata for UI.
509
+ *
510
+ * The return type includes `Promise<...>` so subclasses can override with an
511
+ * async implementation (e.g. to enrich the payload from an external source).
512
+ * The base cache only covers the base payload — async overrides must cache
513
+ * their own enrichment if needed.
509
514
  */
510
515
  meta() {
511
516
  if (this._metaResponse) return this._metaResponse;
@@ -523,7 +528,7 @@ let AsDbReadableController = class AsDbReadableController {
523
528
  filterable: true
524
529
  };
525
530
  }
526
- this._metaResponse = {
531
+ const response = {
527
532
  searchable: this.readable.isSearchable(),
528
533
  vectorSearchable: this.readable.isVectorSearchable(),
529
534
  searchIndexes: this.readable.getSearchIndexes(),
@@ -533,7 +538,8 @@ let AsDbReadableController = class AsDbReadableController {
533
538
  fields,
534
539
  type: this.getSerializedType()
535
540
  };
536
- return this._metaResponse;
541
+ this._metaResponse = response;
542
+ return response;
537
543
  }
538
544
  };
539
545
  __decorate([
@@ -570,7 +576,7 @@ __decorate([
570
576
  (0, _moostjs_event_http.Get)("meta"),
571
577
  __decorateMetadata("design:type", Function),
572
578
  __decorateMetadata("design:paramtypes", []),
573
- __decorateMetadata("design:returntype", void 0)
579
+ __decorateMetadata("design:returntype", Object)
574
580
  ], AsDbReadableController.prototype, "meta", null);
575
581
  AsDbReadableController = __decorate([
576
582
  UseValidationErrorTransform(),
@@ -593,12 +599,14 @@ let AsDbController = class AsDbController extends AsDbReadableController {
593
599
  }
594
600
  /**
595
601
  * Intercepts write operations. Return `undefined` to abort.
602
+ * May be async (e.g. to enrich payloads from session / permissions).
596
603
  */
597
604
  onWrite(action, data) {
598
605
  return data;
599
606
  }
600
607
  /**
601
608
  * Intercepts delete operations. Return `undefined` to abort.
609
+ * May be async (e.g. to resolve composite ids from external state).
602
610
  */
603
611
  onRemove(id) {
604
612
  return id;
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _atscript_typescript_utils0 from "@atscript/typescript/utils";
2
- import { TAtscriptAnnotatedType, TAtscriptDataType, TSerializeOptions, Validator, serializeAnnotatedType } from "@atscript/typescript/utils";
2
+ import { TAtscriptAnnotatedType, TAtscriptDataType, TSerializeOptions, Validator } from "@atscript/typescript/utils";
3
3
  import * as _uniqu_url0 from "@uniqu/url";
4
- import { AtscriptDbReadable, AtscriptDbTable, FilterExpr, Uniquery, UniqueryControls } from "@atscript/db";
4
+ import { AtscriptDbReadable, AtscriptDbTable, FilterExpr, TMetaResponse, Uniquery, UniqueryControls } from "@atscript/db";
5
5
  import { HttpError } from "@moostjs/event-http";
6
6
  import * as moost from "moost";
7
7
  import { Moost, TConsoleBase } from "moost";
@@ -63,12 +63,14 @@ declare class AsDbReadableController<T extends TAtscriptAnnotatedType = TAtscrip
63
63
  protected computeEmbedding(_search: string, _fieldName?: string): Promise<number[]>;
64
64
  /**
65
65
  * Transform filter before querying. Override to add tenant filtering, etc.
66
+ * May return a Promise for async lookups (session, permissions).
66
67
  */
67
- protected transformFilter(filter: FilterExpr): FilterExpr;
68
+ protected transformFilter(filter: FilterExpr): FilterExpr | Promise<FilterExpr>;
68
69
  /**
69
70
  * Transform projection before querying.
71
+ * May return a Promise for async lookups.
70
72
  */
71
- protected transformProjection(projection?: UniqueryControls["$select"]): UniqueryControls["$select"] | undefined;
73
+ protected transformProjection(projection?: UniqueryControls["$select"]): UniqueryControls["$select"] | undefined | Promise<UniqueryControls["$select"] | undefined>;
72
74
  protected parseQueryString(url: string): _uniqu_url0.UrlQuery;
73
75
  protected returnOne(result: Promise<DataType | null>): Promise<DataType | HttpError>;
74
76
  /**
@@ -101,24 +103,13 @@ declare class AsDbReadableController<T extends TAtscriptAnnotatedType = TAtscrip
101
103
  getOneComposite(query: Record<string, string>, url: string): Promise<DataType | HttpError>;
102
104
  /**
103
105
  * **GET /meta** — returns table/view metadata for UI.
106
+ *
107
+ * The return type includes `Promise<...>` so subclasses can override with an
108
+ * async implementation (e.g. to enrich the payload from an external source).
109
+ * The base cache only covers the base payload — async overrides must cache
110
+ * their own enrichment if needed.
104
111
  */
105
- meta(): {
106
- searchable: boolean;
107
- vectorSearchable: boolean;
108
- searchIndexes: ReturnType<AtscriptDbReadable<T>["getSearchIndexes"]>;
109
- primaryKeys: string[];
110
- readOnly: boolean;
111
- relations: Array<{
112
- name: string;
113
- direction: string;
114
- isArray: boolean;
115
- }>;
116
- fields: Record<string, {
117
- sortable: boolean;
118
- filterable: boolean;
119
- }>;
120
- type: ReturnType<typeof serializeAnnotatedType>;
121
- };
112
+ meta(): TMetaResponse | Promise<TMetaResponse>;
122
113
  }
123
114
  //#endregion
124
115
  //#region src/as-db.controller.d.ts
@@ -139,10 +130,12 @@ declare class AsDbController<T extends TAtscriptAnnotatedType = TAtscriptAnnotat
139
130
  protected _isReadOnly(): boolean;
140
131
  /**
141
132
  * Intercepts write operations. Return `undefined` to abort.
133
+ * May be async (e.g. to enrich payloads from session / permissions).
142
134
  */
143
135
  protected onWrite(action: "insert" | "insertMany" | "replace" | "replaceMany" | "update" | "updateMany", data: unknown): unknown;
144
136
  /**
145
137
  * Intercepts delete operations. Return `undefined` to abort.
138
+ * May be async (e.g. to resolve composite ids from external state).
146
139
  */
147
140
  protected onRemove(id: unknown): unknown;
148
141
  /**
package/dist/index.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as _atscript_typescript_utils0 from "@atscript/typescript/utils";
2
- import { TAtscriptAnnotatedType, TAtscriptDataType, TSerializeOptions, Validator, serializeAnnotatedType } from "@atscript/typescript/utils";
2
+ import { TAtscriptAnnotatedType, TAtscriptDataType, TSerializeOptions, Validator } from "@atscript/typescript/utils";
3
3
  import { HttpError } from "@moostjs/event-http";
4
4
  import * as moost from "moost";
5
5
  import { Moost, TConsoleBase } from "moost";
6
6
  import * as _uniqu_url0 from "@uniqu/url";
7
- import { AtscriptDbReadable, AtscriptDbTable, FilterExpr, Uniquery, UniqueryControls } from "@atscript/db";
7
+ import { AtscriptDbReadable, AtscriptDbTable, FilterExpr, TMetaResponse, Uniquery, UniqueryControls } from "@atscript/db";
8
8
 
9
9
  //#region src/as-db-readable.controller.d.ts
10
10
  /**
@@ -63,12 +63,14 @@ declare class AsDbReadableController<T extends TAtscriptAnnotatedType = TAtscrip
63
63
  protected computeEmbedding(_search: string, _fieldName?: string): Promise<number[]>;
64
64
  /**
65
65
  * Transform filter before querying. Override to add tenant filtering, etc.
66
+ * May return a Promise for async lookups (session, permissions).
66
67
  */
67
- protected transformFilter(filter: FilterExpr): FilterExpr;
68
+ protected transformFilter(filter: FilterExpr): FilterExpr | Promise<FilterExpr>;
68
69
  /**
69
70
  * Transform projection before querying.
71
+ * May return a Promise for async lookups.
70
72
  */
71
- protected transformProjection(projection?: UniqueryControls["$select"]): UniqueryControls["$select"] | undefined;
73
+ protected transformProjection(projection?: UniqueryControls["$select"]): UniqueryControls["$select"] | undefined | Promise<UniqueryControls["$select"] | undefined>;
72
74
  protected parseQueryString(url: string): _uniqu_url0.UrlQuery;
73
75
  protected returnOne(result: Promise<DataType | null>): Promise<DataType | HttpError>;
74
76
  /**
@@ -101,24 +103,13 @@ declare class AsDbReadableController<T extends TAtscriptAnnotatedType = TAtscrip
101
103
  getOneComposite(query: Record<string, string>, url: string): Promise<DataType | HttpError>;
102
104
  /**
103
105
  * **GET /meta** — returns table/view metadata for UI.
106
+ *
107
+ * The return type includes `Promise<...>` so subclasses can override with an
108
+ * async implementation (e.g. to enrich the payload from an external source).
109
+ * The base cache only covers the base payload — async overrides must cache
110
+ * their own enrichment if needed.
104
111
  */
105
- meta(): {
106
- searchable: boolean;
107
- vectorSearchable: boolean;
108
- searchIndexes: ReturnType<AtscriptDbReadable<T>["getSearchIndexes"]>;
109
- primaryKeys: string[];
110
- readOnly: boolean;
111
- relations: Array<{
112
- name: string;
113
- direction: string;
114
- isArray: boolean;
115
- }>;
116
- fields: Record<string, {
117
- sortable: boolean;
118
- filterable: boolean;
119
- }>;
120
- type: ReturnType<typeof serializeAnnotatedType>;
121
- };
112
+ meta(): TMetaResponse | Promise<TMetaResponse>;
122
113
  }
123
114
  //#endregion
124
115
  //#region src/as-db.controller.d.ts
@@ -139,10 +130,12 @@ declare class AsDbController<T extends TAtscriptAnnotatedType = TAtscriptAnnotat
139
130
  protected _isReadOnly(): boolean;
140
131
  /**
141
132
  * Intercepts write operations. Return `undefined` to abort.
133
+ * May be async (e.g. to enrich payloads from session / permissions).
142
134
  */
143
135
  protected onWrite(action: "insert" | "insertMany" | "replace" | "replaceMany" | "update" | "updateMany", data: unknown): unknown;
144
136
  /**
145
137
  * Intercepts delete operations. Return `undefined` to abort.
138
+ * May be async (e.g. to resolve composite ids from external state).
146
139
  */
147
140
  protected onRemove(id: unknown): unknown;
148
141
  /**
package/dist/index.mjs CHANGED
@@ -328,12 +328,14 @@ let AsDbReadableController = class AsDbReadableController {
328
328
  }
329
329
  /**
330
330
  * Transform filter before querying. Override to add tenant filtering, etc.
331
+ * May return a Promise for async lookups (session, permissions).
331
332
  */
332
333
  transformFilter(filter) {
333
334
  return filter;
334
335
  }
335
336
  /**
336
337
  * Transform projection before querying.
338
+ * May return a Promise for async lookups.
337
339
  */
338
340
  transformProjection(projection) {
339
341
  return projection;
@@ -392,7 +394,7 @@ let AsDbReadableController = class AsDbReadableController {
392
394
  const insightsError = this.validateInsights(parsed.insights);
393
395
  if (insightsError) return new HttpError(400, insightsError);
394
396
  }
395
- const filter = this.transformFilter(parsed.filter);
397
+ const filter = await this.transformFilter(parsed.filter);
396
398
  return this.readable.aggregate({
397
399
  filter,
398
400
  controls,
@@ -401,8 +403,7 @@ let AsDbReadableController = class AsDbReadableController {
401
403
  }
402
404
  const error = this.validateParsed(parsed, "query");
403
405
  if (error) return error;
404
- const filter = this.transformFilter(parsed.filter);
405
- const select = this.transformProjection(controls.$select);
406
+ const [filter, select] = await Promise.all([this.transformFilter(parsed.filter), this.transformProjection(controls.$select)]);
406
407
  if (controls.$count) return this.readable.count({
407
408
  filter,
408
409
  controls: {
@@ -442,8 +443,7 @@ let AsDbReadableController = class AsDbReadableController {
442
443
  const page = Math.max(Number(controls.$page || 1), 1);
443
444
  const size = Math.max(Number(controls.$size || 10), 1);
444
445
  const skip = (page - 1) * size;
445
- const filter = this.transformFilter(parsed.filter);
446
- const select = this.transformProjection(controls.$select);
446
+ const [filter, select] = await Promise.all([this.transformFilter(parsed.filter), this.transformProjection(controls.$select)]);
447
447
  const searchTerm = controls.$search;
448
448
  const indexName = controls.$index;
449
449
  const vectorField = controls.$vector;
@@ -481,7 +481,7 @@ let AsDbReadableController = class AsDbReadableController {
481
481
  if (Object.keys(parsed.filter).length > 0) return new HttpError(400, "Filtering is not allowed for \"one\" endpoint");
482
482
  const error = this.validateParsed(parsed, "getOne");
483
483
  if (error) return error;
484
- const select = this.transformProjection(parsed.controls.$select);
484
+ const select = await this.transformProjection(parsed.controls.$select);
485
485
  const controls = {
486
486
  ...parsed.controls,
487
487
  $select: select
@@ -496,7 +496,7 @@ let AsDbReadableController = class AsDbReadableController {
496
496
  const idObj = this.extractCompositeId(query);
497
497
  if (idObj instanceof HttpError) return idObj;
498
498
  const parsed = this.parseQueryString(url);
499
- const select = this.transformProjection(parsed.controls.$select);
499
+ const select = await this.transformProjection(parsed.controls.$select);
500
500
  const controls = {
501
501
  ...parsed.controls,
502
502
  $select: select
@@ -505,6 +505,11 @@ let AsDbReadableController = class AsDbReadableController {
505
505
  }
506
506
  /**
507
507
  * **GET /meta** — returns table/view metadata for UI.
508
+ *
509
+ * The return type includes `Promise<...>` so subclasses can override with an
510
+ * async implementation (e.g. to enrich the payload from an external source).
511
+ * The base cache only covers the base payload — async overrides must cache
512
+ * their own enrichment if needed.
508
513
  */
509
514
  meta() {
510
515
  if (this._metaResponse) return this._metaResponse;
@@ -522,7 +527,7 @@ let AsDbReadableController = class AsDbReadableController {
522
527
  filterable: true
523
528
  };
524
529
  }
525
- this._metaResponse = {
530
+ const response = {
526
531
  searchable: this.readable.isSearchable(),
527
532
  vectorSearchable: this.readable.isVectorSearchable(),
528
533
  searchIndexes: this.readable.getSearchIndexes(),
@@ -532,7 +537,8 @@ let AsDbReadableController = class AsDbReadableController {
532
537
  fields,
533
538
  type: this.getSerializedType()
534
539
  };
535
- return this._metaResponse;
540
+ this._metaResponse = response;
541
+ return response;
536
542
  }
537
543
  };
538
544
  __decorate([
@@ -569,7 +575,7 @@ __decorate([
569
575
  Get("meta"),
570
576
  __decorateMetadata("design:type", Function),
571
577
  __decorateMetadata("design:paramtypes", []),
572
- __decorateMetadata("design:returntype", void 0)
578
+ __decorateMetadata("design:returntype", Object)
573
579
  ], AsDbReadableController.prototype, "meta", null);
574
580
  AsDbReadableController = __decorate([
575
581
  UseValidationErrorTransform(),
@@ -592,12 +598,14 @@ let AsDbController = class AsDbController extends AsDbReadableController {
592
598
  }
593
599
  /**
594
600
  * Intercepts write operations. Return `undefined` to abort.
601
+ * May be async (e.g. to enrich payloads from session / permissions).
595
602
  */
596
603
  onWrite(action, data) {
597
604
  return data;
598
605
  }
599
606
  /**
600
607
  * Intercepts delete operations. Return `undefined` to abort.
608
+ * May be async (e.g. to resolve composite ids from external state).
601
609
  */
602
610
  onRemove(id) {
603
611
  return id;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atscript/moost-db",
3
- "version": "0.1.51",
3
+ "version": "0.1.53",
4
4
  "description": "Generic database controller for Moost with Atscript.",
5
5
  "keywords": [
6
6
  "annotations",
@@ -38,22 +38,22 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@uniqu/url": "^0.1.4"
41
+ "@uniqu/url": "^0.1.5"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@atscript/core": "^0.1.48",
45
45
  "@atscript/typescript": "^0.1.48",
46
46
  "@moostjs/event-http": "^0.6.7",
47
- "@uniqu/core": "^0.1.4",
47
+ "@uniqu/core": "^0.1.5",
48
48
  "moost": "^0.6.7",
49
49
  "unplugin-atscript": "^0.1.48"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "@atscript/typescript": "^0.1.48",
53
53
  "@moostjs/event-http": "^0.6.7",
54
- "@uniqu/core": "^0.1.4",
54
+ "@uniqu/core": "^0.1.5",
55
55
  "moost": "^0.6.7",
56
- "@atscript/db": "^0.1.51"
56
+ "@atscript/db": "^0.1.53"
57
57
  },
58
58
  "scripts": {
59
59
  "postinstall": "asc -f dts",