@defra/forms-model 3.0.430 → 3.0.431

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 (45) hide show
  1. package/README.md +163 -1
  2. package/dist/module/common/pagination/index.js +2 -2
  3. package/dist/module/common/pagination/index.js.map +1 -1
  4. package/dist/module/common/search/index.js +4 -4
  5. package/dist/module/common/search/index.js.map +1 -1
  6. package/dist/module/common/sorting/index.js +2 -2
  7. package/dist/module/common/sorting/index.js.map +1 -1
  8. package/dist/module/form/form-definition/index.js +156 -156
  9. package/dist/module/form/form-definition/index.js.map +1 -1
  10. package/dist/module/form/form-editor/index.js +42 -42
  11. package/dist/module/form/form-editor/index.js.map +1 -1
  12. package/dist/module/form/form-manager/index.js +3 -3
  13. package/dist/module/form/form-manager/index.js.map +1 -1
  14. package/dist/module/form/form-metadata/index.js +34 -34
  15. package/dist/module/form/form-metadata/index.js.map +1 -1
  16. package/dist/module/form/form-submission/index.js +13 -13
  17. package/dist/module/form/form-submission/index.js.map +1 -1
  18. package/dist/module/types/joi-to-json.d.js +2 -0
  19. package/dist/module/types/joi-to-json.d.js.map +1 -0
  20. package/dist/types/common/pagination/index.d.ts.map +1 -1
  21. package/dist/types/common/search/index.d.ts.map +1 -1
  22. package/dist/types/common/sorting/index.d.ts.map +1 -1
  23. package/dist/types/form/form-definition/index.d.ts.map +1 -1
  24. package/dist/types/form/form-editor/index.d.ts +12 -12
  25. package/dist/types/form/form-editor/index.d.ts.map +1 -1
  26. package/dist/types/form/form-manager/index.d.ts.map +1 -1
  27. package/dist/types/form/form-metadata/index.d.ts.map +1 -1
  28. package/dist/types/form/form-submission/index.d.ts.map +1 -1
  29. package/package.json +6 -4
  30. package/scripts/generate-schemas.js +238 -0
  31. package/scripts/schema-modules/constants.js +39 -0
  32. package/scripts/schema-modules/schema-processors.js +109 -0
  33. package/scripts/schema-modules/schema-simplifiers.js +351 -0
  34. package/scripts/schema-modules/title-processors.js +327 -0
  35. package/scripts/schema-modules/types.js +21 -0
  36. package/scripts/schema-modules/utils.js +41 -0
  37. package/src/common/pagination/index.ts +8 -1
  38. package/src/common/search/index.ts +17 -3
  39. package/src/common/sorting/index.ts +8 -2
  40. package/src/form/form-definition/index.ts +567 -238
  41. package/src/form/form-editor/index.ts +202 -29
  42. package/src/form/form-manager/index.ts +11 -2
  43. package/src/form/form-metadata/index.ts +118 -40
  44. package/src/form/form-submission/index.ts +33 -10
  45. package/src/types/joi-to-json.d.ts +15 -0
package/README.md CHANGED
@@ -1,9 +1,171 @@
1
1
  # Defra forms model
2
2
 
