@panneau/protocol 5.0.0-alpha.3 → 5.0.0-alpha.5

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 (67) hide show
  1. package/dist/conformance/index.d.ts.map +1 -1
  2. package/dist/conformance/index.js +151 -1
  3. package/dist/conformance/index.js.map +1 -1
  4. package/dist/constants.d.ts +2 -2
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +3 -1
  7. package/dist/constants.js.map +1 -1
  8. package/dist/index.js +5 -2
  9. package/dist/libraries.d.ts +16 -0
  10. package/dist/libraries.d.ts.map +1 -0
  11. package/dist/libraries.js +15 -0
  12. package/dist/libraries.js.map +1 -0
  13. package/dist/lint.d.ts +2 -1
  14. package/dist/lint.d.ts.map +1 -1
  15. package/dist/lint.js +34 -2
  16. package/dist/lint.js.map +1 -1
  17. package/dist/mock/example.d.ts +2 -1
  18. package/dist/mock/example.d.ts.map +1 -1
  19. package/dist/mock/example.js +227 -143
  20. package/dist/mock/example.js.map +1 -1
  21. package/dist/mock/index.d.ts +9 -1
  22. package/dist/mock/index.d.ts.map +1 -1
  23. package/dist/mock/index.js +257 -11
  24. package/dist/mock/index.js.map +1 -1
  25. package/dist/openapi.d.ts.map +1 -1
  26. package/dist/openapi.js +55 -101
  27. package/dist/openapi.js.map +1 -1
  28. package/dist/rules.d.ts.map +1 -1
  29. package/dist/rules.js +17 -0
  30. package/dist/rules.js.map +1 -1
  31. package/dist/runtime/index.d.ts +3 -0
  32. package/dist/runtime/index.d.ts.map +1 -1
  33. package/dist/runtime/index.js +4 -1
  34. package/dist/schemas/action.d.ts +17 -1
  35. package/dist/schemas/action.d.ts.map +1 -1
  36. package/dist/schemas/api.d.ts +155 -37
  37. package/dist/schemas/api.d.ts.map +1 -1
  38. package/dist/schemas/api.js +89 -28
  39. package/dist/schemas/api.js.map +1 -1
  40. package/dist/schemas/definition.d.ts +39 -2
  41. package/dist/schemas/definition.d.ts.map +1 -1
  42. package/dist/schemas/definition.js +4 -3
  43. package/dist/schemas/definition.js.map +1 -1
  44. package/dist/schemas/field.d.ts +24 -1
  45. package/dist/schemas/field.d.ts.map +1 -1
  46. package/dist/schemas/field.js +22 -4
  47. package/dist/schemas/field.js.map +1 -1
  48. package/dist/schemas/index.d.ts +262 -40
  49. package/dist/schemas/index.d.ts.map +1 -1
  50. package/dist/schemas/index.js +13 -5
  51. package/dist/schemas/index.js.map +1 -1
  52. package/dist/schemas/resource.d.ts +37 -2
  53. package/dist/schemas/resource.d.ts.map +1 -1
  54. package/dist/schemas/resource.js +4 -1
  55. package/dist/schemas/resource.js.map +1 -1
  56. package/dist/search.d.ts +51 -0
  57. package/dist/search.d.ts.map +1 -0
  58. package/dist/search.js +53 -0
  59. package/dist/search.js.map +1 -0
  60. package/dist/transforms.d.ts +17 -0
  61. package/dist/transforms.d.ts.map +1 -0
  62. package/dist/transforms.js +34 -0
  63. package/dist/transforms.js.map +1 -0
  64. package/package.json +1 -1
  65. package/schema/boot.schema.json +84 -1
  66. package/schema/definition.schema.json +84 -1
  67. package/schema/openapi.json +771 -605
@@ -9,7 +9,8 @@ var User = z.looseObject({
9
9
  name: z.string(),
10
10
  email: z.string().optional(),
11
11
  avatarUrl: z.string().optional(),
12
- abilities: Abilities.optional()
12
+ abilities: Abilities.optional(),
13
+ resource: z.string().optional().meta({ description: "The resource of users: its item with this `id` is the profile of the user. Without it, clients look for a resource `users`." })
13
14
  });
