sveltia / sveltia-cms

Alternative to Netlify/Decap CMS. Fast, lightweight, Git-based headless CMS. Modern UX, first-class i18n support, open source & free. Made with Svelte.
MIT License
727 stars 33 forks source link

Console error introduced in @sveltia/cms > 0.21.0 #135

Closed greatislander closed 2 months ago

greatislander commented 2 months ago

In versions since 0.21.0 I get the following console error when loading the CMS and no collections are loaded or editable:

sveltia-cms.js:627 Uncaught (in promise) TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at Array.bY (sveltia-cms.js:627:245725)
    at Se (sveltia-cms.js:1:851)
    at hL (sveltia-cms.js:5:114675)
    at te (sveltia-cms.js:1:8952)
    at new Yn (sveltia-cms.js:5:115826)
    at Array.vY (sveltia-cms.js:627:246743)
    at Se (sveltia-cms.js:1:851)
    at Array.LC (sveltia-cms.js:5:54367)
    at Se (sveltia-cms.js:1:851)
bY @ sveltia-cms.js:627
Se @ sveltia-cms.js:1
hL @ sveltia-cms.js:5
te @ sveltia-cms.js:1
Yn @ sveltia-cms.js:5
vY @ sveltia-cms.js:627
Se @ sveltia-cms.js:1
LC @ sveltia-cms.js:5
Se @ sveltia-cms.js:1
ZA @ sveltia-cms.js:5
Se @ sveltia-cms.js:1
k_ @ sveltia-cms.js:5
xA @ sveltia-cms.js:5
te @ sveltia-cms.js:1
S_ @ sveltia-cms.js:5
XA @ sveltia-cms.js:5
te @ sveltia-cms.js:1
Tu @ sveltia-cms.js:5
OC @ sveltia-cms.js:5
te @ sveltia-cms.js:1
oi @ sveltia-cms.js:5
EY @ sveltia-cms.js:627
Se @ sveltia-cms.js:1
WP @ sveltia-cms.js:37
te @ sveltia-cms.js:1
Ar @ sveltia-cms.js:37
DY @ sveltia-cms.js:627
te @ sveltia-cms.js:1
RY @ sveltia-cms.js:627
A3 @ sveltia-cms.js:627
jY @ sveltia-cms.js:627
Se @ sveltia-cms.js:1
UI @ sveltia-cms.js:73
te @ sveltia-cms.js:1
An @ sveltia-cms.js:73
BY @ sveltia-cms.js:627
te @ sveltia-cms.js:1
qY @ sveltia-cms.js:627
fK @ sveltia-cms.js:627
te @ sveltia-cms.js:1
hK @ sveltia-cms.js:627
ln @ sveltia-cms.js:1
p @ sveltia-cms.js:627
IT @ sveltia-cms.js:1
Ze @ sveltia-cms.js:1
Promise.then (async)
Pg @ sveltia-cms.js:1
MT @ sveltia-cms.js:1
(anonymous) @ sveltia-cms.js:1
(anonymous) @ sveltia-cms.js:627
r @ sveltia-cms.js:1
fetchFiles @ sveltia-cms.js:622
await in fetchFiles (async)
eM @ sveltia-cms.js:257
await in eM (async)
(anonymous) @ sveltia-cms.js:622
Tg @ sveltia-cms.js:1
(anonymous) @ sveltia-cms.js:1
Ze @ sveltia-cms.js:1
Promise.then (async)
Pg @ sveltia-cms.js:1
MT @ sveltia-cms.js:1
(anonymous) @ sveltia-cms.js:1
(anonymous) @ sveltia-cms.js:622
r @ sveltia-cms.js:1
Q7 @ sveltia-cms.js:257
await in Q7 (async)
(anonymous) @ sveltia-cms.js:627
Tg @ sveltia-cms.js:1
(anonymous) @ sveltia-cms.js:1
Ze @ sveltia-cms.js:1
te @ sveltia-cms.js:1
UJ @ sveltia-cms.js:627
Kf @ sveltia-cms.js:627
(anonymous) @ sveltia-cms.js:627
(anonymous) @ sveltia-cms.js:627

When viewing source, this is the section of the source file:

        e.$on("change", t[36]),
        i = new Nu({
            props: {
                label: t[20]("sync_scrolling"),
                checked: t[21].syncScrolling,
                disabled: !t[16] && Object.keys(t[2]).length === 1 // Error is here.
            }
        }),

I have a YAML configuration file:

backend:
  name: github
  branch: main
  repo: REDACTED
  base_url: https://sveltia-cms-auth.REDACTED.workers.dev
media_folder: src/assets/uploads
public_folder: /assets/uploads

editor:
  preview: false
i18n:
  locales: [en, fr]
  default_locale: en
