From 41f84aad054e06ad28e881c694031da351dd29cf Mon Sep 17 00:00:00 2001 From: Tim Lai Date: Thu, 12 May 2022 15:51:38 -0700 Subject: [PATCH] fix: set yaml parser load option to JSON_SCHEMA (#8023) --- src/core/plugins/spec/actions.js | 4 +-- src/core/utils.js | 4 +-- .../features/spec-parse-to-json.yaml | 26 +++++++++++++++++++ .../tests/features/spec-parse-to-json.js | 23 ++++++++++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 test/e2e-cypress/static/documents/features/spec-parse-to-json.yaml create mode 100644 test/e2e-cypress/tests/features/spec-parse-to-json.js diff --git a/src/core/plugins/spec/actions.js b/src/core/plugins/spec/actions.js index 3a2b5709..b220d49b 100644 --- a/src/core/plugins/spec/actions.js +++ b/src/core/plugins/spec/actions.js @@ -1,4 +1,4 @@ -import YAML from "js-yaml" +import YAML, { JSON_SCHEMA } from "js-yaml" import { Map } from "immutable" import parseUrl from "url-parse" import { serializeError } from "serialize-error" @@ -62,7 +62,7 @@ export const parseToJson = (str) => ({specActions, specSelectors, errActions}) = try { str = str || specStr() errActions.clear({ source: "parser" }) - json = YAML.load(str) + json = YAML.load(str, { schema: JSON_SCHEMA }) } catch(e) { // TODO: push error to state console.error(e) diff --git a/src/core/utils.js b/src/core/utils.js index 7a511081..2a27a91e 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -25,7 +25,7 @@ import cssEscape from "css.escape" import getParameterSchema from "../helpers/get-parameter-schema" import randomBytes from "randombytes" import shaJs from "sha.js" -import YAML from "js-yaml" +import YAML, { JSON_SCHEMA } from "js-yaml" const DEFAULT_RESPONSE_KEY = "default" @@ -651,7 +651,7 @@ const getYamlSampleSchema = (schema, config, contentType, exampleOverride) => { yamlString = YAML.dump(YAML.load(jsonExample), { lineWidth: -1 // don't generate line folds - }) + }, { schema: JSON_SCHEMA }) if(yamlString[yamlString.length - 1] === "\n") { yamlString = yamlString.slice(0, yamlString.length - 1) } diff --git a/test/e2e-cypress/static/documents/features/spec-parse-to-json.yaml b/test/e2e-cypress/static/documents/features/spec-parse-to-json.yaml new file mode 100644 index 00000000..8d0ea604 --- /dev/null +++ b/test/e2e-cypress/static/documents/features/spec-parse-to-json.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 + +info: + version: 1.0.0 + title: Native date formats in YAML + +paths: + /foo: + get: + description: Has date without quotes + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + without-quotes: + type: string + format: date + example: 1999-11-31 + with-quotes: + type: string + format: date + example: "1999-12-31" diff --git a/test/e2e-cypress/tests/features/spec-parse-to-json.js b/test/e2e-cypress/tests/features/spec-parse-to-json.js new file mode 100644 index 00000000..14af3dad --- /dev/null +++ b/test/e2e-cypress/tests/features/spec-parse-to-json.js @@ -0,0 +1,23 @@ +/** + * @prettier + */ + +describe("Parse YAML as YAML@1.2 with json_schema for all JSON-supported types", () => { + it("should have date string even without quotes", () => { + cy.visit("/?url=/documents/features/spec-parse-to-json.yaml") + .get("#operations-default-get_foo") + .click() + // Responses -> example value tab + .get(".language-json > :nth-child(3)") + .should("have.text", "\"without-quotes\"") + .get(".language-json > :nth-child(5)") + .should("have.text", "\"1999-11-31\"") + // Responses -> schema tab + .get(".model-example > .tab > :nth-child(2)") + .click() + .get(":nth-child(1) > :nth-child(2) > .model > :nth-child(1) > .prop > .property") // first element, without-quotes + .should("have.text", "example: 1999-11-31") + .get(":nth-child(2) > :nth-child(2) > .model > :nth-child(1) > .prop > .property") // second element, with quotes + .should("have.text", "example: 1999-12-31") + }) +})