Make json schemas for custom types
This commit is contained in:
parent
6172d48bf5
commit
fad46955fb
@ -1,5 +1,6 @@
|
|||||||
import { Validator } from "jsonschema";
|
import { Validator } from "jsonschema";
|
||||||
import { ddbSchema, jsonSchema } from "../schemas";
|
import { ddbSchema, jsonSchema } from "../schemas";
|
||||||
|
import { sqlDataTypes } from "../data/data";
|
||||||
|
|
||||||
function enterFullscreen() {
|
function enterFullscreen() {
|
||||||
const element = document.documentElement;
|
const element = document.documentElement;
|
||||||
@ -47,6 +48,45 @@ function dataURItoBlob(dataUrl) {
|
|||||||
return new Blob([intArray], { type: mimeString });
|
return new Blob([intArray], { type: mimeString });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getJsonType(f) {
|
||||||
|
if (!sqlDataTypes.includes(f.type)) {
|
||||||
|
return '{ "type" : "object", additionalProperties : true }';
|
||||||
|
}
|
||||||
|
switch (f.type) {
|
||||||
|
case "INT":
|
||||||
|
case "SMALLINT":
|
||||||
|
case "BIGINT":
|
||||||
|
return '{ "type" : "integer" }';
|
||||||
|
case "DECIMAL":
|
||||||
|
case "NUMERIC":
|
||||||
|
case "REAL":
|
||||||
|
case "FLOAT":
|
||||||
|
return '{ "type" : "number" }';
|
||||||
|
case "BOOLEAN":
|
||||||
|
return '{ "type" : "boolean" }';
|
||||||
|
case "JSON":
|
||||||
|
return '{ "type" : "object", "additionalProperties" : true }';
|
||||||
|
case "ENUM":
|
||||||
|
return `{\n\t\t\t\t\t"type" : "string",\n\t\t\t\t\t"enum" : [${f.values
|
||||||
|
.map((v) => `"${v}"`)
|
||||||
|
.join(", ")}]\n\t\t\t\t}`;
|
||||||
|
case "SET":
|
||||||
|
return `{\n\t\t\t\t\t"type": "array",\n\t\t\t\t\t"items": {\n\t\t\t\t\t\t"type": "string",\n\t\t\t\t\t\t"enum": [${f.values
|
||||||
|
.map((v) => `"${v}"`)
|
||||||
|
.join(", ")}]\n\t\t\t\t\t}\n\t\t\t\t}`;
|
||||||
|
default:
|
||||||
|
return '{ "type" : "string"}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateSchema(type) {
|
||||||
|
return `{\n\t\t\t"$schema": "http://json-schema.org/draft-04/schema#",\n\t\t\t"type": "object",\n\t\t\t"properties": {\n\t\t\t\t${type.fields
|
||||||
|
.map((f) => `"${f.name}" : ${getJsonType(f)}`)
|
||||||
|
.join(
|
||||||
|
",\n\t\t\t\t"
|
||||||
|
)}\n\t\t\t},\n\t\t\t"additionalProperties": false\n\t\t}`;
|
||||||
|
}
|
||||||
|
|
||||||
function getTypeString(field, dbms = "mysql") {
|
function getTypeString(field, dbms = "mysql") {
|
||||||
if (dbms === "mysql") {
|
if (dbms === "mysql") {
|
||||||
if (field.type === "UUID") {
|
if (field.type === "UUID") {
|
||||||
@ -61,6 +101,9 @@ function getTypeString(field, dbms = "mysql") {
|
|||||||
if (field.type === "SET" || field.type === "ENUM") {
|
if (field.type === "SET" || field.type === "ENUM") {
|
||||||
return `${field.type}(${field.values.map((v) => `"${v}"`).join(", ")})`;
|
return `${field.type}(${field.values.map((v) => `"${v}"`).join(", ")})`;
|
||||||
}
|
}
|
||||||
|
if (!sqlDataTypes.includes(field.type)) {
|
||||||
|
return "JSON";
|
||||||
|
}
|
||||||
return field.type;
|
return field.type;
|
||||||
} else if (dbms === "postgres") {
|
} else if (dbms === "postgres") {
|
||||||
if (field.type === "SMALLINT" && field.increment) {
|
if (field.type === "SMALLINT" && field.increment) {
|
||||||
@ -138,7 +181,13 @@ function jsonToMySQL(obj) {
|
|||||||
: ""
|
: ""
|
||||||
}${
|
}${
|
||||||
field.check === "" || !hasCheck(field.type)
|
field.check === "" || !hasCheck(field.type)
|
||||||
? ""
|
? !sqlDataTypes.includes(field.type)
|
||||||
|
? ` CHECK(\n\t\tJSON_SCHEMA_VALID("${generateSchema(
|
||||||
|
obj.types.find(
|
||||||
|
(t) => t.name === field.type.toLowerCase()
|
||||||
|
)
|
||||||
|
)}", \`${field.name}\`))`
|
||||||
|
: ""
|
||||||
: ` CHECK(${field.check})`
|
: ` CHECK(${field.check})`
|
||||||
}`
|
}`
|
||||||
)
|
)
|
||||||
@ -177,19 +226,32 @@ function jsonToMySQL(obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function jsonToPostgreSQL(obj) {
|
function jsonToPostgreSQL(obj) {
|
||||||
return `${obj.types.map(
|
return `${obj.types.map((type) => {
|
||||||
(type) =>
|
const typeStatements = type.fields
|
||||||
`${type.fields
|
|
||||||
.filter((f) => f.type === "ENUM" || f.type === "SET")
|
.filter((f) => f.type === "ENUM" || f.type === "SET")
|
||||||
.map(
|
.map(
|
||||||
(f) =>
|
(f) =>
|
||||||
`CREATE TYPE "${f.name}_t" AS ENUM (${f.values
|
`CREATE TYPE "${f.name}_t" AS ENUM (${f.values
|
||||||
.map((v) => `'${v}'`)
|
.map((v) => `'${v}'`)
|
||||||
.join(", ")});\n`
|
.join(", ")});\n`
|
||||||
)}CREATE TYPE ${type.name} AS (\n${type.fields
|
);
|
||||||
|
if (typeStatements.length > 0) {
|
||||||
|
return (
|
||||||
|
typeStatements.join("") +
|
||||||
|
`${
|
||||||
|
type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
|
||||||
|
}CREATE TYPE ${type.name} AS (\n${type.fields
|
||||||
.map((f) => `\t${f.name} ${getTypeString(f, "postgres")}`)
|
.map((f) => `\t${f.name} ${getTypeString(f, "postgres")}`)
|
||||||
.join("\n")}\n);`
|
.join("\n")}\n);`
|
||||||
)}\n${obj.tables
|
);
|
||||||
|
} else {
|
||||||
|
return `${
|
||||||
|
type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
|
||||||
|
}CREATE TYPE ${type.name} AS (\n${type.fields
|
||||||
|
.map((f) => `\t${f.name} ${getTypeString(f, "postgres")}`)
|
||||||
|
.join("\n")}\n);`;
|
||||||
|
}
|
||||||
|
})}\n${obj.tables
|
||||||
.map(
|
.map(
|
||||||
(table) =>
|
(table) =>
|
||||||
`${table.comment === "" ? "" : `/**\n${table.comment}\n*/\n`}${
|
`${table.comment === "" ? "" : `/**\n${table.comment}\n*/\n`}${
|
||||||
|
Loading…
Reference in New Issue
Block a user