From fc4c1c4c27282fd1c8a20e31f4c42254c5146e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Thu, 13 Jul 2023 21:57:56 +0200 Subject: [PATCH] [mod] namespaces verwenden --- source/main.ts | 2 +- source/outputs/mysql.ts | 76 +++++++----- source/outputs/sqlite.ts | 73 ++++++----- source/outputs/typescript.ts | 230 +++++++++++++++++++++++++---------- tools/makefile | 2 +- 5 files changed, 258 insertions(+), 125 deletions(-) diff --git a/source/main.ts b/source/main.ts index 4a757ef..0200958 100644 --- a/source/main.ts +++ b/source/main.ts @@ -7,7 +7,7 @@ async function main( const outputs : Record = { "sqlite": output_sqlite, "mysql": output_mysql, - "typescript": output_typescript, + "backend-typescript": output_typescript, "jsonschema": output_jsonschema, }; diff --git a/source/outputs/mysql.ts b/source/outputs/mysql.ts index 6c8639d..7d40027 100644 --- a/source/outputs/mysql.ts +++ b/source/outputs/mysql.ts @@ -1,34 +1,44 @@ -function mysql_value_encode( - value : any -) : string +namespace _sindri.outputs.mysql { - if (value === null) { - return "NULL"; - } - else { - switch (typeof(value)) { - case "boolean": { - return (value ? "TRUE" : "FALSE"); - break; - } - case "number": { - return value.toString(); - break; - } - case "string": { - return ("'" + value + "'"); - break; - } - default: { - throw (new Error("unhandled")); - break; + + /** + */ + function value_encode( + value : any + ) : string + { + if (value === null) { + return "NULL"; + } + else { + switch (typeof(value)) { + case "boolean": { + return (value ? "TRUE" : "FALSE"); + break; + } + case "number": { + return value.toString(); + 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 ( input_data.domains .map( @@ -114,7 +124,7 @@ const output_mysql : type_output = { lib_plankton.string.coin( "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")) .join("\n") ); - }, + } + +} + + +/** + */ +const output_mysql : type_output = { + "render": _sindri.outputs.mysql.render, }; diff --git a/source/outputs/sqlite.ts b/source/outputs/sqlite.ts index 334420a..a6bcaa8 100644 --- a/source/outputs/sqlite.ts +++ b/source/outputs/sqlite.ts @@ -1,34 +1,44 @@ -function sqlite_value_encode( - value : any -) : string +namespace _sindri.outputs.sqlite { - if (value === null) { - return "NULL"; - } - else { - switch (typeof(value)) { - case "boolean": { - return (value ? "TRUE" : "FALSE"); - break; - } - case "number": { - return value.toString(); - break; - } - case "string": { - return ("'" + value + "'"); - break; - } - default: { - throw (new Error("unhandled")); - break; + + /** + */ + function value_encode( + value : any + ) : string + { + if (value === null) { + return "NULL"; + } + else { + switch (typeof(value)) { + case "boolean": { + return (value ? "TRUE" : "FALSE"); + break; + } + case "number": { + return value.toString(); + 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 ( input_data["domains"] .map( @@ -92,7 +102,7 @@ const output_sqlite : type_output = { lib_plankton.string.coin( "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")) .join("\n") ); - }, + } + +} + +const output_sqlite : type_output = { + "render": _sindri.outputs.sqlite.render, }; diff --git a/source/outputs/typescript.ts b/source/outputs/typescript.ts index a7af22b..9d9f1dd 100644 --- a/source/outputs/typescript.ts +++ b/source/outputs/typescript.ts @@ -1,73 +1,173 @@ -const output_typescript : type_output = { - "render": function (input_data) { +namespace _sindri.outputs.typescript +{ + + /** + */ + 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", + { + "name": domain.name, + } + ) + : lib_plankton.string.coin( + "Record", + { + "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 {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 ( input_data["domains"] .map( - (domain) => lib_plankton.string.coin( - "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", - { - "name": domain.name, - } - ) - : lib_plankton.string.coin( - "Record", - { - "name": domain.name, - } - ) - ), - "collection_value": ( - (domain.key_field === null) - ? "[]" - : "{}" - ), - } - ) + (domain) => render_entity(domain) ) .map(x => (x + "\n")) .join("\n") ); - }, + } + +} + + +const output_typescript : type_output = { + "render": _sindri.outputs.typescript.render, }; diff --git a/tools/makefile b/tools/makefile index 148b489..c077c03 100644 --- a/tools/makefile +++ b/tools/makefile @@ -18,8 +18,8 @@ lib/plankton/plankton.d.ts \ source/types.ts \ source/outputs/sqlite.ts \ source/outputs/mysql.ts \ -source/outputs/typescript.ts \ source/outputs/jsonschema.ts \ +source/outputs/typescript.ts \ source/conf.ts \ source/main.ts @ ${cmd_log} "compiling …"