@strapi/database 5.47.1 → 5.48.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.
@@ -1,4 +1,6 @@
1
- import StringField from './string';
2
- export default class BigIntegerField extends StringField {
1
+ import Field from './field';
2
+ export default class BigIntegerField extends Field {
3
+ toDB(value: unknown): string | null | undefined;
4
+ fromDB(value: unknown): string | null | undefined;
3
5
  }
4
6
  //# sourceMappingURL=biginteger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"biginteger.d.ts","sourceRoot":"","sources":["../../src/fields/biginteger.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,UAAU,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;CAAG"}
1
+ {"version":3,"file":"biginteger.d.ts","sourceRoot":"","sources":["../../src/fields/biginteger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,SAAS,CAAC;AA8B5B,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,KAAK;IAChD,IAAI,CAAC,KAAK,EAAE,OAAO;IAQnB,MAAM,CAAC,KAAK,EAAE,OAAO;CAatB"}
@@ -1,8 +1,47 @@
1
1
  'use strict';
2
2
 
3
- var string = require('./string.js');
3
+ var _ = require('lodash/fp');
4
+ var field = require('./field.js');
4
5
 
5
- class BigIntegerField extends string {
6
+ const BIG_INTEGER_REGEX = /^[+-]?\d+$/;
7
+ const toBigIntegerString = (value)=>{
8
+ if (typeof value === 'bigint') {
9
+ return value.toString();
10
+ }
11
+ if (typeof value === 'number') {
12
+ if (!Number.isFinite(value) || !Number.isInteger(value)) {
13
+ throw new Error(`Expected a valid BigInteger, got ${value}`);
14
+ }
15
+ return value.toString();
16
+ }
17
+ if (typeof value === 'string') {
18
+ const trimmedValue = value.trim();
19
+ if (!BIG_INTEGER_REGEX.test(trimmedValue)) {
20
+ throw new Error(`Expected a valid BigInteger, got ${value}`);
21
+ }
22
+ return BigInt(trimmedValue).toString();
23
+ }
24
+ throw new Error(`Expected a valid BigInteger, got ${value}`);
25
+ };
26
+ class BigIntegerField extends field {
27
+ toDB(value) {
28
+ if (value === null || value === undefined) {
29
+ return value;
30
+ }
31
+ return toBigIntegerString(value);
32
+ }
33
+ fromDB(value) {
34
+ if (value === null || value === undefined) {
35
+ return value;
36
+ }
37
+ try {
38
+ return toBigIntegerString(value);
39
+ } catch {
40
+ // Preserve backward compatibility for legacy rows that may contain
41
+ // malformed bigint values written by older versions/manual imports.
42
+ return _.toString(value);
43
+ }
44
+ }
6
45
  }
7
46
 
8
47
  module.exports = BigIntegerField;
@@ -1 +1 @@
1
- {"version":3,"file":"biginteger.js","sources":["../../src/fields/biginteger.ts"],"sourcesContent":["import StringField from './string';\n\nexport default class BigIntegerField extends StringField {}\n"],"names":["BigIntegerField","StringField"],"mappings":";;;;AAEe,MAAMA,eAAAA,SAAwBC,MAAAA,CAAAA;AAAa;;;;"}
1
+ {"version":3,"file":"biginteger.js","sources":["../../src/fields/biginteger.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport Field from './field';\n\nconst BIG_INTEGER_REGEX = /^[+-]?\\d+$/;\n\nconst toBigIntegerString = (value: unknown): string => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) {\n throw new Error(`Expected a valid BigInteger, got ${value}`);\n }\n\n return value.toString();\n }\n\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n if (!BIG_INTEGER_REGEX.test(trimmedValue)) {\n throw new Error(`Expected a valid BigInteger, got ${value}`);\n }\n\n return BigInt(trimmedValue).toString();\n }\n\n throw new Error(`Expected a valid BigInteger, got ${value}`);\n};\n\nexport default class BigIntegerField extends Field {\n toDB(value: unknown) {\n if (value === null || value === undefined) {\n return value;\n }\n\n return toBigIntegerString(value);\n }\n\n fromDB(value: unknown) {\n if (value === null || value === undefined) {\n return value;\n }\n\n try {\n return toBigIntegerString(value);\n } catch {\n // Preserve backward compatibility for legacy rows that may contain\n // malformed bigint values written by older versions/manual imports.\n return toString(value);\n }\n }\n}\n"],"names":["BIG_INTEGER_REGEX","toBigIntegerString","value","toString","Number","isFinite","isInteger","Error","trimmedValue","trim","test","BigInt","BigIntegerField","Field","toDB","undefined","fromDB"],"mappings":";;;;;AAGA,MAAMA,iBAAAA,GAAoB,YAAA;AAE1B,MAAMC,qBAAqB,CAACC,KAAAA,GAAAA;IAC1B,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAOA,MAAMC,QAAQ,EAAA;AACvB,IAAA;IAEA,IAAI,OAAOD,UAAU,QAAA,EAAU;QAC7B,IAAI,CAACE,OAAOC,QAAQ,CAACH,UAAU,CAACE,MAAAA,CAAOE,SAAS,CAACJ,KAAAA,CAAAA,EAAQ;AACvD,YAAA,MAAM,IAAIK,KAAAA,CAAM,CAAC,iCAAiC,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AAC7D,QAAA;AAEA,QAAA,OAAOA,MAAMC,QAAQ,EAAA;AACvB,IAAA;IAEA,IAAI,OAAOD,UAAU,QAAA,EAAU;QAC7B,MAAMM,YAAAA,GAAeN,MAAMO,IAAI,EAAA;AAE/B,QAAA,IAAI,CAACT,iBAAAA,CAAkBU,IAAI,CAACF,YAAAA,CAAAA,EAAe;AACzC,YAAA,MAAM,IAAID,KAAAA,CAAM,CAAC,iCAAiC,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AAC7D,QAAA;QAEA,OAAOS,MAAAA,CAAOH,cAAcL,QAAQ,EAAA;AACtC,IAAA;AAEA,IAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,iCAAiC,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AAC7D,CAAA;AAEe,MAAMU,eAAAA,SAAwBC,KAAAA,CAAAA;AAC3CC,IAAAA,IAAAA,CAAKZ,KAAc,EAAE;QACnB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUa,SAAAA,EAAW;YACzC,OAAOb,KAAAA;AACT,QAAA;AAEA,QAAA,OAAOD,kBAAAA,CAAmBC,KAAAA,CAAAA;AAC5B,IAAA;AAEAc,IAAAA,MAAAA,CAAOd,KAAc,EAAE;QACrB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUa,SAAAA,EAAW;YACzC,OAAOb,KAAAA;AACT,QAAA;QAEA,IAAI;AACF,YAAA,OAAOD,kBAAAA,CAAmBC,KAAAA,CAAAA;AAC5B,QAAA,CAAA,CAAE,OAAM;;;AAGN,YAAA,OAAOC,UAAAA,CAASD,KAAAA,CAAAA;AAClB,QAAA;AACF,IAAA;AACF;;;;"}
@@ -1,6 +1,45 @@
1
- import StringField from './string.mjs';
1
+ import { toString } from 'lodash/fp';
2
+ import Field from './field.mjs';
2
3
 
3
- class BigIntegerField extends StringField {
4
+ const BIG_INTEGER_REGEX = /^[+-]?\d+$/;
5
+ const toBigIntegerString = (value)=>{
6
+ if (typeof value === 'bigint') {
7
+ return value.toString();
8
+ }
9
+ if (typeof value === 'number') {
10
+ if (!Number.isFinite(value) || !Number.isInteger(value)) {
11
+ throw new Error(`Expected a valid BigInteger, got ${value}`);
12
+ }
13
+ return value.toString();
14
+ }
15
+ if (typeof value === 'string') {
16
+ const trimmedValue = value.trim();
17
+ if (!BIG_INTEGER_REGEX.test(trimmedValue)) {
18
+ throw new Error(`Expected a valid BigInteger, got ${value}`);
19
+ }
20
+ return BigInt(trimmedValue).toString();
21
+ }
22
+ throw new Error(`Expected a valid BigInteger, got ${value}`);
23
+ };
24
+ class BigIntegerField extends Field {
25
+ toDB(value) {
26
+ if (value === null || value === undefined) {
27
+ return value;
28
+ }
29
+ return toBigIntegerString(value);
30
+ }
31
+ fromDB(value) {
32
+ if (value === null || value === undefined) {
33
+ return value;
34
+ }
35
+ try {
36
+ return toBigIntegerString(value);
37
+ } catch {
38
+ // Preserve backward compatibility for legacy rows that may contain
39
+ // malformed bigint values written by older versions/manual imports.
40
+ return toString(value);
41
+ }
42
+ }
4
43
  }
5
44
 
6
45
  export { BigIntegerField as default };
@@ -1 +1 @@
1
- {"version":3,"file":"biginteger.mjs","sources":["../../src/fields/biginteger.ts"],"sourcesContent":["import StringField from './string';\n\nexport default class BigIntegerField extends StringField {}\n"],"names":["BigIntegerField","StringField"],"mappings":";;AAEe,MAAMA,eAAAA,SAAwBC,WAAAA,CAAAA;AAAa;;;;"}
1
+ {"version":3,"file":"biginteger.mjs","sources":["../../src/fields/biginteger.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport Field from './field';\n\nconst BIG_INTEGER_REGEX = /^[+-]?\\d+$/;\n\nconst toBigIntegerString = (value: unknown): string => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) {\n throw new Error(`Expected a valid BigInteger, got ${value}`);\n }\n\n return value.toString();\n }\n\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n if (!BIG_INTEGER_REGEX.test(trimmedValue)) {\n throw new Error(`Expected a valid BigInteger, got ${value}`);\n }\n\n return BigInt(trimmedValue).toString();\n }\n\n throw new Error(`Expected a valid BigInteger, got ${value}`);\n};\n\nexport default class BigIntegerField extends Field {\n toDB(value: unknown) {\n if (value === null || value === undefined) {\n return value;\n }\n\n return toBigIntegerString(value);\n }\n\n fromDB(value: unknown) {\n if (value === null || value === undefined) {\n return value;\n }\n\n try {\n return toBigIntegerString(value);\n } catch {\n // Preserve backward compatibility for legacy rows that may contain\n // malformed bigint values written by older versions/manual imports.\n return toString(value);\n }\n }\n}\n"],"names":["BIG_INTEGER_REGEX","toBigIntegerString","value","toString","Number","isFinite","isInteger","Error","trimmedValue","trim","test","BigInt","BigIntegerField","Field","toDB","undefined","fromDB"],"mappings":";;;AAGA,MAAMA,iBAAAA,GAAoB,YAAA;AAE1B,MAAMC,qBAAqB,CAACC,KAAAA,GAAAA;IAC1B,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAOA,MAAMC,QAAQ,EAAA;AACvB,IAAA;IAEA,IAAI,OAAOD,UAAU,QAAA,EAAU;QAC7B,IAAI,CAACE,OAAOC,QAAQ,CAACH,UAAU,CAACE,MAAAA,CAAOE,SAAS,CAACJ,KAAAA,CAAAA,EAAQ;AACvD,YAAA,MAAM,IAAIK,KAAAA,CAAM,CAAC,iCAAiC,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AAC7D,QAAA;AAEA,QAAA,OAAOA,MAAMC,QAAQ,EAAA;AACvB,IAAA;IAEA,IAAI,OAAOD,UAAU,QAAA,EAAU;QAC7B,MAAMM,YAAAA,GAAeN,MAAMO,IAAI,EAAA;AAE/B,QAAA,IAAI,CAACT,iBAAAA,CAAkBU,IAAI,CAACF,YAAAA,CAAAA,EAAe;AACzC,YAAA,MAAM,IAAID,KAAAA,CAAM,CAAC,iCAAiC,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AAC7D,QAAA;QAEA,OAAOS,MAAAA,CAAOH,cAAcL,QAAQ,EAAA;AACtC,IAAA;AAEA,IAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,iCAAiC,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AAC7D,CAAA;AAEe,MAAMU,eAAAA,SAAwBC,KAAAA,CAAAA;AAC3CC,IAAAA,IAAAA,CAAKZ,KAAc,EAAE;QACnB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUa,SAAAA,EAAW;YACzC,OAAOb,KAAAA;AACT,QAAA;AAEA,QAAA,OAAOD,kBAAAA,CAAmBC,KAAAA,CAAAA;AAC5B,IAAA;AAEAc,IAAAA,MAAAA,CAAOd,KAAc,EAAE;QACrB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUa,SAAAA,EAAW;YACzC,OAAOb,KAAAA;AACT,QAAA;QAEA,IAAI;AACF,YAAA,OAAOD,kBAAAA,CAAmBC,KAAAA,CAAAA;AAC5B,QAAA,CAAA,CAAE,OAAM;;;AAGN,YAAA,OAAOC,QAAAA,CAASD,KAAAA,CAAAA;AAClB,QAAA;AACF,IAAA;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  import Field from './field';
2
2
  export default class NumberField extends Field {
3
- toDB(value: unknown): number;
3
+ toDB(value: unknown): number | null | undefined;
4
4
  fromDB(value: unknown): number;
5
5
  }
6
6
  //# sourceMappingURL=number.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/fields/number.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,KAAK;IAC5C,IAAI,CAAC,KAAK,EAAE,OAAO;IAUnB,MAAM,CAAC,KAAK,EAAE,OAAO;CAGtB"}
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/fields/number.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,KAAK;IAC5C,IAAI,CAAC,KAAK,EAAE,OAAO;IAgCnB,MAAM,CAAC,KAAK,EAAE,OAAO;CAGtB"}
@@ -5,11 +5,27 @@ var field = require('./field.js');
5
5
 
6
6
  class NumberField extends field {
7
7
  toDB(value) {
8
- const numberValue = _.toNumber(value);
9
- if (Number.isNaN(numberValue)) {
10
- throw new Error(`Expected a valid Number, got ${value}`);
8
+ if (value === null || value === undefined) {
9
+ return value;
11
10
  }
12
- return numberValue;
11
+ if (typeof value === 'number') {
12
+ if (!Number.isFinite(value)) {
13
+ throw new Error(`Expected a valid Number, got ${value}`);
14
+ }
15
+ return value;
16
+ }
17
+ if (typeof value === 'string') {
18
+ const trimmedValue = value.trim();
19
+ if (trimmedValue.length === 0) {
20
+ throw new Error(`Expected a valid Number, got ${value}`);
21
+ }
22
+ const numberValue = Number(trimmedValue);
23
+ if (!Number.isFinite(numberValue)) {
24
+ throw new Error(`Expected a valid Number, got ${value}`);
25
+ }
26
+ return numberValue;
27
+ }
28
+ throw new Error(`Expected a valid Number, got ${value}`);
13
29
  }
14
30
  fromDB(value) {
15
31
  return _.toNumber(value);
@@ -1 +1 @@
1
- {"version":3,"file":"number.js","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n const numberValue = toNumber(value);\n\n if (Number.isNaN(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","numberValue","toNumber","Number","isNaN","Error","fromDB"],"mappings":";;;;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,MAAMC,cAAcC,UAAAA,CAASF,KAAAA,CAAAA;QAE7B,IAAIG,MAAAA,CAAOC,KAAK,CAACH,WAAAA,CAAAA,EAAc;AAC7B,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,6BAA6B,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AACzD,QAAA;QAEA,OAAOC,WAAAA;AACT,IAAA;AAEAK,IAAAA,MAAAA,CAAON,KAAc,EAAE;AACrB,QAAA,OAAOE,UAAAA,CAASF,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"number.js","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return value;\n }\n\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n if (trimmedValue.length === 0) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n const numberValue = Number(trimmedValue);\n\n if (!Number.isFinite(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","undefined","Number","isFinite","Error","trimmedValue","trim","length","numberValue","fromDB","toNumber"],"mappings":";;;;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;QACnB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUC,SAAAA,EAAW;YACzC,OAAOD,KAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,YAAA,IAAI,CAACE,MAAAA,CAAOC,QAAQ,CAACH,KAAAA,CAAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,YAAA;YAEA,OAAOA,KAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;YAC7B,MAAMK,YAAAA,GAAeL,MAAMM,IAAI,EAAA;YAE/B,IAAID,YAAAA,CAAaE,MAAM,KAAK,CAAA,EAAG;AAC7B,gBAAA,MAAM,IAAIH,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,YAAA;AAEA,YAAA,MAAMQ,cAAcN,MAAAA,CAAOG,YAAAA,CAAAA;AAE3B,YAAA,IAAI,CAACH,MAAAA,CAAOC,QAAQ,CAACK,WAAAA,CAAAA,EAAc;AACjC,gBAAA,MAAM,IAAIJ,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,YAAA;YAEA,OAAOQ,WAAAA;AACT,QAAA;AAEA,QAAA,MAAM,IAAIJ,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,IAAA;AAEAS,IAAAA,MAAAA,CAAOT,KAAc,EAAE;AACrB,QAAA,OAAOU,UAAAA,CAASV,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
@@ -3,11 +3,27 @@ import Field from './field.mjs';
3
3
 
4
4
  class NumberField extends Field {
5
5
  toDB(value) {
6
- const numberValue = toNumber(value);
7
- if (Number.isNaN(numberValue)) {
8
- throw new Error(`Expected a valid Number, got ${value}`);
6
+ if (value === null || value === undefined) {
7
+ return value;
9
8
  }
10
- return numberValue;
9
+ if (typeof value === 'number') {
10
+ if (!Number.isFinite(value)) {
11
+ throw new Error(`Expected a valid Number, got ${value}`);
12
+ }
13
+ return value;
14
+ }
15
+ if (typeof value === 'string') {
16
+ const trimmedValue = value.trim();
17
+ if (trimmedValue.length === 0) {
18
+ throw new Error(`Expected a valid Number, got ${value}`);
19
+ }
20
+ const numberValue = Number(trimmedValue);
21
+ if (!Number.isFinite(numberValue)) {
22
+ throw new Error(`Expected a valid Number, got ${value}`);
23
+ }
24
+ return numberValue;
25
+ }
26
+ throw new Error(`Expected a valid Number, got ${value}`);
11
27
  }
12
28
  fromDB(value) {
13
29
  return toNumber(value);
@@ -1 +1 @@
1
- {"version":3,"file":"number.mjs","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n const numberValue = toNumber(value);\n\n if (Number.isNaN(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","numberValue","toNumber","Number","isNaN","Error","fromDB"],"mappings":";;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,MAAMC,cAAcC,QAAAA,CAASF,KAAAA,CAAAA;QAE7B,IAAIG,MAAAA,CAAOC,KAAK,CAACH,WAAAA,CAAAA,EAAc;AAC7B,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,6BAA6B,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AACzD,QAAA;QAEA,OAAOC,WAAAA;AACT,IAAA;AAEAK,IAAAA,MAAAA,CAAON,KAAc,EAAE;AACrB,QAAA,OAAOE,QAAAA,CAASF,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"number.mjs","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return value;\n }\n\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n if (trimmedValue.length === 0) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n const numberValue = Number(trimmedValue);\n\n if (!Number.isFinite(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","undefined","Number","isFinite","Error","trimmedValue","trim","length","numberValue","fromDB","toNumber"],"mappings":";;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;QACnB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUC,SAAAA,EAAW;YACzC,OAAOD,KAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,YAAA,IAAI,CAACE,MAAAA,CAAOC,QAAQ,CAACH,KAAAA,CAAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,YAAA;YAEA,OAAOA,KAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;YAC7B,MAAMK,YAAAA,GAAeL,MAAMM,IAAI,EAAA;YAE/B,IAAID,YAAAA,CAAaE,MAAM,KAAK,CAAA,EAAG;AAC7B,gBAAA,MAAM,IAAIH,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,YAAA;AAEA,YAAA,MAAMQ,cAAcN,MAAAA,CAAOG,YAAAA,CAAAA;AAE3B,YAAA,IAAI,CAACH,MAAAA,CAAOC,QAAQ,CAACK,WAAAA,CAAAA,EAAc;AACjC,gBAAA,MAAM,IAAIJ,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,YAAA;YAEA,OAAOQ,WAAAA;AACT,QAAA;AAEA,QAAA,MAAM,IAAIJ,KAAAA,CAAM,CAAC,6BAA6B,EAAEJ,KAAAA,CAAAA,CAAO,CAAA;AACzD,IAAA;AAEAS,IAAAA,MAAAA,CAAOT,KAAc,EAAE;AACrB,QAAA,OAAOU,QAAAA,CAASV,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
package/dist/index.d.ts CHANGED
@@ -42,6 +42,13 @@ declare class Database {
42
42
  }): Promise<this>;
43
43
  query(uid: string): import("./entity-manager").Repository;
44
44
  inTransaction(): boolean;
45
+ /**
46
+ * Run work inside a DB transaction. On a fulfilled callback, the transaction
47
+ * is committed; on rejection, it is rolled back. The callback receives Knex
48
+ * `commit` and `rollback` helpers: if you call `rollback` and return without
49
+ * throwing, the implementation avoids attempting a second `commit` on an
50
+ * already-finalised transactor.
51
+ */
45
52
  transaction(): Promise<TransactionObject>;
46
53
  transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;
47
54
  getSchemaName(): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAE,OAAO,EAAc,MAAM,YAAY,CAAC;AACjD,OAAO,EAAwB,cAAc,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAkB,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAuB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAA4B,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAA4B,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAkB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,UAAU,QAAQ;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,MAAM,GAAG,MAAM,CACzB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EACnC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CACpD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAcD,cAAM,QAAQ;IACZ,UAAU,EAAE,IAAI,CAAC;IAEjB,OAAO,EAAE,OAAO,CAAC;IAEjB,MAAM,EAAE,cAAc,CAAC;IAEvB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,MAAM,EAAE,cAAc,CAAC;IAEvB,UAAU,EAAE,iBAAiB,CAAC;IAE9B,UAAU,EAAE,iBAAiB,CAAC;IAE9B,aAAa,EAAE,aAAa,CAAC;IAE7B,MAAM,EAAE,aAAa,CAAC;IAEtB,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,cAAc;IAqD5B,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE;IA2B1C,KAAK,CAAC,GAAG,EAAE,MAAM;IAQjB,aAAa;IAIb,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IACzC,WAAW,CAAC,SAAS,SAAS,QAAQ,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IA4CrF,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC,aAAa,IAAI,IAAI;IACrB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY;IAQpD,OAAO;;;;;IA2BP,mBAAmB,CAAC,GAAG,mBAAkB;IAKzC,YAAY,CAAC,GAAG,EAAE,MAAM;IAIlB,OAAO;CAId;AAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC5B,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAE,OAAO,EAAc,MAAM,YAAY,CAAC;AACjD,OAAO,EAAwB,cAAc,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAkB,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAuB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAA4B,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAA4B,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAkB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,UAAU,QAAQ;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,MAAM,GAAG,MAAM,CACzB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EACnC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CACpD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAcD,cAAM,QAAQ;IACZ,UAAU,EAAE,IAAI,CAAC;IAEjB,OAAO,EAAE,OAAO,CAAC;IAEjB,MAAM,EAAE,cAAc,CAAC;IAEvB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,MAAM,EAAE,cAAc,CAAC;IAEvB,UAAU,EAAE,iBAAiB,CAAC;IAE9B,UAAU,EAAE,iBAAiB,CAAC;IAE9B,aAAa,EAAE,aAAa,CAAC;IAE7B,MAAM,EAAE,aAAa,CAAC;IAEtB,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,cAAc;IAqD5B,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE;IA2B1C,KAAK,CAAC,GAAG,EAAE,MAAM;IAQjB,aAAa;IAIb;;;;;;OAMG;IACH,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IACzC,WAAW,CAAC,SAAS,SAAS,QAAQ,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IA4CrF,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC,aAAa,IAAI,IAAI;IACrB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY;IAQpD,OAAO;;;;;IA2BP,mBAAmB,CAAC,GAAG,mBAAkB;IAKzC,YAAY,CAAC,GAAG,EAAE,MAAM;IAIlB,OAAO;CAId;AAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC5B,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n /**\n * Run work inside a DB transaction. On a fulfilled callback, the transaction\n * is committed; on rejection, it is rolled back. The callback receives Knex\n * `commit` and `rollback` helpers: if you call `rollback` and return without\n * throwing, the implementation avoids attempting a second `commit` on an\n * already-finalised transactor.\n */\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n /**\n * Run work inside a DB transaction. On a fulfilled callback, the transaction\n * is committed; on rejection, it is rolled back. The callback receives Knex\n * `commit` and `rollback` helpers: if you call `rollback` and return without\n * throwing, the implementation avoids attempting a second `commit` on an\n * already-finalised transactor.\n */\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
@@ -12,7 +12,7 @@ const joinColPrefix = '__strapi';
12
12
  * When `populateValue.orderBy` is present, join-table ordering must not take precedence
13
13
  * over the target attribute sort (see query-builder join vs root orderBy ordering).
14
14
  */ const getJoinTableOrderBy = (populateValue, joinTable)=>{
15
- if (populateValue.orderBy || !joinTable.orderBy) {
15
+ if (!_.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {
16
16
  return undefined;
17
17
  }
18
18
  return _.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy);
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\n/**\n * Join-table `order` preserves connect order when no explicit populate sort is set.\n * When `populateValue.orderBy` is present, join-table ordering must not take precedence\n * over the target attribute sort (see query-builder join vs root orderBy ordering).\n */\nconst getJoinTableOrderBy = (\n populateValue: Record<string, unknown>,\n joinTable: { orderBy?: Record<string, 'asc' | 'desc'> }\n) => {\n if (populateValue.orderBy || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy);\n};\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n await Promise.all(\n Object.keys(idsByType).map(async (type) => {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n })\n );\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n // Spread target first so a same-named user attribute cannot override the morph type UID\n return { ...fromTargetRow(row), [typeField]: type };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n const row = fromTargetRow(_.first(matchingRows));\n // Spread target first so a same-named user attribute cannot override the morph type UID\n result[attributeName] = row ? { ...row, [typeField]: type } : row;\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst getPopulateValue = (populate: Record<string, any>, filters: Record<string, any>) => {\n const populateValue = {\n filters,\n ...pickPopulateParams(populate),\n };\n\n if ('on' in populateValue) {\n populateValue.on = _.mapValues(\n (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\n },\n populateValue.on as Record<string, any>\n );\n }\n\n return populateValue;\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n const populateAttribute = async (attributeName: string) => {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = getPopulateValue(populate[attributeName], qb.state.filters);\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n await Promise.all(Object.keys(populate).map(populateAttribute));\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","getJoinTableOrderBy","populateValue","joinTable","orderBy","undefined","_","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","uniq","map","r","filter","value","isNil","isEmpty","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","oneToMany","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
1
+ {"version":3,"file":"apply.js","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\n/**\n * Join-table `order` preserves connect order when no explicit populate sort is set.\n * When `populateValue.orderBy` is present, join-table ordering must not take precedence\n * over the target attribute sort (see query-builder join vs root orderBy ordering).\n */\nconst getJoinTableOrderBy = (\n populateValue: Record<string, unknown>,\n joinTable: { orderBy?: Record<string, 'asc' | 'desc'> }\n) => {\n if (!_.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy);\n};\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n await Promise.all(\n Object.keys(idsByType).map(async (type) => {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n })\n );\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n // Spread target first so a same-named user attribute cannot override the morph type UID\n return { ...fromTargetRow(row), [typeField]: type };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n const row = fromTargetRow(_.first(matchingRows));\n // Spread target first so a same-named user attribute cannot override the morph type UID\n result[attributeName] = row ? { ...row, [typeField]: type } : row;\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst getPopulateValue = (populate: Record<string, any>, filters: Record<string, any>) => {\n const populateValue = {\n filters,\n ...pickPopulateParams(populate),\n };\n\n if ('on' in populateValue) {\n populateValue.on = _.mapValues(\n (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\n },\n populateValue.on as Record<string, any>\n );\n }\n\n return populateValue;\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n const populateAttribute = async (attributeName: string) => {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = getPopulateValue(populate[attributeName], qb.state.filters);\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n await Promise.all(Object.keys(populate).map(populateAttribute));\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","getJoinTableOrderBy","populateValue","joinTable","_","isEmpty","orderBy","undefined","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","uniq","map","r","filter","value","isNil","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","oneToMany","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
@@ -10,7 +10,7 @@ const joinColPrefix = '__strapi';
10
10
  * When `populateValue.orderBy` is present, join-table ordering must not take precedence
11
11
  * over the target attribute sort (see query-builder join vs root orderBy ordering).
12
12
  */ const getJoinTableOrderBy = (populateValue, joinTable)=>{
13
- if (populateValue.orderBy || !joinTable.orderBy) {
13
+ if (!_.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {
14
14
  return undefined;
15
15
  }
16
16
  return _.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy);
@@ -1 +1 @@
1
- {"version":3,"file":"apply.mjs","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\n/**\n * Join-table `order` preserves connect order when no explicit populate sort is set.\n * When `populateValue.orderBy` is present, join-table ordering must not take precedence\n * over the target attribute sort (see query-builder join vs root orderBy ordering).\n */\nconst getJoinTableOrderBy = (\n populateValue: Record<string, unknown>,\n joinTable: { orderBy?: Record<string, 'asc' | 'desc'> }\n) => {\n if (populateValue.orderBy || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy);\n};\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n await Promise.all(\n Object.keys(idsByType).map(async (type) => {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n })\n );\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n // Spread target first so a same-named user attribute cannot override the morph type UID\n return { ...fromTargetRow(row), [typeField]: type };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n const row = fromTargetRow(_.first(matchingRows));\n // Spread target first so a same-named user attribute cannot override the morph type UID\n result[attributeName] = row ? { ...row, [typeField]: type } : row;\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst getPopulateValue = (populate: Record<string, any>, filters: Record<string, any>) => {\n const populateValue = {\n filters,\n ...pickPopulateParams(populate),\n };\n\n if ('on' in populateValue) {\n populateValue.on = _.mapValues(\n (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\n },\n populateValue.on as Record<string, any>\n );\n }\n\n return populateValue;\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n const populateAttribute = async (attributeName: string) => {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = getPopulateValue(populate[attributeName], qb.state.filters);\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n await Promise.all(Object.keys(populate).map(populateAttribute));\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","getJoinTableOrderBy","populateValue","joinTable","orderBy","undefined","_","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","uniq","map","r","filter","value","isNil","isEmpty","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","oneToMany","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
1
+ {"version":3,"file":"apply.mjs","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\n/**\n * Join-table `order` preserves connect order when no explicit populate sort is set.\n * When `populateValue.orderBy` is present, join-table ordering must not take precedence\n * over the target attribute sort (see query-builder join vs root orderBy ordering).\n */\nconst getJoinTableOrderBy = (\n populateValue: Record<string, unknown>,\n joinTable: { orderBy?: Record<string, 'asc' | 'desc'> }\n) => {\n if (!_.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy);\n};\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n await Promise.all(\n Object.keys(idsByType).map(async (type) => {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n })\n );\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n // Spread target first so a same-named user attribute cannot override the morph type UID\n return { ...fromTargetRow(row), [typeField]: type };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n const row = fromTargetRow(_.first(matchingRows));\n // Spread target first so a same-named user attribute cannot override the morph type UID\n result[attributeName] = row ? { ...row, [typeField]: type } : row;\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst getPopulateValue = (populate: Record<string, any>, filters: Record<string, any>) => {\n const populateValue = {\n filters,\n ...pickPopulateParams(populate),\n };\n\n if ('on' in populateValue) {\n populateValue.on = _.mapValues(\n (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\n },\n populateValue.on as Record<string, any>\n );\n }\n\n return populateValue;\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n const populateAttribute = async (attributeName: string) => {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = getPopulateValue(populate[attributeName], qb.state.filters);\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n await Promise.all(Object.keys(populate).map(populateAttribute));\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","getJoinTableOrderBy","populateValue","joinTable","_","isEmpty","orderBy","undefined","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","uniq","map","r","filter","value","isNil","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","oneToMany","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../src/transaction-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;CAC7B;AACD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,iBAAiB,EAAE,QAAQ,EAAE,CAAC;CAC/B;AAID,QAAA,MAAM,cAAc;yCACyB,KAAK,WAAW,MAAM,SAAS;;gBAkBxD,KAAK,WAAW;kBAoBd,KAAK,WAAW;iBAoBvB,QAAQ;mBAON,QAAQ;CAMxB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../src/transaction-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;CAC7B;AACD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,iBAAiB,EAAE,QAAQ,EAAE,CAAC;CAC/B;AAID,QAAA,MAAM,cAAc;yCACyB,KAAK,WAAW,MAAM,SAAS;;gBAkBxD,KAAK,WAAW;kBA0Bd,KAAK,WAAW;iBA0BvB,QAAQ;mBAON,QAAQ;CAMxB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -2,6 +2,16 @@
2
2
 
3
3
  var node_async_hooks = require('node:async_hooks');
4
4
 
5
+ /**
6
+ * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via
7
+ * the callback object returned from `Database#transaction`, or after the
8
+ * container’s promise has settled in Knex), a second finalisation is invalid
9
+ * and can throw (e.g. "Transaction query already complete"). Knex exposes
10
+ * `isCompleted()` for this; optional for mocks that omit it.
11
+ */ const isTransactorComplete = (trx)=>{
12
+ const t = trx;
13
+ return typeof t.isCompleted === 'function' && t.isCompleted();
14
+ };
5
15
  const storage = new node_async_hooks.AsyncLocalStorage();
6
16
  const transactionCtx = {
7
17
  async run (trx, cb) {
@@ -19,6 +29,12 @@ const transactionCtx = {
19
29
  },
20
30
  async commit (trx) {
21
31
  const store = storage.getStore();
32
+ if (isTransactorComplete(trx)) {
33
+ if (store?.trx) {
34
+ store.trx = null;
35
+ }
36
+ return;
37
+ }
22
38
  // Clear transaction from store
23
39
  if (store?.trx) {
24
40
  store.trx = null;
@@ -34,6 +50,12 @@ const transactionCtx = {
34
50
  },
35
51
  async rollback (trx) {
36
52
  const store = storage.getStore();
53
+ if (isTransactorComplete(trx)) {
54
+ if (store?.trx) {
55
+ store.trx = null;
56
+ }
57
+ return;
58
+ }
37
59
  // Clear transaction from store
38
60
  if (store?.trx) {
39
61
  store.trx = null;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.js","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;;;AAgBA,MAAMA,UAAU,IAAIC,kCAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOF,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"transaction-context.js","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\n/**\n * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via\n * the callback object returned from `Database#transaction`, or after the\n * container’s promise has settled in Knex), a second finalisation is invalid\n * and can throw (e.g. \"Transaction query already complete\"). Knex exposes\n * `isCompleted()` for this; optional for mocks that omit it.\n */\nconst isTransactorComplete = (trx: Knex.Transaction) => {\n const t = trx as Knex.Transaction & { isCompleted?: () => boolean };\n return typeof t.isCompleted === 'function' && t.isCompleted();\n};\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["isTransactorComplete","trx","t","isCompleted","storage","AsyncLocalStorage","transactionCtx","run","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":"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"}
@@ -1,5 +1,15 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
 
3
+ /**
4
+ * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via
5
+ * the callback object returned from `Database#transaction`, or after the
6
+ * container’s promise has settled in Knex), a second finalisation is invalid
7
+ * and can throw (e.g. "Transaction query already complete"). Knex exposes
8
+ * `isCompleted()` for this; optional for mocks that omit it.
9
+ */ const isTransactorComplete = (trx)=>{
10
+ const t = trx;
11
+ return typeof t.isCompleted === 'function' && t.isCompleted();
12
+ };
3
13
  const storage = new AsyncLocalStorage();
4
14
  const transactionCtx = {
5
15
  async run (trx, cb) {
@@ -17,6 +27,12 @@ const transactionCtx = {
17
27
  },
18
28
  async commit (trx) {
19
29
  const store = storage.getStore();
30
+ if (isTransactorComplete(trx)) {
31
+ if (store?.trx) {
32
+ store.trx = null;
33
+ }
34
+ return;
35
+ }
20
36
  // Clear transaction from store
21
37
  if (store?.trx) {
22
38
  store.trx = null;
@@ -32,6 +48,12 @@ const transactionCtx = {
32
48
  },
33
49
  async rollback (trx) {
34
50
  const store = storage.getStore();
51
+ if (isTransactorComplete(trx)) {
52
+ if (store?.trx) {
53
+ store.trx = null;
54
+ }
55
+ return;
56
+ }
35
57
  // Clear transaction from store
36
58
  if (store?.trx) {
37
59
  store.trx = null;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;AAgBA,MAAMA,UAAU,IAAIC,iBAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOF,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\n/**\n * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via\n * the callback object returned from `Database#transaction`, or after the\n * container’s promise has settled in Knex), a second finalisation is invalid\n * and can throw (e.g. \"Transaction query already complete\"). Knex exposes\n * `isCompleted()` for this; optional for mocks that omit it.\n */\nconst isTransactorComplete = (trx: Knex.Transaction) => {\n const t = trx as Knex.Transaction & { isCompleted?: () => boolean };\n return typeof t.isCompleted === 'function' && t.isCompleted();\n};\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["isTransactorComplete","trx","t","isCompleted","storage","AsyncLocalStorage","transactionCtx","run","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/database",
3
- "version": "5.47.1",
3
+ "version": "5.48.0",
4
4
  "description": "Strapi's database layer",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@paralleldrive/cuid2": "2.2.2",
46
- "@strapi/utils": "5.47.1",
46
+ "@strapi/utils": "5.48.0",
47
47
  "ajv": "8.20.0",
48
48
  "date-fns": "2.30.0",
49
49
  "debug": "4.3.4",
@@ -55,8 +55,8 @@
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/fs-extra": "11.0.4",
58
- "eslint-config-custom": "5.47.1",
59
- "tsconfig": "5.47.1"
58
+ "eslint-config-custom": "5.48.0",
59
+ "tsconfig": "5.48.0"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=20.0.0 <=24.x.x",