@thisisagile/easy 15.21.1 → 15.22.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.
@@ -26,7 +26,7 @@ var import_types = require("../../types");
26
26
  var import_validator = require("validator");
27
27
  class Slug extends import_types.Value {
28
28
  constructor(slug) {
29
- super((0, import_types.text)(slug).strictKebab.toString());
29
+ super((0, import_types.text)(slug).slug.toString());
30
30
  }
31
31
  get isValid() {
32
32
  return (0, import_types.isNotEmpty)(this.value) && (0, import_validator.isSlug)(this.value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/domain/values/Slug.ts"],"sourcesContent":["import { isNotEmpty, text, Value } from '../../types';\nimport { isSlug } from 'validator';\n\nexport class Slug extends Value {\n constructor(slug?: unknown) {\n super(text(slug).strictKebab.toString());\n }\n\n get isValid(): boolean {\n return isNotEmpty(this.value) && isSlug(this.value);\n }\n}\n\nexport const toSlug = (slug?: unknown): Slug => new Slug(slug);"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAwC;AACxC,uBAAuB;AAEhB,MAAM,aAAa,mBAAM;AAAA,EAC9B,YAAY,MAAgB;AAC1B,cAAM,mBAAK,IAAI,EAAE,YAAY,SAAS,CAAC;AAAA,EACzC;AAAA,EAEA,IAAI,UAAmB;AACrB,eAAO,yBAAW,KAAK,KAAK,SAAK,yBAAO,KAAK,KAAK;AAAA,EACpD;AACF;AAEO,MAAM,SAAS,CAAC,SAAyB,IAAI,KAAK,IAAI;","names":[]}
1
+ {"version":3,"sources":["../../../src/domain/values/Slug.ts"],"sourcesContent":["import { isNotEmpty, text, Value } from '../../types';\nimport { isSlug } from 'validator';\n\nexport class Slug extends Value {\n constructor(slug?: unknown) {\n super(text(slug).slug.toString());\n }\n\n get isValid(): boolean {\n return isNotEmpty(this.value) && isSlug(this.value);\n }\n}\n\nexport const toSlug = (slug?: unknown): Slug => new Slug(slug);"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAwC;AACxC,uBAAuB;AAEhB,MAAM,aAAa,mBAAM;AAAA,EAC9B,YAAY,MAAgB;AAC1B,cAAM,mBAAK,IAAI,EAAE,KAAK,SAAS,CAAC;AAAA,EAClC;AAAA,EAEA,IAAI,UAAmB;AACrB,eAAO,yBAAW,KAAK,KAAK,SAAK,yBAAO,KAAK,KAAK;AAAA,EACpD;AACF;AAEO,MAAM,SAAS,CAAC,SAAyB,IAAI,KAAK,IAAI;","names":[]}
@@ -3,7 +3,7 @@ import { isNotEmpty, text, Value } from "../../types";
3
3
  import { isSlug } from "validator";
4
4
  class Slug extends Value {
5
5
  constructor(slug) {
6
- super(text(slug).strictKebab.toString());
6
+ super(text(slug).slug.toString());
7
7
  }
8
8
  get isValid() {
9
9
  return isNotEmpty(this.value) && isSlug(this.value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/domain/values/Slug.ts"],"sourcesContent":["import { isNotEmpty, text, Value } from '../../types';\nimport { isSlug } from 'validator';\n\nexport class Slug extends Value {\n constructor(slug?: unknown) {\n super(text(slug).strictKebab.toString());\n }\n\n get isValid(): boolean {\n return isNotEmpty(this.value) && isSlug(this.value);\n }\n}\n\nexport const toSlug = (slug?: unknown): Slug => new Slug(slug);"],"mappings":";AAAA,SAAS,YAAY,MAAM,aAAa;AACxC,SAAS,cAAc;AAEhB,MAAM,aAAa,MAAM;AAAA,EAC9B,YAAY,MAAgB;AAC1B,UAAM,KAAK,IAAI,EAAE,YAAY,SAAS,CAAC;AAAA,EACzC;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK;AAAA,EACpD;AACF;AAEO,MAAM,SAAS,CAAC,SAAyB,IAAI,KAAK,IAAI;","names":[]}
1
+ {"version":3,"sources":["../../../src/domain/values/Slug.ts"],"sourcesContent":["import { isNotEmpty, text, Value } from '../../types';\nimport { isSlug } from 'validator';\n\nexport class Slug extends Value {\n constructor(slug?: unknown) {\n super(text(slug).slug.toString());\n }\n\n get isValid(): boolean {\n return isNotEmpty(this.value) && isSlug(this.value);\n }\n}\n\nexport const toSlug = (slug?: unknown): Slug => new Slug(slug);"],"mappings":";AAAA,SAAS,YAAY,MAAM,aAAa;AACxC,SAAS,cAAc;AAEhB,MAAM,aAAa,MAAM;AAAA,EAC9B,YAAY,MAAgB;AAC1B,UAAM,KAAK,IAAI,EAAE,KAAK,SAAS,CAAC;AAAA,EAClC;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK;AAAA,EACpD;AACF;AAEO,MAAM,SAAS,CAAC,SAAyB,IAAI,KAAK,IAAI;","names":[]}
@@ -1,11 +1,10 @@
1
- import { Get } from './Get';
1
+ import { Get, Predicate } from './Get';
2
2
  import { Constructor } from './Constructor';
3
3
  export declare class Parser<T, V> {
4
4
  protected value: T;
5
- protected f: Get<V, T>;
6
- protected alt: Get<V, T>;
7
- readonly valid: boolean;
5
+ protected valid: boolean;
8
6
  if: {
7
+ equals: (pred?: Predicate<T>) => this;
9
8
  empty: <U>(pred?: Get<U, T> | undefined) => this;
10
9
  defined: <U_1>(pred?: Get<U_1, T> | undefined) => this;
11
10
  valid: <U_2>(pred?: Get<U_2, T> | undefined) => this;
@@ -28,7 +27,7 @@ export declare class Parser<T, V> {
28
27
  };
29
28
  };
30
29
  };
31
- constructor(value: T, f: Get<V, T>, alt: Get<V, T>, valid?: boolean);
30
+ constructor(value: T, valid?: boolean);
32
31
  protected evaluate<U>(meta: Get<boolean>, pred?: Get<U, T>): this;
33
32
  protected evaluateNot<U>(meta: Get<boolean>, pred?: Get<U, T>): this;
34
33
  }
@@ -24,15 +24,15 @@ module.exports = __toCommonJS(Parser_exports);
24
24
  var import_Get = require("./Get");
25
25
  var import_Is = require("./Is");
26
26
  var import_validation = require("../validation");
27
+ var import_Constructor = require("./Constructor");
27
28
  var import_Array = require("./Array");
28
29
  class Parser {
29
- constructor(value, f, alt, valid = true) {
30
+ constructor(value, valid = true) {
30
31
  this.value = value;
31
- this.f = f;
32
- this.alt = alt;
33
32
  this.valid = valid;
34
33
  }
35
34
  if = {
35
+ equals: (pred) => this.evaluate(import_Is.isTrue, pred),
36
36
  empty: (pred) => this.evaluate(import_Is.isEmpty, pred),
37
37
  defined: (pred) => this.evaluate(import_Is.isDefined, pred),
38
38
  valid: (pred) => this.evaluate(import_validation.isValid, pred),
@@ -56,20 +56,10 @@ class Parser {
56
56
  }
57
57
  };
58
58
  evaluate(meta, pred) {
59
- return new this.constructor(
60
- this.value,
61
- this.f,
62
- this.alt,
63
- (0, import_Get.ofGet)(meta, pred ? (0, import_Get.ofGet)(pred, this.value) : this.value)
64
- );
59
+ return (0, import_Constructor.on)(this, (t) => t.valid = (0, import_Get.ofGet)(meta, pred ? (0, import_Get.ofGet)(pred, this.value) : this.value));
65
60
  }
66
61
  evaluateNot(meta, pred) {
67
- return new this.constructor(
68
- this.value,
69
- this.f,
70
- this.alt,
71
- !(0, import_Get.ofGet)(meta, pred ? (0, import_Get.ofGet)(pred, this.value) : this.value)
72
- );
62
+ return (0, import_Constructor.on)(this, (t) => t.valid = !(0, import_Get.ofGet)(meta, pred ? (0, import_Get.ofGet)(pred, this.value) : this.value));
73
63
  }
74
64
  }
75
65
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/Parser.ts"],"sourcesContent":["import { Get, ofGet } from './Get';\nimport { isDefined, isEmpty, isIn, isObject, isString } from './Is';\nimport { isValid } from '../validation';\nimport { Constructor } from './Constructor';\nimport { toArray } from './Array';\n\nexport class Parser<T, V> {\n if = {\n empty: <U>(pred?: Get<U, T>): this => this.evaluate(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluate(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluate(isValid, pred),\n in: (...items: T[]): this => this.evaluate(() => isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluate(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluate(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => this.value instanceof c, pred),\n },\n not: {\n empty: <U>(pred?: Get<U, T>): this => this.evaluateNot(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluateNot(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluateNot(isValid, pred),\n isObject: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n in: (...items: T[]): this => this.evaluate(() => !isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluateNot(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => !(this.value instanceof c), pred),\n },\n },\n };\n\n constructor(protected value: T, protected f: Get<V, T>, protected alt: Get<V, T>, readonly valid = true) {}\n\n protected evaluate<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return new (this.constructor as new (value: T, f: Get<V, T>, alt: Get<V, T>, allow?: boolean) => this)(\n this.value,\n this.f,\n this.alt,\n ofGet(meta, pred ? ofGet(pred, this.value) : this.value)\n );\n }\n\n protected evaluateNot<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return new (this.constructor as new (value: T, f: Get<V, T>, alt: Get<V, T>, allow?: boolean) => this)(\n this.value,\n this.f,\n this.alt,\n !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA2B;AAC3B,gBAA6D;AAC7D,wBAAwB;AAExB,mBAAwB;AAEjB,MAAM,OAAa;AAAA,EAyBxB,YAAsB,OAAoB,GAAwB,KAAyB,QAAQ,MAAM;AAAnF;AAAoB;AAAwB;AAAyB;AAAA,EAAe;AAAA,EAxB1G,KAAK;AAAA,IACH,OAAO,CAAI,SAA2B,KAAK,SAAS,mBAAS,IAAI;AAAA,IACjE,SAAS,CAAI,SAA2B,KAAK,SAAS,qBAAW,IAAI;AAAA,IACrE,OAAO,CAAI,SAA2B,KAAK,SAAS,2BAAS,IAAI;AAAA,IACjE,IAAI,IAAI,UAAqB,KAAK,SAAS,UAAM,gBAAK,KAAK,WAAO,sBAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,IACpF,IAAI;AAAA,MACF,QAAQ,CAAI,SAA2B,KAAK,SAAS,oBAAU,IAAI;AAAA,MACnE,QAAQ,CAAI,SAA2B,KAAK,SAAS,oBAAU,IAAI;AAAA,MACnE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,KAAK,iBAAiB,GAAG,IAAI;AAAA,IAC/G;AAAA,IACA,KAAK;AAAA,MACH,OAAO,CAAI,SAA2B,KAAK,YAAY,mBAAS,IAAI;AAAA,MACpE,SAAS,CAAI,SAA2B,KAAK,YAAY,qBAAW,IAAI;AAAA,MACxE,OAAO,CAAI,SAA2B,KAAK,YAAY,2BAAS,IAAI;AAAA,MACpE,UAAU,CAAI,SAA2B,KAAK,YAAY,oBAAU,IAAI;AAAA,MACxE,IAAI,IAAI,UAAqB,KAAK,SAAS,MAAM,KAAC,gBAAK,KAAK,WAAO,sBAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,MACrF,IAAI;AAAA,QACF,QAAQ,CAAI,SAA2B,KAAK,YAAY,oBAAU,IAAI;AAAA,QACtE,QAAQ,CAAI,SAA2B,KAAK,YAAY,oBAAU,IAAI;AAAA,QACtE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,EAAE,KAAK,iBAAiB,IAAI,IAAI;AAAA,MAClH;AAAA,IACF;AAAA,EACF;AAAA,EAIU,SAAY,MAAoB,MAAwB;AAChE,WAAO,IAAK,KAAK;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,UACL,kBAAM,MAAM,WAAO,kBAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEU,YAAe,MAAoB,MAAwB;AACnE,WAAO,IAAK,KAAK;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAC,kBAAM,MAAM,WAAO,kBAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IAC1D;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/types/Parser.ts"],"sourcesContent":["import { Get, ofGet, Predicate } from './Get';\nimport { isDefined, isEmpty, isIn, isObject, isString, isTrue } from './Is';\nimport { isValid } from '../validation';\nimport { Constructor, on } from './Constructor';\nimport { toArray } from './Array';\n\nexport class Parser<T, V> {\n if = {\n equals: (pred?: Predicate<T>): this => this.evaluate(isTrue, pred),\n empty: <U>(pred?: Get<U, T>): this => this.evaluate(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluate(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluate(isValid, pred),\n in: (...items: T[]): this => this.evaluate(() => isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluate(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluate(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => this.value instanceof c, pred),\n },\n not: {\n empty: <U>(pred?: Get<U, T>): this => this.evaluateNot(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluateNot(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluateNot(isValid, pred),\n isObject: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n in: (...items: T[]): this => this.evaluate(() => !isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluateNot(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => !(this.value instanceof c), pred),\n },\n },\n };\n\n constructor(\n protected value: T,\n protected valid = true\n ) {}\n\n protected evaluate<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return on(this, t => (t.valid = ofGet(meta, pred ? ofGet(pred, this.value) : this.value)));\n }\n\n protected evaluateNot<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return on(this, t => (t.valid = !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAsC;AACtC,gBAAqE;AACrE,wBAAwB;AACxB,yBAAgC;AAChC,mBAAwB;AAEjB,MAAM,OAAa;AAAA,EA0BxB,YACY,OACA,QAAQ,MAClB;AAFU;AACA;AAAA,EACT;AAAA,EA5BH,KAAK;AAAA,IACH,QAAQ,CAAC,SAA8B,KAAK,SAAS,kBAAQ,IAAI;AAAA,IACjE,OAAO,CAAI,SAA2B,KAAK,SAAS,mBAAS,IAAI;AAAA,IACjE,SAAS,CAAI,SAA2B,KAAK,SAAS,qBAAW,IAAI;AAAA,IACrE,OAAO,CAAI,SAA2B,KAAK,SAAS,2BAAS,IAAI;AAAA,IACjE,IAAI,IAAI,UAAqB,KAAK,SAAS,UAAM,gBAAK,KAAK,WAAO,sBAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,IACpF,IAAI;AAAA,MACF,QAAQ,CAAI,SAA2B,KAAK,SAAS,oBAAU,IAAI;AAAA,MACnE,QAAQ,CAAI,SAA2B,KAAK,SAAS,oBAAU,IAAI;AAAA,MACnE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,KAAK,iBAAiB,GAAG,IAAI;AAAA,IAC/G;AAAA,IACA,KAAK;AAAA,MACH,OAAO,CAAI,SAA2B,KAAK,YAAY,mBAAS,IAAI;AAAA,MACpE,SAAS,CAAI,SAA2B,KAAK,YAAY,qBAAW,IAAI;AAAA,MACxE,OAAO,CAAI,SAA2B,KAAK,YAAY,2BAAS,IAAI;AAAA,MACpE,UAAU,CAAI,SAA2B,KAAK,YAAY,oBAAU,IAAI;AAAA,MACxE,IAAI,IAAI,UAAqB,KAAK,SAAS,MAAM,KAAC,gBAAK,KAAK,WAAO,sBAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,MACrF,IAAI;AAAA,QACF,QAAQ,CAAI,SAA2B,KAAK,YAAY,oBAAU,IAAI;AAAA,QACtE,QAAQ,CAAI,SAA2B,KAAK,YAAY,oBAAU,IAAI;AAAA,QACtE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,EAAE,KAAK,iBAAiB,IAAI,IAAI;AAAA,MAClH;AAAA,IACF;AAAA,EACF;AAAA,EAOU,SAAY,MAAoB,MAAwB;AAChE,eAAO,uBAAG,MAAM,OAAM,EAAE,YAAQ,kBAAM,MAAM,WAAO,kBAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,CAAE;AAAA,EAC3F;AAAA,EAEU,YAAe,MAAoB,MAAwB;AACnE,eAAO,uBAAG,MAAM,OAAM,EAAE,QAAQ,KAAC,kBAAM,MAAM,WAAO,kBAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,CAAE;AAAA,EAC5F;AACF;","names":[]}
@@ -1,16 +1,16 @@
1
1
  import "../chunk-4N72FQFX.mjs";
2
2
  import { ofGet } from "./Get";
3
- import { isDefined, isEmpty, isIn, isObject, isString } from "./Is";
3
+ import { isDefined, isEmpty, isIn, isObject, isString, isTrue } from "./Is";
4
4
  import { isValid } from "../validation";
5
+ import { on } from "./Constructor";
5
6
  import { toArray } from "./Array";
6
7
  class Parser {
7
- constructor(value, f, alt, valid = true) {
8
+ constructor(value, valid = true) {
8
9
  this.value = value;
9
- this.f = f;
10
- this.alt = alt;
11
10
  this.valid = valid;
12
11
  }
13
12
  if = {
13
+ equals: (pred) => this.evaluate(isTrue, pred),
14
14
  empty: (pred) => this.evaluate(isEmpty, pred),
15
15
  defined: (pred) => this.evaluate(isDefined, pred),
16
16
  valid: (pred) => this.evaluate(isValid, pred),
@@ -34,20 +34,10 @@ class Parser {
34
34
  }
35
35
  };
36
36
  evaluate(meta, pred) {
37
- return new this.constructor(
38
- this.value,
39
- this.f,
40
- this.alt,
41
- ofGet(meta, pred ? ofGet(pred, this.value) : this.value)
42
- );
37
+ return on(this, (t) => t.valid = ofGet(meta, pred ? ofGet(pred, this.value) : this.value));
43
38
  }
44
39
  evaluateNot(meta, pred) {
45
- return new this.constructor(
46
- this.value,
47
- this.f,
48
- this.alt,
49
- !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)
50
- );
40
+ return on(this, (t) => t.valid = !ofGet(meta, pred ? ofGet(pred, this.value) : this.value));
51
41
  }
52
42
  }
53
43
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/Parser.ts"],"sourcesContent":["import { Get, ofGet } from './Get';\nimport { isDefined, isEmpty, isIn, isObject, isString } from './Is';\nimport { isValid } from '../validation';\nimport { Constructor } from './Constructor';\nimport { toArray } from './Array';\n\nexport class Parser<T, V> {\n if = {\n empty: <U>(pred?: Get<U, T>): this => this.evaluate(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluate(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluate(isValid, pred),\n in: (...items: T[]): this => this.evaluate(() => isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluate(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluate(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => this.value instanceof c, pred),\n },\n not: {\n empty: <U>(pred?: Get<U, T>): this => this.evaluateNot(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluateNot(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluateNot(isValid, pred),\n isObject: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n in: (...items: T[]): this => this.evaluate(() => !isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluateNot(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => !(this.value instanceof c), pred),\n },\n },\n };\n\n constructor(protected value: T, protected f: Get<V, T>, protected alt: Get<V, T>, readonly valid = true) {}\n\n protected evaluate<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return new (this.constructor as new (value: T, f: Get<V, T>, alt: Get<V, T>, allow?: boolean) => this)(\n this.value,\n this.f,\n this.alt,\n ofGet(meta, pred ? ofGet(pred, this.value) : this.value)\n );\n }\n\n protected evaluateNot<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return new (this.constructor as new (value: T, f: Get<V, T>, alt: Get<V, T>, allow?: boolean) => this)(\n this.value,\n this.f,\n this.alt,\n !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)\n );\n }\n}\n"],"mappings":";AAAA,SAAc,aAAa;AAC3B,SAAS,WAAW,SAAS,MAAM,UAAU,gBAAgB;AAC7D,SAAS,eAAe;AAExB,SAAS,eAAe;AAEjB,MAAM,OAAa;AAAA,EAyBxB,YAAsB,OAAoB,GAAwB,KAAyB,QAAQ,MAAM;AAAnF;AAAoB;AAAwB;AAAyB;AAAA,EAAe;AAAA,EAxB1G,KAAK;AAAA,IACH,OAAO,CAAI,SAA2B,KAAK,SAAS,SAAS,IAAI;AAAA,IACjE,SAAS,CAAI,SAA2B,KAAK,SAAS,WAAW,IAAI;AAAA,IACrE,OAAO,CAAI,SAA2B,KAAK,SAAS,SAAS,IAAI;AAAA,IACjE,IAAI,IAAI,UAAqB,KAAK,SAAS,MAAM,KAAK,KAAK,OAAO,QAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,IACpF,IAAI;AAAA,MACF,QAAQ,CAAI,SAA2B,KAAK,SAAS,UAAU,IAAI;AAAA,MACnE,QAAQ,CAAI,SAA2B,KAAK,SAAS,UAAU,IAAI;AAAA,MACnE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,KAAK,iBAAiB,GAAG,IAAI;AAAA,IAC/G;AAAA,IACA,KAAK;AAAA,MACH,OAAO,CAAI,SAA2B,KAAK,YAAY,SAAS,IAAI;AAAA,MACpE,SAAS,CAAI,SAA2B,KAAK,YAAY,WAAW,IAAI;AAAA,MACxE,OAAO,CAAI,SAA2B,KAAK,YAAY,SAAS,IAAI;AAAA,MACpE,UAAU,CAAI,SAA2B,KAAK,YAAY,UAAU,IAAI;AAAA,MACxE,IAAI,IAAI,UAAqB,KAAK,SAAS,MAAM,CAAC,KAAK,KAAK,OAAO,QAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,MACrF,IAAI;AAAA,QACF,QAAQ,CAAI,SAA2B,KAAK,YAAY,UAAU,IAAI;AAAA,QACtE,QAAQ,CAAI,SAA2B,KAAK,YAAY,UAAU,IAAI;AAAA,QACtE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,EAAE,KAAK,iBAAiB,IAAI,IAAI;AAAA,MAClH;AAAA,IACF;AAAA,EACF;AAAA,EAIU,SAAY,MAAoB,MAAwB;AAChE,WAAO,IAAK,KAAK;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEU,YAAe,MAAoB,MAAwB;AACnE,WAAO,IAAK,KAAK;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,CAAC,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IAC1D;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/types/Parser.ts"],"sourcesContent":["import { Get, ofGet, Predicate } from './Get';\nimport { isDefined, isEmpty, isIn, isObject, isString, isTrue } from './Is';\nimport { isValid } from '../validation';\nimport { Constructor, on } from './Constructor';\nimport { toArray } from './Array';\n\nexport class Parser<T, V> {\n if = {\n equals: (pred?: Predicate<T>): this => this.evaluate(isTrue, pred),\n empty: <U>(pred?: Get<U, T>): this => this.evaluate(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluate(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluate(isValid, pred),\n in: (...items: T[]): this => this.evaluate(() => isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluate(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluate(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => this.value instanceof c, pred),\n },\n not: {\n empty: <U>(pred?: Get<U, T>): this => this.evaluateNot(isEmpty, pred),\n defined: <U>(pred?: Get<U, T>): this => this.evaluateNot(isDefined, pred),\n valid: <U>(pred?: Get<U, T>): this => this.evaluateNot(isValid, pred),\n isObject: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n in: (...items: T[]): this => this.evaluate(() => !isIn(this.value, toArray(...items))),\n is: {\n object: <U>(pred?: Get<U, T>): this => this.evaluateNot(isObject, pred),\n string: <U>(pred?: Get<U, T>): this => this.evaluateNot(isString, pred),\n instance: <U>(c: Constructor<U>, pred?: Get<U, T>): this => this.evaluate(() => !(this.value instanceof c), pred),\n },\n },\n };\n\n constructor(\n protected value: T,\n protected valid = true\n ) {}\n\n protected evaluate<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return on(this, t => (t.valid = ofGet(meta, pred ? ofGet(pred, this.value) : this.value)));\n }\n\n protected evaluateNot<U>(meta: Get<boolean>, pred?: Get<U, T>): this {\n return on(this, t => (t.valid = !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)));\n }\n}\n"],"mappings":";AAAA,SAAc,aAAwB;AACtC,SAAS,WAAW,SAAS,MAAM,UAAU,UAAU,cAAc;AACrE,SAAS,eAAe;AACxB,SAAsB,UAAU;AAChC,SAAS,eAAe;AAEjB,MAAM,OAAa;AAAA,EA0BxB,YACY,OACA,QAAQ,MAClB;AAFU;AACA;AAAA,EACT;AAAA,EA5BH,KAAK;AAAA,IACH,QAAQ,CAAC,SAA8B,KAAK,SAAS,QAAQ,IAAI;AAAA,IACjE,OAAO,CAAI,SAA2B,KAAK,SAAS,SAAS,IAAI;AAAA,IACjE,SAAS,CAAI,SAA2B,KAAK,SAAS,WAAW,IAAI;AAAA,IACrE,OAAO,CAAI,SAA2B,KAAK,SAAS,SAAS,IAAI;AAAA,IACjE,IAAI,IAAI,UAAqB,KAAK,SAAS,MAAM,KAAK,KAAK,OAAO,QAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,IACpF,IAAI;AAAA,MACF,QAAQ,CAAI,SAA2B,KAAK,SAAS,UAAU,IAAI;AAAA,MACnE,QAAQ,CAAI,SAA2B,KAAK,SAAS,UAAU,IAAI;AAAA,MACnE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,KAAK,iBAAiB,GAAG,IAAI;AAAA,IAC/G;AAAA,IACA,KAAK;AAAA,MACH,OAAO,CAAI,SAA2B,KAAK,YAAY,SAAS,IAAI;AAAA,MACpE,SAAS,CAAI,SAA2B,KAAK,YAAY,WAAW,IAAI;AAAA,MACxE,OAAO,CAAI,SAA2B,KAAK,YAAY,SAAS,IAAI;AAAA,MACpE,UAAU,CAAI,SAA2B,KAAK,YAAY,UAAU,IAAI;AAAA,MACxE,IAAI,IAAI,UAAqB,KAAK,SAAS,MAAM,CAAC,KAAK,KAAK,OAAO,QAAQ,GAAG,KAAK,CAAC,CAAC;AAAA,MACrF,IAAI;AAAA,QACF,QAAQ,CAAI,SAA2B,KAAK,YAAY,UAAU,IAAI;AAAA,QACtE,QAAQ,CAAI,SAA2B,KAAK,YAAY,UAAU,IAAI;AAAA,QACtE,UAAU,CAAI,GAAmB,SAA2B,KAAK,SAAS,MAAM,EAAE,KAAK,iBAAiB,IAAI,IAAI;AAAA,MAClH;AAAA,IACF;AAAA,EACF;AAAA,EAOU,SAAY,MAAoB,MAAwB;AAChE,WAAO,GAAG,MAAM,OAAM,EAAE,QAAQ,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,CAAE;AAAA,EAC3F;AAAA,EAEU,YAAe,MAAoB,MAAwB;AACnE,WAAO,GAAG,MAAM,OAAM,EAAE,QAAQ,CAAC,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,CAAE;AAAA,EAC5F;AACF;","names":[]}
@@ -19,6 +19,7 @@ export declare class ToText implements Text {
19
19
  get camel(): ToText;
20
20
  get kebab(): ToText;
21
21
  get strictKebab(): ToText;
22
+ get slug(): ToText;
22
23
  get snake(): ToText;
23
24
  get plural(): ToText;
24
25
  get space(): ToText;
@@ -66,6 +66,9 @@ class ToText {
66
66
  get strictKebab() {
67
67
  return this.map((s) => s.replace(/[^a-z\d]+/gi, " ").trim()).kebab;
68
68
  }
69
+ get slug() {
70
+ return this.map((s) => s.replace(/ß/g, "ss").normalize("NFKD").replace(/[^a-z\d\s]+/gi, "").replace(/\s+/g, " ").trim()).kebab;
71
+ }
69
72
  get snake() {
70
73
  return this.upper.replace(" ", "_");
71
74
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/Text.ts"],"sourcesContent":["import { isDefined, isEmpty, isNotEmpty } from './Is';\nimport { toName } from './Constructor';\nimport { template } from './Template';\nimport { isFunc } from './Func';\nimport { Get, ofGet } from './Get';\nimport { toList } from './List';\nimport { JsonValue } from './Json';\nimport { Optional } from './Types';\n\nexport type Text = { toString(): string };\n\nexport const isText = (t?: unknown): t is Text => isDefined(t) && isFunc<string, any>((t as any).toString);\n\nexport const asString = (t?: unknown, alt: Get<Text> = ''): string => (isText(t) ? t : ofGet(alt)).toString();\n\nexport const replaceAll = (origin: Text, search: Text, replace: Text = ''): string => asString(origin).split(asString(search)).join(asString(replace));\n\nexport const kebab = (s = ''): string =>\n s\n .replace(/[^a-z\\d]+/gi, '-')\n .replace(/-$/, '')\n .replace(/^-/, '')\n .toLowerCase();\n\nexport class ToText implements Text {\n constructor(readonly subject: string) {}\n\n get cap(): ToText {\n return this.map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase());\n }\n\n get title(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => text(w).cap)\n .join(' ')\n );\n }\n\n get pascal(): ToText {\n return this.title.replace(' ', '');\n }\n\n get lower(): ToText {\n return this.map(s => s.toLowerCase());\n }\n\n get upper(): ToText {\n return this.map(s => s.toUpperCase());\n }\n\n get camel(): ToText {\n return this.title.trim.map(s => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);\n }\n\n get kebab(): ToText {\n return this.lower.replace(' ', '-');\n }\n\n get strictKebab(): ToText {\n return this.map(s => s.replace(/[^a-z\\d]+/gi, ' ').trim()).kebab;\n }\n\n get snake(): ToText {\n return this.upper.replace(' ', '_');\n }\n\n get plural(): ToText {\n return this.ifLike('') ?? this.add('s');\n }\n\n get space(): ToText {\n return this.map(s => s.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]/g, ' '));\n }\n\n get sentence(): ToText {\n return this.isEmpty ? this : this.map(s => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);\n }\n\n get initials(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => w[0])\n .join('')\n );\n }\n\n get trim(): ToText {\n return this.map(s => s.replace(/[- ,_#]/g, ''));\n }\n\n get isEmpty(): boolean {\n return isEmpty(this.toString());\n }\n\n parse = (subject: unknown, options = {}): ToText => text(template(this.subject, subject, { type: toName(subject), ...options }));\n\n is = (...others: unknown[]): boolean => others.some(o => this.toString() === text(o).toString());\n\n equals = this.is;\n\n isLike = (...others: unknown[]): boolean => others.some(o => this.trim.lower.is(text(o).trim.lower));\n\n ifLike = (...others: unknown[]): Optional<this> => (this.isLike(...others) ? this : undefined);\n\n endsWith = (end?: unknown): boolean => this.subject.endsWith(asString(end));\n\n startsWith = (end?: unknown): boolean => this.subject.startsWith(asString(end));\n\n first = (n: number): ToText => this.map(s => s.substring(0, n));\n\n last = (n: number): ToText => this.map(s => s.substring(s.length - n));\n\n map = (func: Get<string, string>): ToText => text(ofGet(func, this.subject));\n\n replace = (search: Text, replace: Text): ToText => this.map(s => replaceAll(s, search, replace));\n\n add = (add?: unknown, separator = ''): ToText => this.map(s => (isNotEmpty(add) ? `${s}${separator}${text(add)}` : s));\n\n with = (separator: string, ...other: unknown[]): ToText =>\n this.map(s =>\n toList(s)\n .add(...other.map(u => text(u).toString()))\n .filter(s => isNotEmpty(s))\n .join(separator)\n );\n\n toString(): string {\n return this.subject;\n }\n\n toJSON(): JsonValue {\n return this.subject;\n }\n}\n\nexport const text = (subject?: unknown, alt = ''): ToText => {\n const sub = subject ? asString(subject) : alt;\n return new ToText(sub !== '[object Object]' ? sub : '');\n};\n"],"mappings":"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","names":["s"]}
1
+ {"version":3,"sources":["../../src/types/Text.ts"],"sourcesContent":["import { isDefined, isEmpty, isNotEmpty } from './Is';\nimport { toName } from './Constructor';\nimport { template } from './Template';\nimport { isFunc } from './Func';\nimport { Get, ofGet } from './Get';\nimport { toList } from './List';\nimport { JsonValue } from './Json';\nimport { Optional } from './Types';\n\nexport type Text = { toString(): string };\n\nexport const isText = (t?: unknown): t is Text => isDefined(t) && isFunc<string, any>((t as any).toString);\n\nexport const asString = (t?: unknown, alt: Get<Text> = ''): string => (isText(t) ? t : ofGet(alt)).toString();\n\nexport const replaceAll = (origin: Text, search: Text, replace: Text = ''): string => asString(origin).split(asString(search)).join(asString(replace));\n\nexport const kebab = (s = ''): string =>\n s\n .replace(/[^a-z\\d]+/gi, '-')\n .replace(/-$/, '')\n .replace(/^-/, '')\n .toLowerCase();\n\nexport class ToText implements Text {\n constructor(readonly subject: string) {}\n\n get cap(): ToText {\n return this.map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase());\n }\n\n get title(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => text(w).cap)\n .join(' ')\n );\n }\n\n get pascal(): ToText {\n return this.title.replace(' ', '');\n }\n\n get lower(): ToText {\n return this.map(s => s.toLowerCase());\n }\n\n get upper(): ToText {\n return this.map(s => s.toUpperCase());\n }\n\n get camel(): ToText {\n return this.title.trim.map(s => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);\n }\n\n get kebab(): ToText {\n return this.lower.replace(' ', '-');\n }\n\n get strictKebab(): ToText {\n return this.map(s => s.replace(/[^a-z\\d]+/gi, ' ').trim()).kebab;\n }\n\n get slug(): ToText {\n return this\n .map(s => s.replace(/ß/g, 'ss').normalize('NFKD').replace(/[^a-z\\d\\s]+/gi, '').replace(/\\s+/g, ' ').trim()).kebab;\n }\n\n get snake(): ToText {\n return this.upper.replace(' ', '_');\n }\n\n get plural(): ToText {\n return this.ifLike('') ?? this.add('s');\n }\n\n get space(): ToText {\n return this.map(s => s.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]/g, ' '));\n }\n\n get sentence(): ToText {\n return this.isEmpty ? this : this.map(s => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);\n }\n\n get initials(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => w[0])\n .join('')\n );\n }\n\n get trim(): ToText {\n return this.map(s => s.replace(/[- ,_#]/g, ''));\n }\n\n get isEmpty(): boolean {\n return isEmpty(this.toString());\n }\n\n parse = (subject: unknown, options = {}): ToText => text(template(this.subject, subject, { type: toName(subject), ...options }));\n\n is = (...others: unknown[]): boolean => others.some(o => this.toString() === text(o).toString());\n\n equals = this.is;\n\n isLike = (...others: unknown[]): boolean => others.some(o => this.trim.lower.is(text(o).trim.lower));\n\n ifLike = (...others: unknown[]): Optional<this> => (this.isLike(...others) ? this : undefined);\n\n endsWith = (end?: unknown): boolean => this.subject.endsWith(asString(end));\n\n startsWith = (end?: unknown): boolean => this.subject.startsWith(asString(end));\n\n first = (n: number): ToText => this.map(s => s.substring(0, n));\n\n last = (n: number): ToText => this.map(s => s.substring(s.length - n));\n\n map = (func: Get<string, string>): ToText => text(ofGet(func, this.subject));\n\n replace = (search: Text, replace: Text): ToText => this.map(s => replaceAll(s, search, replace));\n\n add = (add?: unknown, separator = ''): ToText => this.map(s => (isNotEmpty(add) ? `${s}${separator}${text(add)}` : s));\n\n with = (separator: string, ...other: unknown[]): ToText =>\n this.map(s =>\n toList(s)\n .add(...other.map(u => text(u).toString()))\n .filter(s => isNotEmpty(s))\n .join(separator)\n );\n\n toString(): string {\n return this.subject;\n }\n\n toJSON(): JsonValue {\n return this.subject;\n }\n}\n\nexport const text = (subject?: unknown, alt = ''): ToText => {\n const sub = subject ? asString(subject) : alt;\n return new ToText(sub !== '[object Object]' ? sub : '');\n};\n"],"mappings":"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","names":["s"]}
@@ -39,6 +39,9 @@ class ToText {
39
39
  get strictKebab() {
40
40
  return this.map((s) => s.replace(/[^a-z\d]+/gi, " ").trim()).kebab;
41
41
  }
42
+ get slug() {
43
+ return this.map((s) => s.replace(/ß/g, "ss").normalize("NFKD").replace(/[^a-z\d\s]+/gi, "").replace(/\s+/g, " ").trim()).kebab;
44
+ }
42
45
  get snake() {
43
46
  return this.upper.replace(" ", "_");
44
47
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/Text.ts"],"sourcesContent":["import { isDefined, isEmpty, isNotEmpty } from './Is';\nimport { toName } from './Constructor';\nimport { template } from './Template';\nimport { isFunc } from './Func';\nimport { Get, ofGet } from './Get';\nimport { toList } from './List';\nimport { JsonValue } from './Json';\nimport { Optional } from './Types';\n\nexport type Text = { toString(): string };\n\nexport const isText = (t?: unknown): t is Text => isDefined(t) && isFunc<string, any>((t as any).toString);\n\nexport const asString = (t?: unknown, alt: Get<Text> = ''): string => (isText(t) ? t : ofGet(alt)).toString();\n\nexport const replaceAll = (origin: Text, search: Text, replace: Text = ''): string => asString(origin).split(asString(search)).join(asString(replace));\n\nexport const kebab = (s = ''): string =>\n s\n .replace(/[^a-z\\d]+/gi, '-')\n .replace(/-$/, '')\n .replace(/^-/, '')\n .toLowerCase();\n\nexport class ToText implements Text {\n constructor(readonly subject: string) {}\n\n get cap(): ToText {\n return this.map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase());\n }\n\n get title(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => text(w).cap)\n .join(' ')\n );\n }\n\n get pascal(): ToText {\n return this.title.replace(' ', '');\n }\n\n get lower(): ToText {\n return this.map(s => s.toLowerCase());\n }\n\n get upper(): ToText {\n return this.map(s => s.toUpperCase());\n }\n\n get camel(): ToText {\n return this.title.trim.map(s => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);\n }\n\n get kebab(): ToText {\n return this.lower.replace(' ', '-');\n }\n\n get strictKebab(): ToText {\n return this.map(s => s.replace(/[^a-z\\d]+/gi, ' ').trim()).kebab;\n }\n\n get snake(): ToText {\n return this.upper.replace(' ', '_');\n }\n\n get plural(): ToText {\n return this.ifLike('') ?? this.add('s');\n }\n\n get space(): ToText {\n return this.map(s => s.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]/g, ' '));\n }\n\n get sentence(): ToText {\n return this.isEmpty ? this : this.map(s => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);\n }\n\n get initials(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => w[0])\n .join('')\n );\n }\n\n get trim(): ToText {\n return this.map(s => s.replace(/[- ,_#]/g, ''));\n }\n\n get isEmpty(): boolean {\n return isEmpty(this.toString());\n }\n\n parse = (subject: unknown, options = {}): ToText => text(template(this.subject, subject, { type: toName(subject), ...options }));\n\n is = (...others: unknown[]): boolean => others.some(o => this.toString() === text(o).toString());\n\n equals = this.is;\n\n isLike = (...others: unknown[]): boolean => others.some(o => this.trim.lower.is(text(o).trim.lower));\n\n ifLike = (...others: unknown[]): Optional<this> => (this.isLike(...others) ? this : undefined);\n\n endsWith = (end?: unknown): boolean => this.subject.endsWith(asString(end));\n\n startsWith = (end?: unknown): boolean => this.subject.startsWith(asString(end));\n\n first = (n: number): ToText => this.map(s => s.substring(0, n));\n\n last = (n: number): ToText => this.map(s => s.substring(s.length - n));\n\n map = (func: Get<string, string>): ToText => text(ofGet(func, this.subject));\n\n replace = (search: Text, replace: Text): ToText => this.map(s => replaceAll(s, search, replace));\n\n add = (add?: unknown, separator = ''): ToText => this.map(s => (isNotEmpty(add) ? `${s}${separator}${text(add)}` : s));\n\n with = (separator: string, ...other: unknown[]): ToText =>\n this.map(s =>\n toList(s)\n .add(...other.map(u => text(u).toString()))\n .filter(s => isNotEmpty(s))\n .join(separator)\n );\n\n toString(): string {\n return this.subject;\n }\n\n toJSON(): JsonValue {\n return this.subject;\n }\n}\n\nexport const text = (subject?: unknown, alt = ''): ToText => {\n const sub = subject ? asString(subject) : alt;\n return new ToText(sub !== '[object Object]' ? sub : '');\n};\n"],"mappings":"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","names":["s"]}
1
+ {"version":3,"sources":["../../src/types/Text.ts"],"sourcesContent":["import { isDefined, isEmpty, isNotEmpty } from './Is';\nimport { toName } from './Constructor';\nimport { template } from './Template';\nimport { isFunc } from './Func';\nimport { Get, ofGet } from './Get';\nimport { toList } from './List';\nimport { JsonValue } from './Json';\nimport { Optional } from './Types';\n\nexport type Text = { toString(): string };\n\nexport const isText = (t?: unknown): t is Text => isDefined(t) && isFunc<string, any>((t as any).toString);\n\nexport const asString = (t?: unknown, alt: Get<Text> = ''): string => (isText(t) ? t : ofGet(alt)).toString();\n\nexport const replaceAll = (origin: Text, search: Text, replace: Text = ''): string => asString(origin).split(asString(search)).join(asString(replace));\n\nexport const kebab = (s = ''): string =>\n s\n .replace(/[^a-z\\d]+/gi, '-')\n .replace(/-$/, '')\n .replace(/^-/, '')\n .toLowerCase();\n\nexport class ToText implements Text {\n constructor(readonly subject: string) {}\n\n get cap(): ToText {\n return this.map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase());\n }\n\n get title(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => text(w).cap)\n .join(' ')\n );\n }\n\n get pascal(): ToText {\n return this.title.replace(' ', '');\n }\n\n get lower(): ToText {\n return this.map(s => s.toLowerCase());\n }\n\n get upper(): ToText {\n return this.map(s => s.toUpperCase());\n }\n\n get camel(): ToText {\n return this.title.trim.map(s => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);\n }\n\n get kebab(): ToText {\n return this.lower.replace(' ', '-');\n }\n\n get strictKebab(): ToText {\n return this.map(s => s.replace(/[^a-z\\d]+/gi, ' ').trim()).kebab;\n }\n\n get slug(): ToText {\n return this\n .map(s => s.replace(/ß/g, 'ss').normalize('NFKD').replace(/[^a-z\\d\\s]+/gi, '').replace(/\\s+/g, ' ').trim()).kebab;\n }\n\n get snake(): ToText {\n return this.upper.replace(' ', '_');\n }\n\n get plural(): ToText {\n return this.ifLike('') ?? this.add('s');\n }\n\n get space(): ToText {\n return this.map(s => s.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]/g, ' '));\n }\n\n get sentence(): ToText {\n return this.isEmpty ? this : this.map(s => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);\n }\n\n get initials(): ToText {\n return this.map(s =>\n s\n .split(' ')\n .map(w => w[0])\n .join('')\n );\n }\n\n get trim(): ToText {\n return this.map(s => s.replace(/[- ,_#]/g, ''));\n }\n\n get isEmpty(): boolean {\n return isEmpty(this.toString());\n }\n\n parse = (subject: unknown, options = {}): ToText => text(template(this.subject, subject, { type: toName(subject), ...options }));\n\n is = (...others: unknown[]): boolean => others.some(o => this.toString() === text(o).toString());\n\n equals = this.is;\n\n isLike = (...others: unknown[]): boolean => others.some(o => this.trim.lower.is(text(o).trim.lower));\n\n ifLike = (...others: unknown[]): Optional<this> => (this.isLike(...others) ? this : undefined);\n\n endsWith = (end?: unknown): boolean => this.subject.endsWith(asString(end));\n\n startsWith = (end?: unknown): boolean => this.subject.startsWith(asString(end));\n\n first = (n: number): ToText => this.map(s => s.substring(0, n));\n\n last = (n: number): ToText => this.map(s => s.substring(s.length - n));\n\n map = (func: Get<string, string>): ToText => text(ofGet(func, this.subject));\n\n replace = (search: Text, replace: Text): ToText => this.map(s => replaceAll(s, search, replace));\n\n add = (add?: unknown, separator = ''): ToText => this.map(s => (isNotEmpty(add) ? `${s}${separator}${text(add)}` : s));\n\n with = (separator: string, ...other: unknown[]): ToText =>\n this.map(s =>\n toList(s)\n .add(...other.map(u => text(u).toString()))\n .filter(s => isNotEmpty(s))\n .join(separator)\n );\n\n toString(): string {\n return this.subject;\n }\n\n toJSON(): JsonValue {\n return this.subject;\n }\n}\n\nexport const text = (subject?: unknown, alt = ''): ToText => {\n const sub = subject ? asString(subject) : alt;\n return new ToText(sub !== '[object Object]' ? sub : '');\n};\n"],"mappings":"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","names":["s"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy",
3
- "version": "15.21.1",
3
+ "version": "15.22.0",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "devDependencies": {
36
- "@thisisagile/easy-test": "15.21.1",
36
+ "@thisisagile/easy-test": "15.22.0",
37
37
  "@types/form-urlencoded": "^4.4.0",
38
38
  "@types/jsonwebtoken": "^9.0.6",
39
39
  "@types/luxon": "3.4.2",
@@ -3,7 +3,7 @@ import { isSlug } from 'validator';
3
3
 
4
4
  export class Slug extends Value {
5
5
  constructor(slug?: unknown) {
6
- super(text(slug).strictKebab.toString());
6
+ super(text(slug).slug.toString());
7
7
  }
8
8
 
9
9
  get isValid(): boolean {
@@ -1,11 +1,12 @@
1
- import { Get, ofGet } from './Get';
2
- import { isDefined, isEmpty, isIn, isObject, isString } from './Is';
1
+ import { Get, ofGet, Predicate } from './Get';
2
+ import { isDefined, isEmpty, isIn, isObject, isString, isTrue } from './Is';
3
3
  import { isValid } from '../validation';
4
- import { Constructor } from './Constructor';
4
+ import { Constructor, on } from './Constructor';
5
5
  import { toArray } from './Array';
6
6
 
7
7
  export class Parser<T, V> {
8
8
  if = {
9
+ equals: (pred?: Predicate<T>): this => this.evaluate(isTrue, pred),
9
10
  empty: <U>(pred?: Get<U, T>): this => this.evaluate(isEmpty, pred),
10
11
  defined: <U>(pred?: Get<U, T>): this => this.evaluate(isDefined, pred),
11
12
  valid: <U>(pred?: Get<U, T>): this => this.evaluate(isValid, pred),
@@ -29,23 +30,16 @@ export class Parser<T, V> {
29
30
  },
30
31
  };
31
32
 
32
- constructor(protected value: T, protected f: Get<V, T>, protected alt: Get<V, T>, readonly valid = true) {}
33
+ constructor(
34
+ protected value: T,
35
+ protected valid = true
36
+ ) {}
33
37
 
34
38
  protected evaluate<U>(meta: Get<boolean>, pred?: Get<U, T>): this {
35
- return new (this.constructor as new (value: T, f: Get<V, T>, alt: Get<V, T>, allow?: boolean) => this)(
36
- this.value,
37
- this.f,
38
- this.alt,
39
- ofGet(meta, pred ? ofGet(pred, this.value) : this.value)
40
- );
39
+ return on(this, t => (t.valid = ofGet(meta, pred ? ofGet(pred, this.value) : this.value)));
41
40
  }
42
41
 
43
42
  protected evaluateNot<U>(meta: Get<boolean>, pred?: Get<U, T>): this {
44
- return new (this.constructor as new (value: T, f: Get<V, T>, alt: Get<V, T>, allow?: boolean) => this)(
45
- this.value,
46
- this.f,
47
- this.alt,
48
- !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)
49
- );
43
+ return on(this, t => (t.valid = !ofGet(meta, pred ? ofGet(pred, this.value) : this.value)));
50
44
  }
51
45
  }
package/src/types/Text.ts CHANGED
@@ -62,6 +62,11 @@ export class ToText implements Text {
62
62
  return this.map(s => s.replace(/[^a-z\d]+/gi, ' ').trim()).kebab;
63
63
  }
64
64
 
65
+ get slug(): ToText {
66
+ return this
67
+ .map(s => s.replace(/ß/g, 'ss').normalize('NFKD').replace(/[^a-z\d\s]+/gi, '').replace(/\s+/g, ' ').trim()).kebab;
68
+ }
69
+
65
70
  get snake(): ToText {
66
71
  return this.upper.replace(' ', '_');
67
72
  }