@koala-ts/framework 2.13.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,13 @@
1
1
  import { notBlank } from './basic/not-blank.js';
2
2
  import { email } from './string/email.js';
3
+ import { slug } from './string/slug.js';
3
4
  export declare const builtInConstraints: {
4
5
  notBlank: typeof notBlank;
5
6
  email: typeof email;
7
+ slug: typeof slug;
6
8
  };
7
9
  export * from './string/email.js';
10
+ export * from './string/slug.js';
8
11
  export * from './basic/not-blank.js';
9
12
  export * from './other/compound.js';
10
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validator/constraints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,eAAO,MAAM,kBAAkB;;;CAM9B,CAAC;AAEF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validator/constraints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,eAAO,MAAM,kBAAkB;;;;CAO9B,CAAC;AAEF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -1,12 +1,15 @@
1
1
  import { notBlank } from './basic/not-blank.js';
2
2
  import { email } from './string/email.js';
3
+ import { slug } from './string/slug.js';
3
4
  export const builtInConstraints = {
4
5
  // Basic
5
6
  notBlank,
6
7
  // String
7
8
  email,
9
+ slug,
8
10
  };
9
11
  export * from './string/email.js';
12
+ export * from './string/slug.js';
10
13
  export * from './basic/not-blank.js';
11
14
  export * from './other/compound.js';
