diff --git a/demo/W-19097505/W-19097505.json b/demo/W-19097505/W-19097505.json new file mode 100644 index 0000000..2a8f2c7 --- /dev/null +++ b/demo/W-19097505/W-19097505.json @@ -0,0 +1,59 @@ +{ + "swagger": "2.0", + "info": { + "title": "Connected API", + "description": "Resources, information and management for digitially connected products\nAll resources of this service requires a valid security token.\nSee Security Token Service API \n", + "version": "v1" + }, + "paths": { + "/1.0": {}, + "/1.0/vehicle": {}, + "/1.0/vehicle/manual": { + "get": { + "description": "Returns a list of digital manuals", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "", + "x-amf-mediaType": "application/json", + "schema": { + "example": [ + { + "locale": "en-NZ", + "make": "TOYOTA", + "model": "AXAL64R_7", + "modelYear": "2026", + "vehicleRegion": "NZ", + "createdAt": "2025-06-25T03:31:08.000Z", + "documents": { + "om": [ + { + "documentType": "om", + "documentUrl": "https://toyotanz.bynder.com/m/1a9818c1db004a8/original/AXAHA_NM1_OM_GeneralOceania_OM00C00E_1_2507-pdf.pdf", + "pubNumber": "OM00C00E", + "summary": "AXAHA_NM1_OM_GeneralOceania_OM00C00E_1_2507.pdf", + "title": "AXAHA_NM1_OM_GeneralOceania_OM00C00E_1_2507-pdf.pdf" + } + ], + "omms": [], + "omnav": [ + { + "documentType": "omnav", + "documentUrl": "https://toyotanz.bynder.com/m/81e86f1e4959e02/original/AXAHA_NM1_MM_GeneralOceania_OM00C00E_1_2507.pdf", + "pubNumber": "OM00C00E", + "summary": "AXAHA_NM1_MM_GeneralOceania_OM00C00E_1_2507", + "title": "AXAHA_NM1_MM_GeneralOceania_OM00C00E_1_2507.pdf" + } + ] + } + } + ] + } + } + } + } + } + } +} diff --git a/demo/index.js b/demo/index.js index 81dc5ce..6f2b520 100644 --- a/demo/index.js +++ b/demo/index.js @@ -127,7 +127,8 @@ class ComponentDemo extends ApiDemoPage { ['W-17309546', 'W-17309546'], ['W-17413312', 'W-17413312'], ['v4_0_0_api_specs', 'v4_0_0_api_specs'], - ['W-18830464', 'W-18830464'] + ['W-18830464', 'W-18830464'], + ['W-19097505', 'W-19097505'] ].map( ([file, label]) => html` =16.14" } }, + "node_modules/@web/test-runner-playwright/node_modules/playwright": { + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.25.2.tgz", + "integrity": "sha512-RwMB5SFRV/8wSfK+tK8ycpqdzORvoqUNz9DUeRfSgZFrZej5uuBl9wFjWcc+OkXFEtaPmx1acAVGG7hA4IJ1kg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.25.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@web/test-runner-playwright/node_modules/playwright-core": { + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.2.tgz", + "integrity": "sha512-0yTbUE9lIddkEpLHL3u8PoCL+pWiZtj5A/j3U7YoNjcmKKDGBnCrgHJMzwd2J5vy6l28q4ki3JIuz7McLHhl1A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@web/test-runner-playwright/node_modules/readdirp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", @@ -7366,6 +7411,20 @@ } } }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/eslint/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9452,18 +9511,25 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -11740,50 +11806,6 @@ "node": ">=8" } }, - "node_modules/playwright": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", - "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", - "dev": true, - "dependencies": { - "playwright-core": "1.49.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", - "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", diff --git a/package.json b/package.json index 8966412..28d4258 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@api-components/api-example-generator", "description": "Examples generator from AMF model", - "version": "4.4.33", + "version": "4.4.34", "license": "Apache-2.0", "main": "index.js", "module": "index.js", @@ -41,6 +41,7 @@ "eslint": "^7.31.0", "eslint-config-prettier": "^8.1.0", "husky": "^7.0.1", + "js-yaml": "^4.1.0", "lint-staged": "^11.1.1", "sinon": "^11.1.1", "typescript": "^4.2.2", diff --git a/src/ExampleGenerator.js b/src/ExampleGenerator.js index ce29ac5..9bb0852 100644 --- a/src/ExampleGenerator.js +++ b/src/ExampleGenerator.js @@ -1,5 +1,6 @@ /* eslint-disable class-methods-use-this */ import { AmfHelperMixin } from '@api-components/amf-helper-mixin/amf-helper-mixin.js'; +import yaml from 'js-yaml'; /* eslint-disable prefer-destructuring */ /* eslint-disable no-plusplus */ @@ -893,7 +894,7 @@ export class ExampleGenerator extends AmfHelperMixin(Object) { } - computeRaw(raw) { + computeRawOld2(raw) { if (typeof raw !== 'string') { return JSON.stringify(raw); } @@ -936,6 +937,20 @@ export class ExampleGenerator extends AmfHelperMixin(Object) { // Convert to clean JSON string return JSON.stringify(sanitized, null, 2); } + + computeRaw(raw) { + if (typeof raw !== 'string') { + return JSON.stringify(raw, null, 2); + } + try { + const parsed = yaml.load(raw); + return JSON.stringify(parsed, null, 2); + } catch (e) { + // this is a fallback for when the RAML is not valid. + return raw; + } + } + /** * Computes list of examples for an array shape. * @param {Object} schema The AMF's array shape diff --git a/test/ExampleGenerator.test.js b/test/ExampleGenerator.test.js index 703f10e..9f859ba 100644 --- a/test/ExampleGenerator.test.js +++ b/test/ExampleGenerator.test.js @@ -3180,8 +3180,8 @@ describe('ExampleGenerator', () => { }); it('should correctly transform raw string to JSON', () => { - const raw = "-\n balance: 200\n approval-status: P\n account-id: de7228b9-f6bb-4261-9d17-a3ddd5802e03\n account-name: Plaid Saving\n account-number: '1111222233331111'\n account-routing-number: '123123123'\n institution-name: Sample Bank\n institution-id: b3dedb19-157c-4239-880f-a125ef4384e2\n created-by: WREX\n modified-by: WREX\n created-at: February 19, 2023, 3:16:01 AM\n modified-at: February 19, 2023, 3:16:01 AM\n-\n balance: 100\n approval-status: P\n account-id: e7bb8f6d-fdc0-4873-9609-d2f2713900ed\n account-name: Plaid Checking\n account-number: '1111222233330000 '\n account-routing-number: '123123123'\n institution-name: Sample Bank\n institution-id: b3dedb19-157c-4239-880f-a125ef4384e2\n created-by: WREX\n modified-by: WREX\n created-at: February 19, 2023, 3:16:01 AM\n modified-at: February 19, 2023, 3:16:01 AM"; - const expectedJson = '[\n {\n "balance": 200,\n "approval-status": "P",\n "account-id": "de7228b9-f6bb-4261-9d17-a3ddd5802e03",\n "account-name": "Plaid Saving",\n "account-number": "\'1111222233331111\'",\n "account-routing-number": "\'123123123\'",\n "institution-name": "Sample Bank",\n "institution-id": "b3dedb19-157c-4239-880f-a125ef4384e2",\n "created-by": "WREX",\n "modified-by": "WREX",\n "created-at": "February 19, 2023, 3:16:01 AM",\n "modified-at": "February 19, 2023, 3:16:01 AM"\n },\n {\n "balance": 100,\n "approval-status": "P",\n "account-id": "e7bb8f6d-fdc0-4873-9609-d2f2713900ed",\n "account-name": "Plaid Checking",\n "account-number": "\'1111222233330000 \'",\n "account-routing-number": "\'123123123\'",\n "institution-name": "Sample Bank",\n "institution-id": "b3dedb19-157c-4239-880f-a125ef4384e2",\n "created-by": "WREX",\n "modified-by": "WREX",\n "created-at": "February 19, 2023, 3:16:01 AM",\n "modified-at": "February 19, 2023, 3:16:01 AM"\n }\n]'; + const raw = "-\n balance: 200\n approval-status: P\n account-id: de7228b9-f6bb-4261-9d17-a3ddd5802e03\n account-name: Plaid Saving\n account-number: '1111222233331111'\n account-routing-number: '123123123'\n institution-name: Sample Bank\n institution-id: b3dedb19-157c-4239-880f-a125ef4384e2\n created-by: WREX\n modified-by: WREX\n created-at: February 19, 2023, 3:16:01 AM\n modified-at: February 19, 2023, 3:16:01 AM\n-\n balance: 100\n approval-status: P\n account-id: e7bb8f6d-fdc0-4873-9609-d2f2713900ed\n account-name: Plaid Checking\n account-number: '1111222233330000'\n account-routing-number: '123123123'\n institution-name: Sample Bank\n institution-id: b3dedb19-157c-4239-880f-a125ef4384e2\n created-by: WREX\n modified-by: WREX\n created-at: February 19, 2023, 3:16:01 AM\n modified-at: February 19, 2023, 3:16:01 AM"; + const expectedJson = '[\n {\n "balance": 200,\n "approval-status": "P",\n "account-id": "de7228b9-f6bb-4261-9d17-a3ddd5802e03",\n "account-name": "Plaid Saving",\n "account-number": "1111222233331111",\n "account-routing-number": "123123123",\n "institution-name": "Sample Bank",\n "institution-id": "b3dedb19-157c-4239-880f-a125ef4384e2",\n "created-by": "WREX",\n "modified-by": "WREX",\n "created-at": "February 19, 2023, 3:16:01 AM",\n "modified-at": "February 19, 2023, 3:16:01 AM"\n },\n {\n "balance": 100,\n "approval-status": "P",\n "account-id": "e7bb8f6d-fdc0-4873-9609-d2f2713900ed",\n "account-name": "Plaid Checking",\n "account-number": "1111222233330000",\n "account-routing-number": "123123123",\n "institution-name": "Sample Bank",\n "institution-id": "b3dedb19-157c-4239-880f-a125ef4384e2",\n "created-by": "WREX",\n "modified-by": "WREX",\n "created-at": "February 19, 2023, 3:16:01 AM",\n "modified-at": "February 19, 2023, 3:16:01 AM"\n }\n]'; assert.equal(element.computeRaw(raw), expectedJson); }); }); diff --git a/test/W-17309546.test.js b/test/W-17309546.test.js index 6af7744..fabadcc 100644 --- a/test/W-17309546.test.js +++ b/test/W-17309546.test.js @@ -36,21 +36,21 @@ describe('W-17309546', () => { "id": 1, "name": "Alice Dupont", "email": "alice.dupont@example.com", - "companyDateEntry": "2003-05-14", + "companyDateEntry": "2003-05-14T00:00:00.000Z", "postal_code": "075001" }, { "id": 2, "name": "Bob Martin", "email": "bob.martin@example.com", - "companyDateEntry": "2004-05-04", + "companyDateEntry": "2004-05-04T00:00:00.000Z", "postal_code": "169002" }, { "id": 3, "name": "Charlie Durand", "email": "charlie.durand@example.com", - "companyDateEntry": "2003-08-11", + "companyDateEntry": "2003-08-11T00:00:00.000Z", "postal_code": "013003" } ]`); diff --git a/test/W-18830464.test.js b/test/W-18830464.test.js index 4cc6180..75ec4e9 100644 --- a/test/W-18830464.test.js +++ b/test/W-18830464.test.js @@ -42,19 +42,21 @@ describe('W-18830464', () => { "programID": "ENERGYALERT", "channelID": "EMAIL", "userID": "CCB_IDL_Provider", - "customProperties": 0 - }, - { - "link": 0 + "customProperties": [ + { + "link": 0 + } + ] }, { "programID": "ENERGYALERT", "channelID": "EMAIL", "userID": "CCB_IDL_Provider", - "customProperties": 0 - }, - { - "link": 0 + "customProperties": [ + { + "link": 0 + } + ] } ]`); }); diff --git a/test/W-19097505.test.js b/test/W-19097505.test.js new file mode 100644 index 0000000..ff439ed --- /dev/null +++ b/test/W-19097505.test.js @@ -0,0 +1,70 @@ +import { fixture, assert, html } from '@open-wc/testing'; +import { AmfLoader } from './amf-loader.js'; +import '../api-example-generator.js'; + +describe('W-19097505', () => { + async function basicFixture(amf) { + return (await fixture(html``)); + } + + const apiFile = 'W-19097505'; + + [ + ['json+ld data model', false], + ['Compact data model', true] + ].forEach(([label, compact]) => { + describe(label, () => { + let element; + let amf; + + before(async () => { + amf = await AmfLoader.load(compact, apiFile); + }); + + beforeEach(async () => { + element = await basicFixture(amf); + }); + + it('renders examples right', () => { + const payloads = AmfLoader.lookupReturnsPayload(amf, '/1.0/vehicle/manual', 'get', 200); + const result = element.generatePayloadsExamples( + payloads, + 'application/json' + ); + const item = result[0]; + assert.equal(item.value, `[ + { + "locale": "en-NZ", + "make": "TOYOTA", + "model": "AXAL64R_7", + "modelYear": "2026", + "vehicleRegion": "NZ", + "createdAt": "2025-06-25T03:31:08.000Z", + "documents": { + "om": [ + { + "documentType": "om", + "documentUrl": "https://toyotanz.bynder.com/m/1a9818c1db004a8/original/AXAHA_NM1_OM_GeneralOceania_OM00C00E_1_2507-pdf.pdf", + "pubNumber": "OM00C00E", + "summary": "AXAHA_NM1_OM_GeneralOceania_OM00C00E_1_2507.pdf", + "title": "AXAHA_NM1_OM_GeneralOceania_OM00C00E_1_2507-pdf.pdf" + } + ], + "omms": [], + "omnav": [ + { + "documentType": "omnav", + "documentUrl": "https://toyotanz.bynder.com/m/81e86f1e4959e02/original/AXAHA_NM1_MM_GeneralOceania_OM00C00E_1_2507.pdf", + "pubNumber": "OM00C00E", + "summary": "AXAHA_NM1_MM_GeneralOceania_OM00C00E_1_2507", + "title": "AXAHA_NM1_MM_GeneralOceania_OM00C00E_1_2507.pdf" + } + ] + } + } +]`); + }); + }); + }); +});