14
15
  var AuthProvider = z.looseObject({
15
16
  id: z.string().min(1),
@@ -57,8 +58,8 @@ var Uploads = z.looseObject({
57
58
  "multipart",
58
59
  "tus",
59
60
  "presigned"
60
- ]),
61
- endpoint: z.string().optional(),
61
+ ]).meta({ description: "`multipart`: files go through `POST /media` and the requests that take them. `presigned`: the browser also sends files to storage itself, with URLs that `POST /uploads/sign` signs, then `POST /uploads/{upload}/complete` gives an upload that values reference." }),
62
+ endpoint: z.string().optional().meta({ description: "`presigned`: the base URL of the upload routes, when they are not `{api.baseUrl}/uploads`." }),
62
63
  maxSize: z.number().int().positive().optional()
63
64
  });
64
65
  var Definition = z.looseObject({
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","names":[],"sources":["../../src/schemas/definition.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { PROTOCOL_VERSION } from '../version';\nimport { Abilities, Id } from './common';\nimport { Resource } from './resource';\nimport { DefinitionTheme } from './theme';\n\nexport const User = z.looseObject({\n id: Id,\n name: z.string(),\n email: z.string().optional(),\n avatarUrl: z.string().optional(),\n abilities: Abilities.optional(),\n});\n\nexport const AuthProvider = z.looseObject({\n id: z.string().min(1),\n label: z.string(),\n url: z.string().optional().meta({ description: 'Where the login with this provider starts.' }),\n icon: z.string().optional(),\n});\n\nexport const Auth = z.looseObject({\n mode: z.enum(['panneau', 'external']).meta({\n description: \"`panneau`: Panneau's own login pages. `external`: the site handles login.\",\n }),\n loginUrl: z\n .string()\n .nullable()\n .optional()\n .meta({ description: '`external`: where unauthenticated users are sent.' }),\n password: z.boolean().optional(),\n providers: z.array(AuthProvider).optional(),\n passwordReset: z.boolean().optional(),\n twoFactor: z.boolean().optional(),\n passkeys: z.boolean().optional(),\n emailVerification: z.boolean().optional(),\n});\n\nexport const MenuItem = z\n .looseObject({\n type: z.string().min(1).meta({\n description: 'Built-in: `resources`, `resource`, `page`, `link`, `separator`, `group`.',\n }),\n label: z.string().optional(),\n icon: z.string().optional(),\n resource: z.string().optional(),\n page: z.string().optional(),\n url: z.string().optional(),\n external: z.boolean().optional(),\n // The return type is written out so that declaration files keep the recursion.\n get children(): z.ZodOptional<z.ZodArray<typeof MenuItem>> {\n return z.array(MenuItem).optional();\n },\n })\n .meta({ description: 'An entry of a menu.' });\n\nexport const Page = z.looseObject({\n component: z\n .string()\n .min(1)\n .meta({ description: 'A page provided by a plugin, or a built-in page.' }),\n path: z.string().optional().meta({ description: 'Path of a custom page.' }),\n label: z.string().optional(),\n props: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const Widget = z.looseObject({\n id: z.string().min(1),\n type: z.string().min(1).meta({\n description: 'Built-in: `stat`, `chart`, `recent-items`, `shortcuts`, `welcome`.',\n }),\n label: z.string().optional(),\n width: z.number().int().min(1).max(12).optional(),\n settings: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const Uploads = z.looseObject({\n mode: z.enum(['multipart', 'tus', 'presigned']),\n endpoint: z.string().optional(),\n maxSize: z.number().int().positive().optional(),\n});\n\nexport const Definition = z\n .looseObject({\n protocol: z.literal(PROTOCOL_VERSION),\n name: z.string(),\n locale: z\n .string()\n .min(2)\n .meta({ description: 'BCP 47 locale of the labels and messages.' }),\n locales: z\n .array(z.string().min(2))\n .min(1)\n .meta({ description: 'Locales of localized content fields.' }),\n api: z.looseObject({ baseUrl: z.string() }),\n resources: z.array(Resource),\n pages: z.record(z.string(), Page).optional(),\n menus: z.record(z.string(), z.array(MenuItem)).optional(),\n routes: z.record(z.string(), z.string()).optional().meta({\n description: 'Named paths of the frontend, for `link` actions and redirects.',\n }),\n auth: Auth.optional(),\n dashboard: z.looseObject({ widgets: z.array(Widget) }).optional(),\n search: z.looseObject({ enabled: z.boolean() }).optional(),\n uploads: Uploads.optional(),\n theme: DefinitionTheme.optional(),\n user: User.nullable().optional(),\n })\n .superRefine((definition, context) => {\n const ids = new Set<string>();\n definition.resources.forEach((resource, index) => {\n if (ids.has(resource.id)) {\n context.addIssue({\n code: 'custom',\n message: `Duplicate resource id \\`${resource.id}\\`.`,\n path: ['resources', index, 'id'],\n });\n }\n ids.add(resource.id);\n });\n })\n .meta({ description: 'Everything a frontend needs to render the admin for the current user.' });\n\nexport type User = z.infer<typeof User>;\nexport type AuthProvider = z.infer<typeof AuthProvider>;\nexport type Auth = z.infer<typeof Auth>;\nexport type MenuItem = z.infer<typeof MenuItem>;\nexport type Page = z.infer<typeof Page>;\nexport type Widget = z.infer<typeof Widget>;\nexport type Uploads = z.infer<typeof Uploads>;\nexport type Definition = z.infer<typeof Definition>;\n/** A definition as a backend writes it, before defaults are applied. */\nexport type DefinitionInput = z.input<typeof Definition>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"definition.js","names":[],"sources":["../../src/schemas/definition.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { PROTOCOL_VERSION } from '../version';\nimport { Abilities, Id } from './common';\nimport { Resource } from './resource';\nimport { DefinitionTheme } from './theme';\n\nexport const User = z.looseObject({\n id: Id,\n name: z.string(),\n email: z.string().optional(),\n avatarUrl: z.string().optional(),\n abilities: Abilities.optional(),\n resource: z.string().optional().meta({\n description:\n 'The resource of users: its item with this `id` is the profile of the user. Without it, clients look for a resource `users`.',\n }),\n});\n\nexport const AuthProvider = z.looseObject({\n id: z.string().min(1),\n label: z.string(),\n url: z.string().optional().meta({ description: 'Where the login with this provider starts.' }),\n icon: z.string().optional(),\n});\n\nexport const Auth = z.looseObject({\n mode: z.enum(['panneau', 'external']).meta({\n description: \"`panneau`: Panneau's own login pages. `external`: the site handles login.\",\n }),\n loginUrl: z\n .string()\n .nullable()\n .optional()\n .meta({ description: '`external`: where unauthenticated users are sent.' }),\n password: z.boolean().optional(),\n providers: z.array(AuthProvider).optional(),\n passwordReset: z.boolean().optional(),\n twoFactor: z.boolean().optional(),\n passkeys: z.boolean().optional(),\n emailVerification: z.boolean().optional(),\n});\n\nexport const MenuItem = z\n .looseObject({\n type: z.string().min(1).meta({\n description: 'Built-in: `resources`, `resource`, `page`, `link`, `separator`, `group`.',\n }),\n label: z.string().optional(),\n icon: z.string().optional(),\n resource: z.string().optional(),\n page: z.string().optional(),\n url: z.string().optional(),\n external: z.boolean().optional(),\n // The return type is written out so that declaration files keep the recursion.\n get children(): z.ZodOptional<z.ZodArray<typeof MenuItem>> {\n return z.array(MenuItem).optional();\n },\n })\n .meta({ description: 'An entry of a menu.' });\n\nexport const Page = z.looseObject({\n component: z\n .string()\n .min(1)\n .meta({ description: 'A page provided by a plugin, or a built-in page.' }),\n path: z.string().optional().meta({ description: 'Path of a custom page.' }),\n label: z.string().optional(),\n props: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const Widget = z.looseObject({\n id: z.string().min(1),\n type: z.string().min(1).meta({\n description: 'Built-in: `stat`, `chart`, `recent-items`, `shortcuts`, `welcome`.',\n }),\n label: z.string().optional(),\n width: z.number().int().min(1).max(12).optional(),\n settings: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const Uploads = z.looseObject({\n mode: z.enum(['multipart', 'tus', 'presigned']).meta({\n description:\n '`multipart`: files go through `POST /media` and the requests that take them. `presigned`: the browser also sends files to storage itself, with URLs that `POST /uploads/sign` signs, then `POST /uploads/{upload}/complete` gives an upload that values reference.',\n }),\n endpoint: z.string().optional().meta({\n description:\n '`presigned`: the base URL of the upload routes, when they are not `{api.baseUrl}/uploads`.',\n }),\n maxSize: z.number().int().positive().optional(),\n});\n\nexport const Definition = z\n .looseObject({\n protocol: z.literal(PROTOCOL_VERSION),\n name: z.string(),\n locale: z\n .string()\n .min(2)\n .meta({ description: 'BCP 47 locale of the labels and messages.' }),\n locales: z\n .array(z.string().min(2))\n .min(1)\n .meta({ description: 'Locales of localized content fields.' }),\n api: z.looseObject({ baseUrl: z.string() }),\n resources: z.array(Resource),\n pages: z.record(z.string(), Page).optional(),\n menus: z.record(z.string(), z.array(MenuItem)).optional(),\n routes: z.record(z.string(), z.string()).optional().meta({\n description: 'Named paths of the frontend, for `link` actions and redirects.',\n }),\n auth: Auth.optional(),\n dashboard: z.looseObject({ widgets: z.array(Widget) }).optional(),\n search: z.looseObject({ enabled: z.boolean() }).optional(),\n uploads: Uploads.optional(),\n theme: DefinitionTheme.optional(),\n user: User.nullable().optional(),\n })\n .superRefine((definition, context) => {\n const ids = new Set<string>();\n definition.resources.forEach((resource, index) => {\n if (ids.has(resource.id)) {\n context.addIssue({\n code: 'custom',\n message: `Duplicate resource id \\`${resource.id}\\`.`,\n path: ['resources', index, 'id'],\n });\n }\n ids.add(resource.id);\n });\n })\n .meta({ description: 'Everything a frontend needs to render the admin for the current user.' });\n\nexport type User = z.infer<typeof User>;\nexport type AuthProvider = z.infer<typeof AuthProvider>;\nexport type Auth = z.infer<typeof Auth>;\nexport type MenuItem = z.infer<typeof MenuItem>;\nexport type Page = z.infer<typeof Page>;\nexport type Widget = z.infer<typeof Widget>;\nexport type Uploads = z.infer<typeof Uploads>;\nexport type Definition = z.infer<typeof Definition>;\n/** A definition as a backend writes it, before defaults are applied. */\nexport type DefinitionInput = z.input<typeof Definition>;\n"],"mappings":"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"}
@@ -42,6 +42,13 @@ export declare const Rule: z.ZodUnion<readonly [z.ZodObject<{
42
42
  field: z.ZodString;
43
43
  }, z.core.$loose>]>;
44
44
  message: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$loose>, z.ZodObject<{
46
+ rule: z.ZodLiteral<"crop">;
47
+ value: z.ZodObject<{
48
+ ratios: z.ZodOptional<z.ZodArray<z.ZodString>>;
49
+ required: z.ZodOptional<z.ZodBoolean>;
50
+ }, z.core.$loose>;
51
+ message: z.ZodOptional<z.ZodString>;
45
52
  }, z.core.$loose>, z.ZodObject<{
46
53
  rule: z.ZodString;
47
54
  message: z.ZodOptional<z.ZodString>;
@@ -105,6 +112,13 @@ export declare const Field: z.ZodObject<{
105
112
  field: z.ZodString;
106
113
  }, z.core.$loose>]>;
107
114
  message: z.ZodOptional<z.ZodString>;
115
+ }, z.core.$loose>, z.ZodObject<{
116
+ rule: z.ZodLiteral<"crop">;
117
+ value: z.ZodObject<{
118
+ ratios: z.ZodOptional<z.ZodArray<z.ZodString>>;
119
+ required: z.ZodOptional<z.ZodBoolean>;
120
+ }, z.core.$loose>;
121
+ message: z.ZodOptional<z.ZodString>;
108
122
  }, z.core.$loose>, z.ZodObject<{
109
123
  rule: z.ZodString;
110
124
  message: z.ZodOptional<z.ZodString>;
@@ -125,9 +139,18 @@ export declare const Field: z.ZodObject<{
125
139
  disabled: z.ZodOptional<z.ZodBoolean>;
126
140
  }, z.core.$loose>>>;
127
141
  multiple: z.ZodOptional<z.ZodBoolean>;
128
- resource: z.ZodOptional<z.ZodString>;
142
+ resource: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
129
143
  accept: z.ZodOptional<z.ZodArray<z.ZodString>>;
144
+ ratios: z.ZodOptional<z.ZodArray<z.ZodString>>;
145
+ rotate: z.ZodOptional<z.ZodBoolean>;
146
+ focalPoint: z.ZodOptional<z.ZodBoolean>;
147
+ transformBase: z.ZodOptional<z.ZodEnum<{
148
+ media: "media";
149
+ original: "original";
150
+ choose: "choose";
151
+ }>>;
130
152
  from: z.ZodOptional<z.ZodString>;
153
+ check: z.ZodOptional<z.ZodBoolean>;
131
154
  display: z.ZodOptional<z.ZodString>;
132
155
  fields: z.ZodOptional<z.ZodArray<typeof Field>>;
133
156
  types: z.ZodOptional<z.ZodArray<typeof BlockType>>;
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/schemas/field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAU,MAAM,UAAU,CAAC;AAY7C,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAkCX,CAAC;AAEP,eAAO,MAAM,SAAS;;;;YAKJ,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC;iBAGxC,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwCI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC;WAMxC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,SAAS,CAAC,CAAC;;iBAQhB,CAAC;AAEjD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AACxC,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/schemas/field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAU,MAAM,UAAU,CAAC;AAiB7C,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAgDX,CAAC;AAEP,eAAO,MAAM,SAAS;;;;YAKJ,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC;iBAGxC,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA4DI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC;WAMxC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,SAAS,CAAC,CAAC;;iBAQhB,CAAC;AAEjD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AACxC,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC"}
@@ -3,6 +3,7 @@ import { Condition, Option } from "./common.js";
3
3
  import { z } from "zod";
4
4
  //#region src/schemas/field.ts
5
5
  var message = z.string().optional().meta({ description: "Message shown when the rule fails, instead of the default one." });
6
+ var Ratio = z.string().regex(/^[1-9][0-9]*:[1-9][0-9]*$/).meta({ description: "An aspect ratio, as `width:height`: `16:9`." });
6
7
  var DateBound = z.union([z.string().meta({ description: "An ISO 8601 date or date-time." }), z.looseObject({ field: z.string().min(1) }).meta({ description: "Another field of the form." })]);
7
8
  var Rule = z.union([
8
9
  z.looseObject({
@@ -48,11 +49,19 @@ var Rule = z.union([
48
49
  value: DateBound,
49
50
  message
50
51
  }),
52
+ z.looseObject({
53
+ rule: z.literal("crop"),
54
+ value: z.looseObject({
55
+ ratios: z.array(Ratio).optional().meta({ description: "A crop must have one of them: its height is within one pixel of its width divided by the ratio, after its rotation." }),
56
+ required: z.boolean().optional().meta({ description: "Each image needs a crop for this use." })
57
+ }),
58
+ message
59
+ }),
51
60
  z.looseObject({
52
61
  rule: z.string().refine((rule) => !PORTABLE_RULES.includes(rule)),
53
62
  message
54
63
  }).meta({ description: "A rule added in a later version of the protocol. Clients that don't know it ignore it; the server still enforces it." })
55
- ]).meta({ description: "A portable validation rule. `min` and `max` apply to numbers, and to the length of text and arrays. `accept` lists MIME types (`image/*`). `maxSize` is in bytes." });
64
+ ]).meta({ description: "A portable validation rule. `min` and `max` apply to numbers, and to the length of text and arrays. `accept` lists MIME types (`image/*`). `maxSize` is in bytes. `crop` checks the transform of each image of an `image` or `media` value (decision 0031)." });
56
65
  var BlockType = z.looseObject({
57
66
  id: z.string().min(1),
58
67
  label: z.string(),
@@ -75,10 +84,19 @@ var Field = z.looseObject({
75
84
  rules: z.array(Rule).optional(),
76
85
  visibleWhen: Condition.optional(),
77
86
  options: z.array(Option).optional().meta({ description: "`select`: the choices." }),
78
- multiple: z.boolean().optional().meta({ description: "`select`, `relation`, `media`: the value is an array." }),
79
- resource: z.string().optional().meta({ description: "`relation`: id of the related resource." }),
80
- accept: z.array(z.string()).optional().meta({ description: "`media`: accepted MIME types." }),
87
+ multiple: z.boolean().optional().meta({ description: "`select`, `relation`, `media`, `image`, `file`: the value is an array." }),
88
+ resource: z.union([z.string().min(1), z.array(z.string().min(1)).min(1)]).optional().meta({ description: "`relation`: id of the related resource. `media`, `image`: id of a resource of kind `media`, or a list of them; without it, every library of the definition (decision 0027)." }),
89
+ accept: z.array(z.string()).optional().meta({ description: "`media`, `image`, `file`: accepted MIME types. `image` defaults to `image/*`." }),
90
+ ratios: z.array(Ratio).optional().meta({ description: "`image`: ratios the editor suggests. The `crop` rule enforces ratios (decision 0031)." }),
91
+ rotate: z.boolean().optional().meta({ description: "`image`: whether the editor offers rotation and flips. Defaults to true." }),
92
+ focalPoint: z.boolean().optional().meta({ description: "`image`: whether the editor offers the focal point. Defaults to true." }),
93
+ transformBase: z.enum([
94
+ "media",
95
+ "original",
96
+ "choose"
97
+ ]).optional().meta({ description: "`image`: what a transform for one use starts from: the media's own transform (`media`, the default), the original file, or the user's choice in the editor (decision 0031)." }),
81
98
  from: z.string().optional().meta({ description: "`slug`: the field the slug is generated from." }),
99
+ check: z.boolean().optional().meta({ description: "The client checks the value with the backend as it is typed, with `POST /resources/{resource}/fields/{field}/check`: whether a `slug` is available, and its URL. A field at the top of the resource only." }),
82
100
  display: z.string().optional().meta({ description: "Display used in lists, when it differs from the default one of the type." }),
83
101
  get fields() {
84
102
  return z.array(Field).optional().meta({ description: "`group` and `repeater`: the nested fields." });
@@ -1 +1 @@
1
- {"version":3,"file":"field.js","names":[],"sources":["../../src/schemas/field.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { PORTABLE_RULES } from '../constants';\nimport { Condition, Option } from './common';\n\nconst message = z\n .string()\n .optional()\n .meta({ description: 'Message shown when the rule fails, instead of the default one.' });\n\nconst DateBound = z.union([\n z.string().meta({ description: 'An ISO 8601 date or date-time.' }),\n z.looseObject({ field: z.string().min(1) }).meta({ description: 'Another field of the form.' }),\n]);\n\nexport const Rule = z\n .union([\n z.looseObject({ rule: z.literal('required'), message }),\n z.looseObject({ rule: z.enum(['min', 'max']), value: z.number(), message }),\n z.looseObject({\n rule: z.literal('pattern'),\n value: z.string(),\n flags: z.string().optional(),\n message,\n }),\n z.looseObject({ rule: z.enum(['email', 'url']), message }),\n z.looseObject({\n rule: z.literal('in'),\n value: z.array(z.union([z.string(), z.number(), z.boolean()])),\n message,\n }),\n z.looseObject({ rule: z.literal('accept'), value: z.array(z.string().min(1)), message }),\n z.looseObject({ rule: z.literal('maxSize'), value: z.number().int().positive(), message }),\n z.looseObject({ rule: z.enum(['before', 'after']), value: DateBound, message }),\n z\n .looseObject({\n rule: z\n .string()\n .refine((rule) => !(PORTABLE_RULES as readonly string[]).includes(rule)),\n message,\n })\n .meta({\n description:\n \"A rule added in a later version of the protocol. Clients that don't know it ignore it; the server still enforces it.\",\n }),\n ])\n .meta({\n description:\n 'A portable validation rule. `min` and `max` apply to numbers, and to the length of text and arrays. `accept` lists MIME types (`image/*`). `maxSize` is in bytes.',\n });\n\nexport const BlockType = z.looseObject({\n id: z.string().min(1),\n label: z.string(),\n icon: z.string().optional(),\n // Return types are written out so that declaration files keep the recursion.\n get fields(): z.ZodArray<typeof Field> {\n return z.array(Field);\n },\n});\n\nexport const Field = z\n .looseObject({\n name: z.string().min(1),\n type: z\n .string()\n .min(1)\n .meta({ description: 'A built-in field type, or a type provided by a plugin.' }),\n label: z.string().optional(),\n help: z.string().optional(),\n placeholder: z.string().optional(),\n default: z.unknown().optional(),\n localized: z\n .boolean()\n .optional()\n .meta({ description: 'The value is an object keyed by locale.' }),\n readOnly: z.boolean().optional(),\n createOnly: z.boolean().optional(),\n updateOnly: z.boolean().optional(),\n rules: z.array(Rule).optional(),\n visibleWhen: Condition.optional(),\n options: z.array(Option).optional().meta({ description: '`select`: the choices.' }),\n multiple: z\n .boolean()\n .optional()\n .meta({ description: '`select`, `relation`, `media`: the value is an array.' }),\n resource: z\n .string()\n .optional()\n .meta({ description: '`relation`: id of the related resource.' }),\n accept: z\n .array(z.string())\n .optional()\n .meta({ description: '`media`: accepted MIME types.' }),\n from: z\n .string()\n .optional()\n .meta({ description: '`slug`: the field the slug is generated from.' }),\n display: z.string().optional().meta({\n description: 'Display used in lists, when it differs from the default one of the type.',\n }),\n get fields(): z.ZodOptional<z.ZodArray<typeof Field>> {\n return z\n .array(Field)\n .optional()\n .meta({ description: '`group` and `repeater`: the nested fields.' });\n },\n get types(): z.ZodOptional<z.ZodArray<typeof BlockType>> {\n return z\n .array(BlockType)\n .optional()\n .meta({ description: '`repeater`: typed blocks, each with its own fields.' });\n },\n settings: z.record(z.string(), z.unknown()).optional(),\n })\n .meta({ description: 'A field of a form.' });\n\nexport type Rule = z.infer<typeof Rule>;\nexport type BlockType = z.infer<typeof BlockType>;\nexport type Field = z.infer<typeof Field>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"field.js","names":[],"sources":["../../src/schemas/field.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { PORTABLE_RULES } from '../constants';\nimport { Condition, Option } from './common';\n\nconst message = z\n .string()\n .optional()\n .meta({ description: 'Message shown when the rule fails, instead of the default one.' });\n\nconst Ratio = z\n .string()\n .regex(/^[1-9][0-9]*:[1-9][0-9]*$/)\n .meta({ description: 'An aspect ratio, as `width:height`: `16:9`.' });\n\nconst DateBound = z.union([\n z.string().meta({ description: 'An ISO 8601 date or date-time.' }),\n z.looseObject({ field: z.string().min(1) }).meta({ description: 'Another field of the form.' }),\n]);\n\nexport const Rule = z\n .union([\n z.looseObject({ rule: z.literal('required'), message }),\n z.looseObject({ rule: z.enum(['min', 'max']), value: z.number(), message }),\n z.looseObject({\n rule: z.literal('pattern'),\n value: z.string(),\n flags: z.string().optional(),\n message,\n }),\n z.looseObject({ rule: z.enum(['email', 'url']), message }),\n z.looseObject({\n rule: z.literal('in'),\n value: z.array(z.union([z.string(), z.number(), z.boolean()])),\n message,\n }),\n z.looseObject({ rule: z.literal('accept'), value: z.array(z.string().min(1)), message }),\n z.looseObject({ rule: z.literal('maxSize'), value: z.number().int().positive(), message }),\n z.looseObject({ rule: z.enum(['before', 'after']), value: DateBound, message }),\n z.looseObject({\n rule: z.literal('crop'),\n value: z.looseObject({\n ratios: z.array(Ratio).optional().meta({\n description:\n 'A crop must have one of them: its height is within one pixel of its width divided by the ratio, after its rotation.',\n }),\n required: z\n .boolean()\n .optional()\n .meta({ description: 'Each image needs a crop for this use.' }),\n }),\n message,\n }),\n z\n .looseObject({\n rule: z\n .string()\n .refine((rule) => !(PORTABLE_RULES as readonly string[]).includes(rule)),\n message,\n })\n .meta({\n description:\n \"A rule added in a later version of the protocol. Clients that don't know it ignore it; the server still enforces it.\",\n }),\n ])\n .meta({\n description:\n 'A portable validation rule. `min` and `max` apply to numbers, and to the length of text and arrays. `accept` lists MIME types (`image/*`). `maxSize` is in bytes. `crop` checks the transform of each image of an `image` or `media` value (decision 0031).',\n });\n\nexport const BlockType = z.looseObject({\n id: z.string().min(1),\n label: z.string(),\n icon: z.string().optional(),\n // Return types are written out so that declaration files keep the recursion.\n get fields(): z.ZodArray<typeof Field> {\n return z.array(Field);\n },\n});\n\nexport const Field = z\n .looseObject({\n name: z.string().min(1),\n type: z\n .string()\n .min(1)\n .meta({ description: 'A built-in field type, or a type provided by a plugin.' }),\n label: z.string().optional(),\n help: z.string().optional(),\n placeholder: z.string().optional(),\n default: z.unknown().optional(),\n localized: z\n .boolean()\n .optional()\n .meta({ description: 'The value is an object keyed by locale.' }),\n readOnly: z.boolean().optional(),\n createOnly: z.boolean().optional(),\n updateOnly: z.boolean().optional(),\n rules: z.array(Rule).optional(),\n visibleWhen: Condition.optional(),\n options: z.array(Option).optional().meta({ description: '`select`: the choices.' }),\n multiple: z.boolean().optional().meta({\n description: '`select`, `relation`, `media`, `image`, `file`: the value is an array.',\n }),\n resource: z\n .union([z.string().min(1), z.array(z.string().min(1)).min(1)])\n .optional()\n .meta({\n description:\n '`relation`: id of the related resource. `media`, `image`: id of a resource of kind `media`, or a list of them; without it, every library of the definition (decision 0027).',\n }),\n accept: z.array(z.string()).optional().meta({\n description:\n '`media`, `image`, `file`: accepted MIME types. `image` defaults to `image/*`.',\n }),\n ratios: z.array(Ratio).optional().meta({\n description:\n '`image`: ratios the editor suggests. The `crop` rule enforces ratios (decision 0031).',\n }),\n rotate: z.boolean().optional().meta({\n description: '`image`: whether the editor offers rotation and flips. Defaults to true.',\n }),\n focalPoint: z.boolean().optional().meta({\n description: '`image`: whether the editor offers the focal point. Defaults to true.',\n }),\n transformBase: z.enum(['media', 'original', 'choose']).optional().meta({\n description:\n \"`image`: what a transform for one use starts from: the media's own transform (`media`, the default), the original file, or the user's choice in the editor (decision 0031).\",\n }),\n from: z\n .string()\n .optional()\n .meta({ description: '`slug`: the field the slug is generated from.' }),\n check: z.boolean().optional().meta({\n description:\n 'The client checks the value with the backend as it is typed, with `POST /resources/{resource}/fields/{field}/check`: whether a `slug` is available, and its URL. A field at the top of the resource only.',\n }),\n display: z.string().optional().meta({\n description: 'Display used in lists, when it differs from the default one of the type.',\n }),\n get fields(): z.ZodOptional<z.ZodArray<typeof Field>> {\n return z\n .array(Field)\n .optional()\n .meta({ description: '`group` and `repeater`: the nested fields.' });\n },\n get types(): z.ZodOptional<z.ZodArray<typeof BlockType>> {\n return z\n .array(BlockType)\n .optional()\n .meta({ description: '`repeater`: typed blocks, each with its own fields.' });\n },\n settings: z.record(z.string(), z.unknown()).optional(),\n })\n .meta({ description: 'A field of a form.' });\n\nexport type Rule = z.infer<typeof Rule>;\nexport type BlockType = z.infer<typeof BlockType>;\nexport type Field = z.infer<typeof Field>;\n"],"mappings":"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"}