@dyrected/core 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -911,7 +911,7 @@ var require_Evaluator = __commonJS({
911
911
  */
912
912
  }, {
913
913
  key: "_filterRelative",
914
- value: function _filterRelative(subject, expr) {
914
+ value: function _filterRelative(subject, expr2) {
915
915
  var _this4 = this;
916
916
  var promises = [];
917
917
  if (!Array.isArray(subject)) {
@@ -919,7 +919,7 @@ var require_Evaluator = __commonJS({
919
919
  }
920
920
  subject.forEach(function(elem) {
921
921
  var evalInst = new Evaluator2(_this4._grammar, _this4._context, elem, _this4.Promise);
922
- promises.push(evalInst.eval(expr));
922
+ promises.push(evalInst.eval(expr2));
923
923
  });
924
924
  return this.Promise.all(promises).then(function(values) {
925
925
  var results = [];
@@ -948,8 +948,8 @@ var require_Evaluator = __commonJS({
948
948
  */
949
949
  }, {
950
950
  key: "_filterStatic",
951
- value: function _filterStatic(subject, expr) {
952
- return this.eval(expr).then(function(res) {
951
+ value: function _filterStatic(subject, expr2) {
952
+ return this.eval(expr2).then(function(res) {
953
953
  if (typeof res === "boolean") {
954
954
  return res ? subject : void 0;
955
955
  }
@@ -2253,7 +2253,7 @@ var require_Jexl = __commonJS({
2253
2253
  */
2254
2254
  }, {
2255
2255
  key: "expr",
2256
- value: function expr(strs) {
2256
+ value: function expr2(strs) {
2257
2257
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
2258
2258
  args[_key - 1] = arguments[_key];
2259
2259
  }
@@ -2381,6 +2381,7 @@ __export(index_exports, {
2381
2381
  evaluateJexlSync: () => evaluateJexlSync,
2382
2382
  executeFieldAfterRead: () => executeFieldAfterRead,
2383
2383
  executeFieldBeforeChange: () => executeFieldBeforeChange,
2384
+ expr: () => expr,
2384
2385
  first: () => first,
2385
2386
  floor: () => floor,
2386
2387
  formatConfigDiagnostics: () => formatConfigDiagnostics,
@@ -3977,6 +3978,21 @@ var SYSTEM_FIELDS = [
3977
3978
  admin: { readOnly: true, hidden: true }
3978
3979
  }
3979
3980
  ];
3981
+ var MEDIA_SYSTEM_FIELDS = [
3982
+ { name: "folderId", type: "text", label: "Folder", admin: { hidden: true } },
3983
+ { name: "filename", type: "text", label: "Filename", required: true },
3984
+ { name: "originalFilename", type: "text", label: "Original Filename", admin: { hidden: true } },
3985
+ { name: "mimeType", type: "text", label: "MIME Type", admin: { hidden: true } },
3986
+ { name: "filesize", type: "number", label: "File Size", admin: { hidden: true } },
3987
+ { name: "url", type: "text", label: "URL", admin: { hidden: true } },
3988
+ { name: "width", type: "number", label: "Width", admin: { hidden: true } },
3989
+ { name: "height", type: "number", label: "Height", admin: { hidden: true } },
3990
+ { name: "aspectRatio", type: "number", label: "Aspect Ratio", admin: { hidden: true } },
3991
+ { name: "blurhash", type: "text", label: "Blurhash", admin: { hidden: true } },
3992
+ { name: "focalPoint", type: "json", label: "Focal Point", admin: { hidden: true } },
3993
+ { name: "alt", type: "text", label: "Alt Text" },
3994
+ { name: "caption", type: "text", label: "Caption" }
3995
+ ];
3980
3996
  var AUDIT_COLLECTION = {
3981
3997
  slug: AUDIT_COLLECTION_SLUG,
3982
3998
  labels: { singular: "Audit Log", plural: "Audit Logs" },
@@ -4248,6 +4264,11 @@ function normalizeConfig(config) {
4248
4264
  }
4249
4265
  }
4250
4266
  }
4267
+ if (col.upload || col.slug === "media") {
4268
+ const currentNames = new Set(fields.map((f) => f.name));
4269
+ const mediaFieldsToInject = MEDIA_SYSTEM_FIELDS.filter((f) => !currentNames.has(f.name));
4270
+ fields = [...fields, ...mediaFieldsToInject];
4271
+ }
4251
4272
  const updatedFieldNames = new Set(fields.map((f) => f.name));
4252
4273
  const fieldsToInject = SYSTEM_FIELDS.filter((f) => !updatedFieldNames.has(f.name));
4253
4274
  const workflow = col.workflow || (col.drafts ? simplePublishingWorkflow() : void 0);
@@ -4540,8 +4561,8 @@ function buildSqlOrderBy(sort, existingColumns, numericFields, dialect) {
4540
4561
  return `${dialect.quoteIdent(field)} ${direction}`;
4541
4562
  }
4542
4563
  const extracted = dialect.jsonExtract(field);
4543
- const expr = numericFields.has(field) ? dialect.castNumeric(extracted) : extracted;
4544
- return `${expr} ${direction}`;
4564
+ const expr2 = numericFields.has(field) ? dialect.castNumeric(extracted) : extracted;
4565
+ return `${expr2} ${direction}`;
4545
4566
  }).join(", ");
4546
4567
  }
4547
4568
 
@@ -6122,12 +6143,12 @@ var MatchBuilder = class {
6122
6143
  */
6123
6144
  otherwise(fallback = "null") {
6124
6145
  if (this.branches.length === 0) return formatJexlValue(fallback);
6125
- let expr = formatJexlValue(fallback);
6146
+ let expr2 = formatJexlValue(fallback);
6126
6147
  for (let i = this.branches.length - 1; i >= 0; i--) {
6127
6148
  const b = this.branches[i];
6128
- expr = `${b.condition} ? ${formatJexlValue(b.value)} : ${expr}`;
6149
+ expr2 = `${b.condition} ? ${formatJexlValue(b.value)} : ${expr2}`;
6129
6150
  }
6130
- return expr;
6151
+ return expr2;
6131
6152
  }
6132
6153
  };
6133
6154
  var FieldConditionBuilder = class {
@@ -6185,6 +6206,12 @@ var FieldConditionBuilder = class {
6185
6206
  isEmpty() {
6186
6207
  return `${this.field} == null || ${this.field} == ''`;
6187
6208
  }
6209
+ /**
6210
+ * Alias for `isEmpty()`.
6211
+ */
6212
+ empty() {
6213
+ return this.isEmpty();
6214
+ }
6188
6215
  /**
6189
6216
  * Numerical greater than (`field > num`).
6190
6217
  */
@@ -6245,20 +6272,44 @@ var FieldConditionBuilder = class {
6245
6272
  hasLengthAtLeast(length2) {
6246
6273
  return `length(${this.field}) >= ${length2}`;
6247
6274
  }
6275
+ /**
6276
+ * Generates a JEXL `slugify(field)` transform expression.
6277
+ */
6278
+ slugify() {
6279
+ return `slugify(${this.field})`;
6280
+ }
6281
+ /**
6282
+ * Generates a JEXL `lower(field)` transform expression.
6283
+ */
6284
+ lower() {
6285
+ return `lower(${this.field})`;
6286
+ }
6287
+ /**
6288
+ * Generates a JEXL `upper(field)` transform expression.
6289
+ */
6290
+ upper() {
6291
+ return `upper(${this.field})`;
6292
+ }
6293
+ /**
6294
+ * Generates a JEXL `trim(field)` transform expression.
6295
+ */
6296
+ trim() {
6297
+ return `trim(${this.field})`;
6298
+ }
6248
6299
  };
6249
- function createWhen() {
6250
- const whenFn = ((fieldName) => new FieldConditionBuilder(fieldName));
6251
- whenFn.user = (userProp) => new FieldConditionBuilder(`user.${userProp}`);
6252
- whenFn.sibling = (siblingProp) => new FieldConditionBuilder(`siblingData.${siblingProp}`);
6253
- whenFn.concat = (...parts) => {
6300
+ function createExpr() {
6301
+ const exprFn = ((fieldName) => new FieldConditionBuilder(fieldName));
6302
+ exprFn.user = (userProp) => new FieldConditionBuilder(`user.${userProp}`);
6303
+ exprFn.sibling = (siblingProp) => new FieldConditionBuilder(`siblingData.${siblingProp}`);
6304
+ exprFn.concat = (...parts) => {
6254
6305
  if (parts.length === 0) return "''";
6255
6306
  return parts.map((p) => formatJexlValue(p)).join(" + ");
6256
6307
  };
6257
- whenFn.slugify = (field) => `slugify(${field})`;
6258
- whenFn.lower = (field) => `lower(${field})`;
6259
- whenFn.upper = (field) => `upper(${field})`;
6260
- whenFn.trim = (field) => `trim(${field})`;
6261
- whenFn.access = {
6308
+ exprFn.slugify = (field) => `slugify(${field})`;
6309
+ exprFn.lower = (field) => `lower(${field})`;
6310
+ exprFn.upper = (field) => `upper(${field})`;
6311
+ exprFn.trim = (field) => `trim(${field})`;
6312
+ exprFn.access = {
6262
6313
  isOwner: (ownerField = "author") => {
6263
6314
  return `${ownerField} == user.id || ${ownerField}.id == user.id`;
6264
6315
  },
@@ -6266,17 +6317,18 @@ function createWhen() {
6266
6317
  return "user.role == 'admin' || (user.roles != null && 'admin' in user.roles)";
6267
6318
  },
6268
6319
  hasRole: (...roles) => {
6269
- return whenFn.userRole(...roles);
6320
+ return exprFn.userRole(...roles);
6270
6321
  },
6271
6322
  isPublishedOrAdmin: (statusField = "status") => {
6272
6323
  return `${statusField} == 'published' || user.role == 'admin' || (user.roles != null && 'admin' in user.roles)`;
6273
6324
  }
6274
6325
  };
6275
- whenFn.then = (condition, ifTrue, ifFalse = "null") => {
6326
+ exprFn.ifElse = (condition, ifTrue, ifFalse = "null") => {
6276
6327
  return `${condition} ? ${formatJexlValue(ifTrue)} : ${formatJexlValue(ifFalse)}`;
6277
6328
  };
6278
- whenFn.match = () => new MatchBuilder();
6279
- whenFn.cases = (...branches) => {
6329
+ exprFn.then = exprFn.ifElse;
6330
+ exprFn.match = () => new MatchBuilder();
6331
+ exprFn.cases = (...branches) => {
6280
6332
  const builder = new MatchBuilder();
6281
6333
  let fallback = "null";
6282
6334
  for (const b of branches) {
@@ -6288,114 +6340,130 @@ function createWhen() {
6288
6340
  }
6289
6341
  return builder.otherwise(fallback);
6290
6342
  };
6291
- whenFn.all = (...conditions) => {
6343
+ exprFn.all = (...conditions) => {
6292
6344
  const valid = conditions.filter(Boolean);
6293
6345
  if (valid.length === 0) return "true";
6294
6346
  if (valid.length === 1) return valid[0];
6295
6347
  return valid.map((c) => c.includes(" ") ? `(${c})` : c).join(" && ");
6296
6348
  };
6297
- whenFn.and = whenFn.all;
6298
- whenFn.any = (...conditions) => {
6349
+ exprFn.and = exprFn.all;
6350
+ exprFn.any = (...conditions) => {
6299
6351
  const valid = conditions.filter(Boolean);
6300
6352
  if (valid.length === 0) return "true";
6301
6353
  if (valid.length === 1) return valid[0];
6302
6354
  return valid.map((c) => c.includes(" ") ? `(${c})` : c).join(" || ");
6303
6355
  };
6304
- whenFn.or = whenFn.any;
6305
- whenFn.not = (condition) => {
6356
+ exprFn.or = exprFn.any;
6357
+ exprFn.not = (condition) => {
6306
6358
  if (!condition) return "false";
6307
6359
  return `!(${condition})`;
6308
6360
  };
6309
- whenFn.variant = (...variants) => {
6361
+ exprFn.variant = (...variants) => {
6310
6362
  const flat = variants.flat();
6311
6363
  if (flat.length === 0) return "true";
6312
6364
  if (flat.length === 1) return `variant == '${flat[0]}'`;
6313
6365
  return `variant in [${flat.map((v) => `'${v}'`).join(", ")}]`;
6314
6366
  };
6315
- whenFn.notVariant = (...variants) => {
6367
+ exprFn.notVariant = (...variants) => {
6316
6368
  const flat = variants.flat();
6317
6369
  if (flat.length === 0) return "false";
6318
6370
  if (flat.length === 1) return `variant != '${flat[0]}'`;
6319
6371
  return `!(variant in [${flat.map((v) => `'${v}'`).join(", ")}])`;
6320
6372
  };
6321
- whenFn.block = (...blocks) => {
6373
+ exprFn.block = (...blocks) => {
6322
6374
  const flat = blocks.flat();
6323
6375
  if (flat.length === 0) return "true";
6324
6376
  if (flat.length === 1) return `block == '${flat[0]}'`;
6325
6377
  return `block in [${flat.map((b) => `'${b}'`).join(", ")}]`;
6326
6378
  };
6327
- whenFn.notBlock = (...blocks) => {
6379
+ exprFn.notBlock = (...blocks) => {
6328
6380
  const flat = blocks.flat();
6329
6381
  if (flat.length === 0) return "false";
6330
6382
  if (flat.length === 1) return `block != '${flat[0]}'`;
6331
6383
  return `!(block in [${flat.map((b) => `'${b}'`).join(", ")}])`;
6332
6384
  };
6333
- whenFn.fieldEquals = (field, value) => {
6385
+ exprFn.equals = (field, value) => {
6334
6386
  return `${field} == ${JSON.stringify(value)}`;
6335
6387
  };
6336
- whenFn.fieldNotEquals = (field, value) => {
6388
+ exprFn.fieldEquals = exprFn.equals;
6389
+ exprFn.notEquals = (field, value) => {
6337
6390
  return `${field} != ${JSON.stringify(value)}`;
6338
6391
  };
6339
- whenFn.fieldIn = (field, ...values) => {
6392
+ exprFn.fieldNotEquals = exprFn.notEquals;
6393
+ exprFn.in = (field, ...values) => {
6340
6394
  const flat = values.flat();
6341
6395
  return `${field} in [${flat.map((v) => JSON.stringify(v)).join(", ")}]`;
6342
6396
  };
6343
- whenFn.fieldNotIn = (field, ...values) => {
6397
+ exprFn.fieldIn = exprFn.in;
6398
+ exprFn.notIn = (field, ...values) => {
6344
6399
  const flat = values.flat();
6345
6400
  return `!(${field} in [${flat.map((v) => JSON.stringify(v)).join(", ")}])`;
6346
6401
  };
6347
- whenFn.fieldNotEmpty = (field) => {
6402
+ exprFn.fieldNotIn = exprFn.notIn;
6403
+ exprFn.notEmpty = (field) => {
6348
6404
  return `${field} != null && ${field} != ''`;
6349
6405
  };
6350
- whenFn.fieldEmpty = (field) => {
6406
+ exprFn.fieldNotEmpty = exprFn.notEmpty;
6407
+ exprFn.empty = (field) => {
6351
6408
  return `${field} == null || ${field} == ''`;
6352
6409
  };
6353
- whenFn.fieldIsTrue = (field) => {
6410
+ exprFn.fieldEmpty = exprFn.empty;
6411
+ exprFn.isTrue = (field) => {
6354
6412
  return `${field} == true`;
6355
6413
  };
6356
- whenFn.fieldIsFalse = (field) => {
6414
+ exprFn.fieldIsTrue = exprFn.isTrue;
6415
+ exprFn.isFalse = (field) => {
6357
6416
  return `${field} != true`;
6358
6417
  };
6359
- whenFn.fieldGreaterThan = (field, value) => {
6418
+ exprFn.fieldIsFalse = exprFn.isFalse;
6419
+ exprFn.greaterThan = (field, value) => {
6360
6420
  return `${field} > ${value}`;
6361
6421
  };
6362
- whenFn.fieldGreaterThanOrEqual = (field, value) => {
6422
+ exprFn.fieldGreaterThan = exprFn.greaterThan;
6423
+ exprFn.greaterThanOrEqual = (field, value) => {
6363
6424
  return `${field} >= ${value}`;
6364
6425
  };
6365
- whenFn.fieldLessThan = (field, value) => {
6426
+ exprFn.fieldGreaterThanOrEqual = exprFn.greaterThanOrEqual;
6427
+ exprFn.lessThan = (field, value) => {
6366
6428
  return `${field} < ${value}`;
6367
6429
  };
6368
- whenFn.fieldLessThanOrEqual = (field, value) => {
6430
+ exprFn.fieldLessThan = exprFn.lessThan;
6431
+ exprFn.lessThanOrEqual = (field, value) => {
6369
6432
  return `${field} <= ${value}`;
6370
6433
  };
6371
- whenFn.fieldBetween = (field, min2, max2) => {
6434
+ exprFn.fieldLessThanOrEqual = exprFn.lessThanOrEqual;
6435
+ exprFn.between = (field, min2, max2) => {
6372
6436
  return `${field} >= ${min2} && ${field} <= ${max2}`;
6373
6437
  };
6374
- whenFn.fieldStartsWith = (field, prefix) => {
6438
+ exprFn.fieldBetween = exprFn.between;
6439
+ exprFn.startsWith = (field, prefix) => {
6375
6440
  return `startsWith(${field}, ${JSON.stringify(prefix)})`;
6376
6441
  };
6377
- whenFn.fieldEndsWith = (field, suffix) => {
6442
+ exprFn.fieldStartsWith = exprFn.startsWith;
6443
+ exprFn.endsWith = (field, suffix) => {
6378
6444
  return `endsWith(${field}, ${JSON.stringify(suffix)})`;
6379
6445
  };
6380
- whenFn.fieldContains = (field, item) => {
6446
+ exprFn.fieldEndsWith = exprFn.endsWith;
6447
+ exprFn.contains = (field, item) => {
6381
6448
  return `includes(${field}, ${JSON.stringify(item)})`;
6382
6449
  };
6383
- whenFn.arrayNotEmpty = (field) => {
6450
+ exprFn.fieldContains = exprFn.contains;
6451
+ exprFn.arrayNotEmpty = (field) => {
6384
6452
  return `length(${field}) > 0`;
6385
6453
  };
6386
- whenFn.arrayEmpty = (field) => {
6454
+ exprFn.arrayEmpty = (field) => {
6387
6455
  return `length(${field}) == 0`;
6388
6456
  };
6389
- whenFn.arrayCountGreaterThan = (field, count2) => {
6457
+ exprFn.arrayCountGreaterThan = (field, count2) => {
6390
6458
  return `length(${field}) > ${count2}`;
6391
6459
  };
6392
- whenFn.arrayCountAtLeast = (field, count2) => {
6460
+ exprFn.arrayCountAtLeast = (field, count2) => {
6393
6461
  return `length(${field}) >= ${count2}`;
6394
6462
  };
6395
- whenFn.arrayCountLessThan = (field, count2) => {
6463
+ exprFn.arrayCountLessThan = (field, count2) => {
6396
6464
  return `length(${field}) < ${count2}`;
6397
6465
  };
6398
- whenFn.userRole = (...roles) => {
6466
+ exprFn.userRole = (...roles) => {
6399
6467
  const flat = roles.flat();
6400
6468
  if (flat.length === 1) {
6401
6469
  return `user.role == '${flat[0]}' || (user.roles != null && '${flat[0]}' in user.roles)`;
@@ -6403,29 +6471,30 @@ function createWhen() {
6403
6471
  const roleArray = `[${flat.map((r) => `'${r}'`).join(", ")}]`;
6404
6472
  return `user.role in ${roleArray} || (user.roles != null && includes(${roleArray}, user.role))`;
6405
6473
  };
6406
- whenFn.userEmailDomain = (domain) => {
6474
+ exprFn.userEmailDomain = (domain) => {
6407
6475
  const clean = domain.startsWith("@") ? domain : `@${domain}`;
6408
6476
  return `endsWith(user.email, '${clean}')`;
6409
6477
  };
6410
- whenFn.userAttributeEquals = (attr, value) => {
6478
+ exprFn.userAttributeEquals = (attr, value) => {
6411
6479
  return `user.${attr} == ${JSON.stringify(value)}`;
6412
6480
  };
6413
- whenFn.isNewDocument = () => {
6481
+ exprFn.isNewDocument = () => {
6414
6482
  return "id == null";
6415
6483
  };
6416
- whenFn.isExistingDocument = () => {
6484
+ exprFn.isExistingDocument = () => {
6417
6485
  return "id != null";
6418
6486
  };
6419
- whenFn.statusEquals = (status) => {
6487
+ exprFn.statusEquals = (status) => {
6420
6488
  return `status == '${status}'`;
6421
6489
  };
6422
- whenFn.statusIn = (...statuses) => {
6490
+ exprFn.statusIn = (...statuses) => {
6423
6491
  const flat = statuses.flat();
6424
6492
  return `status in [${flat.map((s) => `'${s}'`).join(", ")}]`;
6425
6493
  };
6426
- return whenFn;
6494
+ return exprFn;
6427
6495
  }
6428
- var when = createWhen();
6496
+ var expr = createExpr();
6497
+ var when = expr;
6429
6498
 
6430
6499
  // src/index.ts
6431
6500
  function defineCollection(config) {
@@ -6559,6 +6628,7 @@ function defineTab(args) {
6559
6628
  evaluateJexlSync,
6560
6629
  executeFieldAfterRead,
6561
6630
  executeFieldBeforeChange,
6631
+ expr,
6562
6632
  first,
6563
6633
  floor,
6564
6634
  formatConfigDiagnostics,