[mod] namespaces verwenden

This commit is contained in:
Christian Fraß 2023-07-13 21:57:56 +02:00
parent 94864eaeec
commit fc4c1c4c27
5 changed files with 258 additions and 125 deletions

View file

@ -7,7 +7,7 @@ async function main(
const outputs : Record<string, type_output> = { const outputs : Record<string, type_output> = {
"sqlite": output_sqlite, "sqlite": output_sqlite,
"mysql": output_mysql, "mysql": output_mysql,
"typescript": output_typescript, "backend-typescript": output_typescript,
"jsonschema": output_jsonschema, "jsonschema": output_jsonschema,
}; };

View file

@ -1,34 +1,44 @@
function mysql_value_encode( namespace _sindri.outputs.mysql
value : any
) : string
{ {
if (value === null) {
return "NULL"; /**
} */
else { function value_encode(
switch (typeof(value)) { value : any
case "boolean": { ) : string
return (value ? "TRUE" : "FALSE"); {
break; if (value === null) {
} return "NULL";
case "number": { }
return value.toString(); else {
break; switch (typeof(value)) {
} case "boolean": {
case "string": { return (value ? "TRUE" : "FALSE");
return ("'" + value + "'"); break;
break; }
} case "number": {
default: { return value.toString();
throw (new Error("unhandled")); break;
break; }
case "string": {
return ("'" + value + "'");
break;
}
default: {
throw (new Error("unhandled"));
break;
}
} }
} }
} }
}
const output_mysql : type_output = { /**
"render": function (input_data) { */
export function render(
input_data
) : string
{
return ( return (
input_data.domains input_data.domains
.map( .map(
@ -114,7 +124,7 @@ const output_mysql : type_output = {
lib_plankton.string.coin( lib_plankton.string.coin(
"DEFAULT {{value}}", "DEFAULT {{value}}",
{ {
"value": mysql_value_encode(data_field.default), "value": value_encode(data_field.default),
} }
), ),
] ]
@ -195,5 +205,13 @@ const output_mysql : type_output = {
.map(x => (x + "\n")) .map(x => (x + "\n"))
.join("\n") .join("\n")
); );
}, }
}
/**
*/
const output_mysql : type_output = {
"render": _sindri.outputs.mysql.render,
}; };

View file

@ -1,34 +1,44 @@
function sqlite_value_encode( namespace _sindri.outputs.sqlite
value : any
) : string
{ {
if (value === null) {
return "NULL"; /**
} */
else { function value_encode(
switch (typeof(value)) { value : any
case "boolean": { ) : string
return (value ? "TRUE" : "FALSE"); {
break; if (value === null) {
} return "NULL";
case "number": { }
return value.toString(); else {
break; switch (typeof(value)) {
} case "boolean": {
case "string": { return (value ? "TRUE" : "FALSE");
return ("'" + value + "'"); break;
break; }
} case "number": {
default: { return value.toString();
throw (new Error("unhandled")); break;
break; }
case "string": {
return ("'" + value + "'");
break;
}
default: {
throw (new Error("unhandled"));
break;
}
} }
} }
} }
}
const output_sqlite : type_output = { /**
"render": function (input_data) { */
export function render(
input_data
) : string
{
return ( return (
input_data["domains"] input_data["domains"]
.map( .map(
@ -92,7 +102,7 @@ const output_sqlite : type_output = {
lib_plankton.string.coin( lib_plankton.string.coin(
"DEFAULT {{value}}", "DEFAULT {{value}}",
{ {
"value": sqlite_value_encode(data_field.default), "value": value_encode(data_field.default),
} }
), ),
] ]
@ -160,5 +170,10 @@ const output_sqlite : type_output = {
.map(x => (x + "\n")) .map(x => (x + "\n"))
.join("\n") .join("\n")
); );
}, }
}
const output_sqlite : type_output = {
"render": _sindri.outputs.sqlite.render,
}; };

View file

@ -1,73 +1,173 @@
const output_typescript : type_output = { namespace _sindri.outputs.typescript
"render": function (input_data) { {
/**
*/
function render_entity_type(
domain
) : string
{
return lib_plankton.string.coin(
"type type_{{name}} = {\n{{fields}}\n};\n",
{
"name": domain.name,
"fields": (
domain.data_fields
.map(
(data_field) => lib_plankton.string.coin(
"\t{{name}} : {{type}};{{macro_comment}}",
{
"name": data_field.name,
"type": lib_plankton.string.coin(
(data_field.nullable ? "(null | {{core}})" : "{{core}}"),
{
"core": {
"boolean": "boolean",
"integer": "number",
"float": "number",
"string_short": "string",
"string_medium": "string",
"string_long": "string",
}[data_field["type"]],
}
),
"macro_comment": (
(data_field.description !== null)
? lib_plankton.string.coin(
" // {{comment}}",
{
"comment": data_field.description,
}
)
: ""
),
}
)
)
// .map(x => ("\t" + x))
.join("\n")
),
}
);
}
/**
*/
function render_entity_collection(
domain
) : string
{
return lib_plankton.string.coin(
"let collection_{{name}} : {{collection_type}} = {{collection_value}};\n",
{
"name": domain.name,
"collection_type": (
(domain.key_field === null)
? lib_plankton.string.coin(
"Array<type_{{name}}>",
{
"name": domain.name,
}
)
: lib_plankton.string.coin(
"Record<number, type_{{name}}>",
{
"name": domain.name,
}
)
),
"collection_value": (
(domain.key_field === null)
? "[]"
: "{}"
),
}
);
}
/**
*/
function render_entity(
domain
) : string
{
return (
render_entity_type(domain)
+
render_entity_collection(domain)
);
}
/**
*/
function render_functions(
domain
) : string
{
return (
[
// list
"function {{name}}_list() : Promise<type_{{name}}> {return sql_query_get(\"SELECT * FROM {{name}};\");}",
// read
"",
// create
"",
// update
"",
// delete
"",
]
.join("\n\n")
);
}
/**
*/
function render_api_actions(
domain
) : string
{
return (
[
// list
"",
// read
"",
// create
"",
// update
"",
// delete
"",
]
.join("\n\n")
);
}
/**
*/
export function render(
input_data
) : string
{
return ( return (
input_data["domains"] input_data["domains"]
.map( .map(
(domain) => lib_plankton.string.coin( (domain) => render_entity(domain)
"type type_{{name}} = {\n{{fields}}\n};\nlet collection_{{name}} : {{collection_type}} = {{collection_value}};\n",
{
"name": domain.name,
"fields": (
domain.data_fields
.map(
(data_field) => lib_plankton.string.coin(
"\t{{name}} : {{type}};{{macro_comment}}",
{
"name": data_field.name,
"type": lib_plankton.string.coin(
(data_field.nullable ? "(null | {{core}})" : "{{core}}"),
{
"core": {
"boolean": "boolean",
"integer": "number",
"float": "number",
"string_short": "string",
"string_medium": "string",
"string_long": "string",
}[data_field["type"]],
}
),
"macro_comment": (
(data_field.description !== null)
? lib_plankton.string.coin(
" // {{comment}}",
{
"comment": data_field.description,
}
)
: ""
),
}
)
)
// .map(x => ("\t" + x))
.join("\n")
),
"collection_type": (
(domain.key_field === null)
? lib_plankton.string.coin(
"Array<type_{{name}}>",
{
"name": domain.name,
}
)
: lib_plankton.string.coin(
"Record<number, type_{{name}}>",
{
"name": domain.name,
}
)
),
"collection_value": (
(domain.key_field === null)
? "[]"
: "{}"
),
}
)
) )
.map(x => (x + "\n")) .map(x => (x + "\n"))
.join("\n") .join("\n")
); );
}, }
}
const output_typescript : type_output = {
"render": _sindri.outputs.typescript.render,
}; };

View file

@ -18,8 +18,8 @@ lib/plankton/plankton.d.ts \
source/types.ts \ source/types.ts \
source/outputs/sqlite.ts \ source/outputs/sqlite.ts \
source/outputs/mysql.ts \ source/outputs/mysql.ts \
source/outputs/typescript.ts \
source/outputs/jsonschema.ts \ source/outputs/jsonschema.ts \
source/outputs/typescript.ts \
source/conf.ts \ source/conf.ts \
source/main.ts source/main.ts
@ ${cmd_log} "compiling …" @ ${cmd_log} "compiling …"