@allejo/decap-extras 0.0.8 → 0.0.10

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/dist/index.d.mts CHANGED
@@ -5,11 +5,14 @@ import { CmsField, CmsFieldBoolean, CmsFieldFileOrImage, CmsFieldList, CmsFieldM
5
5
  /**
6
6
  * Get a widget's options while excluding keys we're handling (i.e., `widget`,
7
7
  * `fields`) and respect [global common options](https://decapcms.org/docs/widgets/#String#common-widget-options).
8
+ * Use the second generic parameter (`O`) to exclude additional keys from the
9
+ * options type; e.g., the `selectWidget` handles the `options` key directly, so
10
+ * it should be omitted.
8
11
  */
9
12
  type WidgetOpts<T extends {
10
13
  widget?: string;
11
14
  fields?: unknown[];
12
- }> = Omit<T, 'widget' | 'fields'> & {
15
+ }, O extends keyof T = never> = Omit<T, 'widget' | 'fields' | (O extends never ? never : O)> & {
13
16
  required?: boolean;
14
17
  hint?: string;
15
18
  pattern?: [string, string];
@@ -632,7 +635,7 @@ declare function numberWidget<T extends string>(label: string, name: T, options?
632
635
  * @see optional
633
636
  * @link https://decapcms.org/docs/widgets/#select
634
637
  */
635
- declare function selectWidget<T extends string, O extends string[]>(label: string, name: T, choices: O, options?: WidgetOpts<CmsFieldSelect>): {
638
+ declare function selectWidget<T extends string, O extends string[]>(label: string, name: T, choices: O, options?: WidgetOpts<CmsFieldSelect, 'options'>): {
636
639
  readonly options: O;
637
640
  readonly default?: string | string[];
638
641
  readonly min?: number;
@@ -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
@@ -125,12 +125,17 @@ function imageWidget(label, name, options) {
125
125
  };
126
126
  }
127
127
  function listWidget(label, name, fields, options) {
128
+ const needsUnwrapping = !Array.isArray(fields) && fields.widget === "object";
128
129
  return {
129
130
  label,
130
131
  name,
131
132
  widget: "list",
133
+ ...needsUnwrapping ? {
134
+ summary: fields.summary,
135
+ collapsed: fields.collapsed
136
+ } : {},
132
137
  ...options ?? {},
133
- ...Array.isArray(fields) ? { fields } : fields.widget === "object" ? { fields: fields.fields } : { field: fields }
138
+ ...Array.isArray(fields) ? { fields } : needsUnwrapping ? { fields: fields.fields } : { field: fields }
134
139
  };
135
140
  }
136
141
  /**
@@ -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\n/**\n * Marks a widget field as optional, allowing it to be left empty in DecapCMS.\n * This modifier can be applied to any widget type to make it non-required.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * optional(stringWidget(\"Middle Name\", \"middleName\"))\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Middle Name\n * name: middleName\n * widget: string\n * required: false\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * middleName: # Can be left empty\n * ```\n *\n * The `optional` modifier can be used with all widget types including complex ones:\n *\n * ```typescript\n * optional(objectWidget(\"Metadata\", \"metadata\", [stringWidget(\"Author\", \"author\")]))\n * optional(listWidget(\"Tags\", \"tags\", stringWidget(\"Tag\", \"value\")))\n * ```\n *\n * @link https://decapcms.org/docs/widgets/#common-widget-options\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\n/**\n * Creates a Boolean widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * boolWidget(\"Published\", \"published\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Published\n * name: published\n * widget: boolean\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * published: true\n * ```\n *\n * The boolean widget creates a checkbox input in the editor. This can be made\n * optional using the `optional` modifier:\n *\n * ```typescript\n * optional(boolWidget(\"Draft\", \"isDraft\"))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#boolean\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\n/**\n * Creates an Image widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * imageWidget(\"Featured Image\", \"featuredImage\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Featured Image\n * name: featuredImage\n * widget: image\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * featuredImage: /images/hero.jpg\n * ```\n *\n * The image widget provides file upload functionality with image preview\n * capabilities. It can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(imageWidget(\"Avatar\", \"avatar\"))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#image\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\n/**\n * Creates a List widget configuration with the given label, name, field(s), and\n * optional additional options.\n *\n * The `listWidget` function accepts either a single field (which gets expanded\n * for object types) or an array of fields. When passed an object widget, its\n * fields are automatically extracted and expanded.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * Single field example:\n *\n * ```typescript\n * listWidget(\"Tags\", \"tags\", stringWidget(\"Tag\", \"value\"))\n * ```\n *\n * Multiple fields example:\n *\n * ```typescript\n * listWidget(\"Authors\", \"authors\", [\n * stringWidget(\"Name\", \"name\"),\n * imageWidget(\"Avatar\", \"avatar\"),\n * ])\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * Single field:\n *\n * ```yaml\n * - label: Tags\n * name: tags\n * widget: list\n * field:\n * label: Tag\n * name: value\n * widget: string\n * ```\n *\n * Multiple fields:\n *\n * ```yaml\n * - label: Authors\n * name: authors\n * widget: list\n * fields:\n * - label: Name\n * name: name\n * widget: string\n * - label: Avatar\n * name: avatar\n * widget: image\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * tags:\n * - value: React\n * - value: TypeScript\n *\n * authors:\n * - name: Jane Doe\n * avatar: /images/jane.jpg\n * - name: John Smith\n * avatar: /images/john.jpg\n * ```\n *\n * The list widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(listWidget(\"Tags\", \"tags\", stringWidget(\"Tag\", \"value\")))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#list\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)\n\t\t\t? { fields }\n\t\t\t: fields.widget === 'object'\n\t\t\t\t? { fields: (fields as CmsFieldObject).fields }\n\t\t\t\t: { field: fields }),\n\t} as const;\n}\n\n/**\n * Creates a Markdown widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * markdownWidget(\"Biography\", \"biography\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Biography\n * name: biography\n * widget: richtext\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * biography: |-\n * Hello, world. I was born in the year 2000.\n * ```\n *\n * There are pre-configured constants available for use with the `options`\n * parameter:\n *\n * - INLINE_MARKDOWN\n * - RICH_MARKDOWN\n *\n * For example, to use the `RICH_MARKDOWN` configuration, you can do the following:\n *\n * ```typescript\n * markdownWidget(\"Biography\", \"biography\", RICH_MARKDOWN)\n * ```\n *\n * @see INLINE_MARKDOWN\n * @see RICH_MARKDOWN\n *\n * @link https://decapcms.org/docs/widgets/#Richtext%20(Beta)\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\n/**\n * Creates an Object widget configuration with the given label, name, fields, and\n * optional additional options.\n *\n * The object widget groups multiple fields together as a nested object in the\n * data store. This is useful for creating structured data with related properties.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * objectWidget(\"Author\", \"author\", [\n * stringWidget(\"Name\", \"name\"),\n * stringWidget(\"Email\", \"email\"),\n * ])\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Author\n * name: author\n * widget: object\n * fields:\n * - label: Name\n * name: name\n * widget: string\n * - label: Email\n * name: email\n * widget: string\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * author:\n * name: Jane Doe\n * email: jane@example.com\n * ```\n *\n * Objects can be nested within lists or other objects to create complex data\n * structures. They can also be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(objectWidget(\"Metadata\", \"metadata\", [\n * stringWidget(\"SEO Title\", \"seoTitle\"),\n * textWidget(\"Description\", \"description\"),\n * ]))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#object\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\n/**\n * Creates a Number widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * numberWidget(\"Priority\", \"priority\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Priority\n * name: priority\n * widget: number\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * priority: 1\n * ```\n *\n * The number widget provides numeric input with optional min, max, and step\n * constraints. It can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(numberWidget(\"Views\", \"views\"))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#number\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\n/**\n * Creates a Select widget configuration with the given label, name, choices, and\n * optional additional options.\n *\n * The select widget creates a dropdown menu with predefined options. The `choices`\n * array becomes the available options in the YAML configuration.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * selectWidget(\"Status\", \"status\", [\"draft\", \"published\", \"archived\"] as const)\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Status\n * name: status\n * widget: select\n * options:\n * - draft\n * - published\n * - archived\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * status: published\n * ```\n *\n * The select widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(selectWidget(\"Category\", \"category\", [\"tech\", \"lifestyle\", \"business\"] as const))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#select\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\n/**\n * Creates a String widget configuration with the given label and name, and\n * optional additional options.\n *\n * The string widget provides a single-line text input field for short text content.\n * Unlike the text widget which provides multi-line input, the string widget is\n * designed for concise, single-line values.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * stringWidget(\"Title\", \"title\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Title\n * name: title\n * widget: string\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * title: Welcome to My Blog\n * ```\n *\n * The string widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(stringWidget(\"Slug\", \"slug\"))\n * ```\n *\n * @see optional\n * @see textWidget\n * @link https://decapcms.org/docs/widgets/#string\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\n/**\n * Creates a Text widget configuration with the given label and name, and\n * optional additional options.\n *\n * The text widget provides a multi-line text input field for longer text content.\n * Unlike the string widget which provides single-line input, the text widget is\n * designed for paragraphs and multi-line content.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * textWidget(\"Description\", \"description\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Description\n * name: description\n * widget: text\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * description: |-\n * This is a longer description that spans\n * multiple lines in the data store.\n * ```\n *\n * The text widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(textWidget(\"Notes\", \"notes\"))\n * ```\n *\n * @see optional\n * @see stringWidget\n * @see markdownWidget\n * @link https://decapcms.org/docs/widgets/#text\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 RICH_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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAgB,SAA6B,QAA8B;CAC1E,OAAO;EACN,GAAG;EACH,UAAU;EACV,YAAY;CACb;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,SAAgB,WACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,YACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AA2FA,SAAgB,WACf,OACA,MACA,QACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB,GAAI,MAAM,QAAQ,MAAM,IACrB,EAAE,OAAO,IACT,OAAO,WAAW,WACjB,EAAE,QAAS,OAA0B,OAAO,IAC5C,EAAE,OAAO,OAAO;CACrB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,SAAgB,eACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,SAAgB,aACf,OACA,MACA,QACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB;CACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,aACf,OACA,MACA,SACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB,SAAS,WAAW,CAAC;CACtB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,SAAgB,aACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,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\n/**\n * Marks a widget field as optional, allowing it to be left empty in DecapCMS.\n * This modifier can be applied to any widget type to make it non-required.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * optional(stringWidget(\"Middle Name\", \"middleName\"))\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Middle Name\n * name: middleName\n * widget: string\n * required: false\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * middleName: # Can be left empty\n * ```\n *\n * The `optional` modifier can be used with all widget types including complex ones:\n *\n * ```typescript\n * optional(objectWidget(\"Metadata\", \"metadata\", [stringWidget(\"Author\", \"author\")]))\n * optional(listWidget(\"Tags\", \"tags\", stringWidget(\"Tag\", \"value\")))\n * ```\n *\n * @link https://decapcms.org/docs/widgets/#common-widget-options\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\n/**\n * Creates a Boolean widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * boolWidget(\"Published\", \"published\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Published\n * name: published\n * widget: boolean\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * published: true\n * ```\n *\n * The boolean widget creates a checkbox input in the editor. This can be made\n * optional using the `optional` modifier:\n *\n * ```typescript\n * optional(boolWidget(\"Draft\", \"isDraft\"))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#boolean\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\n/**\n * Creates an Image widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * imageWidget(\"Featured Image\", \"featuredImage\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Featured Image\n * name: featuredImage\n * widget: image\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * featuredImage: /images/hero.jpg\n * ```\n *\n * The image widget provides file upload functionality with image preview\n * capabilities. It can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(imageWidget(\"Avatar\", \"avatar\"))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#image\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\n/**\n * Creates a List widget configuration with the given label, name, field(s), and\n * optional additional options.\n *\n * The `listWidget` function accepts either a single field (which gets expanded\n * for object types) or an array of fields. When passed an object widget, its\n * fields are automatically extracted and expanded.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * Single field example:\n *\n * ```typescript\n * listWidget(\"Tags\", \"tags\", stringWidget(\"Tag\", \"value\"))\n * ```\n *\n * Multiple fields example:\n *\n * ```typescript\n * listWidget(\"Authors\", \"authors\", [\n * stringWidget(\"Name\", \"name\"),\n * imageWidget(\"Avatar\", \"avatar\"),\n * ])\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * Single field:\n *\n * ```yaml\n * - label: Tags\n * name: tags\n * widget: list\n * field:\n * label: Tag\n * name: value\n * widget: string\n * ```\n *\n * Multiple fields:\n *\n * ```yaml\n * - label: Authors\n * name: authors\n * widget: list\n * fields:\n * - label: Name\n * name: name\n * widget: string\n * - label: Avatar\n * name: avatar\n * widget: image\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * tags:\n * - value: React\n * - value: TypeScript\n *\n * authors:\n * - name: Jane Doe\n * avatar: /images/jane.jpg\n * - name: John Smith\n * avatar: /images/john.jpg\n * ```\n *\n * The list widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(listWidget(\"Tags\", \"tags\", stringWidget(\"Tag\", \"value\")))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#list\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\tconst needsUnwrapping = !Array.isArray(fields) && fields.widget === 'object';\n\n\treturn {\n\t\tlabel,\n\t\tname,\n\t\twidget: 'list',\n\t\t...(needsUnwrapping\n\t\t\t? {\n\t\t\t\t\tsummary: (fields as CmsFieldObject).summary,\n\t\t\t\t\tcollapsed: (fields as CmsFieldObject).collapsed,\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(options ?? {}),\n\t\t...(Array.isArray(fields)\n\t\t\t? { fields }\n\t\t\t: needsUnwrapping\n\t\t\t\t? { fields: (fields as CmsFieldObject).fields }\n\t\t\t\t: { field: fields }),\n\t} as const;\n}\n\n/**\n * Creates a Markdown widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * markdownWidget(\"Biography\", \"biography\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Biography\n * name: biography\n * widget: richtext\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * biography: |-\n * Hello, world. I was born in the year 2000.\n * ```\n *\n * There are pre-configured constants available for use with the `options`\n * parameter:\n *\n * - INLINE_MARKDOWN\n * - RICH_MARKDOWN\n *\n * For example, to use the `RICH_MARKDOWN` configuration, you can do the following:\n *\n * ```typescript\n * markdownWidget(\"Biography\", \"biography\", RICH_MARKDOWN)\n * ```\n *\n * @see INLINE_MARKDOWN\n * @see RICH_MARKDOWN\n *\n * @link https://decapcms.org/docs/widgets/#Richtext%20(Beta)\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\n/**\n * Creates an Object widget configuration with the given label, name, fields, and\n * optional additional options.\n *\n * The object widget groups multiple fields together as a nested object in the\n * data store. This is useful for creating structured data with related properties.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * objectWidget(\"Author\", \"author\", [\n * stringWidget(\"Name\", \"name\"),\n * stringWidget(\"Email\", \"email\"),\n * ])\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Author\n * name: author\n * widget: object\n * fields:\n * - label: Name\n * name: name\n * widget: string\n * - label: Email\n * name: email\n * widget: string\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * author:\n * name: Jane Doe\n * email: jane@example.com\n * ```\n *\n * Objects can be nested within lists or other objects to create complex data\n * structures. They can also be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(objectWidget(\"Metadata\", \"metadata\", [\n * stringWidget(\"SEO Title\", \"seoTitle\"),\n * textWidget(\"Description\", \"description\"),\n * ]))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#object\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\n/**\n * Creates a Number widget configuration with the given label and name, and\n * optional additional options.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * numberWidget(\"Priority\", \"priority\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Priority\n * name: priority\n * widget: number\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * priority: 1\n * ```\n *\n * The number widget provides numeric input with optional min, max, and step\n * constraints. It can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(numberWidget(\"Views\", \"views\"))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#number\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\n/**\n * Creates a Select widget configuration with the given label, name, choices, and\n * optional additional options.\n *\n * The select widget creates a dropdown menu with predefined options. The `choices`\n * array becomes the available options in the YAML configuration.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * selectWidget(\"Status\", \"status\", [\"draft\", \"published\", \"archived\"] as const)\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Status\n * name: status\n * widget: select\n * options:\n * - draft\n * - published\n * - archived\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * status: published\n * ```\n *\n * The select widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(selectWidget(\"Category\", \"category\", [\"tech\", \"lifestyle\", \"business\"] as const))\n * ```\n *\n * @see optional\n * @link https://decapcms.org/docs/widgets/#select\n */\nexport function selectWidget<T extends string, O extends string[]>(\n\tlabel: string,\n\tname: T,\n\tchoices: O,\n\toptions?: WidgetOpts<CmsFieldSelect, 'options'>,\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\n/**\n * Creates a String widget configuration with the given label and name, and\n * optional additional options.\n *\n * The string widget provides a single-line text input field for short text content.\n * Unlike the text widget which provides multi-line input, the string widget is\n * designed for concise, single-line values.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * stringWidget(\"Title\", \"title\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Title\n * name: title\n * widget: string\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * title: Welcome to My Blog\n * ```\n *\n * The string widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(stringWidget(\"Slug\", \"slug\"))\n * ```\n *\n * @see optional\n * @see textWidget\n * @link https://decapcms.org/docs/widgets/#string\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\n/**\n * Creates a Text widget configuration with the given label and name, and\n * optional additional options.\n *\n * The text widget provides a multi-line text input field for longer text content.\n * Unlike the string widget which provides single-line input, the text widget is\n * designed for paragraphs and multi-line content.\n *\n * **DecapCMS Configuration (TypeScript)**\n *\n * ```typescript\n * textWidget(\"Description\", \"description\")\n * ```\n *\n * **DecapCMS Configuration (YAML)**\n *\n * ```yaml\n * - label: Description\n * name: description\n * widget: text\n * ```\n *\n * **Data Store YAML**\n *\n * ```yaml\n * description: |-\n * This is a longer description that spans\n * multiple lines in the data store.\n * ```\n *\n * The text widget can be made optional using the `optional` modifier:\n *\n * ```typescript\n * optional(textWidget(\"Notes\", \"notes\"))\n * ```\n *\n * @see optional\n * @see stringWidget\n * @see markdownWidget\n * @link https://decapcms.org/docs/widgets/#text\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 RICH_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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAgB,SAA6B,QAA8B;CAC1E,OAAO;EACN,GAAG;EACH,UAAU;EACV,YAAY;CACb;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,SAAgB,WACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,YACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;AA2FA,SAAgB,WACf,OACA,MACA,QACA,SACC;CACD,MAAM,kBAAkB,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW;CAEpE,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,kBACD;GACA,SAAU,OAA0B;GACpC,WAAY,OAA0B;EACvC,IACC,CAAC;EACJ,GAAI,WAAW,CAAC;EAChB,GAAI,MAAM,QAAQ,MAAM,IACrB,EAAE,OAAO,IACT,kBACC,EAAE,QAAS,OAA0B,OAAO,IAC5C,EAAE,OAAO,OAAO;CACrB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,SAAgB,eACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,SAAgB,aACf,OACA,MACA,QACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB;CACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,aACf,OACA,MACA,SACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;EAChB,SAAS,WAAW,CAAC;CACtB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,SAAgB,aACf,OACA,MACA,SACC;CACD,OAAO;EACN;EACA;EACA,QAAQ;EACR,GAAI,WAAW,CAAC;CACjB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allejo/decap-extras",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
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"
@@ -15,19 +15,25 @@
15
15
  "exports": {
16
16
  ".": {
17
17
  "types": "./dist/index.d.mts",
18
- "import": "./dist/index.mjs"
18
+ "import": "./dist/index.mjs",
19
+ "default": "./dist/index.mjs"
19
20
  },
20
21
  "./react": {
21
22
  "types": "./dist/react/index.d.mts",
22
- "import": "./dist/react/index.mjs"
23
+ "import": "./dist/react/index.mjs",
24
+ "default": "./dist/react/index.mjs"
23
25
  },
24
26
  "./next": {
25
27
  "types": "./dist/next/index.d.mts",
26
- "import": "./dist/next/index.mjs"
28
+ "import": "./dist/next/index.mjs",
29
+ "default": "./dist/next/index.mjs"
27
30
  }
28
31
  },
32
+ "main": "./dist/index.mjs",
33
+ "types": "./dist/index.d.mts",
29
34
  "scripts": {
30
35
  "build": "tsdown",
36
+ "build:watch": "tsdown --watch",
31
37
  "format": "prettier --write .",
32
38
  "test": "vitest run --typecheck"
33
39
  },