From 6160b10d74ff76a2dc6a20176bc5af4f2fe7cc98 Mon Sep 17 00:00:00 2001 From: Twan Kamp Date: Wed, 10 Apr 2024 23:47:48 -0700 Subject: [PATCH] refactor(json-schema-2020-12-samples): design formatAPI consistent with mediatypeAPI and encoderAPI (#9799) Refs #9739 --- .../fn/api/formatAPI.js | 5 +- .../fn/class/FormatRegistry.js | 65 +++++++++++++ .../fn/types/number.js | 11 --- .../fn/types/string.js | 96 +++---------------- 4 files changed, 79 insertions(+), 98 deletions(-) create mode 100644 src/core/plugins/json-schema-2020-12-samples/fn/class/FormatRegistry.js diff --git a/src/core/plugins/json-schema-2020-12-samples/fn/api/formatAPI.js b/src/core/plugins/json-schema-2020-12-samples/fn/api/formatAPI.js index 9d1cd6b1d63..cd2fff52ca2 100644 --- a/src/core/plugins/json-schema-2020-12-samples/fn/api/formatAPI.js +++ b/src/core/plugins/json-schema-2020-12-samples/fn/api/formatAPI.js @@ -2,9 +2,9 @@ * @prettier */ -import Registry from "../class/Registry" +import FormatRegistry from "../class/FormatRegistry" -const registry = new Registry() +const registry = new FormatRegistry() const formatAPI = (format, generator) => { if (typeof generator === "function") { @@ -15,5 +15,6 @@ const formatAPI = (format, generator) => { return registry.get(format) } +formatAPI.getDefaults = () => registry.defaults export default formatAPI diff --git a/src/core/plugins/json-schema-2020-12-samples/fn/class/FormatRegistry.js b/src/core/plugins/json-schema-2020-12-samples/fn/class/FormatRegistry.js new file mode 100644 index 00000000000..2509d889f8b --- /dev/null +++ b/src/core/plugins/json-schema-2020-12-samples/fn/class/FormatRegistry.js @@ -0,0 +1,65 @@ +/** + * @prettier + */ +import Registry from "./Registry" +import int32Generator from "../generators/int32" +import int64Generator from "../generators/int64" +import floatGenerator from "../generators/float" +import doubleGenerator from "../generators/double" +import emailGenerator from "../generators/email" +import idnEmailGenerator from "../generators/idn-email" +import hostnameGenerator from "../generators/hostname" +import idnHostnameGenerator from "../generators/idn-hostname" +import ipv4Generator from "../generators/ipv4" +import ipv6Generator from "../generators/ipv6" +import uriGenerator from "../generators/uri" +import uriReferenceGenerator from "../generators/uri-reference" +import iriGenerator from "../generators/iri" +import iriReferenceGenerator from "../generators/iri-reference" +import uuidGenerator from "../generators/uuid" +import uriTemplateGenerator from "../generators/uri-template" +import jsonPointerGenerator from "../generators/json-pointer" +import relativeJsonPointerGenerator from "../generators/relative-json-pointer" +import dateTimeGenerator from "../generators/date-time" +import dateGenerator from "../generators/date" +import timeGenerator from "../generators/time" +import durationGenerator from "../generators/duration" +import passwordGenerator from "../generators/password" +import regexGenerator from "../generators/regex" + +class FormatRegistry extends Registry { + #defaults = { + int32: int32Generator, + int64: int64Generator, + float: floatGenerator, + double: doubleGenerator, + email: emailGenerator, + "idn-email": idnEmailGenerator, + hostname: hostnameGenerator, + "idn-hostname": idnHostnameGenerator, + ipv4: ipv4Generator, + ipv6: ipv6Generator, + uri: uriGenerator, + "uri-reference": uriReferenceGenerator, + iri: iriGenerator, + "iri-reference": iriReferenceGenerator, + uuid: uuidGenerator, + "uri-template": uriTemplateGenerator, + "json-pointer": jsonPointerGenerator, + "relative-json-pointer": relativeJsonPointerGenerator, + "date-time": dateTimeGenerator, + date: dateGenerator, + time: timeGenerator, + duration: durationGenerator, + password: passwordGenerator, + regex: regexGenerator, + } + + data = { ...this.#defaults } + + get defaults() { + return { ...this.#defaults } + } +} + +export default FormatRegistry diff --git a/src/core/plugins/json-schema-2020-12-samples/fn/types/number.js b/src/core/plugins/json-schema-2020-12-samples/fn/types/number.js index d246a94d186..0560fb41a4a 100644 --- a/src/core/plugins/json-schema-2020-12-samples/fn/types/number.js +++ b/src/core/plugins/json-schema-2020-12-samples/fn/types/number.js @@ -3,8 +3,6 @@ */ import { number as randomNumber } from "../core/random" import formatAPI from "../api/formatAPI" -import floatGenerator from "../generators/float" -import doubleGenerator from "../generators/double" const generateFormat = (schema) => { const { format } = schema @@ -14,15 +12,6 @@ const generateFormat = (schema) => { return formatGenerator(schema) } - switch (format) { - case "float": { - return floatGenerator() - } - case "double": { - return doubleGenerator() - } - } - return randomNumber() } diff --git a/src/core/plugins/json-schema-2020-12-samples/fn/types/string.js b/src/core/plugins/json-schema-2020-12-samples/fn/types/string.js index 3fd94481fa4..9cf3ac8a6ec 100644 --- a/src/core/plugins/json-schema-2020-12-samples/fn/types/string.js +++ b/src/core/plugins/json-schema-2020-12-samples/fn/types/string.js @@ -5,26 +5,6 @@ import identity from "lodash/identity" import { string as randomString, randexp } from "../core/random" import { isJSONSchema } from "../core/predicates" -import emailGenerator from "../generators/email" -import idnEmailGenerator from "../generators/idn-email" -import hostnameGenerator from "../generators/hostname" -import idnHostnameGenerator from "../generators/idn-hostname" -import ipv4Generator from "../generators/ipv4" -import ipv6Generator from "../generators/ipv6" -import uriGenerator from "../generators/uri" -import uriReferenceGenerator from "../generators/uri-reference" -import iriGenerator from "../generators/iri" -import iriReferenceGenerator from "../generators/iri-reference" -import uuidGenerator from "../generators/uuid" -import uriTemplateGenerator from "../generators/uri-template" -import jsonPointerGenerator from "../generators/json-pointer" -import relativeJsonPointerGenerator from "../generators/relative-json-pointer" -import dateTimeGenerator from "../generators/date-time" -import dateGenerator from "../generators/date" -import timeGenerator from "../generators/time" -import durationGenerator from "../generators/duration" -import passwordGenerator from "../generators/password" -import regexGenerator from "../generators/regex" import formatAPI from "../api/formatAPI" import encoderAPI from "../api/encoderAPI" import mediaTypeAPI from "../api/mediaTypeAPI" @@ -37,67 +17,15 @@ const generateFormat = (schema) => { return formatGenerator(schema) } - switch (format) { - case "email": { - return emailGenerator() - } - case "idn-email": { - return idnEmailGenerator() - } - case "hostname": { - return hostnameGenerator() - } - case "idn-hostname": { - return idnHostnameGenerator() - } - case "ipv4": { - return ipv4Generator() - } - case "ipv6": { - return ipv6Generator() - } - case "uri": { - return uriGenerator() - } - case "uri-reference": { - return uriReferenceGenerator() - } - case "iri": { - return iriGenerator() - } - case "iri-reference": { - return iriReferenceGenerator() - } - case "uuid": { - return uuidGenerator() - } - case "uri-template": { - return uriTemplateGenerator() - } - case "json-pointer": { - return jsonPointerGenerator() - } - case "relative-json-pointer": { - return relativeJsonPointerGenerator() - } - case "date-time": { - return dateTimeGenerator() - } - case "date": { - return dateGenerator() - } - case "time": { - return timeGenerator() - } - case "duration": { - return durationGenerator() - } - case "password": { - return passwordGenerator() - } - case "regex": { - return regexGenerator() - } + return randomString() +} + +const generateMediaType = (schema) => { + const { contentMediaType } = schema + + const mediaTypeGenerator = mediaTypeAPI(contentMediaType) + if (typeof mediaTypeGenerator === "function") { + return mediaTypeGenerator(schema) } return randomString() @@ -119,6 +47,7 @@ const applyStringConstraints = (string, constraints = {}) => { return constrainedString } + const stringType = (schema, { sample } = {}) => { const { contentEncoding, contentMediaType, contentSchema } = schema const { pattern, format } = schema @@ -140,10 +69,7 @@ const stringType = (schema, { sample } = {}) => { generatedString = applyStringConstraints(String(sample), schema) } } else if (typeof contentMediaType === "string") { - const mediaTypeGenerator = mediaTypeAPI(contentMediaType) - if (typeof mediaTypeGenerator === "function") { - generatedString = mediaTypeGenerator(schema) - } + generatedString = generateMediaType(schema) } else { generatedString = applyStringConstraints(randomString(), schema) }