@sittari/payload-seo 0.1.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.
Files changed (126) hide show
  1. package/README.md +38 -0
  2. package/dist/admin/ResetRawJson.d.ts +4 -0
  3. package/dist/admin/ResetRawJson.d.ts.map +1 -0
  4. package/dist/admin/ResetRawJson.js +53 -0
  5. package/dist/admin/ResetRawJson.js.map +1 -0
  6. package/dist/admin/SchemaValueOverrides.d.ts +4 -0
  7. package/dist/admin/SchemaValueOverrides.d.ts.map +1 -0
  8. package/dist/admin/SchemaValueOverrides.js +46 -0
  9. package/dist/admin/SchemaValueOverrides.js.map +1 -0
  10. package/dist/admin/SeoPreviews.d.ts +4 -0
  11. package/dist/admin/SeoPreviews.d.ts.map +1 -0
  12. package/dist/admin/SeoPreviews.js +172 -0
  13. package/dist/admin/SeoPreviews.js.map +1 -0
  14. package/dist/admin/preview-document.d.ts +7 -0
  15. package/dist/admin/preview-document.d.ts.map +1 -0
  16. package/dist/admin/preview-document.js +50 -0
  17. package/dist/admin/preview-document.js.map +1 -0
  18. package/dist/admin/translations.d.ts +236 -0
  19. package/dist/admin/translations.d.ts.map +1 -0
  20. package/dist/admin/translations.js +67 -0
  21. package/dist/admin/translations.js.map +1 -0
  22. package/dist/admin/use-admin-text.d.ts +4 -0
  23. package/dist/admin/use-admin-text.d.ts.map +1 -0
  24. package/dist/admin/use-admin-text.js +9 -0
  25. package/dist/admin/use-admin-text.js.map +1 -0
  26. package/dist/collections/redirects.d.ts +7 -0
  27. package/dist/collections/redirects.d.ts.map +1 -0
  28. package/dist/collections/redirects.js +71 -0
  29. package/dist/collections/redirects.js.map +1 -0
  30. package/dist/endpoints/preview.d.ts +4 -0
  31. package/dist/endpoints/preview.d.ts.map +1 -0
  32. package/dist/endpoints/preview.js +170 -0
  33. package/dist/endpoints/preview.js.map +1 -0
  34. package/dist/exports/client.d.ts +4 -0
  35. package/dist/exports/client.d.ts.map +1 -0
  36. package/dist/exports/client.js +5 -0
  37. package/dist/exports/client.js.map +1 -0
  38. package/dist/exports/types.d.ts +3 -0
  39. package/dist/exports/types.d.ts.map +1 -0
  40. package/dist/exports/types.js +2 -0
  41. package/dist/exports/types.js.map +1 -0
  42. package/dist/fields/seo.d.ts +11 -0
  43. package/dist/fields/seo.d.ts.map +1 -0
  44. package/dist/fields/seo.js +187 -0
  45. package/dist/fields/seo.js.map +1 -0
  46. package/dist/globals/seo-settings.d.ts +8 -0
  47. package/dist/globals/seo-settings.d.ts.map +1 -0
  48. package/dist/globals/seo-settings.js +73 -0
  49. package/dist/globals/seo-settings.js.map +1 -0
  50. package/dist/helpers/config.d.ts +5 -0
  51. package/dist/helpers/config.d.ts.map +1 -0
  52. package/dist/helpers/config.js +7 -0
  53. package/dist/helpers/config.js.map +1 -0
  54. package/dist/helpers/metadata.d.ts +27 -0
  55. package/dist/helpers/metadata.d.ts.map +1 -0
  56. package/dist/helpers/metadata.js +50 -0
  57. package/dist/helpers/metadata.js.map +1 -0
  58. package/dist/helpers/preview.d.ts +18 -0
  59. package/dist/helpers/preview.d.ts.map +1 -0
  60. package/dist/helpers/preview.js +23 -0
  61. package/dist/helpers/preview.js.map +1 -0
  62. package/dist/helpers/redirects.d.ts +10 -0
  63. package/dist/helpers/redirects.d.ts.map +1 -0
  64. package/dist/helpers/redirects.js +27 -0
  65. package/dist/helpers/redirects.js.map +1 -0
  66. package/dist/helpers/robots.d.ts +6 -0
  67. package/dist/helpers/robots.d.ts.map +1 -0
  68. package/dist/helpers/robots.js +46 -0
  69. package/dist/helpers/robots.js.map +1 -0
  70. package/dist/helpers/schema.d.ts +15 -0
  71. package/dist/helpers/schema.d.ts.map +1 -0
  72. package/dist/helpers/schema.js +5 -0
  73. package/dist/helpers/schema.js.map +1 -0
  74. package/dist/helpers/sitemap.d.ts +11 -0
  75. package/dist/helpers/sitemap.d.ts.map +1 -0
  76. package/dist/helpers/sitemap.js +131 -0
  77. package/dist/helpers/sitemap.js.map +1 -0
  78. package/dist/index.d.ts +16 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +14 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/next.d.ts +14 -0
  83. package/dist/next.d.ts.map +1 -0
  84. package/dist/next.js +24 -0
  85. package/dist/next.js.map +1 -0
  86. package/dist/plugin.d.ts +12 -0
  87. package/dist/plugin.d.ts.map +1 -0
  88. package/dist/plugin.js +260 -0
  89. package/dist/plugin.js.map +1 -0
  90. package/dist/resolvers/document.d.ts +5 -0
  91. package/dist/resolvers/document.d.ts.map +1 -0
  92. package/dist/resolvers/document.js +15 -0
  93. package/dist/resolvers/document.js.map +1 -0
  94. package/dist/resolvers/effective.d.ts +33 -0
  95. package/dist/resolvers/effective.d.ts.map +1 -0
  96. package/dist/resolvers/effective.js +225 -0
  97. package/dist/resolvers/effective.js.map +1 -0
  98. package/dist/resolvers/metadata.d.ts +13 -0
  99. package/dist/resolvers/metadata.d.ts.map +1 -0
  100. package/dist/resolvers/metadata.js +24 -0
  101. package/dist/resolvers/metadata.js.map +1 -0
  102. package/dist/types.d.ts +261 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +12 -0
  105. package/dist/types.js.map +1 -0
  106. package/dist/utils/generated-schema.d.ts +11 -0
  107. package/dist/utils/generated-schema.d.ts.map +1 -0
  108. package/dist/utils/generated-schema.js +69 -0
  109. package/dist/utils/generated-schema.js.map +1 -0
  110. package/dist/utils/locale.d.ts +17 -0
  111. package/dist/utils/locale.d.ts.map +1 -0
  112. package/dist/utils/locale.js +5 -0
  113. package/dist/utils/locale.js.map +1 -0
  114. package/dist/utils/robots.d.ts +11 -0
  115. package/dist/utils/robots.d.ts.map +1 -0
  116. package/dist/utils/robots.js +35 -0
  117. package/dist/utils/robots.js.map +1 -0
  118. package/dist/utils/urls.d.ts +9 -0
  119. package/dist/utils/urls.d.ts.map +1 -0
  120. package/dist/utils/urls.js +48 -0
  121. package/dist/utils/urls.js.map +1 -0
  122. package/dist/utils/validation.d.ts +20 -0
  123. package/dist/utils/validation.d.ts.map +1 -0
  124. package/dist/utils/validation.js +56 -0
  125. package/dist/utils/validation.js.map +1 -0
  126. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/resolvers/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAG5G,KAAK,eAAe,GAAG;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,sBAAsB,CAAA;IAC9B,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,EAAE,WAAW,CAAA;CACtB,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,GAAU,OAAO,eAAe,KAAG,OAAO,CAAC,mBAAmB,CAehG,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { resolveEffectiveSeo } from './effective.js';