12
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validator/constraints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,QAAQ;IAER,SAAS;IACT,KAAK;CACN,CAAC;AAEF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validator/constraints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,QAAQ;IAER,SAAS;IACT,KAAK;IACL,IAAI;CACL,CAAC;AAEF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWhE,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,CA6B7E"}
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWhE,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAiC7E"}
@@ -3,6 +3,9 @@ const strictEmailRegex = /^[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9-]+(?:\.[A
3
3
  export function email(value, context) {
4
4
  const options = context.options;
5
5
  const message = options.message ?? DEFAULT_MESSAGE;
6
+ if (value === undefined) {
7
+ return [];
8
+ }
6
9
  if (typeof value !== 'string') {
7
10
  return [
8
11
  {
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,0CAA0C,CAAC;AAOnE,MAAM,gBAAgB,GAAG,sEAAsE,CAAC;AAEhG,MAAM,UAAU,KAAK,CAAC,KAAc,EAAE,OAA0B;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAuB,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,0CAA0C,CAAC;AAOnE,MAAM,gBAAgB,GAAG,sEAAsE,CAAC;AAEhG,MAAM,UAAU,KAAK,CAAC,KAAc,EAAE,OAA0B;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAuB,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -115,5 +115,17 @@ describe('email', () => {
115
115
  value: 42,
116
116
  });
117
117
  });
118
+ it('returns no violations for undefined values', () => {
119
+ const context = {
120
+ path: 'email',
121
+ root: { email: undefined },
122
+ value: undefined,
123
+ constraint: 'email',
124
+ options: {},
125
+ runNestedRules: () => [],
126
+ };
127
+ const violations = email(undefined, context);
128
+ expect(violations).toHaveLength(0);
129
+ });
118
130
  });
119
131
  //# sourceMappingURL=email.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"email.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ConstraintContext, Violation } from '../../types.js';
2
+ export declare function slug(value: unknown, context: ConstraintContext): Violation[];
3
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/string/slug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWhE,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAiC5E"}
@@ -0,0 +1,32 @@
1
+ const DEFAULT_MESSAGE = 'This value is not a valid slug.';
2
+ const strictSlugRegex = /^(?!-)(?!.*--)[a-z0-9]+(?:-[a-z0-9]+)*$/;
3
+ export function slug(value, context) {
4
+ const options = context.options;
5
+ const message = options.message ?? DEFAULT_MESSAGE;
6
+ if (value === undefined) {
7
+ return [];
8
+ }
9
+ if (typeof value !== 'string') {
10
+ return [
11
+ {
12
+ path: context.path,
13
+ constraint: context.constraint,
14
+ message,
15
+ value,
16
+ },
17
+ ];
18
+ }
19
+ const normalized = options.normalizer ? options.normalizer(value) : value;
20
+ if (!strictSlugRegex.test(normalized)) {
21
+ return [
22
+ {
23
+ path: context.path,
24
+ constraint: context.constraint,
25
+ message,
26
+ value,
27
+ },
28
+ ];
29
+ }
30
+ return [];
31
+ }
32
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/slug.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,iCAAiC,CAAC;AAO1D,MAAM,eAAe,GAAG,yCAAyC,CAAC;AAElE,MAAM,UAAU,IAAI,CAAC,KAAc,EAAE,OAA0B;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAsB,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1E,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=slug.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.test.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/string/slug.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { slug } from './slug.js';
3
+ describe('slug', () => {
4
+ it('accepts valid slug with lowercase, digits and hyphens', () => {
5
+ const context = createContext('article-123');
6
+ const violations = slug('article-123', context);
7
+ expect(violations).toHaveLength(0);
8
+ });
9
+ it.each([
10
+ { value: 'Article-123', label: 'uppercase letters' },
11
+ { value: 'my slug', label: 'spaces' },
12
+ { value: 'my_slug', label: 'underscores' },
13
+ { value: 'my@slug', label: 'special symbols' },
14
+ { value: '-my-slug', label: 'leading hyphen' },
15
+ { value: 'my-slug-', label: 'trailing hyphen' },
16
+ { value: 'my--slug', label: 'consecutive hyphens' },
17
+ { value: '', label: 'empty string' },
18
+ ])('rejects invalid slug with $label', ({ value }) => {
19
+ const context = createContext(value);
20
+ const violations = slug(value, context);
21
+ expect(violations).toHaveLength(1);
22
+ expect(violations[0]).toEqual({
23
+ path: 'slug',
24
+ constraint: 'slug',
25
+ message: 'This value is not a valid slug.',
26
+ value,
27
+ });
28
+ });
29
+ it('rejects non-string values with default message', () => {
30
+ const context = createContext(42);
31
+ const violations = slug(42, context);
32
+ expect(violations).toHaveLength(1);
33
+ expect(violations[0]).toEqual({
34
+ path: 'slug',
35
+ constraint: 'slug',
36
+ message: 'This value is not a valid slug.',
37
+ value: 42,
38
+ });
39
+ });
40
+ it('returns no violations for undefined values', () => {
41
+ const context = createContext(undefined);
42
+ const violations = slug(undefined, context);
43
+ expect(violations).toHaveLength(0);
44
+ });
45
+ it('uses a custom message when provided', () => {
46
+ const context = createContext('invalid slug', { message: 'Slug is invalid' });
47
+ const violations = slug('invalid slug', context);
48
+ expect(violations).toHaveLength(1);
49
+ expect(violations[0]).toEqual({
50
+ path: 'slug',
51
+ constraint: 'slug',
52
+ message: 'Slug is invalid',
53
+ value: 'invalid slug',
54
+ });
55
+ });
56
+ it('normalizes values before validation', () => {
57
+ const context = createContext(' article-slug ', {
58
+ normalizer: (value) => value.trim(),
59
+ });
60
+ const violations = slug(' article-slug ', context);
61
+ expect(violations).toHaveLength(0);
62
+ });
63
+ });
64
+ function createContext(value, options = {}) {
65
+ return {
66
+ path: 'slug',
67
+ root: { slug: value },
68
+ value,
69
+ constraint: 'slug',
70
+ options,
71
+ runNestedRules: () => [],
72
+ };
73
+ }
74
+ //# sourceMappingURL=slug.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/slug.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEhD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE;QACpD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;QACrC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;QAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC9C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE;QAC9C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC/C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,EAAE;QACnD,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;KACrC,CAAC,CAAC,kCAAkC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAExC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,iCAAiC;YAC1C,KAAK;SACN,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAErC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,iCAAiC;YAC1C,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE9E,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,iBAAiB;YAC1B,KAAK,EAAE,cAAc;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,EAAE;YAC9C,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;SAC5C,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAEnD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,KAAc,EAAE,UAA6B,EAAE;IACpE,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACrB,KAAK;QACL,UAAU,EAAE,MAAM;QAClB,OAAO;QACP,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE;KACzB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  ]
19
19
  }
20
20
  },
21
- "version": "2.13.0",
21
+ "version": "2.14.0",
22
22
  "description": "A NodeJS framework for lazy developers",
23
23
  "keywords": [
24
24
  "koala",