@dyrected/core 2.10.1 → 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/{app-config-BLC7WoyL.d.cts → app-config-C6hYM8WO.d.cts} +69 -4
- package/dist/{app-config-BLC7WoyL.d.ts → app-config-C6hYM8WO.d.ts} +69 -4
- package/dist/{chunk-H7DVVW2P.js → chunk-VOE2LOLF.js} +20 -0
- package/dist/index.cjs +133 -63
- package/dist/index.d.cts +103 -45
- package/dist/index.d.ts +103 -45
- package/dist/index.js +108 -59
- package/dist/server.cjs +416 -7
- package/dist/server.d.cts +14 -2
- package/dist/server.d.ts +14 -2
- package/dist/server.js +378 -8
- package/dist/{where-sanitizer-47QPJQ6O.js → where-sanitizer-CAAIYSSK.js} +20 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -101,7 +101,7 @@ import {
|
|
|
101
101
|
validatePreviewUrlExpression,
|
|
102
102
|
wordCount,
|
|
103
103
|
workflowCapabilities
|
|
104
|
-
} from "./chunk-
|
|
104
|
+
} from "./chunk-VOE2LOLF.js";
|
|
105
105
|
import "./chunk-JSBRDJBE.js";
|
|
106
106
|
|
|
107
107
|
// src/types/workflows.ts
|
|
@@ -384,8 +384,8 @@ function buildSqlOrderBy(sort, existingColumns, numericFields, dialect) {
|
|
|
384
384
|
return `${dialect.quoteIdent(field)} ${direction}`;
|
|
385
385
|
}
|
|
386
386
|
const extracted = dialect.jsonExtract(field);
|
|
387
|
-
const
|
|
388
|
-
return `${
|
|
387
|
+
const expr2 = numericFields.has(field) ? dialect.castNumeric(extracted) : extracted;
|
|
388
|
+
return `${expr2} ${direction}`;
|
|
389
389
|
}).join(", ");
|
|
390
390
|
}
|
|
391
391
|
|
|
@@ -424,12 +424,12 @@ var MatchBuilder = class {
|
|
|
424
424
|
*/
|
|
425
425
|
otherwise(fallback = "null") {
|
|
426
426
|
if (this.branches.length === 0) return formatJexlValue(fallback);
|
|
427
|
-
let
|
|
427
|
+
let expr2 = formatJexlValue(fallback);
|
|
428
428
|
for (let i = this.branches.length - 1; i >= 0; i--) {
|
|
429
429
|
const b = this.branches[i];
|
|
430
|
-
|
|
430
|
+
expr2 = `${b.condition} ? ${formatJexlValue(b.value)} : ${expr2}`;
|
|
431
431
|
}
|
|
432
|
-
return
|
|
432
|
+
return expr2;
|
|
433
433
|
}
|
|
434
434
|
};
|
|
435
435
|
var FieldConditionBuilder = class {
|
|
@@ -487,6 +487,12 @@ var FieldConditionBuilder = class {
|
|
|
487
487
|
isEmpty() {
|
|
488
488
|
return `${this.field} == null || ${this.field} == ''`;
|
|
489
489
|
}
|
|
490
|
+
/**
|
|
491
|
+
* Alias for `isEmpty()`.
|
|
492
|
+
*/
|
|
493
|
+
empty() {
|
|
494
|
+
return this.isEmpty();
|
|
495
|
+
}
|
|
490
496
|
/**
|
|
491
497
|
* Numerical greater than (`field > num`).
|
|
492
498
|
*/
|
|
@@ -547,20 +553,44 @@ var FieldConditionBuilder = class {
|
|
|
547
553
|
hasLengthAtLeast(length2) {
|
|
548
554
|
return `length(${this.field}) >= ${length2}`;
|
|
549
555
|
}
|
|
556
|
+
/**
|
|
557
|
+
* Generates a JEXL `slugify(field)` transform expression.
|
|
558
|
+
*/
|
|
559
|
+
slugify() {
|
|
560
|
+
return `slugify(${this.field})`;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Generates a JEXL `lower(field)` transform expression.
|
|
564
|
+
*/
|
|
565
|
+
lower() {
|
|
566
|
+
return `lower(${this.field})`;
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Generates a JEXL `upper(field)` transform expression.
|
|
570
|
+
*/
|
|
571
|
+
upper() {
|
|
572
|
+
return `upper(${this.field})`;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Generates a JEXL `trim(field)` transform expression.
|
|
576
|
+
*/
|
|
577
|
+
trim() {
|
|
578
|
+
return `trim(${this.field})`;
|
|
579
|
+
}
|
|
550
580
|
};
|
|
551
|
-
function
|
|
552
|
-
const
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
581
|
+
function createExpr() {
|
|
582
|
+
const exprFn = ((fieldName) => new FieldConditionBuilder(fieldName));
|
|
583
|
+
exprFn.user = (userProp) => new FieldConditionBuilder(`user.${userProp}`);
|
|
584
|
+
exprFn.sibling = (siblingProp) => new FieldConditionBuilder(`siblingData.${siblingProp}`);
|
|
585
|
+
exprFn.concat = (...parts) => {
|
|
556
586
|
if (parts.length === 0) return "''";
|
|
557
587
|
return parts.map((p) => formatJexlValue(p)).join(" + ");
|
|
558
588
|
};
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
589
|
+
exprFn.slugify = (field) => `slugify(${field})`;
|
|
590
|
+
exprFn.lower = (field) => `lower(${field})`;
|
|
591
|
+
exprFn.upper = (field) => `upper(${field})`;
|
|
592
|
+
exprFn.trim = (field) => `trim(${field})`;
|
|
593
|
+
exprFn.access = {
|
|
564
594
|
isOwner: (ownerField = "author") => {
|
|
565
595
|
return `${ownerField} == user.id || ${ownerField}.id == user.id`;
|
|
566
596
|
},
|
|
@@ -568,17 +598,18 @@ function createWhen() {
|
|
|
568
598
|
return "user.role == 'admin' || (user.roles != null && 'admin' in user.roles)";
|
|
569
599
|
},
|
|
570
600
|
hasRole: (...roles) => {
|
|
571
|
-
return
|
|
601
|
+
return exprFn.userRole(...roles);
|
|
572
602
|
},
|
|
573
603
|
isPublishedOrAdmin: (statusField = "status") => {
|
|
574
604
|
return `${statusField} == 'published' || user.role == 'admin' || (user.roles != null && 'admin' in user.roles)`;
|
|
575
605
|
}
|
|
576
606
|
};
|
|
577
|
-
|
|
607
|
+
exprFn.ifElse = (condition, ifTrue, ifFalse = "null") => {
|
|
578
608
|
return `${condition} ? ${formatJexlValue(ifTrue)} : ${formatJexlValue(ifFalse)}`;
|
|
579
609
|
};
|
|
580
|
-
|
|
581
|
-
|
|
610
|
+
exprFn.then = exprFn.ifElse;
|
|
611
|
+
exprFn.match = () => new MatchBuilder();
|
|
612
|
+
exprFn.cases = (...branches) => {
|
|
582
613
|
const builder = new MatchBuilder();
|
|
583
614
|
let fallback = "null";
|
|
584
615
|
for (const b of branches) {
|
|
@@ -590,114 +621,130 @@ function createWhen() {
|
|
|
590
621
|
}
|
|
591
622
|
return builder.otherwise(fallback);
|
|
592
623
|
};
|
|
593
|
-
|
|
624
|
+
exprFn.all = (...conditions) => {
|
|
594
625
|
const valid = conditions.filter(Boolean);
|
|
595
626
|
if (valid.length === 0) return "true";
|
|
596
627
|
if (valid.length === 1) return valid[0];
|
|
597
628
|
return valid.map((c) => c.includes(" ") ? `(${c})` : c).join(" && ");
|
|
598
629
|
};
|
|
599
|
-
|
|
600
|
-
|
|
630
|
+
exprFn.and = exprFn.all;
|
|
631
|
+
exprFn.any = (...conditions) => {
|
|
601
632
|
const valid = conditions.filter(Boolean);
|
|
602
633
|
if (valid.length === 0) return "true";
|
|
603
634
|
if (valid.length === 1) return valid[0];
|
|
604
635
|
return valid.map((c) => c.includes(" ") ? `(${c})` : c).join(" || ");
|
|
605
636
|
};
|
|
606
|
-
|
|
607
|
-
|
|
637
|
+
exprFn.or = exprFn.any;
|
|
638
|
+
exprFn.not = (condition) => {
|
|
608
639
|
if (!condition) return "false";
|
|
609
640
|
return `!(${condition})`;
|
|
610
641
|
};
|
|
611
|
-
|
|
642
|
+
exprFn.variant = (...variants) => {
|
|
612
643
|
const flat = variants.flat();
|
|
613
644
|
if (flat.length === 0) return "true";
|
|
614
645
|
if (flat.length === 1) return `variant == '${flat[0]}'`;
|
|
615
646
|
return `variant in [${flat.map((v) => `'${v}'`).join(", ")}]`;
|
|
616
647
|
};
|
|
617
|
-
|
|
648
|
+
exprFn.notVariant = (...variants) => {
|
|
618
649
|
const flat = variants.flat();
|
|
619
650
|
if (flat.length === 0) return "false";
|
|
620
651
|
if (flat.length === 1) return `variant != '${flat[0]}'`;
|
|
621
652
|
return `!(variant in [${flat.map((v) => `'${v}'`).join(", ")}])`;
|
|
622
653
|
};
|
|
623
|
-
|
|
654
|
+
exprFn.block = (...blocks) => {
|
|
624
655
|
const flat = blocks.flat();
|
|
625
656
|
if (flat.length === 0) return "true";
|
|
626
657
|
if (flat.length === 1) return `block == '${flat[0]}'`;
|
|
627
658
|
return `block in [${flat.map((b) => `'${b}'`).join(", ")}]`;
|
|
628
659
|
};
|
|
629
|
-
|
|
660
|
+
exprFn.notBlock = (...blocks) => {
|
|
630
661
|
const flat = blocks.flat();
|
|
631
662
|
if (flat.length === 0) return "false";
|
|
632
663
|
if (flat.length === 1) return `block != '${flat[0]}'`;
|
|
633
664
|
return `!(block in [${flat.map((b) => `'${b}'`).join(", ")}])`;
|
|
634
665
|
};
|
|
635
|
-
|
|
666
|
+
exprFn.equals = (field, value) => {
|
|
636
667
|
return `${field} == ${JSON.stringify(value)}`;
|
|
637
668
|
};
|
|
638
|
-
|
|
669
|
+
exprFn.fieldEquals = exprFn.equals;
|
|
670
|
+
exprFn.notEquals = (field, value) => {
|
|
639
671
|
return `${field} != ${JSON.stringify(value)}`;
|
|
640
672
|
};
|
|
641
|
-
|
|
673
|
+
exprFn.fieldNotEquals = exprFn.notEquals;
|
|
674
|
+
exprFn.in = (field, ...values) => {
|
|
642
675
|
const flat = values.flat();
|
|
643
676
|
return `${field} in [${flat.map((v) => JSON.stringify(v)).join(", ")}]`;
|
|
644
677
|
};
|
|
645
|
-
|
|
678
|
+
exprFn.fieldIn = exprFn.in;
|
|
679
|
+
exprFn.notIn = (field, ...values) => {
|
|
646
680
|
const flat = values.flat();
|
|
647
681
|
return `!(${field} in [${flat.map((v) => JSON.stringify(v)).join(", ")}])`;
|
|
648
682
|
};
|
|
649
|
-
|
|
683
|
+
exprFn.fieldNotIn = exprFn.notIn;
|
|
684
|
+
exprFn.notEmpty = (field) => {
|
|
650
685
|
return `${field} != null && ${field} != ''`;
|
|
651
686
|
};
|
|
652
|
-
|
|
687
|
+
exprFn.fieldNotEmpty = exprFn.notEmpty;
|
|
688
|
+
exprFn.empty = (field) => {
|
|
653
689
|
return `${field} == null || ${field} == ''`;
|
|
654
690
|
};
|
|
655
|
-
|
|
691
|
+
exprFn.fieldEmpty = exprFn.empty;
|
|
692
|
+
exprFn.isTrue = (field) => {
|
|
656
693
|
return `${field} == true`;
|
|
657
694
|
};
|
|
658
|
-
|
|
695
|
+
exprFn.fieldIsTrue = exprFn.isTrue;
|
|
696
|
+
exprFn.isFalse = (field) => {
|
|
659
697
|
return `${field} != true`;
|
|
660
698
|
};
|
|
661
|
-
|
|
699
|
+
exprFn.fieldIsFalse = exprFn.isFalse;
|
|
700
|
+
exprFn.greaterThan = (field, value) => {
|
|
662
701
|
return `${field} > ${value}`;
|
|
663
702
|
};
|
|
664
|
-
|
|
703
|
+
exprFn.fieldGreaterThan = exprFn.greaterThan;
|
|
704
|
+
exprFn.greaterThanOrEqual = (field, value) => {
|
|
665
705
|
return `${field} >= ${value}`;
|
|
666
706
|
};
|
|
667
|
-
|
|
707
|
+
exprFn.fieldGreaterThanOrEqual = exprFn.greaterThanOrEqual;
|
|
708
|
+
exprFn.lessThan = (field, value) => {
|
|
668
709
|
return `${field} < ${value}`;
|
|
669
710
|
};
|
|
670
|
-
|
|
711
|
+
exprFn.fieldLessThan = exprFn.lessThan;
|
|
712
|
+
exprFn.lessThanOrEqual = (field, value) => {
|
|
671
713
|
return `${field} <= ${value}`;
|
|
672
714
|
};
|
|
673
|
-
|
|
715
|
+
exprFn.fieldLessThanOrEqual = exprFn.lessThanOrEqual;
|
|
716
|
+
exprFn.between = (field, min2, max2) => {
|
|
674
717
|
return `${field} >= ${min2} && ${field} <= ${max2}`;
|
|
675
718
|
};
|
|
676
|
-
|
|
719
|
+
exprFn.fieldBetween = exprFn.between;
|
|
720
|
+
exprFn.startsWith = (field, prefix) => {
|
|
677
721
|
return `startsWith(${field}, ${JSON.stringify(prefix)})`;
|
|
678
722
|
};
|
|
679
|
-
|
|
723
|
+
exprFn.fieldStartsWith = exprFn.startsWith;
|
|
724
|
+
exprFn.endsWith = (field, suffix) => {
|
|
680
725
|
return `endsWith(${field}, ${JSON.stringify(suffix)})`;
|
|
681
726
|
};
|
|
682
|
-
|
|
727
|
+
exprFn.fieldEndsWith = exprFn.endsWith;
|
|
728
|
+
exprFn.contains = (field, item) => {
|
|
683
729
|
return `includes(${field}, ${JSON.stringify(item)})`;
|
|
684
730
|
};
|
|
685
|
-
|
|
731
|
+
exprFn.fieldContains = exprFn.contains;
|
|
732
|
+
exprFn.arrayNotEmpty = (field) => {
|
|
686
733
|
return `length(${field}) > 0`;
|
|
687
734
|
};
|
|
688
|
-
|
|
735
|
+
exprFn.arrayEmpty = (field) => {
|
|
689
736
|
return `length(${field}) == 0`;
|
|
690
737
|
};
|
|
691
|
-
|
|
738
|
+
exprFn.arrayCountGreaterThan = (field, count2) => {
|
|
692
739
|
return `length(${field}) > ${count2}`;
|
|
693
740
|
};
|
|
694
|
-
|
|
741
|
+
exprFn.arrayCountAtLeast = (field, count2) => {
|
|
695
742
|
return `length(${field}) >= ${count2}`;
|
|
696
743
|
};
|
|
697
|
-
|
|
744
|
+
exprFn.arrayCountLessThan = (field, count2) => {
|
|
698
745
|
return `length(${field}) < ${count2}`;
|
|
699
746
|
};
|
|
700
|
-
|
|
747
|
+
exprFn.userRole = (...roles) => {
|
|
701
748
|
const flat = roles.flat();
|
|
702
749
|
if (flat.length === 1) {
|
|
703
750
|
return `user.role == '${flat[0]}' || (user.roles != null && '${flat[0]}' in user.roles)`;
|
|
@@ -705,29 +752,30 @@ function createWhen() {
|
|
|
705
752
|
const roleArray = `[${flat.map((r) => `'${r}'`).join(", ")}]`;
|
|
706
753
|
return `user.role in ${roleArray} || (user.roles != null && includes(${roleArray}, user.role))`;
|
|
707
754
|
};
|
|
708
|
-
|
|
755
|
+
exprFn.userEmailDomain = (domain) => {
|
|
709
756
|
const clean = domain.startsWith("@") ? domain : `@${domain}`;
|
|
710
757
|
return `endsWith(user.email, '${clean}')`;
|
|
711
758
|
};
|
|
712
|
-
|
|
759
|
+
exprFn.userAttributeEquals = (attr, value) => {
|
|
713
760
|
return `user.${attr} == ${JSON.stringify(value)}`;
|
|
714
761
|
};
|
|
715
|
-
|
|
762
|
+
exprFn.isNewDocument = () => {
|
|
716
763
|
return "id == null";
|
|
717
764
|
};
|
|
718
|
-
|
|
765
|
+
exprFn.isExistingDocument = () => {
|
|
719
766
|
return "id != null";
|
|
720
767
|
};
|
|
721
|
-
|
|
768
|
+
exprFn.statusEquals = (status) => {
|
|
722
769
|
return `status == '${status}'`;
|
|
723
770
|
};
|
|
724
|
-
|
|
771
|
+
exprFn.statusIn = (...statuses) => {
|
|
725
772
|
const flat = statuses.flat();
|
|
726
773
|
return `status in [${flat.map((s) => `'${s}'`).join(", ")}]`;
|
|
727
774
|
};
|
|
728
|
-
return
|
|
775
|
+
return exprFn;
|
|
729
776
|
}
|
|
730
|
-
var
|
|
777
|
+
var expr = createExpr();
|
|
778
|
+
var when = expr;
|
|
731
779
|
|
|
732
780
|
// src/index.ts
|
|
733
781
|
function defineCollection(config) {
|
|
@@ -860,6 +908,7 @@ export {
|
|
|
860
908
|
evaluateJexlSync,
|
|
861
909
|
executeFieldAfterRead,
|
|
862
910
|
executeFieldBeforeChange,
|
|
911
|
+
expr,
|
|
863
912
|
first,
|
|
864
913
|
floor,
|
|
865
914
|
formatConfigDiagnostics,
|