diff --git a/package-lock.json b/package-lock.json index 98c2a6ba..fd6af1e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -127,7 +127,7 @@ "stream-browserify": "^3.0.0", "tachyons-sass": "^4.9.5", "terser-webpack-plugin": "^5.3.6", - "webpack": "^5.65.0", + "webpack": "^5.76.0", "webpack-bundle-size-analyzer": "^3.1.0", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.7.4", @@ -28687,9 +28687,9 @@ } }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -50811,9 +50811,9 @@ "dev": true }, "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index 9a380157..70d4345a 100644 --- a/package.json +++ b/package.json @@ -179,7 +179,7 @@ "stream-browserify": "^3.0.0", "tachyons-sass": "^4.9.5", "terser-webpack-plugin": "^5.3.6", - "webpack": "^5.65.0", + "webpack": "^5.76.0", "webpack-bundle-size-analyzer": "^3.1.0", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.7.4", diff --git a/src/core/components/model.jsx b/src/core/components/model.jsx index e72edbd6..4b420f36 100644 --- a/src/core/components/model.jsx +++ b/src/core/components/model.jsx @@ -3,6 +3,16 @@ import ImmutablePureComponent from "react-immutable-pure-component" import ImPropTypes from "react-immutable-proptypes" import PropTypes from "prop-types" +const decodeRefName = uri => { + const unescaped = uri.replace(/~1/g, "/").replace(/~0/g, "~") + + try { + return decodeURIComponent(unescaped) + } catch { + return unescaped + } +} + export default class Model extends ImmutablePureComponent { static propTypes = { schema: ImPropTypes.map.isRequired, @@ -22,10 +32,10 @@ export default class Model extends ImmutablePureComponent { getModelName =( ref )=> { if ( ref.indexOf("#/definitions/") !== -1 ) { - return ref.replace(/^.*#\/definitions\//, "") + return decodeRefName(ref.replace(/^.*#\/definitions\//, "")) } if ( ref.indexOf("#/components/schemas/") !== -1 ) { - return ref.replace(/^.*#\/components\/schemas\//, "") + return decodeRefName(ref.replace(/^.*#\/components\/schemas\//, "")) } } diff --git a/test/unit/core/helpers/get-model-name.js b/test/unit/core/helpers/get-model-name.js new file mode 100644 index 00000000..2dbdd99c --- /dev/null +++ b/test/unit/core/helpers/get-model-name.js @@ -0,0 +1,39 @@ +/** + * @prettier + */ + +import Model from "../../../../src/core/components/model" + +describe("getModelName", () => { + const model = new Model() + + it("should decode JSON Pointer and URI encoding for OpenAPI v3 refs", () => { + const actual = model.getModelName("#/components/schemas/a~1b%2Bc") + const expected = "a/b+c" + + expect(actual).toStrictEqual(expected) + }) + + it("should decode JSON Pointer and URI encoding for Swagger v2 refs", () => { + const actual = model.getModelName( + "#/definitions/custom%3A%3Anamespace%3A%3APerson" + ) + const expected = "custom::namespace::Person" + + expect(actual).toStrictEqual(expected) + }) + + it("should decode multiple json-pointer values", () => { + const actual = model.getModelName("#/components/schemas/~1~1~0~0") + const expected = "//~~" + + expect(actual).toStrictEqual(expected) + }) + + it("should support invalid URI encoding", () => { + const actual = model.getModelName("#/components/schemas/%25%d") + const expected = "%25%d" + + expect(actual).toStrictEqual(expected) + }) +})