@strapi/database 5.48.1 → 5.49.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.
Files changed (58) hide show
  1. package/dist/connection.js +5 -1
  2. package/dist/connection.js.map +1 -1
  3. package/dist/dialects/sqlite/index.js +8 -3
  4. package/dist/dialects/sqlite/index.js.map +1 -1
  5. package/dist/entity-manager/relations-orderer.js +5 -1
  6. package/dist/entity-manager/relations-orderer.js.map +1 -1
  7. package/dist/fields/datetime.js +3 -2
  8. package/dist/fields/datetime.js.map +1 -1
  9. package/dist/fields/index.js +5 -1
  10. package/dist/fields/index.js.map +1 -1
  11. package/dist/fields/shared/parsers.js +3 -2
  12. package/dist/fields/shared/parsers.js.map +1 -1
  13. package/dist/fields/timestamp.js +3 -2
  14. package/dist/fields/timestamp.js.map +1 -1
  15. package/dist/index.js +5 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/lifecycles/subscribers/timestamps.js +10 -6
  18. package/dist/lifecycles/subscribers/timestamps.js.map +1 -1
  19. package/dist/metadata/relations.js +6 -2
  20. package/dist/metadata/relations.js.map +1 -1
  21. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +5 -1
  22. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -1
  23. package/dist/migrations/users.js +6 -2
  24. package/dist/migrations/users.js.map +1 -1
  25. package/dist/query/helpers/order-by.js +11 -7
  26. package/dist/query/helpers/order-by.js.map +1 -1
  27. package/dist/query/helpers/populate/apply.d.ts.map +1 -1
  28. package/dist/query/helpers/populate/apply.js +48 -47
  29. package/dist/query/helpers/populate/apply.js.map +1 -1
  30. package/dist/query/helpers/populate/apply.mjs +4 -7
  31. package/dist/query/helpers/populate/apply.mjs.map +1 -1
  32. package/dist/query/helpers/populate/process.js +7 -3
  33. package/dist/query/helpers/populate/process.js.map +1 -1
  34. package/dist/query/helpers/search.js +5 -1
  35. package/dist/query/helpers/search.js.map +1 -1
  36. package/dist/query/helpers/transform.js +10 -6
  37. package/dist/query/helpers/transform.js.map +1 -1
  38. package/dist/query/helpers/where.d.ts +1 -1
  39. package/dist/query/helpers/where.d.ts.map +1 -1
  40. package/dist/query/helpers/where.js.map +1 -1
  41. package/dist/query/helpers/where.mjs.map +1 -1
  42. package/dist/query/query-builder.js +30 -26
  43. package/dist/query/query-builder.js.map +1 -1
  44. package/dist/schema/builder.js +5 -1
  45. package/dist/schema/builder.js.map +1 -1
  46. package/dist/schema/diff.js +19 -15
  47. package/dist/schema/diff.js.map +1 -1
  48. package/dist/schema/index.js +5 -1
  49. package/dist/schema/index.js.map +1 -1
  50. package/dist/schema/storage.js +5 -1
  51. package/dist/schema/storage.js.map +1 -1
  52. package/dist/utils/identifiers/hash.js +5 -1
  53. package/dist/utils/identifiers/hash.js.map +1 -1
  54. package/dist/utils/identifiers/index.js +5 -1
  55. package/dist/utils/identifiers/index.js.map +1 -1
  56. package/dist/utils/knex.js +6 -1
  57. package/dist/utils/knex.js.map +1 -1
  58. package/package.json +4 -4
@@ -3,6 +3,10 @@
3
3
  var _ = require('lodash/fp');
4
4
  var transform = require('../transform.js');
5
5
 
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var ___default = /*#__PURE__*/_interopDefault(_);
9
+
6
10
  // We must select the join column id, however whatever it is named will overwrite an attribute of the same name
7
11
  // Therefore, we will prefix with something unlikely to conflict with a user attribute
8
12
  // TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future
@@ -12,10 +16,10 @@ const joinColPrefix = '__strapi';
12
16
  * When `populateValue.orderBy` is present, join-table ordering must not take precedence
13
17
  * over the target attribute sort (see query-builder join vs root orderBy ordering).
