GatsbyJS и чистая строка против числа в markdown

#graphql #markdown #gatsby #netlify

#graphql #markdown #gatsby #netlify

Вопрос:

У меня возникли проблемы с полем даты и времени в gatsby.

Первоначально я просто использовал строковый виджет в netlify cms, но markdown, похоже, не мог решить, что такое число и что такое строка:

введите описание изображения здесь

Это означает, что gatsby видит конфликтующие типы полей:

 warn There are conflicting field types in your data.
MarkdownRemark.frontmatter.startTime:
 - type: number
   value: 1080
 - type: string
   value: '07:00'
MarkdownRemark.frontmatter.endTime:
 - type: number
   value: 1140
 - type: string
   value: '08:00'
  

Поэтому я явно определяю их с createTypes помощью действия в соответствии с предложением gatsby:

 schema.buildObjectType({
            name: 'Frontmatter',
            fields: {
                startTime: {
                    type: 'Date',
                    // resolve(parent){
                    //     console.log(parent.startTime);
                    // }, 
                    extensions: {
                        dateformat: {
                            formatString: "HH:mm",
                        },
                    },
                },
                endTime: {
                    type: 'Date',
                    extensions: {
                        dateformat: {
                            formatString: "HH:mm",
                        },
                    }
                },
            },
        }),
  

Но это приводит либо к 00:00 "Invalid date"

Я использую netlify timepicker для установки значений:

 - { label: "Start Time", name: startTime, widget: datetime, date_format: false, time_format: HH:mm, format: HH:mm}
      - { label: "End Time", name: endTime, widget: datetime, date_format: false, time_format: HH:mm, format: HH:mm}
  

Есть ли способ заставить markdown видеть строки вместо чисел? Или чтобы увидеть дату и время? Или заставить netlify cms всегда сохранять его в виде строки?

Ответ №1:

У меня также была эта проблема, и я обнаружил, что версия синтаксического анализатора YAML, используемого Gatsby (в настоящее js-yaml@3.14.1 время), анализирует строки как base60, где это возможно. Который, я считаю, не соответствует спецификации YAML 1.2.

С тех пор эта проблема была исправлена в версии 4, но, к сожалению, библиотеки, которые использует Gatsby, все еще зависят от версии 3. gatsby-transformer-remark@4.3.0 -> gray-matter@4.0.3 -> js-yaml@3.14.1

Попытка принудительного обновления с использованием npm-force-resolutions не сработала, но, к счастью, серое вещество позволяет менять движки с помощью опций. Также gatsby-transformer-remark позволяет настраивать параметры серого вещества внутри gatsby-config.js .

Итак, мне удалось обойти проблему, установив js-yaml@4.1.0 и переопределение двигателя вот так:

package.json

 {
...
  "dependencies": {
     "js-yaml": "4.1.0",
  

gatsby-config.js

   const yaml = require('js-yaml');
...
    {
      resolve: "gatsby-transformer-remark",
      options: {
         engines: {
           yaml: {
             parse: yaml.load.bind(yaml),
             stringify: yaml.dump.bind(yaml)
           }
        },