2
+ /** Framework-neutral projection of the shared effective SEO state. */
3
+ export const resolveSeoMetadataCore = async (input) => {
4
+ const effective = await resolveEffectiveSeo(input);
5
+ const result = {};
6
+ if (effective.title)
7
+ result.title = effective.title;
8
+ if (effective.description)
9
+ result.description = effective.description;
10
+ if (effective.canonical.url)
11
+ result.canonicalUrl = effective.canonical.url;
12
+ result.robots = { index: effective.robots.index, follow: effective.robots.follow, ...(effective.robots.custom?.length ? { custom: effective.robots.custom } : {}) };
13
+ if (Object.keys(effective.social.openGraph).length)
14
+ result.openGraph = effective.social.openGraph;
15
+ if (Object.keys(effective.social.twitter).length)
16
+ result.twitter = effective.social.twitter;
17
+ if (effective.schema || effective.siteSchemas.length || effective.breadcrumbs.length) {
18
+ result.schema = effective.siteSchemas.length || effective.breadcrumbs.length
19
+ ? { '@context': 'https://schema.org', '@graph': [...(effective.schema ? [effective.schema] : []), ...effective.breadcrumbs, ...effective.siteSchemas] }
20
+ : effective.schema;
21
+ }
22
+ return result;
23
+ };
24
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/resolvers/metadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAWpD,sEAAsE;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,KAAsB,EAAgC,EAAE;IACnG,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAClD,MAAM,MAAM,GAAwB,EAAE,CAAA;IACtC,IAAI,SAAS,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;IACnD,IAAI,SAAS,CAAC,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAA;IACrE,IAAI,SAAS,CAAC,SAAS,CAAC,GAAG;QAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAA;IAC1E,MAAM,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACnK,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAA;IACjG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;QAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAA;IAC3F,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACrF,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM;YAC1E,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE;YACvJ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;IACtB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,261 @@
1
+ import type { Access, Field, FieldAccess, PayloadRequest } from 'payload';
2
+ /** Metadata marker written to every Payload entity generated by this plugin. */
3
+ export declare const SEO_PLUGIN_MARKER = "@sittari/payload-seo";
4
+ export declare const DEFAULT_SEO_NAMES: {
5
+ readonly redirectsCollection: "seo-redirects";
6
+ readonly seoField: "seo";
7
+ readonly settingsGlobal: "seo-settings";
8
+ };
9
+ /** Client component paths registered on generated Payload Admin fields. */
10
+ export declare const SEO_PREVIEWS_ADMIN_COMPONENT = "@sittari/payload-seo/client#SeoPreviews";
11
+ export declare const SEO_RAW_JSON_ADMIN_COMPONENT = "@sittari/payload-seo/client#ResetRawJson";
12
+ export declare const SEO_SCHEMA_VALUE_OVERRIDES_ADMIN_COMPONENT = "@sittari/payload-seo/client#SchemaValueOverrides";
13
+ export type SeoSchemaType = 'Article' | 'FAQPage' | 'LocalBusiness' | 'Organization' | 'Product' | 'WebPage';
14
+ export type SeoDocument = Record<string, unknown>;
15
+ export type RobotsMode = 'inherit' | 'index-follow' | 'noindex-follow' | 'index-nofollow' | 'noindex-nofollow' | 'custom';
16
+ export type CanonicalMode = 'auto' | 'manual' | 'none';
17
+ export type TrailingSlashPolicy = 'always' | 'never';
18
+ export type ResolveDocumentUrl = (input: {
19
+ collection: string;
20
+ document: SeoDocument;
21
+ locale: string;
22
+ }) => null | Promise<null | string> | string;
23
+ export type ResolveLastModified = (input: {
24
+ collection: string;
25
+ document: SeoDocument;
26
+ locale: string;
27
+ }) => Date | null | Promise<Date | null | string> | string;
28
+ export type ResolveMediaUrl = (input: {
29
+ locale: string;
30
+ media: SeoDocument;
31
+ }) => null | Promise<null | string> | string;
32
+ export type ResolveSitemapChunkUrl = (input: {
33
+ collection: string;
34
+ locale: string;
35
+ page: number;
36
+ }) => Promise<string> | string;
37
+ export type ResolveRobotsSitemapUrls = (input: {
38
+ locale: string;
39
+ }) => Promise<readonly string[]> | readonly string[];
40
+ export type SeoDocumentFieldMappings = {
41
+ description?: string;
42
+ image?: string;
43
+ title?: string;
44
+ };
45
+ export type SeoBreadcrumbItem = {
46
+ name: string;
47
+ /** Absolute HTTP(S) URL, or a site-relative path resolved against `siteUrl`. */
48
+ url: string;
49
+ };
50
+ export type ResolveBreadcrumbs = (input: {
51
+ collection: string;
52
+ document: SeoDocument;
53
+ locale: string;
54
+ canonicalUrl?: string;
55
+ }) => readonly SeoBreadcrumbItem[] | Promise<readonly SeoBreadcrumbItem[]>;
56
+ export type SeoSitemapConfig = {
57
+ enabled?: boolean;
58
+ /**
59
+ * Document paths required by `resolveUrl`, `lastModified`, and `exclude`
60
+ * while rendering a sitemap page. Supplying them keeps large sitemap reads
61
+ * projected; the callback receives exactly this projection plus SEO state.
62
+ */
63
+ fields?: readonly string[];
64
+ /** Return false to omit a document after its effective SEO state is resolved. */
65
+ exclude?: (input: {
66
+ collection: string;
67
+ document: SeoDocument;
68
+ locale: string;
69
+ /** Sitemap resolution deliberately computes only canonical and robots state. */
70
+ effective: ResolvedSitemapSeo;
71
+ }) => boolean | Promise<boolean>;
72
+ };
73
+ export type SeoCollectionConfig = {
74
+ fields?: SeoDocumentFieldMappings;
75
+ lastModified?: ResolveLastModified;
76
+ media?: {
77
+ collection: string;
78
+ };
79
+ /** Optional host-owned breadcrumb resolver. Invalid items are omitted. */
80
+ breadcrumbs?: ResolveBreadcrumbs;
81
+ schema?: Record<string, string>;
82
+ schemaType: SeoSchemaType;
83
+ sitemap?: SeoSitemapConfig;
84
+ /** Additional schema-editor fields displayed alongside the built-in type-specific fields. */
85
+ visualFields?: Field[];
86
+ /** Additive boolean field access for the generated SEO group. */
87
+ access?: {
88
+ read?: FieldAccess;
89
+ update?: FieldAccess;
90
+ };
91
+ };
92
+ export type SeoPluginAccess = {
93
+ redirects?: {
94
+ admin?: ({ req }: {
95
+ req: PayloadRequest;
96
+ }) => boolean | Promise<boolean>;
97
+ create?: Access;
98
+ delete?: Access;
99
+ read?: Access;
100
+ update?: Access;
101
+ };
102
+ settings?: {
103
+ read?: Access;
104
+ update?: Access;
105
+ };
106
+ };
107
+ export type SeoGeneratedNames = {
108
+ redirectsCollection?: string;
109
+ seoField?: string;
110
+ settingsGlobal?: string;
111
+ };
112
+ export type SeoEnabledPluginConfig = {
113
+ collections: Record<string, SeoCollectionConfig>;
114
+ enabled?: true;
115
+ /** Immutable public site origin, normally supplied from the host environment. */
116
+ siteUrl: string;
117
+ media: {
118
+ collection: string;
119
+ resolveMediaUrl: ResolveMediaUrl;
120
+ };
121
+ resolveChunkUrl: ResolveSitemapChunkUrl;
122
+ resolveUrl: ResolveDocumentUrl;
123
+ /** URL policy used consistently by canonicals, alternates, and sitemaps. */
124
+ url?: {
125
+ trailingSlash?: TrailingSlashPolicy;
126
+ };
127
+ hreflang?: {
128
+ xDefaultLocale?: string;
129
+ };
130
+ /** Receives resolution failures without document values or other sensitive input. */
131
+ diagnostics?: (event: SeoDiagnostic) => void;
132
+ access?: SeoPluginAccess;
133
+ names?: SeoGeneratedNames;
134
+ robots?: {
135
+ resolveSitemapUrls?: ResolveRobotsSitemapUrls;
136
+ };
137
+ };
138
+ /** Disabled mode deliberately accepts no active-plugin requirements. */
139
+ export type SeoDisabledPluginConfig = {
140
+ enabled: false;
141
+ } & Partial<Omit<SeoEnabledPluginConfig, 'enabled'>>;
142
+ export type SeoPluginConfig = SeoDisabledPluginConfig | SeoEnabledPluginConfig;
143
+ /** Shape stored in `admin.custom` on generated fields, globals, and collections. */
144
+ export type SeoAdminCustom = {
145
+ seo?: {
146
+ marker: typeof SEO_PLUGIN_MARKER;
147
+ };
148
+ };
149
+ /** Locale-explicit subset of the Payload Local API used by the resolver core. */
150
+ export type SeoPayload = {
151
+ findByID: (options: Record<string, unknown>) => Promise<SeoDocument>;
152
+ findGlobal: (options: Record<string, unknown>) => Promise<SeoDocument>;
153
+ find?: (options: Record<string, unknown>) => Promise<{
154
+ docs: SeoDocument[];
155
+ totalDocs?: number;
156
+ }>;
157
+ config?: {
158
+ custom?: Record<string, unknown>;
159
+ localization?: {
160
+ locales?: Array<string | {
161
+ code?: string;
162
+ }>;
163
+ };
164
+ };
165
+ };
166
+ /** Optional context passed to Payload Local API reads performed for an Admin preview. */
167
+ export type SeoLocalApiOptions = {
168
+ overrideAccess: false;
169
+ req?: PayloadRequest;
170
+ user?: unknown;
171
+ };
172
+ export type SeoRobotsDirectives = {
173
+ /** Normalized supported directives selected in custom mode (including explicit index/follow tokens). */
174
+ custom?: string[];
175
+ follow?: 'follow' | 'nofollow';
176
+ index?: 'index' | 'noindex';
177
+ };
178
+ export type SeoDiagnostic = {
179
+ area: 'canonical' | 'media' | 'metadata' | 'robots' | 'schema' | 'sitemap' | 'url';
180
+ collection?: string;
181
+ documentId?: string | number;
182
+ locale?: string;
183
+ message: string;
184
+ };
185
+ export type SeoSocialMetadata = {
186
+ description?: string;
187
+ image?: string;
188
+ title?: string;
189
+ };
190
+ export type ResolvedEffectiveSeo = {
191
+ title?: string;
192
+ description?: string;
193
+ canonical: {
194
+ mode: CanonicalMode;
195
+ url?: string;
196
+ external: boolean;
197
+ };
198
+ robots: {
199
+ index: 'index' | 'noindex';
200
+ follow: 'follow' | 'nofollow';
201
+ mode: RobotsMode;
202
+ custom?: string[];
203
+ };
204
+ social: {
205
+ openGraph: SeoSocialMetadata & {
206
+ url?: string;
207
+ type?: string;
208
+ siteName?: string;
209
+ locale?: string;
210
+ };
211
+ twitter: SeoSocialMetadata & {
212
+ card?: 'summary' | 'summary_large_image';
213
+ site?: string;
214
+ creator?: string;
215
+ };
216
+ };
217
+ schema?: Record<string, unknown>;
218
+ siteSchemas: Record<string, unknown>[];
219
+ breadcrumbs: Record<string, unknown>[];
220
+ };
221
+ export type ResolvedSitemapSeo = Pick<ResolvedEffectiveSeo, 'canonical' | 'robots'>;
222
+ export type SeoPreview = {
223
+ canonicalUrl?: string;
224
+ description?: string;
225
+ image?: string;
226
+ openGraph?: SeoSocialMetadata;
227
+ robots: {
228
+ index: 'index' | 'noindex';
229
+ follow: 'follow' | 'nofollow';
230
+ custom?: string[];
231
+ };
232
+ title?: string;
233
+ twitter?: SeoSocialMetadata & {
234
+ card?: 'summary' | 'summary_large_image';
235
+ site?: string;
236
+ creator?: string;
237
+ };
238
+ /** The exact resolved schema payload returned by the public schema helper. */
239
+ schema?: Record<string, unknown>;
240
+ };
241
+ /** Framework-neutral, omission-first output of the locale-safe resolver. */
242
+ export type ResolvedSeoMetadata = {
243
+ alternates?: Record<string, string>;
244
+ canonicalUrl?: string;
245
+ description?: string;
246
+ openGraph?: SeoSocialMetadata & {
247
+ url?: string;
248
+ type?: string;
249
+ siteName?: string;
250
+ locale?: string;
251
+ };
252
+ robots?: SeoRobotsDirectives;
253
+ schema?: Record<string, unknown>;
254
+ title?: string;
255
+ twitter?: SeoSocialMetadata & {
256
+ card?: 'summary' | 'summary_large_image';
257
+ site?: string;
258
+ creator?: string;
259
+ };
260
+ };
261
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ /** Metadata marker written to every Payload entity generated by this plugin. */
2
+ export const SEO_PLUGIN_MARKER = '@sittari/payload-seo';
3
+ export const DEFAULT_SEO_NAMES = {
4
+ redirectsCollection: 'seo-redirects',
5
+ seoField: 'seo',
6
+ settingsGlobal: 'seo-settings',
7
+ };
8
+ /** Client component paths registered on generated Payload Admin fields. */
9
+ export const SEO_PREVIEWS_ADMIN_COMPONENT = '@sittari/payload-seo/client#SeoPreviews';
10
+ export const SEO_RAW_JSON_ADMIN_COMPONENT = '@sittari/payload-seo/client#ResetRawJson';
11
+ export const SEO_SCHEMA_VALUE_OVERRIDES_ADMIN_COMPONENT = '@sittari/payload-seo/client#SchemaValueOverrides';
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAA;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB,EAAE,eAAe;IACpC,QAAQ,EAAE,KAAK;IACf,cAAc,EAAE,cAAc;CACtB,CAAA;AAEV,2EAA2E;AAC3E,MAAM,CAAC,MAAM,4BAA4B,GACvC,yCAAyC,CAAA;AAC3C,MAAM,CAAC,MAAM,4BAA4B,GACvC,0CAA0C,CAAA;AAC5C,MAAM,CAAC,MAAM,0CAA0C,GACrD,kDAAkD,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { SeoDocument, SeoSchemaType } from '../types.js';
2
+ export declare const isSchemaType: (value: unknown) => value is SeoSchemaType;
3
+ /** Builds the schema controlled by the visual editor, without applying a raw JSON override. */
4
+ export declare const buildGeneratedSchema: ({ canonicalUrl, collectionSchema, defaultType, document, schema: suppliedSchema, }: {
5
+ canonicalUrl?: string;
6
+ collectionSchema?: Record<string, string>;
7
+ defaultType: SeoSchemaType;
8
+ document: SeoDocument;
9
+ schema?: SeoDocument;
10
+ }) => Record<string, unknown>;
11
+ //# sourceMappingURL=generated-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-schema.d.ts","sourceRoot":"","sources":["../../src/utils/generated-schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAO7D,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,aAC0B,CAAA;AAEjF,+FAA+F;AAC/F,eAAO,MAAM,oBAAoB,GAAI,oFAMlC;IACD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,WAAW,EAAE,aAAa,CAAA;IAC1B,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA4DzB,CAAA"}
@@ -0,0 +1,69 @@
1
+ import { getByPath } from '../resolvers/document.js';
2
+ const schemaTypes = ['Article', 'FAQPage', 'LocalBusiness', 'Organization', 'Product', 'WebPage'];
3
+ // Generated output owns vocabulary, type selection, and the canonical URL.
4
+ // `name` and `image` intentionally remain editor/mapping controlled.
5
+ const reservedSchemaKeys = new Set(['@context', '@type', 'url']);
6
+ export const isSchemaType = (value) => typeof value === 'string' && schemaTypes.includes(value);
7
+ /** Builds the schema controlled by the visual editor, without applying a raw JSON override. */
8
+ export const buildGeneratedSchema = ({ canonicalUrl, collectionSchema, defaultType, document, schema: suppliedSchema, }) => {
9
+ const seo = document.seo && typeof document.seo === 'object' ? document.seo : {};
10
+ const schema = suppliedSchema ?? (seo.schema && typeof seo.schema === 'object' ? seo.schema : {});
11
+ const result = {
12
+ '@context': 'https://schema.org',
13
+ '@type': isSchemaType(schema.type) ? schema.type : defaultType,
14
+ };
15
+ if (canonicalUrl)
16
+ result.url = canonicalUrl;
17
+ for (const [property, path] of Object.entries(collectionSchema ?? {})) {
18
+ if (reservedSchemaKeys.has(property))
19
+ continue;
20
+ const value = getByPath(document, path);
21
+ if (value !== undefined && value !== null && value !== '')
22
+ result[property] = value;
23
+ }
24
+ for (const [property, value] of Object.entries(schema.values && typeof schema.values === 'object' ? schema.values : {})) {
25
+ if (reservedSchemaKeys.has(property))
26
+ continue;
27
+ if (value !== undefined && value !== null && value !== '')
28
+ result[property] = value;
29
+ }
30
+ const type = result['@type'];
31
+ const string = (value) => typeof value === 'string' && value.trim() ? value.trim() : undefined;
32
+ const value = (key) => result[key];
33
+ if (type === 'Article') {
34
+ const author = string(value('author'));
35
+ if (author)
36
+ result.author = { '@type': 'Person', name: author };
37
+ const headline = string(value('headline')) ?? string(value('name'));
38
+ if (headline)
39
+ result.headline = headline;
40
+ }
41
+ if (type === 'Product') {
42
+ const brand = string(value('brand'));
43
+ if (brand)
44
+ result.brand = { '@type': 'Brand', name: brand };
45
+ const price = value('price');
46
+ const priceCurrency = string(value('priceCurrency'));
47
+ if (price !== undefined && price !== null && price !== '' && priceCurrency) {
48
+ result.offers = { '@type': 'Offer', price, priceCurrency };
49
+ }
50
+ delete result.price;
51
+ delete result.priceCurrency;
52
+ }
53
+ if (type === 'FAQPage') {
54
+ const question = string(value('question'));
55
+ const answer = string(value('answer'));
56
+ if (question && answer) {
57
+ result.mainEntity = [{ '@type': 'Question', name: question, acceptedAnswer: { '@type': 'Answer', text: answer } }];
58
+ }
59
+ delete result.question;
60
+ delete result.answer;
61
+ }
62
+ if (type === 'LocalBusiness') {
63
+ const address = string(value('address'));
64
+ if (address)
65
+ result.address = { '@type': 'PostalAddress', streetAddress: address };
66
+ }
67
+ return result;
68
+ };
69
+ //# sourceMappingURL=generated-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-schema.js","sourceRoot":"","sources":["../../src/utils/generated-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SeoDocument, SeoLocalApiOptions, SeoPayload } from '../types.js';
2
+ /** Reads one document in exactly the requested locale, never Payload's fallback locale. */
3
+ export declare const loadDocumentWithoutFallback: ({ payload, collection, id, locale, access, }: {
4
+ payload: SeoPayload;
5
+ collection: string;
6
+ id: string | number;
7
+ locale: string;
8
+ access?: SeoLocalApiOptions;
9
+ }) => Promise<SeoDocument>;
10
+ /** Reads localized settings in exactly the requested locale. */
11
+ export declare const loadSettingsWithoutFallback: ({ payload, slug, locale, access, }: {
12
+ payload: SeoPayload;
13
+ slug: string;
14
+ locale: string;
15
+ access?: SeoLocalApiOptions;
16
+ }) => Promise<SeoDocument>;
17
+ //# sourceMappingURL=locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../src/utils/locale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE9E,2FAA2F;AAC3F,eAAO,MAAM,2BAA2B,GAAU,8CAM/C;IACD,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC5B,KAAG,OAAO,CAAC,WAAW,CACuE,CAAA;AAE9F,gEAAgE;AAChE,eAAO,MAAM,2BAA2B,GAAU,oCAK/C;IACD,OAAO,EAAE,UAAU,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC5B,KAAG,OAAO,CAAC,WAAW,CAC+D,CAAA"}
@@ -0,0 +1,5 @@
1
+ /** Reads one document in exactly the requested locale, never Payload's fallback locale. */
2
+ export const loadDocumentWithoutFallback = async ({ payload, collection, id, locale, access, }) => payload.findByID({ collection, id, locale, fallbackLocale: false, draft: false, ...access });
3
+ /** Reads localized settings in exactly the requested locale. */
4
+ export const loadSettingsWithoutFallback = async ({ payload, slug, locale, access, }) => payload.findGlobal({ slug, locale, fallbackLocale: false, draft: false, ...access });
5
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sourceRoot":"","sources":["../../src/utils/locale.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAAE,EAChD,OAAO,EACP,UAAU,EACV,EAAE,EACF,MAAM,EACN,MAAM,GAOP,EAAwB,EAAE,CACzB,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAE9F,gEAAgE;AAChE,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAAE,EAChD,OAAO,EACP,IAAI,EACJ,MAAM,EACN,MAAM,GAMP,EAAwB,EAAE,CACzB,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Returns only directives that can be represented by the framework-neutral and
3
+ * Next adapters. Values are normalized to the robots token spelling.
4
+ */
5
+ export declare const normalizeRobotsDirectives: (value: unknown) => string[];
6
+ export declare const robotsContent: (robots: {
7
+ index?: "index" | "noindex";
8
+ follow?: "follow" | "nofollow";
9
+ custom?: string[];
10
+ }) => string;
11
+ //# sourceMappingURL=robots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../src/utils/robots.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GAAI,OAAO,OAAO,KAAG,MAAM,EAoBhE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,QAAQ;IAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,MAG5G,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { nonEmptyString } from './urls.js';
2
+ const simple = new Set(['noarchive', 'nosnippet', 'noimageindex', 'notranslate']);
3
+ const indexFollow = new Set(['index', 'noindex', 'follow', 'nofollow']);
4
+ /**
5
+ * Returns only directives that can be represented by the framework-neutral and
6
+ * Next adapters. Values are normalized to the robots token spelling.
7
+ */
8
+ export const normalizeRobotsDirectives = (value) => {
9
+ const seen = new Set();
10
+ const directives = [];
11
+ const add = (candidate) => {
12
+ const directive = candidate.trim().toLowerCase();
13
+ if (!directive || seen.has(directive))
14
+ return;
15
+ const supported = simple.has(directive)
16
+ || indexFollow.has(directive)
17
+ || /^max-snippet:-?\d+$/.test(directive)
18
+ || /^max-video-preview:-?\d+$/.test(directive)
19
+ || /^max-image-preview:(none|standard|large)$/.test(directive)
20
+ || /^unavailable_after:.+$/.test(directive);
21
+ if (supported) {
22
+ seen.add(directive);
23
+ directives.push(directive);
24
+ }
25
+ };
26
+ if (Array.isArray(value))
27
+ value.forEach((item) => typeof item === 'string' && item.split(',').forEach(add));
28
+ else
29
+ nonEmptyString(value)?.split(',').forEach(add);
30
+ return directives;
31
+ };
32
+ export const robotsContent = (robots) => [robots.index, robots.follow, ...(robots.custom ?? []).filter((value) => !indexFollow.has(value))]
33
+ .filter((value) => Boolean(value))
34
+ .join(', ');
35
+ //# sourceMappingURL=robots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/utils/robots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAA;AACjF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;AAEvE;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAc,EAAY,EAAE;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,GAAG,GAAG,CAAC,SAAiB,EAAQ,EAAE;QACtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAChD,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAM;QAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;eAClC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;eAC1B,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC;eACrC,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC;eAC3C,2CAA2C,CAAC,IAAI,CAAC,SAAS,CAAC;eAC3D,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACnB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC,CAAA;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;;QACtG,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAA0F,EAAU,EAAE,CAClI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;KAC/F,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAClD,IAAI,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { TrailingSlashPolicy } from '../types.js';
2
+ export declare const nonEmptyString: (value: unknown) => string | undefined;
3
+ export declare const isSiteRelativePath: (value: unknown) => value is string;
4
+ /** A site URL is deliberately an origin. Paths, queries, fragments, and credentials are not site settings. */
5
+ export declare const normalizeSiteUrl: (value: unknown) => string | undefined;
6
+ export declare const normalizeCanonicalUrl: (value: unknown, policy?: TrailingSlashPolicy) => string | undefined;
7
+ export declare const combineSiteUrl: (siteUrl: unknown, path: unknown, policy?: TrailingSlashPolicy) => string | undefined;
8
+ export declare const isSameSiteUrl: (siteUrl: unknown, url: unknown) => boolean;
9
+ //# sourceMappingURL=urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/utils/urls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGtD,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SACoB,CAAA;AAE7E,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACyC,CAAA;AAEtG,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAS1D,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,EAAE,SAAQ,mBAA6B,KAAG,MAAM,GAAG,SActG,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,EAAE,MAAM,OAAO,EAAE,SAAQ,mBAA6B,KAAG,MAAM,GAAG,SAIhH,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,EAAE,KAAK,OAAO,KAAG,OAI9D,CAAA"}
@@ -0,0 +1,48 @@
1
+ import { isAbsoluteHttpUrl } from './validation.js';
2
+ export const nonEmptyString = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
3
+ export const isSiteRelativePath = (value) => typeof value === 'string' && value.startsWith('/') && !value.startsWith('//') && !/[?#]/.test(value);
4
+ /** A site URL is deliberately an origin. Paths, queries, fragments, and credentials are not site settings. */
5
+ export const normalizeSiteUrl = (value) => {
6
+ if (!isAbsoluteHttpUrl(value))
7
+ return undefined;
8
+ try {
9
+ const url = new URL(value.trim());
10
+ if (url.pathname !== '/' || url.search || url.hash || url.username || url.password)
11
+ return undefined;
12
+ return url.origin;
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ };
18
+ export const normalizeCanonicalUrl = (value, policy = 'never') => {
19
+ if (!isAbsoluteHttpUrl(value))
20
+ return undefined;
21
+ try {
22
+ const url = new URL(value.trim());
23
+ if (url.search || url.hash)
24
+ return undefined;
25
+ if (url.pathname !== '/') {
26
+ url.pathname = policy === 'always'
27
+ ? `${url.pathname.replace(/\/+$/, '')}/`
28
+ : url.pathname.replace(/\/+$/, '');
29
+ }
30
+ return url.toString();
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ };
36
+ export const combineSiteUrl = (siteUrl, path, policy = 'never') => {
37
+ const origin = normalizeSiteUrl(siteUrl);
38
+ if (!origin || !isSiteRelativePath(path))
39
+ return undefined;
40
+ return normalizeCanonicalUrl(new URL(path, origin).toString(), policy);
41
+ };
42
+ export const isSameSiteUrl = (siteUrl, url) => {
43
+ const origin = normalizeSiteUrl(siteUrl);
44
+ if (!origin || !isAbsoluteHttpUrl(url))
45
+ return false;
46
+ return new URL(url).origin === origin;
47
+ };
48
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/utils/urls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const isAbsoluteHttpUrl: (value: unknown) => value is string;
2
+ /** Normalizes only surrounding whitespace; pathname identity otherwise stays exact. */
3
+ export declare const normalizeRedirectPath: (value: unknown) => string | null;
4
+ import type { TrailingSlashPolicy } from '../types.js';
5
+ type ValidationContext = {
6
+ req?: {
7
+ i18n?: {
8
+ language?: string;
9
+ };
10
+ };
11
+ };
12
+ export declare const validateAbsoluteHttpUrl: (value: unknown, context?: ValidationContext) => true | string;
13
+ /** The Admin and runtime use this exact canonical contract: HTTP(S), no query or fragment. */
14
+ export declare const validateCanonicalUrl: (value: unknown, context?: ValidationContext, policy?: TrailingSlashPolicy) => true | string;
15
+ export declare const isPlainJsonObject: (value: unknown) => value is Record<string, unknown>;
16
+ export declare const validateJson: (value: unknown, context?: ValidationContext) => true | string;
17
+ export declare const hasLineBreak: (value: unknown) => boolean;
18
+ export declare const validateRobotsToken: (value: unknown, context?: ValidationContext) => true | string;
19
+ export {};
20
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAS3D,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,IAY/D,CAAA;AAID,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD,KAAK,iBAAiB,GAAG;IAAE,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAKnE,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,EAAE,UAAU,iBAAiB,KAAG,IAAI,GAAG,MAGnC,CAAA;AAE1D,8FAA8F;AAC9F,eAAO,MAAM,oBAAoB,GAC/B,OAAO,OAAO,EACd,UAAU,iBAAiB,EAC3B,SAAQ,mBAA6B,KACpC,IAAI,GAAG,MAGgD,CAAA;AAE1D,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACyC,CAAA;AAE3H,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,UAAU,iBAAiB,KAAG,IAAI,GAAG,MAQjF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,OAA4D,CAAA;AAE1G,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,EAAE,UAAU,iBAAiB,KAAG,IAAI,GAAG,MAG/B,CAAA"}