collections:
  - label: Pages
    label_singular: Page
    name: pages
    icon: article
    i18n:
      structure: multiple_folders
    folder: src/collections/pages/
    extension: md
    create: true
    fields:
      - {label: Title, name: title, widget: string, i18n: true}
      - {label: Excerpt, name: excerpt, widget: string, required: false, i18n: true}
      - {label: YouTube Video, name: youtube, widget: string, type: url, required: false, i18n: true}
      - {label: YouTube Video Transcript Link, name: transcript, widget: string, type: url, required: false, i18n: true}
      - {label: Introduction, name: intro, widget: markdown, i18n: true, required: false}
      - {label: Body, name: body, widget: markdown, i18n: true}
  - label: Submissions
    label_singular: Submission
    name: submissions
    icon: co_present
    i18n:
      structure: multiple_folders
    folder: src/collections/submissions/
    extension: md
    create: true
    fields:
      - {label: Title, name: title, widget: string, i18n: true}
      - {label: ID, name: id, widget: string, i18n: duplicate}
      - {label: Preview Image, name: previewImage, widget: image, i18n: duplicate, required: false}
      - {label: Preview Image Alternative Text, name: previewImageAlt, widget: string, i18n: true, required: false}
      - {label: Presenters, name: presenters, widget: list, i18n: duplicate, hint: Enter a comma-separated list of names.}
      - {label: Themes, name: themes, widget: relation, multiple: true, collection: themes, search_fields: [title], value_field: uuid, display_fields: [title], i18n: duplicate}
      - {label: Custom Theme, name: customTheme, widget: string, i18n: true, required: false}
      - label: Text
        name: text
        widget: object
        i18n: duplicate
        required: false
        fields:
          - {label: English URL, name: en, widget: string, type: url, i18n: duplicate, required: false}
          - {label: French URL, name: fr, widget: string, type: url, i18n: duplicate, required: false}
      - label: YouTube
        name: youtube
        widget: object
        i18n: duplicate
        required: false
        fields:
          - {label: YouTube URL, name: url, widget: string, type: url, i18n: duplicate, required: false}
          - {label: Language, name: lang, widget: select, options: [{value: en, label: English}, {value: fr, label: Français}], i18n: duplicate, required: false}
          - {label: Sign Language Interpretation, name: interpretation, widget: boolean, i18n: duplicate, required: false}
      - label: Transcript
        name: transcript
        widget: object
        i18n: duplicate
        required: false
        fields:
          - {label: English URL, name: en, widget: string, type: url, i18n: duplicate, required: false}
          - {label: French URL, name: fr, widget: string, type: url, i18n: duplicate, required: false}
      - label: Slide Deck
        name: slides
        widget: object
        i18n: duplicate
        required: false
        fields:
          - {label: English URL, name: en, widget: string, type: url, i18n: duplicate, required: false}
          - {label: French URL, name: fr, widget: string, type: url, i18n: duplicate, required: false}
      - label: Audio
        name: audio
        widget: object
        i18n: duplicate
        required: false
        fields:
          - {label: Audio URL, name: url, widget: string, type: url, i18n: duplicate, required: false}
          - {label: Language, name: lang, widget: select, options: [{value: en, label: English}, {value: fr, label: Français}], i18n: duplicate, required: false}
      - label: PDF
        name: pdf
        widget: object
        i18n: duplicate
        required: false
        fields:
          - {label: English URL, name: en, widget: string, type: url, i18n: duplicate, required: false}
          - {label: French URL, name: fr, widget: string, type: url, i18n: duplicate, required: false}
      - {label: Body, name: body, widget: markdown, i18n: true}
  - label: Themes
    label_singular: Theme
    name: themes
    icon: sell
    i18n:
      structure: multiple_folders
    folder: src/collections/themes/
    extension: md
    create: true
    fields:
      - {label: Title, name: title, widget: string, i18n: true}
      - {label: ID, name: uuid, widget: uuid, i18n: duplicate}
  - label: Settings
    name: settings
    icon: tune
    i18n:
      structure: single_file
    files:
      - label: Site Data
        name: site
        file: src/_data/site.json
        i18n: true
        fields:
          - {label: Name, name: name, widget: string, i18n: true}
          - {label: Description, name: description, widget: text, i18n: true}
          - {label: URL, name: url, widget: string, i18n: duplicate}
          - {label: Author Name, name: authorName, widget: string, i18n: duplicate}
          - {label: Author Email, name: authorEmail, widget: string, i18n: duplicate}
          - {label: Author Website, name: authorWebsite, widget: string, i18n: duplicate}
          - {label: Organizer Banner, name: organizerBanner, widget: markdown, i18n: true}
          - {label: Organizer Footer, name: organizerFooter, widget: markdown, i18n: true}
          - {label: Event Sponsor Footer, name: eventSponsorFooter, widget: markdown, i18n: true}
          - {label: Main Sponsor Footer, name: mainSponsorFooter, widget: markdown, i18n: true}
          - label: Sponsors
            name: sponsors
            widget: list
            i18n: true
            fields:
              - {label: Name, name: name, widget: string, i18n: true}
              - {label: URL, name: url, widget: string, type: url, i18n: true}
              - {label: Logo, name: logo, widget: image, i18n: true}
              - {label: Mobile Width, name: mobileWidth, widget: number, i18n: true}
              - {label: Desktop Width, name: desktopWidth, widget: number, i18n: true}
kyoshino commented 2 months ago

Thanks for the report! Will check shortly.

kyoshino commented 2 months ago

Just shipped v0.22.1 with the fix! 🙇🏼 I don’t know why it didn’t happen with my test environments — will figure it out later.