3
- # Test coverage threshold
3
+ A model and validation library for Defra forms, providing the foundation for form definitions, components, validation, and data handling.
4
+
5
+ ## Features
6
+
7
+ - **Form Definition** - Core structures for forms, pages, components, and conditions
8
+ - **Component Library** - Pre-defined form components with validation
9
+ - **JSON Schema** - Ready-to-use JSON schema files for cross-platform validation
10
+ - **Conditions Engine** - Logic for determining form flow and visibility
11
+ - **Type Definitions** - Complete TypeScript type safety
12
+ - **Metadata Handling** - Support for form metadata, versioning, and state management
13
+
14
+ ## Installation
15
+
16
+ ```shell
17
+ npm install @defra/forms-model
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ### Form Definition
23
+
24
+ ```javascript
25
+ import { createForm } from '@defra/forms-model';
26
+
27
+ const form = createForm({
28
+ name: 'my-form',
29
+ pages: [
30
+ {
31
+ path: '/start',
32
+ title: 'Start page',
33
+ components: [/* components */]
34
+ }
35
+ ],
36
+ sections: [/* sections */]
37
+ });
38
+ ```
39
+
40
+ ### Component Usage
41
+
42
+ ```javascript
43
+ import { ComponentType } from '@defra/forms-model';
44
+
45
+ const textField = {
46
+ type: ComponentType.TextField,
47
+ name: 'fullName',
48
+ title: 'Full name',
49
+ schema: {
50
+ min: 2,
51
+ max: 100
52
+ }
53
+ };
54
+ ```
55
+
56
+ ### Form Validation
57
+
58
+ #### JSON Schema Files
59
+
60
+ This package includes pre-generated JSON schema files for use with external JSON Schema validators/ IDEs linting etc:
61
+
62
+ ```javascript
63
+ import formSchema from '@defra/forms-model/schemas/form-definition-schema.json';
64
+ ```
65
+
66
+ Available schema files include:
67
+
68
+ ##### Form Definition Schemas
69
+
70
+ - `form-definition-schema.json` - Full form definition validation
71
+ - `form-definition-v2-payload-schema.json` - Form definition v2 payload validation
72
+
73
+ ##### Component Schemas
74
+
75
+ - `component-schema.json` - Component validation
76
+ - `component-schema-v2.json` - Component validation (v2)
77
+
78
+ ##### Page Schemas
79
+
80
+ - `page-schema.json` - Page validation
81
+ - `page-schema-v2.json` - Page validation (v2)
82
+ - `page-schema-payload-v2.json` - Page payload validation (v2)
83
+
84
+ ##### List Schemas
85
+
86
+ - `list-schema.json` - List validation
87
+ - `list-schema-v2.json` - List validation (v2)
88
+
89
+ ##### Form Metadata Schemas
90
+
91
+ - `form-metadata-schema.json` - Form metadata validation
92
+ - `form-metadata-author-schema.json` - Form metadata author validation
93
+ - `form-metadata-input-schema.json` - Form metadata input validation
94
+ - `form-metadata-state-schema.json` - Form metadata state validation
95
+
96
+ ##### Form Metadata Field Schemas
97
+
98
+ - `form-metadata-contact-schema.json` - Contact information validation
99
+ - `form-metadata-email-schema.json` - Email validation
100
+ - `form-metadata-online-schema.json` - Online form metadata validation
101
+
102
+ ##### Form Editor Schemas
103
+
104
+ - `form-editor-input-page-schema.json` - Form editor input page validation
105
+ - `form-editor-input-check-answers-setting-schema.json` - Check answers setting validation
106
+ - `form-editor-input-question-schema.json` - Question input validation
107
+ - `form-editor-input-page-settings-schema.json` - Page settings validation
108
+
109
+ ##### Form Editor Field Schemas
110
+
111
+ - `page-type-schema.json` - Page type validation
112
+ - `question-type-schema.json` - Question type validation
113
+ - `question-type-full-schema.json` - Full question type validation
114
+ - `written-answer-sub-schema.json` - Written answer sub-schema validation
115
+ - `date-sub-schema.json` - Date sub-schema validation
116
+
117
+ ##### Form Submission Schemas
118
+
119
+ - `form-submit-payload-schema.json` - Form submission payload validation
120
+ - `form-submit-record-schema.json` - Form submission record validation
121
+ - `form-submit-recordset-schema.json` - Form submission recordset validation
122
+
123
+ ##### Form Manager Schemas
124
+
125
+ - `patch-page-schema.json` - Patch page validation
126
+
127
+ ##### Section Schemas
128
+
129
+ - `question-schema.json` - Question validation
130
+
131
+ ##### Validation Schemas
132
+
133
+ - `min-schema.json` - Minimum value validation
134
+ - `max-schema.json` - Maximum value validation
135
+ - `min-length-schema.json` - Minimum length validation
136
+ - `max-length-schema.json` - Maximum length validation
137
+ - `max-future-schema.json` - Maximum future date validation
138
+ - `max-past-schema.json` - Maximum past date validation
139
+
140
+ ##### Common Schemas
141
+
142
+ - `search-options-schema.json` - Search options validation
143
+ - `query-options-schema.json` - Query options validation
144
+ - `pagination-options-schema.json` - Pagination options validation
145
+ - `sorting-options-schema.json` - Sorting options validation
146
+
147
+ ## Development
148
+
149
+ ### Test Coverage
4
150
 
5
151
  Unit test coverage threshold, code coverage below which build will fail is set by using jest config, at the moment line coverage threshold is set as 92%, see [jest.config.js](jest.config.js)
6
152
 
153
+ ### JSON Schema Generation and Publishing
154
+
155
+ This package generates JSON Schema files from Joi validation schemas during the build process. These schemas are included in the published npm package and are available at runtime.
156
+
157
+ #### How It Works
158
+
159
+ When you run `npm run build`, the script `scripts/generate-schemas.js` is executed which:
160
+
161
+ 1. Converts Joi validation schemas to JSON Schema format
162
+ 2. Enhances schemas with titles and descriptions
163
+ 3. Writes schema files to the `schemas/` directory
164
+
165
+ #### Known Quirks
166
+
167
+ 1. **First Build Required**: After a fresh clone, you must run `npm run build` before the schema files will be available locally.
168
+
7
169
  ## License
8
170
 
9
171
  THIS INFORMATION IS LICENSED UNDER THE CONDITIONS OF THE OPEN GOVERNMENT LICENCE found at:
@@ -3,8 +3,8 @@ import Joi from 'joi';
3
3
  * Field definitions for pagination options.
4
4
  */
5
5
  export const paginationOptionFields = {
6
- page: Joi.number().positive().integer().default(1).min(1).optional(),
7
- perPage: Joi.number().positive().integer().default(24).min(1).max(200).optional()
6
+ page: Joi.number().positive().integer().default(1).min(1).optional().description('Current page number, starting from 1'),
7
+ perPage: Joi.number().positive().integer().default(24).min(1).max(200).optional().description('Number of items to display per page, between 1 and 200')
8
8
  };
9
9
 
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","paginationOptionFields","page","number","positive","integer","default","min","optional","perPage","max","paginationOptionsSchema","object"],"sources":["../../../../src/common/pagination/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type PaginationOptions } from '~/src/common/pagination/types.js'\n\n/**\n * Field definitions for pagination options.\n */\nexport const paginationOptionFields = {\n page: Joi.number().positive().integer().default(1).min(1).optional(),\n perPage: Joi.number()\n .positive()\n .integer()\n .default(24)\n .min(1)\n .max(200)\n .optional()\n}\n\n/**\n * Joi schema for `PaginationOptions` interface\n * @see {@link PaginationOptions}\n */\nexport const paginationOptionsSchema: Joi.ObjectSchema<PaginationOptions> =\n Joi.object(paginationOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,GAAG;EACpCC,IAAI,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACpEC,OAAO,EAAET,GAAG,CAACG,MAAM,CAAC,CAAC,CAClBC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,CAAC,CACTC,OAAO,CAAC,EAAE,CAAC,CACXC,GAAG,CAAC,CAAC,CAAC,CACNG,GAAG,CAAC,GAAG,CAAC,CACRF,QAAQ,CAAC;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMG,uBAA4D,GACvEX,GAAG,CAACY,MAAM,CAACX,sBAAsB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Joi","paginationOptionFields","page","number","positive","integer","default","min","optional","description","perPage","max","paginationOptionsSchema","object"],"sources":["../../../../src/common/pagination/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type PaginationOptions } from '~/src/common/pagination/types.js'\n\n/**\n * Field definitions for pagination options.\n */\nexport const paginationOptionFields = {\n page: Joi.number()\n .positive()\n .integer()\n .default(1)\n .min(1)\n .optional()\n .description('Current page number, starting from 1'),\n perPage: Joi.number()\n .positive()\n .integer()\n .default(24)\n .min(1)\n .max(200)\n .optional()\n .description('Number of items to display per page, between 1 and 200')\n}\n\n/**\n * Joi schema for `PaginationOptions` interface\n * @see {@link PaginationOptions}\n */\nexport const paginationOptionsSchema: Joi.ObjectSchema<PaginationOptions> =\n Joi.object(paginationOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,GAAG;EACpCC,IAAI,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,CAAC,CACTC,OAAO,CAAC,CAAC,CAAC,CACVC,GAAG,CAAC,CAAC,CAAC,CACNC,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,sCAAsC,CAAC;EACtDC,OAAO,EAAEV,GAAG,CAACG,MAAM,CAAC,CAAC,CAClBC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,CAAC,CACTC,OAAO,CAAC,EAAE,CAAC,CACXC,GAAG,CAAC,CAAC,CAAC,CACNI,GAAG,CAAC,GAAG,CAAC,CACRH,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,wDAAwD;AACzE,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMG,uBAA4D,GACvEZ,GAAG,CAACa,MAAM,CAACZ,sBAAsB,CAAC","ignoreList":[]}
@@ -5,10 +5,10 @@ import { organisations } from "../../form/form-metadata/index.js";
5
5
  * Field definitions for search options.
6
6
  */
7
7
  export const searchOptionFields = {
8
- title: Joi.string().trim().allow('').max(255).optional().default(''),
9
- author: Joi.string().trim().allow('').max(100).optional().default(''),
10
- organisations: Joi.array().items(Joi.string().valid(...organisations)).single().optional().default([]),
11
- status: Joi.array().items(Joi.string().valid('draft', 'live')).single().optional().default([])
8
+ title: Joi.string().trim().allow('').max(255).optional().default('').description('Search by form title, empty string matches all'),
9
+ author: Joi.string().trim().allow('').max(100).optional().default('').description('Search by form author, empty string matches all'),
10
+ organisations: Joi.array().items(Joi.string().valid(...organisations)).single().optional().default([]).description('Filter by organisation(s), empty array matches all'),
11
+ status: Joi.array().items(Joi.string().valid('draft', 'live')).single().optional().default([]).description('Filter by form status(es), empty array matches all')
12
12
  };
13
13
 
14
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","organisations","searchOptionFields","title","string","trim","allow","max","optional","default","author","array","items","valid","single","status","searchOptionsSchema","object"],"sources":["../../../../src/common/search/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SearchOptions } from '~/src/common/search/types.js'\nimport { organisations } from '~/src/form/form-metadata/index.js'\n\n/**\n * Field definitions for search options.\n */\nexport const searchOptionFields = {\n title: Joi.string().trim().allow('').max(255).optional().default(''),\n author: Joi.string().trim().allow('').max(100).optional().default(''),\n organisations: Joi.array()\n .items(Joi.string().valid(...organisations))\n .single()\n .optional()\n .default([]),\n status: Joi.array()\n .items(Joi.string().valid('draft', 'live'))\n .single()\n .optional()\n .default([])\n}\n\n/**\n * Joi schema for {@link SearchOptions} interface\n */\nexport const searchOptionsSchema: Joi.ObjectSchema<SearchOptions> =\n Joi.object(searchOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAGrB,SAASC,aAAa;;AAEtB;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,GAAG;EAChCC,KAAK,EAAEH,GAAG,CAACI,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,EAAE,CAAC,CAACC,GAAG,CAAC,GAAG,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,EAAE,CAAC;EACpEC,MAAM,EAAEV,GAAG,CAACI,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,EAAE,CAAC,CAACC,GAAG,CAAC,GAAG,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,EAAE,CAAC;EACrER,aAAa,EAAED,GAAG,CAACW,KAAK,CAAC,CAAC,CACvBC,KAAK,CAACZ,GAAG,CAACI,MAAM,CAAC,CAAC,CAACS,KAAK,CAAC,GAAGZ,aAAa,CAAC,CAAC,CAC3Ca,MAAM,CAAC,CAAC,CACRN,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC;EACdM,MAAM,EAAEf,GAAG,CAACW,KAAK,CAAC,CAAC,CAChBC,KAAK,CAACZ,GAAG,CAACI,MAAM,CAAC,CAAC,CAACS,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAC1CC,MAAM,CAAC,CAAC,CACRN,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE;AACf,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMO,mBAAoD,GAC/DhB,GAAG,CAACiB,MAAM,CAACf,kBAAkB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Joi","organisations","searchOptionFields","title","string","trim","allow","max","optional","default","description","author","array","items","valid","single","status","searchOptionsSchema","object"],"sources":["../../../../src/common/search/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SearchOptions } from '~/src/common/search/types.js'\nimport { organisations } from '~/src/form/form-metadata/index.js'\n\n/**\n * Field definitions for search options.\n */\nexport const searchOptionFields = {\n title: Joi.string()\n .trim()\n .allow('')\n .max(255)\n .optional()\n .default('')\n .description('Search by form title, empty string matches all'),\n author: Joi.string()\n .trim()\n .allow('')\n .max(100)\n .optional()\n .default('')\n .description('Search by form author, empty string matches all'),\n organisations: Joi.array()\n .items(Joi.string().valid(...organisations))\n .single()\n .optional()\n .default([])\n .description('Filter by organisation(s), empty array matches all'),\n status: Joi.array()\n .items(Joi.string().valid('draft', 'live'))\n .single()\n .optional()\n .default([])\n .description('Filter by form status(es), empty array matches all')\n}\n\n/**\n * Joi schema for {@link SearchOptions} interface\n */\nexport const searchOptionsSchema: Joi.ObjectSchema<SearchOptions> =\n Joi.object(searchOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAGrB,SAASC,aAAa;;AAEtB;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,GAAG;EAChCC,KAAK,EAAEH,GAAG,CAACI,MAAM,CAAC,CAAC,CAChBC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,EAAE,CAAC,CACTC,GAAG,CAAC,GAAG,CAAC,CACRC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,gDAAgD,CAAC;EAChEC,MAAM,EAAEX,GAAG,CAACI,MAAM,CAAC,CAAC,CACjBC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,EAAE,CAAC,CACTC,GAAG,CAAC,GAAG,CAAC,CACRC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,iDAAiD,CAAC;EACjET,aAAa,EAAED,GAAG,CAACY,KAAK,CAAC,CAAC,CACvBC,KAAK,CAACb,GAAG,CAACI,MAAM,CAAC,CAAC,CAACU,KAAK,CAAC,GAAGb,aAAa,CAAC,CAAC,CAC3Cc,MAAM,CAAC,CAAC,CACRP,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,oDAAoD,CAAC;EACpEM,MAAM,EAAEhB,GAAG,CAACY,KAAK,CAAC,CAAC,CAChBC,KAAK,CAACb,GAAG,CAACI,MAAM,CAAC,CAAC,CAACU,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAC1CC,MAAM,CAAC,CAAC,CACRP,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,EAAE,CAAC,CACXC,WAAW,CAAC,oDAAoD;AACrE,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMO,mBAAoD,GAC/DjB,GAAG,CAACkB,MAAM,CAAChB,kBAAkB,CAAC","ignoreList":[]}
@@ -3,8 +3,8 @@ import Joi from 'joi';
3
3
  * Field definitions for sorting options.
4
4
  */
5
5
  export const sortingOptionFields = {
6
- sortBy: Joi.string().valid('updatedAt', 'title').optional(),
7
- order: Joi.string().valid('asc', 'desc').optional()
6
+ sortBy: Joi.string().valid('updatedAt', 'title').optional().description('Field to sort results by'),
7
+ order: Joi.string().valid('asc', 'desc').optional().description('Sort order (ascending or descending)')
8
8
  };
9
9
 
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","sortingOptionFields","sortBy","string","valid","optional","order","sortingOptionsSchema","object"],"sources":["../../../../src/common/sorting/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SortingOptions } from '~/src/common/sorting/types.js'\n\n/**\n * Field definitions for sorting options.\n */\nexport const sortingOptionFields = {\n sortBy: Joi.string().valid('updatedAt', 'title').optional(),\n order: Joi.string().valid('asc', 'desc').optional()\n}\n\n/**\n * Joi schema for `SortingOptions` interface\n * @see {@link SortingOptions}\n */\nexport const sortingOptionsSchema: Joi.ObjectSchema<SortingOptions> =\n Joi.object(sortingOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG;EACjCC,MAAM,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,CAACC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAACC,QAAQ,CAAC,CAAC;EAC3DC,KAAK,EAAEN,GAAG,CAACG,MAAM,CAAC,CAAC,CAACC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAAC;AACpD,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAME,oBAAsD,GACjEP,GAAG,CAACQ,MAAM,CAACP,mBAAmB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Joi","sortingOptionFields","sortBy","string","valid","optional","description","order","sortingOptionsSchema","object"],"sources":["../../../../src/common/sorting/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { type SortingOptions } from '~/src/common/sorting/types.js'\n\n/**\n * Field definitions for sorting options.\n */\nexport const sortingOptionFields = {\n sortBy: Joi.string()\n .valid('updatedAt', 'title')\n .optional()\n .description('Field to sort results by'),\n order: Joi.string()\n .valid('asc', 'desc')\n .optional()\n .description('Sort order (ascending or descending)')\n}\n\n/**\n * Joi schema for `SortingOptions` interface\n * @see {@link SortingOptions}\n */\nexport const sortingOptionsSchema: Joi.ObjectSchema<SortingOptions> =\n Joi.object(sortingOptionFields)\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAIrB;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG;EACjCC,MAAM,EAAEF,GAAG,CAACG,MAAM,CAAC,CAAC,CACjBC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAC3BC,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,0BAA0B,CAAC;EAC1CC,KAAK,EAAEP,GAAG,CAACG,MAAM,CAAC,CAAC,CAChBC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CACpBC,QAAQ,CAAC,CAAC,CACVC,WAAW,CAAC,sCAAsC;AACvD,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAME,oBAAsD,GACjER,GAAG,CAACS,MAAM,CAACR,mBAAmB,CAAC","ignoreList":[]}