14
18
  */ const getJoinTableOrderBy = (populateValue, joinTable)=>{
15
- if (!_.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {
19
+ if (!___default.default.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {
16
20
  return undefined;
17
21
  }
18
- return _.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy);
22
+ return ___default.default.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy);
19
23
  };
20
24
  /**
21
25
  * Populate oneToOne and manyToOne relation
@@ -28,8 +32,8 @@ const joinColPrefix = '__strapi';
28
32
  const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
29
33
  if ('joinColumn' in attribute && attribute.joinColumn) {
30
34
  const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;
31
- const referencedValues = _.uniq(results.map((r)=>r[joinColumnName]).filter((value)=>!_.isNil(value)));
32
- if (_.isEmpty(referencedValues)) {
35
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[joinColumnName]).filter((value)=>!___default.default.isNil(value)));
36
+ if (___default.default.isEmpty(referencedValues)) {
33
37
  results.forEach((result)=>{
34
38
  result[attributeName] = null;
35
39
  });
@@ -40,9 +44,9 @@ const joinColPrefix = '__strapi';
40
44
  }).execute({
41
45
  mapResults: false
42
46
  });
43
- const map = _.groupBy(referencedColumnName)(rows);
47
+ const map = ___default.default.groupBy(referencedColumnName)(rows);
44
48
  results.forEach((result)=>{
45
- result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName]]));
49
+ result[attributeName] = fromTargetRow(___default.default.first(map[result[joinColumnName]]));
46
50
  });
47
51
  return;
48
52
  }
@@ -54,9 +58,9 @@ const joinColPrefix = '__strapi';
54
58
  const joinColAlias = `${alias}.${joinColumnName}`;
55
59
  const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;
56
60
  const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;
57
- const referencedValues = _.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!_.isNil(value)));
61
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!___default.default.isNil(value)));
58
62
  if (isCount) {
59
- if (_.isEmpty(referencedValues)) {
63
+ if (___default.default.isEmpty(referencedValues)) {
60
64
  results.forEach((result)=>{
61
65
  result[attributeName] = {
62
66
  count: 0
@@ -92,7 +96,7 @@ const joinColPrefix = '__strapi';
92
96
  });
93
97
  return;
94
98
  }
95
- if (_.isEmpty(referencedValues)) {
99
+ if (___default.default.isEmpty(referencedValues)) {
96
100
  results.forEach((result)=>{
97
101
  result[attributeName] = null;
98
102
  });
@@ -111,9 +115,9 @@ const joinColPrefix = '__strapi';
111
115
  }).execute({
112
116
  mapResults: false
113
117
  });
114
- const map = _.groupBy(joinColRenameAs)(rows);
118
+ const map = ___default.default.groupBy(joinColRenameAs)(rows);
115
119
  results.forEach((result)=>{
116
- result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName]]));
120
+ result[attributeName] = fromTargetRow(___default.default.first(map[result[referencedColumnName]]));
117
121
  });
118
122
  }
119
123
  };
@@ -123,8 +127,8 @@ const oneToMany = async (input, ctx)=>{
123
127
  const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
124
128
  if ('joinColumn' in attribute && attribute.joinColumn) {
125
129
  const { name: joinColumnName, referencedColumn: referencedColumnName, on } = attribute.joinColumn;
126
- const referencedValues = _.uniq(results.map((r)=>r[joinColumnName]).filter((value)=>!_.isNil(value)));
127
- if (_.isEmpty(referencedValues)) {
130
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[joinColumnName]).filter((value)=>!___default.default.isNil(value)));
131
+ if (___default.default.isEmpty(referencedValues)) {
128
132
  results.forEach((result)=>{
129
133
  result[attributeName] = null;
130
134
  });
@@ -139,7 +143,7 @@ const oneToMany = async (input, ctx)=>{
139
143
  }).execute({
140
144
  mapResults: false
141
145
  });
142
- const map = _.groupBy(referencedColumnName)(rows);
146
+ const map = ___default.default.groupBy(referencedColumnName)(rows);
143
147
  results.forEach((result)=>{
144
148
  result[attributeName] = fromTargetRow(map[result[joinColumnName]] || []);
145
149
  });
@@ -153,9 +157,9 @@ const oneToMany = async (input, ctx)=>{
153
157
  const joinColAlias = `${alias}.${joinColumnName}`;
154
158
  const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;
155
159
  const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;
156
- const referencedValues = _.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!_.isNil(value)));
160
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!___default.default.isNil(value)));
157
161
  if (isCount) {
158
- if (_.isEmpty(referencedValues)) {
162
+ if (___default.default.isEmpty(referencedValues)) {
159
163
  results.forEach((result)=>{
160
164
  result[attributeName] = {
161
165
  count: 0
@@ -191,7 +195,7 @@ const oneToMany = async (input, ctx)=>{
191
195
  });
192
196
  return;
193
197
  }
194
- if (_.isEmpty(referencedValues)) {
198
+ if (___default.default.isEmpty(referencedValues)) {
195
199
  results.forEach((result)=>{
196
200
  result[attributeName] = [];
197
201
  });
@@ -210,7 +214,7 @@ const oneToMany = async (input, ctx)=>{
210
214
  }).execute({
211
215
  mapResults: false
212
216
  });
213
- const map = _.groupBy(joinColRenameAs)(rows);
217
+ const map = ___default.default.groupBy(joinColRenameAs)(rows);
214
218
  results.forEach((r)=>{
215
219
  r[attributeName] = fromTargetRow(map[r[referencedColumnName]] || []);
216
220
  });
@@ -227,9 +231,9 @@ const manyToMany = async (input, ctx)=>{
227
231
  const joinColAlias = `${alias}.${joinColumnName}`;
228
232
  const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;
229
233
  const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;
230
- const referencedValues = _.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!_.isNil(value)));
234
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!___default.default.isNil(value)));
231
235
  if (isCount) {
232
- if (_.isEmpty(referencedValues)) {
236
+ if (___default.default.isEmpty(referencedValues)) {
233
237
  results.forEach((result)=>{
234
238
  result[attributeName] = {
235
239
  count: 0
@@ -265,7 +269,7 @@ const manyToMany = async (input, ctx)=>{
265
269
  });
266
270
  return;
267
271
  }
268
- if (_.isEmpty(referencedValues)) {
272
+ if (___default.default.isEmpty(referencedValues)) {
269
273
  results.forEach((result)=>{
270
274
  result[attributeName] = [];
271
275
  });
@@ -284,7 +288,7 @@ const manyToMany = async (input, ctx)=>{
284
288
  }).execute({
285
289
  mapResults: false
286
290
  });
287
- const map = _.groupBy(joinColRenameAs)(rows);
291
+ const map = ___default.default.groupBy(joinColRenameAs)(rows);
288
292
  results.forEach((result)=>{
289
293
  result[attributeName] = fromTargetRow(map[result[referencedColumnName]] || []);
290
294
  });
@@ -297,8 +301,8 @@ const morphX = async (input, ctx)=>{
297
301
  const targetAttribute = db.metadata.get(target).attributes[morphBy];
298
302
  if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {
299
303
  const { idColumn, typeColumn } = targetAttribute.morphColumn;
300
- const referencedValues = _.uniq(results.map((r)=>r[idColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
301
- if (_.isEmpty(referencedValues)) {
304
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[idColumn.referencedColumn]).filter((value)=>!___default.default.isNil(value)));
305
+ if (___default.default.isEmpty(referencedValues)) {
302
306
  results.forEach((result)=>{
303
307
  result[attributeName] = null;
304
308
  });
@@ -311,18 +315,18 @@ const morphX = async (input, ctx)=>{
311
315
  }).execute({
312
316
  mapResults: false
313
317
  });
314
- const map = _.groupBy(idColumn.name)(rows);
318
+ const map = ___default.default.groupBy(idColumn.name)(rows);
315
319
  results.forEach((result)=>{
316
320
  const matchingRows = map[result[idColumn.referencedColumn]];
317
- const matchingValue = attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;
321
+ const matchingValue = attribute.relation === 'morphOne' ? ___default.default.first(matchingRows) : matchingRows;
318
322
  result[attributeName] = fromTargetRow(matchingValue);
319
323
  });
320
324
  } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {
321
325
  const { joinTable } = targetAttribute;
322
326
  const { joinColumn, morphColumn } = joinTable;
323
327
  const { idColumn, typeColumn } = morphColumn;
324
- const referencedValues = _.uniq(results.map((r)=>r[idColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
325
- if (_.isEmpty(referencedValues)) {
328
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[idColumn.referencedColumn]).filter((value)=>!___default.default.isNil(value)));
329
+ if (___default.default.isEmpty(referencedValues)) {
326
330
  results.forEach((result)=>{
327
331
  result[attributeName] = attribute.relation === 'morphOne' ? null : [];
328
332
  });
@@ -351,10 +355,10 @@ const morphX = async (input, ctx)=>{
351
355
  }).execute({
352
356
  mapResults: false
353
357
  });
354
- const map = _.groupBy(idColumn.name)(rows);
358
+ const map = ___default.default.groupBy(idColumn.name)(rows);
355
359
  results.forEach((result)=>{
356
360
  const matchingRows = map[result[idColumn.referencedColumn]];
357
- const matchingValue = attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;
361
+ const matchingValue = attribute.relation === 'morphOne' ? ___default.default.first(matchingRows) : matchingRows;
358
362
  result[attributeName] = fromTargetRow(matchingValue);
359
363
  });
360
364
  }
@@ -367,30 +371,27 @@ const morphToMany = async (input, ctx)=>{
367
371
  const { joinColumn, morphColumn } = joinTable;
368
372
  const { idColumn, typeColumn, typeField = '__type' } = morphColumn;
369
373
  // fetch join table to create the ids map then do the same as morphToOne without the first
370
- const referencedValues = _.uniq(results.map((r)=>r[joinColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
374
+ const referencedValues = ___default.default.uniq(results.map((r)=>r[joinColumn.referencedColumn]).filter((value)=>!___default.default.isNil(value)));
371
375
  const qb = db.entityManager.createQueryBuilder(joinTable.name);
372
- const joinRows = await qb.where({
376
+ const joinRowsRaw = await qb.where({
373
377
  [joinColumn.name]: referencedValues,
374
- ...joinTable.on || {},
375
- // If the populateValue contains an "on" property,
376
- // only populate the types defined in it
377
- ...'on' in populateValue ? {
378
- [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {})
379
- } : {}
378
+ ...joinTable.on || {}
380
379
  }).orderBy([
381
380
  joinColumn.name,
382
381
  'order'
383
382
  ]).execute({
384
383
  mapResults: false
385
384
  });
386
- const joinMap = _.groupBy(joinColumn.name, joinRows);
385
+ const allowedTypes = 'on' in populateValue && populateValue.on ? new Set(Object.keys(populateValue.on)) : null;
386
+ const joinRows = allowedTypes ? joinRowsRaw.filter((row)=>allowedTypes.has(row[typeColumn.name])) : joinRowsRaw;
387
+ const joinMap = ___default.default.groupBy(joinColumn.name, joinRows);
387
388
  const idsByType = joinRows.reduce((acc, result)=>{
388
389
  const idValue = result[morphColumn.idColumn.name];
389
390
  const typeValue = result[morphColumn.typeColumn.name];
390
391
  if (!idValue || !typeValue) {
391
392
  return acc;
392
393
  }
393
- if (!_.has(typeValue, acc)) {
394
+ if (!___default.default.has(typeValue, acc)) {
394
395
  acc[typeValue] = [];
395
396
  }
396
397
  acc[typeValue].push(idValue);
@@ -411,7 +412,7 @@ const morphToMany = async (input, ctx)=>{
411
412
  }).execute({
412
413
  mapResults: false
413
414
  });
414
- map[type] = _.groupBy(idColumn.referencedColumn)(rows);
415
+ map[type] = ___default.default.groupBy(idColumn.referencedColumn)(rows);
415
416
  }));
416
417
  results.forEach((result)=>{
417
418
  const joinResults = joinMap[result[joinColumn.referencedColumn]] || [];
@@ -465,7 +466,7 @@ const morphToOne = async (input, ctx)=>{
465
466
  }).execute({
466
467
  mapResults: false
467
468
  });
468
- map[type] = _.groupBy(idColumn.referencedColumn)(rows);
469
+ map[type] = ___default.default.groupBy(idColumn.referencedColumn)(rows);
469
470
  }
470
471
  results.forEach((result)=>{
471
472
  const id = result[idColumn.name];
@@ -476,7 +477,7 @@ const morphToOne = async (input, ctx)=>{
476
477
  }
477
478
  const matchingRows = map[type][id];
478
479
  const fromTargetRow = (rowOrRows)=>transform.fromRow(db.metadata.get(type), rowOrRows);
479
- const row = fromTargetRow(_.first(matchingRows));
480
+ const row = fromTargetRow(___default.default.first(matchingRows));
480
481
  // Spread target first so a same-named user attribute cannot override the morph type UID
481
482
  result[attributeName] = row ? {
482
483
  ...row,
@@ -499,7 +500,7 @@ const pickPopulateParams = (populate)=>{
499
500
  if (populate.count !== true) {
500
501
  fieldsToPick.push('limit', 'offset');
501
502
  }
502
- return _.pick(fieldsToPick, populate);
503
+ return ___default.default.pick(fieldsToPick, populate);
503
504
  };
504
505
  const getPopulateValue = (populate, filters)=>{
505
506
  const populateValue = {
@@ -507,8 +508,8 @@ const getPopulateValue = (populate, filters)=>{
507
508
  ...pickPopulateParams(populate)
508
509
  };
509
510
  if ('on' in populateValue) {
510
- populateValue.on = _.mapValues((value)=>{
511
- if (_.isPlainObject(value)) {
511
+ populateValue.on = ___default.default.mapValues((value)=>{
512
+ if (___default.default.isPlainObject(value)) {
512
513
  value.filters = filters;
513
514
  }
514
515
  return value;
@@ -519,7 +520,7 @@ const getPopulateValue = (populate, filters)=>{
519
520
  const applyPopulate = async (results, populate, ctx)=>{
520
521
  const { db, uid, qb } = ctx;
521
522
  const meta = db.metadata.get(uid);
522
- if (_.isEmpty(results)) {
523
+ if (___default.default.isEmpty(results)) {
523
524
  return results;
524
525
  }
525
526
  const populateAttribute = async (attributeName)=>{
@@ -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 (!_.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":";;;;;AAQA;AACA;AACA;AACA,MAAMA,aAAAA,GAAgB,UAAA;AAEtB;;;;IAKA,MAAMC,mBAAAA,GAAsB,CAC1BC,aAAAA,EACAC,SAAAA,GAAAA;IAEA,IAAI,CAACC,CAAAA,CAAEC,OAAO,CAACH,aAAAA,CAAcI,OAAO,CAAA,IAAK,CAACH,SAAAA,CAAUG,OAAO,EAAE;QAC3D,OAAOC,SAAAA;AACT,IAAA;IAEA,OAAOH,CAAAA,CAAEI,SAAS,CAAC,CAACC,CAAAA,GAAMP,cAAcQ,QAAQ,IAAID,CAAAA,EAAGN,SAAAA,CAAUG,OAAO,CAAA;AAC1E,CAAA;AA4BA;;;;;IAMA,MAAMK,MAAAA,GAAS,OACbC,KAAAA,EACAC,GAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAEd,aAAa,EAAEe,UAAU,EAAEC,OAAO,EAAE,GAAGN,KAAAA;AAClF,IAAA,MAAM,EAAEO,EAAE,EAAEC,EAAE,EAAE,GAAGP,GAAAA;AAEnB,IAAA,MAAMQ,aAAAA,GAAgB,CAACC,SAAAA,GAAuCC,iBAAAA,CAAQN,UAAAA,EAAYK,SAAAA,CAAAA;AAElF,IAAA,IAAI,YAAA,IAAgBR,SAAAA,IAAaA,SAAAA,CAAUU,UAAU,EAAE;QACrD,MAAM,EAAEC,MAAMC,cAAc,EAAEC,kBAAkBC,oBAAoB,EAAE,GAAGd,SAAAA,CAAUU,UAAU;QAE7F,MAAMK,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAACN,cAAAA,CAAe,CAAA,CAAEO,MAAM,CAAC,CAACC,QAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;QAGnE,IAAI9B,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAG,IAAA;AAC1B,YAAA,CAAA,CAAA;AAEA,YAAA;AACF,QAAA;QAEA,MAAMuB,IAAAA,GAAO,MAAMnB,EAAAA,CAAGoB,aAAa,CAChCC,kBAAkB,CAACvB,UAAAA,CAAWwB,GAAG,CAAA,CACjCC,IAAI,CAACxC,eACLyC,SAAS,CAAC,CAAA,EAAGvB,EAAAA,CAAGwB,KAAK,CAAC,CAAC,EAAEhB,oBAAAA,CAAAA,CAAsB,CAAA,CAC/CiB,KAAK,CAAC;AAAE,YAAA,CAACjB,uBAAuBC;AAAiB,SAAA,CAAA,CACjDiB,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAEtC,QAAA,MAAMhB,GAAAA,GAAM3B,CAAAA,CAAE4C,OAAO,CAAQpB,oBAAAA,CAAAA,CAAsBU,IAAAA,CAAAA;QAEnDtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;AACfA,YAAAA,MAAM,CAACtB,aAAAA,CAAc,GAAGM,aAAAA,CAAcjB,CAAAA,CAAE6C,KAAK,CAAClB,GAAG,CAACM,MAAM,CAACX,cAAAA,CAAe,CAAW,CAAA,CAAA;AACrF,QAAA,CAAA,CAAA;AAEA,QAAA;AACF,IAAA;AAEA,IAAA,IAAI,WAAA,IAAeZ,SAAAA,IAAaA,SAAAA,CAAUX,SAAS,EAAE;QACnD,MAAM,EAAEA,SAAS,EAAE,GAAGW,SAAAA;AAEtB,QAAA,MAAMM,KAAKD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAACvB,WAAWwB,GAAG,CAAA;QAE7D,MAAM,EAAEhB,MAAMC,cAAc,EAAEC,kBAAkBC,oBAAoB,EAAE,GAAGzB,SAAAA,CAAUqB,UAAU;QAE7F,MAAMoB,KAAAA,GAAQxB,GAAG8B,QAAQ,EAAA;AACzB,QAAA,MAAMC,YAAAA,GAAe,CAAA,EAAGP,KAAAA,CAAM,CAAC,EAAElB,cAAAA,CAAAA,CAAgB;QACjD,MAAM0B,eAAAA,GAAkB,CAAA,EAAGpD,aAAAA,CAAAA,EAAgB0B,cAAAA,CAAAA,CAAgB;AAC3D,QAAA,MAAM2B,aAAAA,GAAgB,CAAA,EAAGF,YAAAA,CAAa,IAAI,EAAEC,eAAAA,CAAAA,CAAiB;QAE7D,MAAMvB,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAACJ,oBAAAA,CAAqB,CAAA,CAAEK,MAAM,CAAC,CAACC,QAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;AAGzE,QAAA,IAAIhB,OAAAA,EAAS;YACX,IAAId,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;gBAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;oBACfA,MAAM,CAACtB,cAAc,GAAG;wBAAEuC,KAAAA,EAAO;AAAE,qBAAA;AACrC,gBAAA,CAAA,CAAA;AACA,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMhB,OAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,gBAAAA,KAAAA;AACAY,gBAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;gBAC/BE,gBAAAA,EAAkBxB,SAAAA,CAAUsD,iBAAiB,CAAChC,IAAI;gBAClDiC,UAAAA,EAAYvD,SAAAA,CAAUsD,iBAAiB,CAAC9B,gBAAgB;AACxDgC,gBAAAA,SAAAA,EAAWvC,GAAGwB,KAAK;AACnBgB,gBAAAA,EAAAA,EAAIzD,UAAUyD;AAChB,aAAA,CAAA,CACCC,MAAM,CAAC;AAACV,gBAAAA,YAAAA;AAAc/B,gBAAAA,EAAAA,CAAG0C,GAAG,CAAC,mBAAA;AAAqB,aAAA,CAAA,CAClDjB,KAAK,CAAC;AAAE,gBAAA,CAACM,eAAetB;AAAiB,aAAA,CAAA,CACzCmB,OAAO,CAACG,YAAAA,CAAAA,CACRL,OAAO,CAAuD;gBAAEC,UAAAA,EAAY;AAAM,aAAA,CAAA;AAErF,YAAA,MAAMhB,GAAAA,GAAMO,IAAAA,CAAKyB,MAAM,CACrB,CAAChC,GAAAA,EAAKiC,GAAAA,GAAAA;AACJjC,gBAAAA,GAAG,CAACiC,GAAG,CAACtC,cAAAA,CAAe,CAAC,GAAG;oBAAE4B,KAAAA,EAAOW,MAAAA,CAAOD,IAAIV,KAAK;AAAE,iBAAA;gBACtD,OAAOvB,GAAAA;AACT,YAAA,CAAA,EACA,EAAC,CAAA;YAGHf,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAGgB,GAAG,CAACM,MAAM,CAACT,oBAAAA,CAAqB,CAAW,IAAI;oBAAE0B,KAAAA,EAAO;AAAE,iBAAA;AACpF,YAAA,CAAA,CAAA;AAEA,YAAA;AACF,QAAA;QAEA,IAAIlD,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAG,IAAA;AAC1B,YAAA,CAAA,CAAA;AAEA,YAAA;AACF,QAAA;AAEA,QAAA,MAAMuB,OAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,YAAAA,KAAAA;AACAY,YAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;YAC/BE,gBAAAA,EAAkBxB,SAAAA,CAAUsD,iBAAiB,CAAChC,IAAI;YAClDiC,UAAAA,EAAYvD,SAAAA,CAAUsD,iBAAiB,CAAC9B,gBAAgB;AACxDgC,YAAAA,SAAAA,EAAWvC,GAAGwB,KAAK;AACnBgB,YAAAA,EAAAA,EAAIzD,UAAUyD,EAAE;AAChBtD,YAAAA,OAAAA,EAASL,oBAAoBC,aAAAA,EAAeC,SAAAA;AAC9C,SAAA,CAAA,CACCwC,SAAS,CAACU,aAAAA,CAAAA,CACVR,KAAK,CAAC;AAAE,YAAA,CAACM,eAAetB;AAAiB,SAAA,CAAA,CACzCiB,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAEtC,QAAA,MAAMhB,GAAAA,GAAM3B,CAAAA,CAAE4C,OAAO,CAAMI,eAAAA,CAAAA,CAAiBd,IAAAA,CAAAA;QAE5CtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;AACfA,YAAAA,MAAM,CAACtB,aAAAA,CAAc,GAAGM,aAAAA,CAAcjB,CAAAA,CAAE6C,KAAK,CAAClB,GAAG,CAACM,MAAM,CAACT,oBAAAA,CAAqB,CAAW,CAAA,CAAA;AAC3F,QAAA,CAAA,CAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMsC,SAAAA,GAAY,OAAOtD,KAAAA,EAA4CC,GAAAA,GAAAA;AACnE,IAAA,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAEd,aAAa,EAAEe,UAAU,EAAEC,OAAO,EAAE,GAAGN,KAAAA;AAClF,IAAA,MAAM,EAAEO,EAAE,EAAEC,EAAE,EAAE,GAAGP,GAAAA;AAEnB,IAAA,MAAMQ,aAAAA,GAAgB,CAACC,SAAAA,GAAuCC,iBAAAA,CAAQN,UAAAA,EAAYK,SAAAA,CAAAA;AAElF,IAAA,IAAI,YAAA,IAAgBR,SAAAA,IAAaA,SAAAA,CAAUU,UAAU,EAAE;QACrD,MAAM,EACJC,IAAAA,EAAMC,cAAc,EACpBC,gBAAAA,EAAkBC,oBAAoB,EACtCgC,EAAE,EACH,GAAG9C,SAAAA,CAAUU,UAAU;QAExB,MAAMK,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAACN,cAAAA,CAAe,CAAA,CAAEO,MAAM,CAAC,CAACC,QAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;QAGnE,IAAI9B,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAG,IAAA;AAC1B,YAAA,CAAA,CAAA;AACA,YAAA;AACF,QAAA;QAEA,MAAMuB,IAAAA,GAAO,MAAMnB,EAAAA,CAAGoB,aAAa,CAChCC,kBAAkB,CAACvB,UAAAA,CAAWwB,GAAG,CAAA,CACjCC,IAAI,CAACxC,eACLyC,SAAS,CAAC,CAAA,EAAGvB,EAAAA,CAAGwB,KAAK,CAAC,CAAC,EAAEhB,oBAAAA,CAAAA,CAAsB,CAAA,CAC/CiB,KAAK,CAAC;AACL,YAAA,CAACjB,uBAAuBC,gBAAAA;AACxB,YAAA,GAAI+B,EAAAA,IAAM,OAAOA,EAAAA,KAAO,UAAA,GAAaA,EAAAA,CAAG;AAAE1D,gBAAAA,aAAAA;AAAec,gBAAAA;AAAQ,aAAA,CAAA,GAAK;AACxE,SAAA,CAAA,CACC8B,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAEtC,QAAA,MAAMhB,GAAAA,GAAM3B,CAAAA,CAAE4C,OAAO,CAAMpB,oBAAAA,CAAAA,CAAsBU,IAAAA,CAAAA;QAEjDtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;YACfA,MAAM,CAACtB,aAAAA,CAAc,GAAGM,aAAAA,CAAcU,GAAG,CAACM,MAAM,CAACX,cAAAA,CAAe,CAAW,IAAI,EAAE,CAAA;AACnF,QAAA,CAAA,CAAA;AAEA,QAAA;AACF,IAAA;AAEA,IAAA,IAAI,WAAA,IAAeZ,SAAAA,IAAaA,SAAAA,CAAUX,SAAS,EAAE;QACnD,MAAM,EAAEA,SAAS,EAAE,GAAGW,SAAAA;AAEtB,QAAA,MAAMM,KAAKD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAACvB,WAAWwB,GAAG,CAAA;QAE7D,MAAM,EAAEhB,MAAMC,cAAc,EAAEC,kBAAkBC,oBAAoB,EAAE,GAAGzB,SAAAA,CAAUqB,UAAU;QAE7F,MAAMoB,KAAAA,GAAQxB,GAAG8B,QAAQ,EAAA;AACzB,QAAA,MAAMC,YAAAA,GAAe,CAAA,EAAGP,KAAAA,CAAM,CAAC,EAAElB,cAAAA,CAAAA,CAAgB;QACjD,MAAM0B,eAAAA,GAAkB,CAAA,EAAGpD,aAAAA,CAAAA,EAAgB0B,cAAAA,CAAAA,CAAgB;AAC3D,QAAA,MAAM2B,aAAAA,GAAgB,CAAA,EAAGF,YAAAA,CAAa,IAAI,EAAEC,eAAAA,CAAAA,CAAiB;QAE7D,MAAMvB,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAACJ,oBAAAA,CAAqB,CAAA,CAAEK,MAAM,CAAC,CAACC,QAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;AAGzE,QAAA,IAAIhB,OAAAA,EAAS;YACX,IAAId,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;gBAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;oBACfA,MAAM,CAACtB,cAAc,GAAG;wBAAEuC,KAAAA,EAAO;AAAE,qBAAA;AACrC,gBAAA,CAAA,CAAA;AACA,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMhB,OAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,gBAAAA,KAAAA;AACAY,gBAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;gBAC/BE,gBAAAA,EAAkBxB,SAAAA,CAAUsD,iBAAiB,CAAChC,IAAI;gBAClDiC,UAAAA,EAAYvD,SAAAA,CAAUsD,iBAAiB,CAAC9B,gBAAgB;AACxDgC,gBAAAA,SAAAA,EAAWvC,GAAGwB,KAAK;AACnBgB,gBAAAA,EAAAA,EAAIzD,UAAUyD;AAChB,aAAA,CAAA,CACCC,MAAM,CAAC;AAACR,gBAAAA,aAAAA;AAAejC,gBAAAA,EAAAA,CAAG0C,GAAG,CAAC,mBAAA;AAAqB,aAAA,CAAA,CACnDjB,KAAK,CAAC;AAAE,gBAAA,CAACM,eAAetB;AAAiB,aAAA,CAAA,CACzCmB,OAAO,CAACG,YAAAA,CAAAA,CACRL,OAAO,CAAuD;gBAAEC,UAAAA,EAAY;AAAM,aAAA,CAAA;AAErF,YAAA,MAAMhB,GAAAA,GAAMO,IAAAA,CAAKyB,MAAM,CACrB,CAAChC,GAAAA,EAAKiC,GAAAA,GAAAA;AACJjC,gBAAAA,GAAG,CAACiC,GAAG,CAACZ,eAAAA,CAAgB,CAAC,GAAG;oBAAEE,KAAAA,EAAOW,MAAAA,CAAOD,IAAIV,KAAK;AAAE,iBAAA;gBACvD,OAAOvB,GAAAA;AACT,YAAA,CAAA,EACA,EAAC,CAAA;YAGHf,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAGgB,GAAG,CAACM,MAAM,CAACT,oBAAAA,CAAqB,CAAW,IAAI;oBAAE0B,KAAAA,EAAO;AAAE,iBAAA;AACpF,YAAA,CAAA,CAAA;AAEA,YAAA;AACF,QAAA;QAEA,IAAIlD,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,aAAAA,CAAc,GAAG,EAAE;AAC5B,YAAA,CAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEA,QAAA,MAAMuB,OAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,YAAAA,KAAAA;AACAY,YAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;YAC/BE,gBAAAA,EAAkBxB,SAAAA,CAAUsD,iBAAiB,CAAChC,IAAI;YAClDiC,UAAAA,EAAYvD,SAAAA,CAAUsD,iBAAiB,CAAC9B,gBAAgB;AACxDgC,YAAAA,SAAAA,EAAWvC,GAAGwB,KAAK;AACnBgB,YAAAA,EAAAA,EAAIzD,UAAUyD,EAAE;AAChBtD,YAAAA,OAAAA,EAASL,oBAAoBC,aAAAA,EAAeC,SAAAA;AAC9C,SAAA,CAAA,CACCwC,SAAS,CAACU,aAAAA,CAAAA,CACVR,KAAK,CAAC;AAAE,YAAA,CAACM,eAAetB;AAAiB,SAAA,CAAA,CACzCiB,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAEtC,QAAA,MAAMhB,GAAAA,GAAM3B,CAAAA,CAAE4C,OAAO,CAAMI,eAAAA,CAAAA,CAAiBd,IAAAA,CAAAA;QAE5CtB,OAAAA,CAAQoB,OAAO,CAAC,CAACJ,CAAAA,GAAAA;YACfA,CAAC,CAACjB,aAAAA,CAAc,GAAGM,aAAAA,CAAcU,GAAG,CAACC,CAAC,CAACJ,oBAAAA,CAAqB,CAAW,IAAI,EAAE,CAAA;AAC/E,QAAA,CAAA,CAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMuC,UAAAA,GAAa,OAAOvD,KAAAA,EAA6CC,GAAAA,GAAAA;AACrE,IAAA,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAEd,aAAa,EAAEe,UAAU,EAAEC,OAAO,EAAE,GAAGN,KAAAA;IAClF,MAAM,EAAEO,EAAE,EAAE,GAAGN,GAAAA;AAEf,IAAA,MAAMQ,aAAAA,GAAgB,CAACC,SAAAA,GAAuCC,iBAAAA,CAAQN,UAAAA,EAAYK,SAAAA,CAAAA;IAElF,MAAM,EAAEnB,SAAS,EAAE,GAAGW,SAAAA;AAEtB,IAAA,MAAMsD,aAAajD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAACvB,WAAWwB,GAAG,CAAA;IAErE,MAAM,EAAEhB,MAAMC,cAAc,EAAEC,kBAAkBC,oBAAoB,EAAE,GAAGzB,SAAAA,CAAUqB,UAAU;IAE7F,MAAMoB,KAAAA,GAAQwB,WAAWlB,QAAQ,EAAA;AACjC,IAAA,MAAMC,YAAAA,GAAe,CAAA,EAAGP,KAAAA,CAAM,CAAC,EAAElB,cAAAA,CAAAA,CAAgB;IACjD,MAAM0B,eAAAA,GAAkB,CAAA,EAAGpD,aAAAA,CAAAA,EAAgB0B,cAAAA,CAAAA,CAAgB;AAC3D,IAAA,MAAM2B,aAAAA,GAAgB,CAAA,EAAGF,YAAAA,CAAa,IAAI,EAAEC,eAAAA,CAAAA,CAAiB;IAE7D,MAAMvB,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAACJ,oBAAAA,CAAqB,CAAA,CAAEK,MAAM,CAAC,CAACC,QAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;AAGzE,IAAA,IAAIhB,OAAAA,EAAS;QACX,IAAId,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAG;oBAAEuC,KAAAA,EAAO;AAAE,iBAAA;AACrC,YAAA,CAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEA,QAAA,MAAMhB,OAAO,MAAM8B,UAAAA,CAChB1B,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,YAAAA,KAAAA;AACAY,YAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;YAC/BE,gBAAAA,EAAkBxB,SAAAA,CAAUsD,iBAAiB,CAAChC,IAAI;YAClDiC,UAAAA,EAAYvD,SAAAA,CAAUsD,iBAAiB,CAAC9B,gBAAgB;AACxDgC,YAAAA,SAAAA,EAAWS,WAAWxB,KAAK;AAC3BgB,YAAAA,EAAAA,EAAIzD,UAAUyD;AAChB,SAAA,CAAA,CACCC,MAAM,CAAC;AAACV,YAAAA,YAAAA;AAAciB,YAAAA,UAAAA,CAAWN,GAAG,CAAC,mBAAA;AAAqB,SAAA,CAAA,CAC1DjB,KAAK,CAAC;AAAE,YAAA,CAACM,eAAetB;AAAiB,SAAA,CAAA,CACzCmB,OAAO,CAACG,YAAAA,CAAAA,CACRL,OAAO,CAAuD;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAErF,QAAA,MAAMhB,GAAAA,GAAMO,IAAAA,CAAKyB,MAAM,CACrB,CAAChC,GAAAA,EAAKiC,GAAAA,GAAAA;AACJjC,YAAAA,GAAG,CAACiC,GAAG,CAACtC,cAAAA,CAAe,CAAC,GAAG;gBAAE4B,KAAAA,EAAOW,MAAAA,CAAOD,IAAIV,KAAK;AAAE,aAAA;YACtD,OAAOvB,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;QAGHf,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;YACfA,MAAM,CAACtB,cAAc,GAAGgB,GAAG,CAACM,MAAM,CAACT,oBAAAA,CAAqB,CAAW,IAAI;gBAAE0B,KAAAA,EAAO;AAAE,aAAA;AACpF,QAAA,CAAA,CAAA;AAEA,QAAA;AACF,IAAA;IAEA,IAAIlD,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;QAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;YACfA,MAAM,CAACtB,aAAAA,CAAc,GAAG,EAAE;AAC5B,QAAA,CAAA,CAAA;AACA,QAAA;AACF,IAAA;AAEA,IAAA,MAAMuB,OAAO,MAAM8B,UAAAA,CAChB1B,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,QAAAA,KAAAA;AACAY,QAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;QAC/BE,gBAAAA,EAAkBxB,SAAAA,CAAUsD,iBAAiB,CAAChC,IAAI;QAClDiC,UAAAA,EAAYvD,SAAAA,CAAUsD,iBAAiB,CAAC9B,gBAAgB;AACxDgC,QAAAA,SAAAA,EAAWS,WAAWxB,KAAK;AAC3BgB,QAAAA,EAAAA,EAAIzD,UAAUyD,EAAE;AAChBtD,QAAAA,OAAAA,EAASL,oBAAoBC,aAAAA,EAAeC,SAAAA;AAC9C,KAAA,CAAA,CACCwC,SAAS,CAACU,aAAAA,CAAAA,CACVR,KAAK,CAAC;AAAE,QAAA,CAACM,eAAetB;AAAiB,KAAA,CAAA,CACzCiB,OAAO,CAAQ;QAAEC,UAAAA,EAAY;AAAM,KAAA,CAAA;AAEtC,IAAA,MAAMhB,GAAAA,GAAM3B,CAAAA,CAAE4C,OAAO,CAAMI,eAAAA,CAAAA,CAAiBd,IAAAA,CAAAA;IAE5CtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;QACfA,MAAM,CAACtB,aAAAA,CAAc,GAAGM,aAAAA,CAAcU,GAAG,CAACM,MAAM,CAACT,oBAAAA,CAAqB,CAAW,IAAI,EAAE,CAAA;AACzF,IAAA,CAAA,CAAA;AACF,CAAA;AAEA,MAAMyC,MAAAA,GAAS,OACbzD,KAAAA,EACAC,GAAAA,GAAAA;IAEA,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAEd,aAAa,EAAEe,UAAU,EAAE,GAAGL,KAAAA;AACzE,IAAA,MAAM,EAAEO,EAAE,EAAEsB,GAAG,EAAE,GAAG5B,GAAAA;AAEpB,IAAA,MAAMQ,aAAAA,GAAgB,CAACC,SAAAA,GAAuCC,iBAAAA,CAAQN,UAAAA,EAAYK,SAAAA,CAAAA;AAElF,IAAA,MAAM,EAAEgD,MAAM,EAAEC,OAAO,EAAE,GAAGzD,SAAAA;IAE5B,MAAM0D,eAAAA,GAAkBrD,GAAGsD,QAAQ,CAACC,GAAG,CAACJ,MAAAA,CAAAA,CAAQK,UAAU,CAACJ,OAAAA,CAAQ;AAEnE,IAAA,IAAIC,gBAAgBI,IAAI,KAAK,cAAcJ,eAAAA,CAAgBK,QAAQ,KAAK,YAAA,EAAc;AACpF,QAAA,MAAM,EAAEC,QAAQ,EAAEC,UAAU,EAAE,GAAGP,gBAAgBQ,WAAW;QAE5D,MAAMnD,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAAC8C,SAASnD,gBAAgB,CAAC,EAAEM,MAAM,CAAC,CAACC,KAAAA,GAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;QAG9E,IAAI9B,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAG,IAAA;AAC1B,YAAA,CAAA,CAAA;AAEA,YAAA;AACF,QAAA;QAEA,MAAMuB,IAAAA,GAAO,MAAMnB,EAAAA,CAAGoB,aAAa,CAChCC,kBAAkB,CAAC8B,MAAAA,CAAAA,CACnB5B,IAAI,CAACxC,aAAAA,CACN;AACC2C,SAAAA,KAAK,CAAC;YAAE,CAACiC,QAAAA,CAASrD,IAAI,GAAGI,gBAAAA;YAAkB,CAACkD,UAAAA,CAAWtD,IAAI,GAAGgB;AAAI,SAAA,CAAA,CAClEK,OAAO,CAAM;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAEpC,QAAA,MAAMhB,MAAM3B,CAAAA,CAAE4C,OAAO,CAAM8B,QAAAA,CAASrD,IAAI,CAAA,CAAEa,IAAAA,CAAAA;QAE1CtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;YACf,MAAM4C,YAAAA,GAAelD,GAAG,CAACM,MAAM,CAACyC,QAAAA,CAASnD,gBAAgB,CAAC,CAAW;YAErE,MAAMuD,aAAAA,GACJpE,UAAU+D,QAAQ,KAAK,aAAazE,CAAAA,CAAE6C,KAAK,CAACgC,YAAAA,CAAAA,GAAgBA,YAAAA;YAE9D5C,MAAM,CAACtB,aAAAA,CAAc,GAAGM,aAAAA,CAAc6D,aAAAA,CAAAA;AACxC,QAAA,CAAA,CAAA;IACF,CAAA,MAAO,IAAIV,gBAAgBI,IAAI,KAAK,cAAcJ,eAAAA,CAAgBK,QAAQ,KAAK,aAAA,EAAe;QAC5F,MAAM,EAAE1E,SAAS,EAAE,GAAGqE,eAAAA;AAEtB,QAAA,MAAM,EAAEhD,UAAU,EAAEwD,WAAW,EAAE,GAAG7E,SAAAA;AAEpC,QAAA,MAAM,EAAE2E,QAAQ,EAAEC,UAAU,EAAE,GAAGC,WAAAA;QAEjC,MAAMnD,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAAC8C,SAASnD,gBAAgB,CAAC,EAAEM,MAAM,CAAC,CAACC,KAAAA,GAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;QAG9E,IAAI9B,CAAAA,CAAEC,OAAO,CAACwB,gBAAAA,CAAAA,EAAmB;YAC/Bb,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACfA,MAAM,CAACtB,cAAc,GAAGD,SAAAA,CAAU+D,QAAQ,KAAK,UAAA,GAAa,OAAO,EAAE;AACvE,YAAA,CAAA,CAAA;AAEA,YAAA;AACF,QAAA;;AAGA,QAAA,MAAMzD,EAAAA,GAAKD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAAC8B,MAAAA,CAAAA;QAE/C,MAAM1B,KAAAA,GAAQxB,GAAG8B,QAAQ,EAAA;AAEzB,QAAA,MAAMZ,OAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACxC,aAAAA,CAAAA,CACLqD,IAAI,CAAC;AACJX,YAAAA,KAAAA;AACAY,YAAAA,eAAAA,EAAiBrD,UAAUsB,IAAI;AAC/BE,YAAAA,gBAAAA,EAAkBH,WAAWC,IAAI;AACjCiC,YAAAA,UAAAA,EAAYlC,WAAWG,gBAAgB;AACvCgC,YAAAA,SAAAA,EAAWvC,GAAGwB,KAAK;YACnBgB,EAAAA,EAAI;AACF,gBAAA,GAAIzD,SAAAA,CAAUyD,EAAE,IAAI,EAAE;gBACtBuB,KAAAA,EAAOpE;AACT,aAAA;AACAT,YAAAA,OAAAA,EAASL,oBAAoBC,aAAAA,EAAeC,SAAAA;AAC9C,SAAA,CAAA,CACCwC,SAAS,CAAC;AAAC,YAAA,CAAA,EAAGC,KAAAA,CAAM,CAAC,EAAEkC,QAAAA,CAASrD,IAAI,CAAA,CAAE;AAAE,YAAA,CAAA,EAAGmB,KAAAA,CAAM,CAAC,EAAEmC,UAAAA,CAAWtD,IAAI,CAAA;AAAG,SAAA,CAAA,CACtEoB,KAAK,CAAC;YACL,CAAC,CAAA,EAAGD,MAAM,CAAC,EAAEkC,SAASrD,IAAI,CAAA,CAAE,GAAGI,gBAAAA;YAC/B,CAAC,CAAA,EAAGe,MAAM,CAAC,EAAEmC,WAAWtD,IAAI,CAAA,CAAE,GAAGgB;AACnC,SAAA,CAAA,CACCK,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;AAEtC,QAAA,MAAMhB,MAAM3B,CAAAA,CAAE4C,OAAO,CAAM8B,QAAAA,CAASrD,IAAI,CAAA,CAAEa,IAAAA,CAAAA;QAE1CtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;YACf,MAAM4C,YAAAA,GAAelD,GAAG,CAACM,MAAM,CAACyC,QAAAA,CAASnD,gBAAgB,CAAC,CAAW;YAErE,MAAMuD,aAAAA,GACJpE,UAAU+D,QAAQ,KAAK,aAAazE,CAAAA,CAAE6C,KAAK,CAACgC,YAAAA,CAAAA,GAAgBA,YAAAA;YAE9D5C,MAAM,CAACtB,aAAAA,CAAc,GAAGM,aAAAA,CAAc6D,aAAAA,CAAAA;AACxC,QAAA,CAAA,CAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAME,WAAAA,GAAc,OAAOxE,KAAAA,EAAoCC,GAAAA,GAAAA;IAC7D,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAEd,aAAa,EAAE,GAAGU,KAAAA;IAC7D,MAAM,EAAEO,EAAE,EAAE,GAAGN,GAAAA;;IAGf,MAAM,EAAEV,SAAS,EAAE,GAAGW,SAAAA;AAEtB,IAAA,MAAM,EAAEU,UAAU,EAAEwD,WAAW,EAAE,GAAG7E,SAAAA;IACpC,MAAM,EAAE2E,QAAQ,EAAEC,UAAU,EAAEM,SAAAA,GAAY,QAAQ,EAAE,GAAGL,WAAAA;;IAIvD,MAAMnD,gBAAAA,GAAmBzB,EAAE0B,IAAI,CAC7Bd,QAAQe,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAC,CAACR,WAAWG,gBAAgB,CAAC,EAAEM,MAAM,CAAC,CAACC,KAAAA,GAAU,CAAC9B,CAAAA,CAAE+B,KAAK,CAACD,KAAAA,CAAAA,CAAAA,CAAAA;AAGhF,IAAA,MAAMd,KAAKD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAACrC,UAAUsB,IAAI,CAAA;AAE7D,IAAA,MAAM6D,QAAAA,GAAW,MAAMlE,EAAAA,CACpByB,KAAK,CAAC;QACL,CAACrB,UAAAA,CAAWC,IAAI,GAAGI,gBAAAA;AACnB,QAAA,GAAI1B,SAAAA,CAAUyD,EAAE,IAAI,EAAE;;;AAGtB,QAAA,GAAI,QAAQ1D,aAAAA,GACR;AAAE,YAAA,CAAC8E,WAAAA,CAAYD,UAAU,CAACtD,IAAI,GAAG8D,MAAAA,CAAOC,IAAI,CAACtF,aAAAA,CAAc0D,EAAE,IAAI,EAAC;AAAG,SAAA,GACrE;AACN,KAAA,CAAA,CACCtD,OAAO,CAAC;AAACkB,QAAAA,UAAAA,CAAWC,IAAI;AAAE,QAAA;AAAQ,KAAA,CAAA,CAClCqB,OAAO,CAAQ;QAAEC,UAAAA,EAAY;AAAM,KAAA,CAAA;AAEtC,IAAA,MAAM0C,UAAUrF,CAAAA,CAAE4C,OAAO,CAACxB,UAAAA,CAAWC,IAAI,EAAE6D,QAAAA,CAAAA;AAE3C,IAAA,MAAMI,SAAAA,GAAYJ,QAAAA,CAASvB,MAAM,CAAuB,CAAC4B,GAAAA,EAAKtD,MAAAA,GAAAA;AAC5D,QAAA,MAAMuD,UAAUvD,MAAM,CAAC2C,YAAYF,QAAQ,CAACrD,IAAI,CAAC;AACjD,QAAA,MAAMoE,YAAYxD,MAAM,CAAC2C,YAAYD,UAAU,CAACtD,IAAI,CAAC;QAErD,IAAI,CAACmE,OAAAA,IAAW,CAACC,SAAAA,EAAW;YAC1B,OAAOF,GAAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAACvF,CAAAA,CAAE0F,GAAG,CAACD,WAAWF,GAAAA,CAAAA,EAAM;YAC1BA,GAAG,CAACE,SAAAA,CAAU,GAAG,EAAE;AACrB,QAAA;AAEAF,QAAAA,GAAG,CAACE,SAAAA,CAAU,CAACE,IAAI,CAACH,OAAAA,CAAAA;QAEpB,OAAOD,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AAEJ,IAAA,MAAM5D,MAAkB,EAAC;AACzB,IAAA,MAAM,EAAE6B,EAAE,EAAE,GAAGoC,cAAc,GAAG9F,aAAAA;IAEhC,MAAM+F,OAAAA,CAAQC,GAAG,CACfX,MAAAA,CAAOC,IAAI,CAACE,SAAAA,CAAAA,CAAW3D,GAAG,CAAC,OAAO6C,IAAAA,GAAAA;QAChC,MAAMuB,GAAAA,GAAMT,SAAS,CAACd,IAAAA,CAAK;;AAG3B,QAAA,IAAI,CAACzD,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAACE,IAAAA,CAAAA,EAAO;YAC1B7C,GAAG,CAAC6C,IAAAA,CAAK,GAAG,EAAC;AAEb,YAAA;AACF,QAAA;AAEA,QAAA,MAAMxD,EAAAA,GAAKD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAACoC,IAAAA,CAAAA;QAE/C,MAAMtC,IAAAA,GAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACkB,EAAAA,GAAKgB,IAAAA,CAAK,IAAIoB,YAAAA,CAAAA,CACnBrD,SAAS,CAAC,CAAA,EAAGvB,EAAAA,CAAGwB,KAAK,CAAC,CAAC,EAAEkC,SAASnD,gBAAgB,CAAA,CAAE,CAAA,CACpDkB,KAAK,CAAC;YAAE,CAACiC,QAAAA,CAASnD,gBAAgB,GAAGwE;AAAI,SAAA,CAAA,CACzCrD,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;QAEtChB,GAAG,CAAC6C,KAAK,GAAGxE,CAAAA,CAAE4C,OAAO,CAAM8B,QAAAA,CAASnD,gBAAgB,CAAA,CAAEW,IAAAA,CAAAA;AACxD,IAAA,CAAA,CAAA,CAAA;IAGFtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;QACf,MAAM+D,WAAAA,GAAcX,OAAO,CAACpD,MAAM,CAACb,WAAWG,gBAAgB,CAAC,CAAW,IAAI,EAAE;AAEhF,QAAA,MAAMsD,YAAAA,GAAemB,WAAAA,CAAYC,OAAO,CAAC,CAACC,UAAAA,GAAAA;AACxC,YAAA,MAAMC,EAAAA,GAAKD,UAAU,CAACxB,QAAAA,CAASrD,IAAI,CAAC;AACpC,YAAA,MAAMmD,IAAAA,GAAO0B,UAAU,CAACvB,UAAAA,CAAWtD,IAAI,CAAC;AAExC,YAAA,MAAMR,UAAAA,GAAaE,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAACE,IAAAA,CAAAA;AAEnC,YAAA,MAAMvD,aAAAA,GAAgB,CAACC,SAAAA,GAAuCC,iBAAAA,CAAQN,UAAAA,EAAYK,SAAAA,CAAAA;AAElF,YAAA,OAAO,CAACS,GAAG,CAAC6C,IAAAA,CAAK,CAAC2B,EAAAA,CAAG,IAAI,EAAC,EAAGxE,GAAG,CAAC,CAACiC,GAAAA,GAAAA;;gBAEhC,OAAO;AAAE,oBAAA,GAAG3C,cAAc2C,GAAAA,CAAI;AAAE,oBAAA,CAACqB,YAAYT;AAAK,iBAAA;AACpD,YAAA,CAAA,CAAA;AACF,QAAA,CAAA,CAAA;QAEAvC,MAAM,CAACtB,cAAc,GAAGkE,YAAAA;AAC1B,IAAA,CAAA,CAAA;AACF,CAAA;AAEA,MAAMuB,UAAAA,GAAa,OAAO5F,KAAAA,EAAmCC,GAAAA,GAAAA;IAC3D,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAEd,aAAa,EAAE,GAAGU,KAAAA;IAC7D,MAAM,EAAEO,EAAE,EAAE,GAAGN,GAAAA;IAEf,MAAM,EAAEmE,WAAW,EAAE,GAAGlE,SAAAA;IACxB,MAAM,EAAEgE,QAAQ,EAAEC,UAAU,EAAEM,SAAAA,GAAY,QAAQ,EAAE,GAAGL,WAAAA;;;AAKvD,IAAA,MAAMU,SAAAA,GAAY1E,OAAAA,CAAQ+C,MAAM,CAAuB,CAAC4B,GAAAA,EAAKtD,MAAAA,GAAAA;AAC3D,QAAA,MAAMuD,UAAUvD,MAAM,CAAC2C,YAAYF,QAAQ,CAACrD,IAAI,CAAC;AACjD,QAAA,MAAMoE,YAAYxD,MAAM,CAAC2C,YAAYD,UAAU,CAACtD,IAAI,CAAC;QAErD,IAAI,CAACmE,OAAAA,IAAW,CAACC,SAAAA,EAAW;YAC1B,OAAOF,GAAAA;AACT,QAAA;AAEA,QAAA,IAAI,EAAEE,SAAAA,IAAaF,GAAE,CAAA,EAAI;YACvBA,GAAG,CAACE,SAAAA,CAAU,GAAG,EAAE;AACrB,QAAA;AAEAF,QAAAA,GAAG,CAACE,SAAAA,CAAU,CAACE,IAAI,CAACH,OAAAA,CAAAA;QAEpB,OAAOD,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AAEJ,IAAA,MAAM5D,MAAkB,EAAC;AACzB,IAAA,MAAM,EAAE6B,EAAE,EAAE,GAAGoC,cAAc,GAAG9F,aAAAA;AAEhC,IAAA,KAAK,MAAM0E,IAAAA,IAAQW,MAAAA,CAAOC,IAAI,CAACE,SAAAA,CAAAA,CAAY;QACzC,MAAMS,GAAAA,GAAMT,SAAS,CAACd,IAAAA,CAAK;;AAG3B,QAAA,IAAI,CAACzD,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAACE,IAAAA,CAAAA,EAAO;YAC1B7C,GAAG,CAAC6C,IAAAA,CAAK,GAAG,EAAC;AACb,YAAA;AACF,QAAA;AAEA,QAAA,MAAMxD,EAAAA,GAAKD,EAAAA,CAAGoB,aAAa,CAACC,kBAAkB,CAACoC,IAAAA,CAAAA;QAE/C,MAAMtC,IAAAA,GAAO,MAAMlB,EAAAA,CAChBsB,IAAI,CAACkB,EAAAA,GAAKgB,IAAAA,CAAK,IAAIoB,YAAAA,CAAAA,CACnBrD,SAAS,CAAC,CAAA,EAAGvB,EAAAA,CAAGwB,KAAK,CAAC,CAAC,EAAEkC,SAASnD,gBAAgB,CAAA,CAAE,CAAA,CACpDkB,KAAK,CAAC;YAAE,CAACiC,QAAAA,CAASnD,gBAAgB,GAAGwE;AAAI,SAAA,CAAA,CACzCrD,OAAO,CAAQ;YAAEC,UAAAA,EAAY;AAAM,SAAA,CAAA;QAEtChB,GAAG,CAAC6C,KAAK,GAAGxE,CAAAA,CAAE4C,OAAO,CAAM8B,QAAAA,CAASnD,gBAAgB,CAAA,CAAEW,IAAAA,CAAAA;AACxD,IAAA;IAEAtB,OAAAA,CAAQoB,OAAO,CAAC,CAACC,MAAAA,GAAAA;AACf,QAAA,MAAMkE,EAAAA,GAAKlE,MAAM,CAACyC,QAAAA,CAASrD,IAAI,CAAC;AAChC,QAAA,MAAMmD,IAAAA,GAAOvC,MAAM,CAAC0C,UAAAA,CAAWtD,IAAI,CAAC;QAEpC,IAAI,CAACmD,IAAAA,IAAQ,CAAC2B,EAAAA,EAAI;YAChBlE,MAAM,CAACtB,cAAc,GAAG,IAAA;AACxB,YAAA;AACF,QAAA;AAEA,QAAA,MAAMkE,YAAAA,GAAelD,GAAG,CAAC6C,IAAAA,CAAK,CAAC2B,EAAAA,CAAG;QAElC,MAAMlF,aAAAA,GAAgB,CAACC,SAAAA,GACrBC,iBAAAA,CAAQJ,GAAGsD,QAAQ,CAACC,GAAG,CAACE,IAAAA,CAAAA,EAAOtD,SAAAA,CAAAA;AAEjC,QAAA,MAAM0C,GAAAA,GAAM3C,aAAAA,CAAcjB,CAAAA,CAAE6C,KAAK,CAACgC,YAAAA,CAAAA,CAAAA;;QAElC5C,MAAM,CAACtB,aAAAA,CAAc,GAAGiD,GAAAA,GAAM;AAAE,YAAA,GAAGA,GAAG;AAAE,YAAA,CAACqB,YAAYT;SAAK,GAAIZ,GAAAA;AAChE,IAAA,CAAA,CAAA;AACF,CAAA;AAEA;AACA,MAAMyC,qBAAqB,CAACC,QAAAA,GAAAA;AAC1B,IAAA,MAAMC,YAAAA,GAAe;AACnB,QAAA,QAAA;AACA,QAAA,OAAA;AACA,QAAA,OAAA;AACA,QAAA,UAAA;AACA,QAAA,SAAA;AACA,QAAA,SAAA;AACA,QAAA,UAAA;AACA,QAAA;AACD,KAAA;IAED,IAAID,QAAAA,CAASpD,KAAK,KAAK,IAAA,EAAM;QAC3BqD,YAAAA,CAAaZ,IAAI,CAAC,OAAA,EAAS,QAAA,CAAA;AAC7B,IAAA;IAEA,OAAO3F,CAAAA,CAAEwG,IAAI,CAACD,YAAAA,EAAcD,QAAAA,CAAAA;AAC9B,CAAA;AAEA,MAAMG,gBAAAA,GAAmB,CAACH,QAAAA,EAA+BI,OAAAA,GAAAA;AACvD,IAAA,MAAM5G,aAAAA,GAAgB;AACpB4G,QAAAA,OAAAA;AACA,QAAA,GAAGL,mBAAmBC,QAAAA;AACxB,KAAA;AAEA,IAAA,IAAI,QAAQxG,aAAAA,EAAe;AACzBA,QAAAA,aAAAA,CAAc0D,EAAE,GAAGxD,CAAAA,CAAEI,SAAS,CAC5B,CAAC0B,KAAAA,GAAAA;YACC,IAAI9B,CAAAA,CAAE2G,aAAa,CAAC7E,KAAAA,CAAAA,EAAQ;AAC1BA,gBAAAA,KAAAA,CAAM4E,OAAO,GAAGA,OAAAA;AAClB,YAAA;YAEA,OAAO5E,KAAAA;AACT,QAAA,CAAA,EACAhC,cAAc0D,EAAE,CAAA;AAEpB,IAAA;IAEA,OAAO1D,aAAAA;AACT,CAAA;AAEA,MAAM8G,aAAAA,GAAgB,OAAOhG,OAAAA,EAAgB0F,QAAAA,EAA+B7F,GAAAA,GAAAA;AAC1E,IAAA,MAAM,EAAEM,EAAE,EAAEsB,GAAG,EAAErB,EAAE,EAAE,GAAGP,GAAAA;AACxB,IAAA,MAAMoG,IAAAA,GAAO9F,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAACjC,GAAAA,CAAAA;IAE7B,IAAIrC,CAAAA,CAAEC,OAAO,CAACW,OAAAA,CAAAA,EAAU;QACtB,OAAOA,OAAAA;AACT,IAAA;AAEA,IAAA,MAAMkG,oBAAoB,OAAOnG,aAAAA,GAAAA;AAC/B,QAAA,MAAMD,SAAAA,GAAYmG,IAAAA,CAAKtC,UAAU,CAAC5D,aAAAA,CAAc;QAEhD,IAAID,SAAAA,CAAU8D,IAAI,KAAK,UAAA,EAAY;AACjC,YAAA,MAAM,IAAIuC,KAAAA,CAAM,CAAC,2BAA2B,EAAEpG,aAAAA,CAAAA,CAAe,CAAA;AAC/D,QAAA;QAEA,MAAMb,aAAAA,GAAgB2G,iBAAiBH,QAAQ,CAAC3F,cAAc,EAAEK,EAAAA,CAAGgG,KAAK,CAACN,OAAO,CAAA;AAEhF,QAAA,MAAM5F,OAAAA,GAAU,OAAA,IAAWhB,aAAAA,IAAiBA,aAAAA,CAAcoD,KAAK,KAAK,IAAA;AAEpE,QAAA,OAAQxC,UAAU+D,QAAQ;YACxB,KAAK,UAAA;YACL,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAM5D,aAAaE,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAAC5D,UAAUwD,MAAM,CAAA;AACnD,oBAAA,MAAM1D,KAAAA,GAAQ;AAAEE,wBAAAA,SAAAA;AAAWC,wBAAAA,aAAAA;AAAeC,wBAAAA,OAAAA;AAASd,wBAAAA,aAAAA;AAAee,wBAAAA,UAAAA;AAAYC,wBAAAA;AAAQ,qBAAA;AACtF,oBAAA,MAAMP,OAAOC,KAAAA,EAAOC,GAAAA,CAAAA;AACpB,oBAAA;AACF,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMI,aAAaE,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAAC5D,UAAUwD,MAAM,CAAA;AACnD,oBAAA,MAAM1D,KAAAA,GAAQ;AAAEE,wBAAAA,SAAAA;AAAWC,wBAAAA,aAAAA;AAAeC,wBAAAA,OAAAA;AAASd,wBAAAA,aAAAA;AAAee,wBAAAA,UAAAA;AAAYC,wBAAAA;AAAQ,qBAAA;AACtF,oBAAA,MAAMgD,UAAUtD,KAAAA,EAAOC,GAAAA,CAAAA;AACvB,oBAAA;AACF,gBAAA;YACA,KAAK,YAAA;AAAc,gBAAA;AACjB,oBAAA,MAAMI,aAAaE,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAAC5D,UAAUwD,MAAM,CAAA;AACnD,oBAAA,MAAM1D,KAAAA,GAAQ;AAAEE,wBAAAA,SAAAA;AAAWC,wBAAAA,aAAAA;AAAeC,wBAAAA,OAAAA;AAASd,wBAAAA,aAAAA;AAAee,wBAAAA,UAAAA;AAAYC,wBAAAA;AAAQ,qBAAA;AACtF,oBAAA,MAAMiD,WAAWvD,KAAAA,EAAOC,GAAAA,CAAAA;AACxB,oBAAA;AACF,gBAAA;YACA,KAAK,UAAA;YACL,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMI,aAAaE,EAAAA,CAAGsD,QAAQ,CAACC,GAAG,CAAC5D,UAAUwD,MAAM,CAAA;AACnD,oBAAA,MAAM1D,KAAAA,GAAQ;AAAEE,wBAAAA,SAAAA;AAAWC,wBAAAA,aAAAA;AAAeC,wBAAAA,OAAAA;AAASd,wBAAAA,aAAAA;AAAee,wBAAAA,UAAoB,CAAA;AACtF,oBAAA,MAAMoD,OAAOzD,KAAAA,EAAOC,GAAAA,CAAAA;AACpB,oBAAA;AACF,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMD,KAAAA,GAAQ;AAAEE,wBAAAA,SAAAA;AAAWC,wBAAAA,aAAAA;AAAeC,wBAAAA,OAAAA;AAASd,wBAAAA,aAAuB,CAAA;AAC1E,oBAAA,MAAMkF,YAAYxE,KAAAA,EAAOC,GAAAA,CAAAA;AACzB,oBAAA;AACF,gBAAA;YACA,KAAK,YAAA;AAAc,gBAAA;AACjB,oBAAA,MAAMD,KAAAA,GAAQ;AAAEE,wBAAAA,SAAAA;AAAWC,wBAAAA,aAAAA;AAAeC,wBAAAA,OAAAA;AAASd,wBAAAA,aAAuB,CAAA;AAC1E,oBAAA,MAAMsG,WAAW5F,KAAAA,EAAOC,GAAAA,CAAAA;AACxB,oBAAA;AACF,gBAAA;AAIF;AACF,IAAA,CAAA;IAEA,MAAMoF,OAAAA,CAAQC,GAAG,CAACX,MAAAA,CAAOC,IAAI,CAACkB,QAAAA,CAAAA,CAAU3E,GAAG,CAACmF,iBAAAA,CAAAA,CAAAA;AAC9C;;;;"}
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 joinRowsRaw = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const allowedTypes =\n 'on' in populateValue && populateValue.on ? new Set(Object.keys(populateValue.on)) : null;\n\n const joinRows = allowedTypes\n ? joinRowsRaw.filter((row) => allowedTypes.has(row[typeColumn.name] as string))\n : joinRowsRaw;\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","joinRowsRaw","allowedTypes","Set","Object","keys","joinRows","has","joinMap","idsByType","acc","idValue","typeValue","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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"}
@@ -367,20 +367,17 @@ const morphToMany = async (input, ctx)=>{
367
367
  // fetch join table to create the ids map then do the same as morphToOne without the first
368
368
  const referencedValues = _.uniq(results.map((r)=>r[joinColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
369
369
  const qb = db.entityManager.createQueryBuilder(joinTable.name);
370
- const joinRows = await qb.where({
370
+ const joinRowsRaw = await qb.where({
371
371
  [joinColumn.name]: referencedValues,
372
- ...joinTable.on || {},
373
- // If the populateValue contains an "on" property,
374
- // only populate the types defined in it
375
- ...'on' in populateValue ? {
376
- [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {})
377
- } : {}
372
+ ...joinTable.on || {}
378
373
  }).orderBy([
379
374
  joinColumn.name,
380
375
  'order'
381
376
  ]).execute({
382
377
  mapResults: false
383
378
  });
379
+ const allowedTypes = 'on' in populateValue && populateValue.on ? new Set(Object.keys(populateValue.on)) : null;
380
+ const joinRows = allowedTypes ? joinRowsRaw.filter((row)=>allowedTypes.has(row[typeColumn.name])) : joinRowsRaw;
384
381
  const joinMap = _.groupBy(joinColumn.name, joinRows);
385
382
  const idsByType = joinRows.reduce((acc, result)=>{
386
383
  const idValue = result[morphColumn.idColumn.name];