@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 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
- `imageWidget` is pre-configured with [Cloudinary](https://cloudinary.com/) as the media library, with default transformations (`fetch_format: auto`, `quality: auto`, `width: 300`, `crop: scale`). You can override these via the `options` parameter.
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
- ## Server utilities
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;
@@ -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) {
@@ -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\tmedia_library: {\n\t\t\tname: 'cloudinary',\n\t\t\tconfig: {\n\t\t\t\tdefault_transformations: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfetch_format: 'auto',\n\t\t\t\t\t\t\twidth: 300,\n\t\t\t\t\t\t\tquality: 'auto',\n\t\t\t\t\t\t\tcrop: 'scale',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t},\n\t\t},\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;EAChB,eAAe;GACd,MAAM;GACN,QAAQ,EACP,yBAAyB,CACxB,CACC;IACC,cAAc;IACd,OAAO;IACP,SAAS;IACT,MAAM;GACP,CACD,CACD,EACD;EACD;CACD;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"}
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"}
@@ -1,4 +1,4 @@
1
- import { ComponentClass, ComponentType } from "react";
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: ComponentClass<CmsWidgetControlProps<unknown>>;
75
+ control: ComponentType<CmsWidgetControlProps>;
76
76
  /**
77
77
  * Widget preview component used in Decap preview rendering.
78
78
  */
79
- preview: ComponentType<CmsWidgetPreviewProps<unknown>>;
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,cAAA,CAAe,qBAAA;;;;IAIxB,OAAA,EAAS,aAAA,CAAc,qBAAA;EAAA;AAAA;;;;;;;;;;;;;;;;cAoBb,aAAA;EAAiB,MAAA;EAAA,QAAA;EAAA,MAAA;EAAA,KAAA;EAAA,aAAA;EAAA;AAAA,GAO3B,kBAAA"}
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"}
@@ -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 { ComponentClass, 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: ComponentClass<CmsWidgetControlProps<unknown>>;\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<unknown>>;\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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allejo/decap-extras",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "A TypeScript utility library for Decap CMS with utility types to derive types from Decap CMS configuration files.",
5
5
  "keywords": [
6
6
  "decapcms"