Skip to content

refactor(json-schema-2020-12-samples): design formatAPI consistent with mediatypeAPI and encoderAPI #9799

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand All @@ -15,5 +15,6 @@ const formatAPI = (format, generator) => {

return registry.get(format)
}
formatAPI.getDefaults = () => registry.defaults

export default formatAPI
Original file line number Diff line number Diff line change
@@ -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
11 changes: 0 additions & 11 deletions src/core/plugins/json-schema-2020-12-samples/fn/types/number.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -14,15 +12,6 @@ const generateFormat = (schema) => {
return formatGenerator(schema)
}

switch (format) {
case "float": {
return floatGenerator()
}
case "double": {
return doubleGenerator()
}
}

return randomNumber()
}

Expand Down
96 changes: 11 additions & 85 deletions src/core/plugins/json-schema-2020-12-samples/fn/types/string.js
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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()
Expand All @@ -119,6 +47,7 @@ const applyStringConstraints = (string, constraints = {}) => {

return constrainedString
}

const stringType = (schema, { sample } = {}) => {
const { contentEncoding, contentMediaType, contentSchema } = schema
const { pattern, format } = schema
Expand All @@ -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)
}
Expand Down