@allejo/decap-extras 0.0.3 → 0.0.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.
- package/README.md +8 -7
- package/dist/index.d.mts +1 -11
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -10
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.mts.map +1 -1
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @allejo/decap-extras
|
|
2
2
|
|
|
3
|
+
> [!WARNING]
|
|
4
|
+
>
|
|
5
|
+
> This is an experimental package in early development. I'm currently dog feeding this project in my own projects and am constantly improving the API as I discover better patterns.
|
|
6
|
+
>
|
|
7
|
+
> See my [nextjs-decap-typescript-template](https://github.com/allejo/nextjs-decap-typescript-template) repository for a real-world example of how to use this package in a Next.js project.
|
|
8
|
+
|
|
3
9
|
A TypeScript utility library for [Decap CMS](https://decapcms.org/) that does two things:
|
|
4
10
|
|
|
5
11
|
1. **Widget factory functions** — type-safe helpers for building Decap CMS field configuration objects instead of writing raw object literals by hand.
|
|
@@ -91,7 +97,7 @@ const tagObjectsField = listWidget('Tag Objects', 'tagObjects', [
|
|
|
91
97
|
|
|
92
98
|
#### Image widget
|
|
93
99
|
|
|
94
|
-
|
|
100
|
+
To pass a default transformation (supported by services like Cloudinary), use the `opts` parameter to pass a `media_library` configuration.
|
|
95
101
|
|
|
96
102
|
```ts
|
|
97
103
|
const heroField = imageWidget('Hero Image', 'hero');
|
|
@@ -135,8 +141,6 @@ const slugField = stringWidget('Slug', 'slug', {
|
|
|
135
141
|
});
|
|
136
142
|
```
|
|
137
143
|
|
|
138
|
-
---
|
|
139
|
-
|
|
140
144
|
### Type inference
|
|
141
145
|
|
|
142
146
|
Define your CMS config using the widget factories and `as const`, then let `PropsByCollectionAndFile` derive a fully typed content object from it automatically.
|
|
@@ -408,7 +412,7 @@ Registers the Cloudinary media picker.
|
|
|
408
412
|
>
|
|
409
413
|
> Being able to _disable_ Cloudinary is a work-in-progress. I've always needed it for the projects I'm building so it's enabled by default. I'll get to respecting the "disable" environment variable... eventually.
|
|
410
414
|
|
|
411
|
-
##
|
|
415
|
+
## Next.js utilities
|
|
412
416
|
|
|
413
417
|
A server-side utility for getting CSS from Next.js build manifests. This is useful for registering CSS stylesheets into Decap's CMS preview system.
|
|
414
418
|
|
|
@@ -445,9 +449,6 @@ export default function Admin({ cssFiles }: Props) {
|
|
|
445
449
|
}
|
|
446
450
|
```
|
|
447
451
|
|
|
448
|
-
> **Note:** This utility reads `.next/build-manifest.json` (or `.next/dev/build-manifest.json` in development) and is intended for Next.js projects only.
|
|
449
|
-
|
|
450
|
-
---
|
|
451
452
|
|
|
452
453
|
## API reference
|
|
453
454
|
|
package/dist/index.d.mts
CHANGED
|
@@ -221,18 +221,8 @@ declare function boolWidget<T extends string>(label: string, name: T, options?:
|
|
|
221
221
|
readonly widget: "boolean";
|
|
222
222
|
};
|
|
223
223
|
declare function imageWidget<T extends string>(label: string, name: T, options?: WidgetOpts<CmsFieldFileOrImage>): {
|
|
224
|
-
readonly media_library: {
|
|
225
|
-
readonly name: "cloudinary";
|
|
226
|
-
readonly config: {
|
|
227
|
-
readonly default_transformations: readonly [readonly [{
|
|
228
|
-
readonly fetch_format: "auto";
|
|
229
|
-
readonly width: 300;
|
|
230
|
-
readonly quality: "auto";
|
|
231
|
-
readonly crop: "scale";
|
|
232
|
-
}]];
|
|
233
|
-
};
|
|
234
|
-
};
|
|
235
224
|
readonly default?: string;
|
|
225
|
+
readonly media_library?: _$decap_cms_core0.CmsMediaLibrary;
|
|
236
226
|
readonly allow_multiple?: boolean;
|
|
237
227
|
readonly choose_url?: boolean;
|
|
238
228
|
readonly config?: any;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/api.ts","../src/widgets.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/api.ts","../src/widgets.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -19,16 +19,7 @@ function imageWidget(label, name, options) {
|
|
|
19
19
|
label,
|
|
20
20
|
name,
|
|
21
21
|
widget: "image",
|
|
22
|
-
...options ?? {}
|
|
23
|
-
media_library: {
|
|
24
|
-
name: "cloudinary",
|
|
25
|
-
config: { default_transformations: [[{
|
|
26
|
-
fetch_format: "auto",
|
|
27
|
-
width: 300,
|
|
28
|
-
quality: "auto",
|
|
29
|
-
crop: "scale"
|
|
30
|
-
}]] }
|
|
31
|
-
}
|
|
22
|
+
...options ?? {}
|
|
32
23
|
};
|
|
33
24
|
}
|
|
34
25
|
function listWidget(label, name, fields, options) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/widgets.ts"],"sourcesContent":["import type {\n\tCmsField,\n\tCmsFieldBoolean,\n\tCmsFieldFileOrImage,\n\tCmsFieldList,\n\tCmsFieldMarkdown,\n\tCmsFieldNumber,\n\tCmsFieldObject,\n\tCmsFieldSelect,\n\tCmsFieldStringOrText,\n} from 'decap-cms-core';\n\nimport type { OptionalWidget, WidgetOpts } from './api.js';\n\n// Widget Modifiers\n\nexport function optional<T extends CmsField>(widget: T): OptionalWidget<T> {\n\treturn {\n\t\t...widget,\n\t\trequired: false as const,\n\t\t__optional: true as const,\n\t};\n}\n\n// Primitive Widgets\n\nexport function boolWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldBoolean>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'boolean',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\nexport function imageWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldFileOrImage>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'image',\n\t\t...(options ?? {}),\n\t
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/widgets.ts"],"sourcesContent":["import type {\n\tCmsField,\n\tCmsFieldBoolean,\n\tCmsFieldFileOrImage,\n\tCmsFieldList,\n\tCmsFieldMarkdown,\n\tCmsFieldNumber,\n\tCmsFieldObject,\n\tCmsFieldSelect,\n\tCmsFieldStringOrText,\n} from 'decap-cms-core';\n\nimport type { OptionalWidget, WidgetOpts } from './api.js';\n\n// Widget Modifiers\n\nexport function optional<T extends CmsField>(widget: T): OptionalWidget<T> {\n\treturn {\n\t\t...widget,\n\t\trequired: false as const,\n\t\t__optional: true as const,\n\t};\n}\n\n// Primitive Widgets\n\nexport function boolWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldBoolean>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'boolean',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\nexport function imageWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldFileOrImage>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'image',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\nexport function listWidget<T extends string, F extends CmsField>(\n\tlabel: string,\n\tname: T,\n\tfields: F,\n\toptions?: WidgetOpts<CmsFieldList>,\n): { label: string; name: T; widget: 'list'; field: F };\nexport function listWidget<T extends string, F extends CmsField[]>(\n\tlabel: string,\n\tname: T,\n\tfields: F,\n\toptions?: WidgetOpts<CmsFieldList>,\n): { label: string; name: T; widget: 'list'; fields: F };\nexport function listWidget<T extends string, F extends CmsField | CmsField[]>(\n\tlabel: string,\n\tname: T,\n\tfields: F,\n\toptions?: WidgetOpts<CmsFieldList>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'list',\n\t\t...(options ?? {}),\n\t\t...(Array.isArray(fields) ? { fields } : { field: fields }),\n\t} as const;\n}\n\nexport function markdownWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldMarkdown>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'richtext' as 'string',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\nexport function objectWidget<T extends string, F extends CmsField[]>(\n\tlabel: string,\n\tname: T,\n\tfields: F,\n\toptions?: WidgetOpts<CmsFieldObject>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'object',\n\t\t...(options ?? {}),\n\t\tfields,\n\t} as const satisfies CmsField;\n}\n\nexport function numberWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldNumber>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'number',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\nexport function selectWidget<T extends string, O extends string[]>(\n\tlabel: string,\n\tname: T,\n\tchoices: O,\n\toptions?: WidgetOpts<CmsFieldSelect>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'select',\n\t\t...(options ?? {}),\n\t\toptions: choices ?? [],\n\t} as const satisfies CmsField;\n}\n\nexport function stringWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldStringOrText>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'string',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\nexport function textWidget<T extends string>(\n\tlabel: string,\n\tname: T,\n\toptions?: WidgetOpts<CmsFieldStringOrText>,\n) {\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'text',\n\t\t...(options ?? {}),\n\t} as const satisfies CmsField;\n}\n\n// Reusable Widget Configurations\n\n/**\n * Stripped down Markdown widget configuration that does the following:\n *\n * - Allows bold, italic, lists (bullet + numbered), quotes\n * - No images or code block components\n * - Rich Text preview only\n */\nexport const BARE_MARKDOWN: WidgetOpts<CmsFieldMarkdown> = {\n\tbuttons: [\n\t\t'bold',\n\t\t'bulleted-list',\n\t\t'italic',\n\t\t'link',\n\t\t'numbered-list',\n\t\t'quote',\n\t],\n\teditor_components: [],\n\tmodes: ['rich_text'],\n};\n\n/**\n * Stripped down Markdown Widget configuration that allows only inline\n * elements (e.g., no lists, quotes, or headings) and rich text preview only.\n */\nexport const INLINE_MARKDOWN: WidgetOpts<CmsFieldMarkdown> = {\n\tbuttons: ['bold', 'italic', 'link'],\n\teditor_components: [],\n\tmodes: ['rich_text'],\n};\n"],"mappings":";AAgBA,SAAgB,SAA6B,QAA8B;CAC1E,OAAO;EACN,GAAG;EACH,UAAU;EACV,YAAY;CACb;AACD;AAIA,SAAgB,WACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AAEA,SAAgB,YACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AAcA,SAAgB,WACf,OACA,MACA,QACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB,GAAI,MAAM,QAAQ,MAAM,IAAI,EAAE,OAAO,IAAI,EAAE,OAAO,OAAO;CAC1D;AACD;AAEA,SAAgB,eACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AAEA,SAAgB,aACf,OACA,MACA,QACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB;CACD;AACD;AAEA,SAAgB,aACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AAEA,SAAgB,aACf,OACA,MACA,SACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB,SAAS,WAAW,CAAC;CACtB;AACD;AAEA,SAAgB,aACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AAEA,SAAgB,WACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;AAWA,MAAa,gBAA8C;CAC1D,SAAS;EACR;EACA;EACA;EACA;EACA;EACA;CACD;CACA,mBAAmB,CAAC;CACpB,OAAO,CAAC,WAAW;AACpB;;;;;AAMA,MAAa,kBAAgD;CAC5D,SAAS;EAAC;EAAQ;EAAU;CAAM;CAClC,mBAAmB,CAAC;CACpB,OAAO,CAAC,WAAW;AACpB"}
|
package/dist/react/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComponentType } from "react";
|
|
2
2
|
import { CMS, CmsConfig, CmsWidgetControlProps, CmsWidgetPreviewProps } from "decap-cms-core";
|
|
3
3
|
|
|
4
4
|
//#region src/react/DecapInstance.d.ts
|
|
@@ -72,11 +72,11 @@ interface DecapInstanceProps {
|
|
|
72
72
|
/**
|
|
73
73
|
* Widget editor component used in the Decap entry form.
|
|
74
74
|
*/
|
|
75
|
-
control:
|
|
75
|
+
control: ComponentType<CmsWidgetControlProps>;
|
|
76
76
|
/**
|
|
77
77
|
* Widget preview component used in Decap preview rendering.
|
|
78
78
|
*/
|
|
79
|
-
preview: ComponentType<CmsWidgetPreviewProps
|
|
79
|
+
preview: ComponentType<CmsWidgetPreviewProps>;
|
|
80
80
|
}>;
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/react/DecapInstance.tsx"],"mappings":";;;;;;AAcA;;;;UAAiB,kBAAA;EA0BT;;;;;;;;;EAhBP,MAAA,EAAQ,SAAA;EAAA;;;;;;;EAQR,QAAA;EA8BA;;;;;;;EAtBA,KAAA,EAAO,MAAA,SAAe,aAAA;EA4CG;;AAAqB;AAoB/C;;;;;;;;;;;EAjDC,MAAA,IAAU,GAAA,EAAK,GAAA;EAiDc;;;;;;EA1C7B,aAAA;EA0C6B;;;;;;;AAOT;;;;EArCpB,OAAA,EAAS,MAAA;;;;IAMP,OAAA,EAAS,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/react/DecapInstance.tsx"],"mappings":";;;;;;AAcA;;;;UAAiB,kBAAA;EA0BT;;;;;;;;;EAhBP,MAAA,EAAQ,SAAA;EAAA;;;;;;;EAQR,QAAA;EA8BA;;;;;;;EAtBA,KAAA,EAAO,MAAA,SAAe,aAAA;EA4CG;;AAAqB;AAoB/C;;;;;;;;;;;EAjDC,MAAA,IAAU,GAAA,EAAK,GAAA;EAiDc;;;;;;EA1C7B,aAAA;EA0C6B;;;;;;;AAOT;;;;EArCpB,OAAA,EAAS,MAAA;;;;IAMP,OAAA,EAAS,aAAA,CAAc,qBAAA;;;;IAIvB,OAAA,EAAS,aAAA,CAAc,qBAAA;EAAA;AAAA;;;;;;;;;;;;;;;;cAoBb,aAAA;EAAiB,MAAA;EAAA,QAAA;EAAA,MAAA;EAAA,KAAA;EAAA,aAAA;EAAA;AAAA,GAO3B,kBAAA"}
|
package/dist/react/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["Component"],"sources":["../../src/react/DecapInstance.tsx"],"sourcesContent":["import type {\n\tCMS,\n\tCmsConfig,\n\tCmsWidgetControlProps,\n\tCmsWidgetPreviewProps,\n} from 'decap-cms-core';\nimport {
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["Component"],"sources":["../../src/react/DecapInstance.tsx"],"sourcesContent":["import type {\n\tCMS,\n\tCmsConfig,\n\tCmsWidgetControlProps,\n\tCmsWidgetPreviewProps,\n} from 'decap-cms-core';\nimport { ComponentType, useEffect } from 'react';\n\n/**\n * Props for {@link DecapInstance}.\n *\n * This object describes everything needed to initialize the Decap CMS runtime\n * in a React/Next.js admin page.\n */\nexport interface DecapInstanceProps {\n\t/**\n\t * Decap CMS configuration object passed to `cms.init({ config })`.\n\t *\n\t * @example\n\t * const config = {\n\t * \tbackend: { name: 'git-gateway' },\n\t * \tcollections: [...],\n\t * } as const;\n\t */\n\tconfig: CmsConfig;\n\t/**\n\t * Stylesheets that should be available inside preview panes.\n\t *\n\t * This is commonly generated in Next.js via\n\t * `getCssFilesFromManifest(process.env.NODE_ENV, ['/', '/_app'])` and passed\n\t * through page props.\n\t */\n\tcssFiles: string[];\n\t/**\n\t * Map of preview template IDs to React components.\n\t *\n\t * Each component receives the serialized entry data as props\n\t * (`entry.get('data').toJSON()`). In practice, this lets you pair inferred\n\t * content types from `PropsByCollectionAndFile` with your preview templates.\n\t */\n\tpages: Record<string, ComponentType<never>>;\n\t/**\n\t * Optional callback invoked after Decap has been initialized and all\n\t * templates/widgets have been registered.\n\t *\n\t * Use this hook for custom registration that depends on the CMS instance.\n\t *\n\t * @example\n\t * onInit: (cms) => {\n\t * \tcms.registerEditorComponent({\n\t * \t\tid: 'callout',\n\t * \t\tlabel: 'Callout',\n\t * \t});\n\t * }\n\t */\n\tonInit?: (cms: CMS) => void;\n\t/**\n\t * Enables Cloudinary media library registration when set to `true`.\n\t *\n\t * Defaults to `false`. Pass this explicitly so the admin setup remains\n\t * obvious to future maintainers.\n\t */\n\tuseCloudinary?: boolean;\n\t/**\n\t * Registry of custom widgets to register with Decap.\n\t *\n\t * @example\n\t * widgets: {\n\t * \tcolor: {\n\t * \t\tcontrol: ColorControl,\n\t * \t\tpreview: ColorPreview,\n\t * \t},\n\t * }\n\t */\n\twidgets: Record<\n\t\tstring,\n\t\t{\n\t\t\t/**\n\t\t\t * Widget editor component used in the Decap entry form.\n\t\t\t */\n\t\t\tcontrol: ComponentType<CmsWidgetControlProps>;\n\t\t\t/**\n\t\t\t * Widget preview component used in Decap preview rendering.\n\t\t\t */\n\t\t\tpreview: ComponentType<CmsWidgetPreviewProps>;\n\t\t}\n\t>;\n}\n\n/**\n * Initializes Decap CMS from a React component, then returns `null`.\n *\n * This component performs all setup in a `useEffect` call: it boots Decap,\n * registers preview CSS, wires preview templates, registers custom widgets,\n * optionally enables Cloudinary, and finally calls `onInit`.\n *\n * @example\n * import type { PropsByCollectionAndFile } from '@allejo/decap-extras';\n * import { DecapInstance } from '@allejo/decap-extras/react';\n *\n * import type { cmsConfig } from '@/cms/config';\n *\n * type HomePageProps = PropsByCollectionAndFile<typeof cmsConfig, 'pages', 'home'>;\n */\nexport const DecapInstance = ({\n\tconfig,\n\tcssFiles,\n\tonInit,\n\tpages,\n\tuseCloudinary = false,\n\twidgets,\n}: DecapInstanceProps) => {\n\tuseEffect(() => {\n\t\tPromise.all([\n\t\t\timport('decap-cms-app'),\n\t\t\tuseCloudinary\n\t\t\t\t? // @ts-expect-error package has no types\n\t\t\t\t\timport('decap-cms-media-library-cloudinary')\n\t\t\t\t: Promise.resolve(null),\n\t\t]).then(([cmsMod, cloudinaryMod]) => {\n\t\t\tconst cms = cmsMod.default;\n\t\t\tconst cloudinary = cloudinaryMod.default;\n\n\t\t\tcms.init({ config });\n\n\t\t\tcssFiles.forEach((css) => {\n\t\t\t\tcms.registerPreviewStyle(css);\n\t\t\t});\n\n\t\t\tObject.entries(pages).forEach(([pageId, PageComponent]) => {\n\t\t\t\tcms.registerPreviewTemplate(pageId, ({ entry }) => {\n\t\t\t\t\tconst Component = PageComponent as ComponentType<\n\t\t\t\t\t\tRecord<string, unknown>\n\t\t\t\t\t>;\n\n\t\t\t\t\treturn <Component {...entry.get('data').toJSON()} />;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tObject.entries(widgets).forEach(([widgetId, { control, preview }]) => {\n\t\t\t\tcms.registerWidget(widgetId, control, preview);\n\t\t\t});\n\n\t\t\tif (cloudinaryMod) {\n\t\t\t\tcms.registerMediaLibrary(cloudinary);\n\t\t\t}\n\n\t\t\tonInit?.(cms);\n\t\t});\n\t}, [cssFiles]);\n\n\treturn null;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwGA,MAAa,iBAAiB,EAC7B,QACA,UACA,QACA,OACA,gBAAgB,OAChB,cACyB;CACzB,gBAAgB;EACf,QAAQ,IAAI,CACX,OAAO,kBACP,gBAEE,OAAO,wCACN,QAAQ,QAAQ,IAAI,CACxB,CAAC,EAAE,MAAM,CAAC,QAAQ,mBAAmB;GACpC,MAAM,MAAM,OAAO;GACnB,MAAM,aAAa,cAAc;GAEjC,IAAI,KAAK,EAAE,OAAO,CAAC;GAEnB,SAAS,SAAS,QAAQ;IACzB,IAAI,qBAAqB,GAAG;GAC7B,CAAC;GAED,OAAO,QAAQ,KAAK,EAAE,SAAS,CAAC,QAAQ,mBAAmB;IAC1D,IAAI,wBAAwB,SAAS,EAAE,YAAY;KAKlD,OAAO,oBAACA,eAAD,EAAW,GAAI,MAAM,IAAI,MAAM,EAAE,OAAO,EAAI;IACpD,CAAC;GACF,CAAC;GAED,OAAO,QAAQ,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,eAAe;IACrE,IAAI,eAAe,UAAU,SAAS,OAAO;GAC9C,CAAC;GAED,IAAI,eACH,IAAI,qBAAqB,UAAU;GAGpC,SAAS,GAAG;EACb,CAAC;CACF,GAAG,CAAC,QAAQ,CAAC;CAEb,OAAO;AACR"}
|
package/package.json
CHANGED