aboutsummaryrefslogtreecommitdiff
path: root/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator
diff options
context:
space:
mode:
authorNevena Bojovic <nenabojov@gmail.com>2022-03-01 20:05:50 +0100
committerNevena Bojovic <nenabojov@gmail.com>2022-03-01 20:05:50 +0100
commit291803c31f829fe0d32bb3207bc11def95a7408c (patch)
treec7d43107d79291b19d8c9eceefbe91c9f9a52acf /sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator
parent1fa69862057db4db53cfda5be9c24b4228ef63f7 (diff)
Urađena test aplikacija. Povezan front i back.
Diffstat (limited to 'sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator')
-rw-r--r--sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/index.ts110
-rw-r--r--sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/types.ts12
2 files changed, 122 insertions, 0 deletions
diff --git a/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/index.ts b/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/index.ts
new file mode 100644
index 00000000..ec00064f
--- /dev/null
+++ b/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/index.ts
@@ -0,0 +1,110 @@
+import type {CodeKeywordDefinition, AnySchemaObject, KeywordErrorDefinition} from "../../types"
+import type {KeywordCxt} from "../../compile/validate"
+import {_, getProperty, Name} from "../../compile/codegen"
+import {DiscrError, DiscrErrorObj} from "../discriminator/types"
+import {resolveRef, SchemaEnv} from "../../compile"
+import {schemaHasRulesButRef} from "../../compile/util"
+
+export type DiscriminatorError = DiscrErrorObj<DiscrError.Tag> | DiscrErrorObj<DiscrError.Mapping>
+
+const error: KeywordErrorDefinition = {
+ message: ({params: {discrError, tagName}}) =>
+ discrError === DiscrError.Tag
+ ? `tag "${tagName}" must be string`
+ : `value of tag "${tagName}" must be in oneOf`,
+ params: ({params: {discrError, tag, tagName}}) =>
+ _`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}`,
+}
+
+const def: CodeKeywordDefinition = {
+ keyword: "discriminator",
+ type: "object",
+ schemaType: "object",
+ error,
+ code(cxt: KeywordCxt) {
+ const {gen, data, schema, parentSchema, it} = cxt
+ const {oneOf} = parentSchema
+ if (!it.opts.discriminator) {
+ throw new Error("discriminator: requires discriminator option")
+ }
+ const tagName = schema.propertyName
+ if (typeof tagName != "string") throw new Error("discriminator: requires propertyName")
+ if (schema.mapping) throw new Error("discriminator: mapping is not supported")
+ if (!oneOf) throw new Error("discriminator: requires oneOf keyword")
+ const valid = gen.let("valid", false)
+ const tag = gen.const("tag", _`${data}${getProperty(tagName)}`)
+ gen.if(
+ _`typeof ${tag} == "string"`,
+ () => validateMapping(),
+ () => cxt.error(false, {discrError: DiscrError.Tag, tag, tagName})
+ )
+ cxt.ok(valid)
+
+ function validateMapping(): void {
+ const mapping = getMapping()
+ gen.if(false)
+ for (const tagValue in mapping) {
+ gen.elseIf(_`${tag} === ${tagValue}`)
+ gen.assign(valid, applyTagSchema(mapping[tagValue]))
+ }
+ gen.else()
+ cxt.error(false, {discrError: DiscrError.Mapping, tag, tagName})
+ gen.endIf()
+ }
+
+ function applyTagSchema(schemaProp?: number): Name {
+ const _valid = gen.name("valid")
+ const schCxt = cxt.subschema({keyword: "oneOf", schemaProp}, _valid)
+ cxt.mergeEvaluated(schCxt, Name)
+ return _valid
+ }
+
+ function getMapping(): {[T in string]?: number} {
+ const oneOfMapping: {[T in string]?: number} = {}
+ const topRequired = hasRequired(parentSchema)
+ let tagRequired = true
+ for (let i = 0; i < oneOf.length; i++) {
+ let sch = oneOf[i]
+ if (sch?.$ref && !schemaHasRulesButRef(sch, it.self.RULES)) {
+ sch = resolveRef.call(it.self, it.schemaEnv, it.baseId, sch?.$ref)
+ if (sch instanceof SchemaEnv) sch = sch.schema
+ }
+ const propSch = sch?.properties?.[tagName]
+ if (typeof propSch != "object") {
+ throw new Error(
+ `discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`
+ )
+ }
+ tagRequired = tagRequired && (topRequired || hasRequired(sch))
+ addMappings(propSch, i)
+ }
+ if (!tagRequired) throw new Error(`discriminator: "${tagName}" must be required`)
+ return oneOfMapping
+
+ function hasRequired({required}: AnySchemaObject): boolean {
+ return Array.isArray(required) && required.includes(tagName)
+ }
+
+ function addMappings(sch: AnySchemaObject, i: number): void {
+ if (sch.const) {
+ addMapping(sch.const, i)
+ } else if (sch.enum) {
+ for (const tagValue of sch.enum) {
+ addMapping(tagValue, i)
+ }
+ } else {
+ throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`)
+ }
+ }
+
+ function addMapping(tagValue: unknown, i: number): void {
+ if (typeof tagValue != "string" || tagValue in oneOfMapping) {
+ throw new Error(`discriminator: "${tagName}" values must be unique strings`)
+ }
+ oneOfMapping[tagValue] = i
+ }
+ }
+ },
+}
+
+export default def
diff --git a/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/types.ts b/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/types.ts
new file mode 100644
index 00000000..bee5a278
--- /dev/null
+++ b/sandbox/testAppNevena/Front/node_modules/ajv/lib/vocabularies/discriminator/types.ts
@@ -0,0 +1,12 @@
+import type {ErrorObject} from "../../types"
+
+export enum DiscrError {
+ Tag = "tag",
+ Mapping = "mapping",
+}
+
+export type DiscrErrorObj<E extends DiscrError> = ErrorObject<
+ "discriminator",
+ {error: E; tag: string; tagValue: unknown},
+ string
+>