@nestia/migrate 0.1.11 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/NestiaMigrateApplication.js +74 -9
- package/lib/NestiaMigrateApplication.js.map +1 -1
- package/lib/archivers/FileArchiver.js +0 -1
- package/lib/archivers/FileArchiver.js.map +1 -1
- package/lib/bundles/TEMPLATE.js +10 -5
- package/lib/bundles/TEMPLATE.js.map +1 -1
- package/lib/programmers/RouteProgrammer.js +58 -30
- package/lib/programmers/RouteProgrammer.js.map +1 -1
- package/lib/structures/IMigrateRoute.d.ts +3 -0
- package/lib/structures/ISwaggerRoute.d.ts +3 -1
- package/package.json +4 -4
- package/src/NestiaMigrateApplication.ts +22 -1
- package/src/archivers/FileArchiver.ts +0 -1
- package/src/bundles/TEMPLATE.ts +10 -5
- package/src/programmers/RouteProgrammer.ts +64 -26
- package/src/structures/IMigrateRoute.ts +4 -0
- package/src/structures/ISwaggerRoute.ts +4 -1
| @@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { | |
| 4 4 | 
             
            };
         | 
| 5 5 | 
             
            Object.defineProperty(exports, "__esModule", { value: true });
         | 
| 6 6 | 
             
            exports.NestiaMigrateApplication = void 0;
         | 
| 7 | 
            +
            const child_process_1 = __importDefault(require("child_process"));
         | 
| 7 8 | 
             
            const typia_1 = __importDefault(require("typia"));
         | 
| 8 9 | 
             
            const FileArchiver_1 = require("./archivers/FileArchiver");
         | 
| 9 10 | 
             
            const TEMPLATE_1 = require("./bundles/TEMPLATE");
         | 
| @@ -13,7 +14,23 @@ class NestiaMigrateApplication { | |
| 13 14 | 
             
                    this.generate = (archiver) => (output) => {
         | 
| 14 15 | 
             
                        const program = this.analyze();
         | 
| 15 16 | 
             
                        const files = MigrateProgrammer_1.MigrateProgrammer.write(program);
         | 
| 16 | 
            -
                         | 
| 17 | 
            +
                        try {
         | 
| 18 | 
            +
                            child_process_1.default.execSync(`git clone https://github.com/samchon/nestia-template "${output}"`, { stdio: "ignore" });
         | 
| 19 | 
            +
                            for (const path of [
         | 
| 20 | 
            +
                                "/.git",
         | 
| 21 | 
            +
                                "/src/api",
         | 
| 22 | 
            +
                                "/src/controllers",
         | 
| 23 | 
            +
                                "/src/providers",
         | 
| 24 | 
            +
                                "/test/features",
         | 
| 25 | 
            +
                            ])
         | 
| 26 | 
            +
                                child_process_1.default.execSync(`rm -rf "${output}${path}"`, {
         | 
| 27 | 
            +
                                    stdio: "ignore",
         | 
| 28 | 
            +
                                });
         | 
| 29 | 
            +
                        }
         | 
| 30 | 
            +
                        catch (_a) {
         | 
| 31 | 
            +
                            FileArchiver_1.FileArchiver.archive(archiver)(output)(TEMPLATE_1.TEMPLATE);
         | 
| 32 | 
            +
                        }
         | 
| 33 | 
            +
                        FileArchiver_1.FileArchiver.archive(archiver)(output)(files);
         | 
| 17 34 | 
             
                    };
         | 
| 18 35 | 
             
                    this.swagger = (input => {
         | 
| 19 36 | 
             
                        const __is = input => {
         | 
| @@ -86,11 +103,11 @@ class NestiaMigrateApplication { | |
| 86 103 | 
             
                                    return "object" === typeof value && null !== value && false === Array.isArray(value) && $io31(value);
         | 
| 87 104 | 
             
                                return true;
         | 
| 88 105 | 
             
                            });
         | 
| 89 | 
            -
                            const $io31 = input => (undefined === input.parameters || Array.isArray(input.parameters) && input.parameters.every(elem => "object" === typeof elem && null !== elem && $io32(elem))) && (undefined === input.requestBody || "object" === typeof input.requestBody && null !== input.requestBody && $io33(input.requestBody)) && (undefined === input.responses || "object" === typeof input.responses && null !== input.responses && false === Array.isArray(input.responses) && $io37(input.responses)) && (undefined === input.summary || "string" === typeof input.summary) && (undefined === input.description || "string" === typeof input.description) && (undefined === input.deprecated || "boolean" === typeof input.deprecated) && (undefined === input.security || Array.isArray(input.security) && input.security.every(elem => "object" === typeof elem && null !== elem && false === Array.isArray(elem) && $io39(elem))) && (undefined === input.tags || Array.isArray(input.tags) && input.tags.every(elem => "string" === typeof elem));
         | 
| 106 | 
            +
                            const $io31 = input => (undefined === input.parameters || Array.isArray(input.parameters) && input.parameters.every(elem => "object" === typeof elem && null !== elem && $io32(elem))) && (undefined === input.requestBody || "object" === typeof input.requestBody && null !== input.requestBody && $io33(input.requestBody)) && (undefined === input.responses || "object" === typeof input.responses && null !== input.responses && false === Array.isArray(input.responses) && $io37(input.responses)) && (undefined === input.summary || "string" === typeof input.summary) && (undefined === input.description || "string" === typeof input.description) && (undefined === input.deprecated || "boolean" === typeof input.deprecated) && (undefined === input.security || Array.isArray(input.security) && input.security.every(elem => "object" === typeof elem && null !== elem && false === Array.isArray(elem) && $io39(elem))) && (undefined === input.tags || Array.isArray(input.tags) && input.tags.every(elem => "string" === typeof elem)) && (undefined === input["x-nestia-jsDocTags"] || Array.isArray(input["x-nestia-jsDocTags"]) && input["x-nestia-jsDocTags"].every(elem => "object" === typeof elem && null !== elem && $io40(elem)));
         | 
| 90 107 | 
             
                            const $io32 = input => (undefined === input.name || "string" === typeof input.name) && ("header" === input["in"] || "query" === input["in"] || "cookie" === input["in"] || "path" === input["in"]) && ("object" === typeof input.schema && null !== input.schema && false === Array.isArray(input.schema) && $iu0(input.schema)) && (undefined === input.required || "boolean" === typeof input.required) && (undefined === input.description || "string" === typeof input.description);
         | 
| 91 108 | 
             
                            const $io33 = input => (undefined === input.description || "string" === typeof input.description) && ("object" === typeof input.content && null !== input.content && false === Array.isArray(input.content) && $io34(input.content)) && (undefined === input.required || "boolean" === typeof input.required) && (undefined === input["x-nestia-encrypted"] || "boolean" === typeof input["x-nestia-encrypted"]);
         | 
| 92 109 | 
             
                            const $io34 = input => (undefined === input["text/plain"] || "object" === typeof input["text/plain"] && null !== input["text/plain"] && $io35(input["text/plain"])) && (undefined === input["application/json"] || "object" === typeof input["application/json"] && null !== input["application/json"] && $io36(input["application/json"]));
         | 
| 93 | 
            -
                            const $io35 = input => "object" === typeof input.schema && null !== input.schema && $ | 
| 110 | 
            +
                            const $io35 = input => "object" === typeof input.schema && null !== input.schema && false === Array.isArray(input.schema) && $iu0(input.schema);
         | 
| 94 111 | 
             
                            const $io36 = input => "object" === typeof input.schema && null !== input.schema && false === Array.isArray(input.schema) && $iu0(input.schema);
         | 
| 95 112 | 
             
                            const $io37 = input => Object.keys(input).every(key => {
         | 
| 96 113 | 
             
                                const value = input[key];
         | 
| @@ -109,6 +126,8 @@ class NestiaMigrateApplication { | |
| 109 126 | 
             
                                    return Array.isArray(value) && value.every(elem => "string" === typeof elem);
         | 
| 110 127 | 
             
                                return true;
         | 
| 111 128 | 
             
                            });
         | 
| 129 | 
            +
                            const $io40 = input => "string" === typeof input.name && (undefined === input.text || Array.isArray(input.text) && input.text.every(elem => "object" === typeof elem && null !== elem && $io41(elem)));
         | 
| 130 | 
            +
                            const $io41 = input => "string" === typeof input.text && "string" === typeof input.kind;
         | 
| 112 131 | 
             
                            const $iu0 = input => (() => {
         | 
| 113 132 | 
             
                                if (undefined !== input.anyOf)
         | 
| 114 133 | 
             
                                    return $io8(input);
         | 
| @@ -1193,6 +1212,22 @@ class NestiaMigrateApplication { | |
| 1193 1212 | 
             
                                    path: _path + ".tags",
         | 
| 1194 1213 | 
             
                                    expected: "(Array<string> | undefined)",
         | 
| 1195 1214 | 
             
                                    value: input.tags
         | 
| 1215 | 
            +
                                })) && (undefined === input["x-nestia-jsDocTags"] || (Array.isArray(input["x-nestia-jsDocTags"]) || $guard(_exceptionable, {
         | 
| 1216 | 
            +
                                    path: _path + "[\"x-nestia-jsDocTags\"]",
         | 
| 1217 | 
            +
                                    expected: "(Array<IJsDocTagInfo> | undefined)",
         | 
| 1218 | 
            +
                                    value: input["x-nestia-jsDocTags"]
         | 
| 1219 | 
            +
                                })) && input["x-nestia-jsDocTags"].every((elem, _index14) => ("object" === typeof elem && null !== elem || $guard(_exceptionable, {
         | 
| 1220 | 
            +
                                    path: _path + "[\"x-nestia-jsDocTags\"][" + _index14 + "]",
         | 
| 1221 | 
            +
                                    expected: "IJsDocTagInfo",
         | 
| 1222 | 
            +
                                    value: elem
         | 
| 1223 | 
            +
                                })) && $ao40(elem, _path + "[\"x-nestia-jsDocTags\"][" + _index14 + "]", true && _exceptionable) || $guard(_exceptionable, {
         | 
| 1224 | 
            +
                                    path: _path + "[\"x-nestia-jsDocTags\"][" + _index14 + "]",
         | 
| 1225 | 
            +
                                    expected: "IJsDocTagInfo",
         | 
| 1226 | 
            +
                                    value: elem
         | 
| 1227 | 
            +
                                })) || $guard(_exceptionable, {
         | 
| 1228 | 
            +
                                    path: _path + "[\"x-nestia-jsDocTags\"]",
         | 
| 1229 | 
            +
                                    expected: "(Array<IJsDocTagInfo> | undefined)",
         | 
| 1230 | 
            +
                                    value: input["x-nestia-jsDocTags"]
         | 
| 1196 1231 | 
             
                                }));
         | 
| 1197 1232 | 
             
                                const $ao32 = (input, _path, _exceptionable = true) => (undefined === input.name || "string" === typeof input.name || $guard(_exceptionable, {
         | 
| 1198 1233 | 
             
                                    path: _path + ".name",
         | 
| @@ -1257,13 +1292,13 @@ class NestiaMigrateApplication { | |
| 1257 1292 | 
             
                                    expected: "(__type.o1 | undefined)",
         | 
| 1258 1293 | 
             
                                    value: input["application/json"]
         | 
| 1259 1294 | 
             
                                }));
         | 
| 1260 | 
            -
                                const $ao35 = (input, _path, _exceptionable = true) => ("object" === typeof input.schema && null !== input.schema || $guard(_exceptionable, {
         | 
| 1295 | 
            +
                                const $ao35 = (input, _path, _exceptionable = true) => ("object" === typeof input.schema && null !== input.schema && false === Array.isArray(input.schema) || $guard(_exceptionable, {
         | 
| 1261 1296 | 
             
                                    path: _path + ".schema",
         | 
| 1262 | 
            -
                                    expected: "ISwaggerSchema.IString",
         | 
| 1297 | 
            +
                                    expected: "(ISwaggerSchema.IAnyOf | ISwaggerSchema.IArray | ISwaggerSchema.IBoolean | ISwaggerSchema.IInteger | ISwaggerSchema.INumber | ISwaggerSchema.IObject | ISwaggerSchema.IOneOf | ISwaggerSchema.IReference | ISwaggerSchema.IString | ISwaggerSchema.IUnknown)",
         | 
| 1263 1298 | 
             
                                    value: input.schema
         | 
| 1264 | 
            -
                                })) && $ | 
| 1299 | 
            +
                                })) && $au0(input.schema, _path + ".schema", true && _exceptionable) || $guard(_exceptionable, {
         | 
| 1265 1300 | 
             
                                    path: _path + ".schema",
         | 
| 1266 | 
            -
                                    expected: "ISwaggerSchema.IString",
         | 
| 1301 | 
            +
                                    expected: "(ISwaggerSchema.IAnyOf | ISwaggerSchema.IArray | ISwaggerSchema.IBoolean | ISwaggerSchema.IInteger | ISwaggerSchema.INumber | ISwaggerSchema.IObject | ISwaggerSchema.IOneOf | ISwaggerSchema.IReference | ISwaggerSchema.IString | ISwaggerSchema.IUnknown)",
         | 
| 1267 1302 | 
             
                                    value: input.schema
         | 
| 1268 1303 | 
             
                                });
         | 
| 1269 1304 | 
             
                                const $ao36 = (input, _path, _exceptionable = true) => ("object" === typeof input.schema && null !== input.schema && false === Array.isArray(input.schema) || $guard(_exceptionable, {
         | 
| @@ -1317,8 +1352,8 @@ class NestiaMigrateApplication { | |
| 1317 1352 | 
             
                                            path: _path + $join(key),
         | 
| 1318 1353 | 
             
                                            expected: "Array<string>",
         | 
| 1319 1354 | 
             
                                            value: value
         | 
| 1320 | 
            -
                                        })) && value.every((elem,  | 
| 1321 | 
            -
                                            path: _path + $join(key) + "[" +  | 
| 1355 | 
            +
                                        })) && value.every((elem, _index15) => "string" === typeof elem || $guard(_exceptionable, {
         | 
| 1356 | 
            +
                                            path: _path + $join(key) + "[" + _index15 + "]",
         | 
| 1322 1357 | 
             
                                            expected: "string",
         | 
| 1323 1358 | 
             
                                            value: elem
         | 
| 1324 1359 | 
             
                                        })) || $guard(_exceptionable, {
         | 
| @@ -1328,6 +1363,36 @@ class NestiaMigrateApplication { | |
| 1328 1363 | 
             
                                        });
         | 
| 1329 1364 | 
             
                                    return true;
         | 
| 1330 1365 | 
             
                                });
         | 
| 1366 | 
            +
                                const $ao40 = (input, _path, _exceptionable = true) => ("string" === typeof input.name || $guard(_exceptionable, {
         | 
| 1367 | 
            +
                                    path: _path + ".name",
         | 
| 1368 | 
            +
                                    expected: "string",
         | 
| 1369 | 
            +
                                    value: input.name
         | 
| 1370 | 
            +
                                })) && (undefined === input.text || (Array.isArray(input.text) || $guard(_exceptionable, {
         | 
| 1371 | 
            +
                                    path: _path + ".text",
         | 
| 1372 | 
            +
                                    expected: "(Array<IJsDocTagInfo.IText> | undefined)",
         | 
| 1373 | 
            +
                                    value: input.text
         | 
| 1374 | 
            +
                                })) && input.text.every((elem, _index16) => ("object" === typeof elem && null !== elem || $guard(_exceptionable, {
         | 
| 1375 | 
            +
                                    path: _path + ".text[" + _index16 + "]",
         | 
| 1376 | 
            +
                                    expected: "IJsDocTagInfo.IText",
         | 
| 1377 | 
            +
                                    value: elem
         | 
| 1378 | 
            +
                                })) && $ao41(elem, _path + ".text[" + _index16 + "]", true && _exceptionable) || $guard(_exceptionable, {
         | 
| 1379 | 
            +
                                    path: _path + ".text[" + _index16 + "]",
         | 
| 1380 | 
            +
                                    expected: "IJsDocTagInfo.IText",
         | 
| 1381 | 
            +
                                    value: elem
         | 
| 1382 | 
            +
                                })) || $guard(_exceptionable, {
         | 
| 1383 | 
            +
                                    path: _path + ".text",
         | 
| 1384 | 
            +
                                    expected: "(Array<IJsDocTagInfo.IText> | undefined)",
         | 
| 1385 | 
            +
                                    value: input.text
         | 
| 1386 | 
            +
                                }));
         | 
| 1387 | 
            +
                                const $ao41 = (input, _path, _exceptionable = true) => ("string" === typeof input.text || $guard(_exceptionable, {
         | 
| 1388 | 
            +
                                    path: _path + ".text",
         | 
| 1389 | 
            +
                                    expected: "string",
         | 
| 1390 | 
            +
                                    value: input.text
         | 
| 1391 | 
            +
                                })) && ("string" === typeof input.kind || $guard(_exceptionable, {
         | 
| 1392 | 
            +
                                    path: _path + ".kind",
         | 
| 1393 | 
            +
                                    expected: "string",
         | 
| 1394 | 
            +
                                    value: input.kind
         | 
| 1395 | 
            +
                                }));
         | 
| 1331 1396 | 
             
                                const $au0 = (input, _path, _exceptionable = true) => (() => {
         | 
| 1332 1397 | 
             
                                    if (undefined !== input.anyOf)
         | 
| 1333 1398 | 
             
                                        return $ao8(input, _path, true && _exceptionable);
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"file":"NestiaMigrateApplication.js","sourceRoot":"","sources":["../src/NestiaMigrateApplication.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,2DAAwD;AACxD,iDAA8C;AAC9C,uEAAoE;AAKpE,MAAa,wBAAwB;IAKjC,YAAmB,OAAiB;QAoB7B,aAAQ,GACX,CAAC,QAA4C,EAAE,EAAE,CACjD,CAAC,MAAc,EAAQ,EAAE;YACrB,MAAM,OAAO,GAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,KAAK,GAAmB,qCAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC; | 
| 1 | 
            +
            {"version":3,"file":"NestiaMigrateApplication.js","sourceRoot":"","sources":["../src/NestiaMigrateApplication.ts"],"names":[],"mappings":"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"}
         | 
| @@ -4,7 +4,6 @@ exports.FileArchiver = void 0; | |
| 4 4 | 
             
            var FileArchiver;
         | 
| 5 5 | 
             
            (function (FileArchiver) {
         | 
| 6 6 | 
             
                FileArchiver.archive = (operator) => (output) => (files) => {
         | 
| 7 | 
            -
                    operator.mkdir(output);
         | 
| 8 7 | 
             
                    const visited = new Set();
         | 
| 9 8 | 
             
                    for (const f of files) {
         | 
| 10 9 | 
             
                        mkdir(operator.mkdir)(output)(visited)(f.location);
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"file":"FileArchiver.js","sourceRoot":"","sources":["../../src/archivers/FileArchiver.ts"],"names":[],"mappings":";;;AAEA,IAAiB,YAAY, | 
| 1 | 
            +
            {"version":3,"file":"FileArchiver.js","sourceRoot":"","sources":["../../src/archivers/FileArchiver.ts"],"names":[],"mappings":";;;AAEA,IAAiB,YAAY,CAmC5B;AAnCD,WAAiB,YAAY;IAMZ,oBAAO,GAChB,CAAC,QAAmB,EAAE,EAAE,CACxB,CAAC,MAAc,EAAE,EAAE,CACnB,CAAC,KAAqB,EAAQ,EAAE;QAC5B,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACnB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnD,QAAQ,CAAC,SAAS,CACd,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACtC,CAAC,CAAC,OAAO,CACZ,CAAC;SACL;IACL,CAAC,CAAC;IAEN,MAAM,KAAK,GACP,CAAC,OAA+B,EAAE,EAAE,CACpC,CAAC,MAAc,EAAE,EAAE,CACnB,CAAC,OAAoB,EAAE,EAAE,CACzB,CAAC,IAAY,EAAQ,EAAE;QACnB,MAAM,QAAQ,GAAa,IAAI;aAC1B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,QAAQ;YACpB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK;gBACxB,IAAI;oBACA,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClB;gBAAC,WAAM,GAAE;IACtB,CAAC,CAAC;AACV,CAAC,EAnCgB,YAAY,4BAAZ,YAAY,QAmC5B"}
         | 
    
        package/lib/bundles/TEMPLATE.js
    CHANGED
    
    | @@ -30,7 +30,7 @@ exports.TEMPLATE = [ | |
| 30 30 | 
             
                {
         | 
| 31 31 | 
             
                    "location": "/.vscode",
         | 
| 32 32 | 
             
                    "file": "launch.json",
         | 
| 33 | 
            -
                    "content": "{\r\n    // Use IntelliSense to learn about possible Node.js debug attributes.\r\n    // Hover to view descriptions of existing attributes.\r\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\r\n    \"version\": \"0.2.0\",\r\n    \"configurations\": [\r\n        {\r\n            \"type\": \"node\",\r\n            \"request\": \"launch\",\r\n            \"name\": \" | 
| 33 | 
            +
                    "content": "{\r\n    // Use IntelliSense to learn about possible Node.js debug attributes.\r\n    // Hover to view descriptions of existing attributes.\r\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\r\n    \"version\": \"0.2.0\",\r\n    \"configurations\": [\r\n        {\r\n            \"type\": \"node\",\r\n            \"request\": \"launch\",\r\n            \"name\": \"Backend Test\",\r\n            \"program\": \"${workspaceRoot}/test/index.ts\",\r\n            \"cwd\": \"${workspaceRoot}\",\r\n            \"args\": [\r\n                // //----\r\n                // // Not possible to reset DB in debugging mode\r\n                // //\r\n                // // Therefore, if you need DB reset, then do it \r\n                // // through `npm run reset-for-debugging` command\r\n                // //----\r\n                // \"--reset\", \"false\",\r\n                // \"--mode\", \"local\",\r\n\r\n                //----\r\n                // You can run specific test functions\r\n                //\r\n                // If you want to include or exclude multiple words,\r\n                // then separate them with space character\r\n                //----\r\n                // \"--include\", \"some-words-to-include\",\r\n                // \"--exclude\", \"some-word another-word\",\r\n            ],\r\n            \"outFiles\": [\"${workspaceRoot}/bin/**/*.js\"],\r\n        }\r\n    ]\r\n}"
         | 
| 34 34 | 
             
                },
         | 
| 35 35 | 
             
                {
         | 
| 36 36 | 
             
                    "location": "/.vscode",
         | 
| @@ -50,7 +50,7 @@ exports.TEMPLATE = [ | |
| 50 50 | 
             
                {
         | 
| 51 51 | 
             
                    "location": "",
         | 
| 52 52 | 
             
                    "file": "package.json",
         | 
| 53 | 
            -
                    "content": "{\r\n  \"private\": true,\r\n  \"name\": \"@ORGANIZATION/PROJECT\",\r\n  \"version\": \"0.1.0\",\r\n  \"description\": \"Starter kit of Nestia\",\r\n  \"main\": \"lib/index.js\",\r\n  \"scripts\": {\r\n    \"----------------------------------------------\": \"\",\r\n    \"build\": \"npm run build:sdk && npm run build:main && npm run build:test\",\r\n    \"build:api\": \"rimraf packages/api/lib && npm run build:sdk && tsc -p packages/api/tsconfig.json\",\r\n    \"build:main\": \"rimraf lib && tsc\",\r\n    \"build:sdk\": \"rimraf src/api/functional && nestia sdk\",\r\n    \"build:swagger\": \"npx nestia swagger\",\r\n    \"build:test\": \"rimraf bin && tsc -p test/tsconfig.json\",\r\n    \"dev\": \"npm run build:test -- --watch\",\r\n    \"eslint\": \"eslint src && eslint test\",\r\n    \"eslint:fix\": \"eslint --fix src && eslint --fix test\",\r\n    \"prepare\": \"ts-patch install\",\r\n    \"prettier\": \"prettier src --write && prettier test --write\",\r\n    \"-----------------------------------------------\": \"\",\r\n    \"start\": \"node lib/executable/server\",\r\n    \"test\": \"node bin/test\",\r\n    \"------------------------------------------------\": \"\"\r\n  },\r\n  \"repository\": {\r\n    \"type\": \"git\",\r\n    \"url\": \"https://github.com/samchon/nestia-template\"\r\n  },\r\n  \"keywords\": [\r\n    \"nestia\",\r\n    \"template\",\r\n    \"boilerplate\"\r\n  ],\r\n  \"author\": \"AUTHOR\",\r\n  \"license\": \"MIT\",\r\n  \"bugs\": {\r\n    \"url\": \"https://github.com/samchon/nestia-template/issues\"\r\n  },\r\n  \"homepage\": \"https://github.com/samchon/nestia-template#readme\",\r\n  \"devDependencies\": {\r\n    \"@nestia/e2e\": \"^0.3.6\",\r\n    \"@nestia/sdk\": \"^1. | 
| 53 | 
            +
                    "content": "{\r\n  \"private\": true,\r\n  \"name\": \"@ORGANIZATION/PROJECT\",\r\n  \"version\": \"0.1.0\",\r\n  \"description\": \"Starter kit of Nestia\",\r\n  \"main\": \"lib/index.js\",\r\n  \"scripts\": {\r\n    \"----------------------------------------------\": \"\",\r\n    \"build\": \"npm run build:sdk && npm run build:main && npm run build:test\",\r\n    \"build:api\": \"rimraf packages/api/lib && npm run build:sdk && tsc -p packages/api/tsconfig.json\",\r\n    \"build:main\": \"rimraf lib && tsc\",\r\n    \"build:sdk\": \"rimraf src/api/functional && nestia sdk\",\r\n    \"build:swagger\": \"npx nestia swagger\",\r\n    \"build:test\": \"rimraf bin && tsc -p test/tsconfig.json\",\r\n    \"dev\": \"npm run build:test -- --watch\",\r\n    \"eslint\": \"eslint src && eslint test\",\r\n    \"eslint:fix\": \"eslint --fix src && eslint --fix test\",\r\n    \"package:api\": \"npm run build:swagger && npm run build:api && cd packages/api && npm publish\",\r\n    \"prepare\": \"ts-patch install\",\r\n    \"prettier\": \"prettier src --write && prettier test --write\",\r\n    \"-----------------------------------------------\": \"\",\r\n    \"start\": \"node lib/executable/server\",\r\n    \"test\": \"node bin/test\",\r\n    \"------------------------------------------------\": \"\"\r\n  },\r\n  \"repository\": {\r\n    \"type\": \"git\",\r\n    \"url\": \"https://github.com/samchon/nestia-template\"\r\n  },\r\n  \"keywords\": [\r\n    \"nestia\",\r\n    \"template\",\r\n    \"boilerplate\"\r\n  ],\r\n  \"author\": \"AUTHOR\",\r\n  \"license\": \"MIT\",\r\n  \"bugs\": {\r\n    \"url\": \"https://github.com/samchon/nestia-template/issues\"\r\n  },\r\n  \"homepage\": \"https://github.com/samchon/nestia-template#readme\",\r\n  \"devDependencies\": {\r\n    \"@nestia/e2e\": \"^0.3.6\",\r\n    \"@nestia/sdk\": \"^1.5.1\",\r\n    \"@trivago/prettier-plugin-sort-imports\": \"^3.3.1\",\r\n    \"@types/cli\": \"^0.11.21\",\r\n    \"@types/inquirer\": \"^8.2.5\",\r\n    \"@types/node\": \"^18.11.0\",\r\n    \"@types/uuid\": \"^8.3.4\",\r\n    \"@typescript-eslint/eslint-plugin\": \"^5.40.0\",\r\n    \"@typescript-eslint/parser\": \"^5.40.0\",\r\n    \"chalk\": \"^4.1.0\",\r\n    \"cli\": \"^1.0.1\",\r\n    \"eslint-plugin-deprecation\": \"^1.4.1\",\r\n    \"nestia\": \"^4.3.2\",\r\n    \"prettier\": \"^2.7.1\",\r\n    \"rimraf\": \"^3.0.2\",\r\n    \"source-map-support\": \"^0.5.21\",\r\n    \"ts-node\": \"^10.9.1\",\r\n    \"ts-patch\": \"^3.0.0\",\r\n    \"typescript\": \"^5.1.3\",\r\n    \"typescript-transform-paths\": \"^3.4.6\"\r\n  },\r\n  \"dependencies\": {\r\n    \"@nestia/core\": \"^1.5.1\",\r\n    \"serialize-error\": \"^4.1.0\",\r\n    \"tstl\": \"^2.5.13\",\r\n    \"typia\": \"^4.1.13\",\r\n    \"uuid\": \"^9.0.0\"\r\n  },\r\n  \"stackblitz\": {\r\n    \"startCommand\": \"npm run prepare && npm run build:test && npm run test\"\r\n  }\r\n}\r\n"
         | 
| 54 54 | 
             
                },
         | 
| 55 55 | 
             
                {
         | 
| 56 56 | 
             
                    "location": "/packages/api",
         | 
| @@ -60,7 +60,7 @@ exports.TEMPLATE = [ | |
| 60 60 | 
             
                {
         | 
| 61 61 | 
             
                    "location": "/packages/api",
         | 
| 62 62 | 
             
                    "file": "package.json",
         | 
| 63 | 
            -
                    "content": "{\r\n  \"name\": \"@ORGANIZATION/PROJECT-api\",\r\n  \"version\": \"0.0.0\",\r\n  \"description\": \"API for PROJECT\",\r\n  \"main\": \"lib/index.js\",\r\n  \"typings\": \"lib/index.d.ts\",\r\n  \"repository\": {\r\n    \"type\": \"git\",\r\n    \"url\": \"https://github.com/samchon/nestia-template\"\r\n  },\r\n  \"author\": \"AUTHOR\",\r\n  \"license\": \"MIT\",\r\n  \"bugs\": {\r\n    \"url\": \"https://github.com/samchon/nestia-template/issues\"\r\n  },\r\n  \"homepage\": \"https://github.com/samchon/nestia-template#readme\",\r\n  \"dependencies\": {\r\n    \"@nestia/fetcher\": \"^1. | 
| 63 | 
            +
                    "content": "{\r\n  \"name\": \"@ORGANIZATION/PROJECT-api\",\r\n  \"version\": \"0.0.0\",\r\n  \"description\": \"API for PROJECT\",\r\n  \"main\": \"lib/index.js\",\r\n  \"typings\": \"lib/index.d.ts\",\r\n  \"repository\": {\r\n    \"type\": \"git\",\r\n    \"url\": \"https://github.com/samchon/nestia-template\"\r\n  },\r\n  \"author\": \"AUTHOR\",\r\n  \"license\": \"MIT\",\r\n  \"bugs\": {\r\n    \"url\": \"https://github.com/samchon/nestia-template/issues\"\r\n  },\r\n  \"homepage\": \"https://github.com/samchon/nestia-template#readme\",\r\n  \"dependencies\": {\r\n    \"@nestia/fetcher\": \"^1.5.1\",\r\n    \"typia\": \"^4.1.13\"\r\n  }\r\n}\r\n"
         | 
| 64 64 | 
             
                },
         | 
| 65 65 | 
             
                {
         | 
| 66 66 | 
             
                    "location": "/packages/api",
         | 
| @@ -70,7 +70,7 @@ exports.TEMPLATE = [ | |
| 70 70 | 
             
                {
         | 
| 71 71 | 
             
                    "location": "/packages/api",
         | 
| 72 72 | 
             
                    "file": "swagger.json",
         | 
| 73 | 
            -
                    "content": "{\r\n  \"openapi\": \"3.0.1\",\r\n  \"servers\": [\r\n    {\r\n      \"url\": \"http://localhost:37001\",\r\n      \"description\": \"Local Server\"\r\n    }\r\n  ],\r\n  \"info\": {\r\n    \"version\": \"0.1.0\",\r\n    \"title\": \"@ORGANIZATION/PROJECT\",\r\n    \"description\": \"Starter kit of Nestia\"\r\n  },\r\n  \"paths\": {\r\n    \"/bbs/articles/{section}\": {\r\n      \"patch\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"requestBody\": {\r\n          \"description\": \"Pagination request info with searching and sorting options\",\r\n          \"content\": {\r\n            \"application/json\": {\r\n              \"schema\": {\r\n                \"$ref\": \"#/components/schemas/IBbsArticle.IRequest\"\r\n              }\r\n            }\r\n          },\r\n          \"required\": true,\r\n          \"x-nestia-encrypted\": false\r\n        },\r\n        \"responses\": {\r\n          \"201\": {\r\n            \"description\": \"Paged articles witb summarization\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IPage_lt_IBbsArticle.ISummary_gt_\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"List up entire articles, but paginated and summarized\",\r\n        \"description\": \"List up entire articles, but paginated and summarized.\\n\\nThis method is for listing up summarized articles with pagination.\\n\\nIf you want, you can search and sort articles with specific conditions.\\n\\n@param section Target section\\n@param input Pagination request info with searching and sorting options\\n@returns Paged articles witb summarization\",\r\n        \"x-nestia-namespace\": \"bbs.articles.index\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"input\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Pagination request info with searching and sorting options\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Paged articles witb summarization\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ]\r\n      },\r\n      \"post\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"requestBody\": {\r\n          \"description\": \"New article info\",\r\n          \"content\": {\r\n            \"application/json\": {\r\n              \"schema\": {\r\n                \"$ref\": \"#/components/schemas/IBbsArticle.IStore\"\r\n              }\r\n            }\r\n          },\r\n          \"required\": true,\r\n          \"x-nestia-encrypted\": false\r\n        },\r\n        \"responses\": {\r\n          \"201\": {\r\n            \"description\": \"Newly created article info\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IBbsArticle\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"Store a new article\",\r\n        \"description\": \"Store a new article.\\n\\nStore a new article and returns its detailed record info.\\n\\n@param section Target section\\n@param input New article info\\n@returns Newly created article info\",\r\n        \"x-nestia-namespace\": \"bbs.articles.store\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"input\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"New article info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Newly created article info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ]\r\n      }\r\n    },\r\n    \"/bbs/articles/{section}/{id}\": {\r\n      \"get\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          },\r\n          {\r\n            \"name\": \"id\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target articles id\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"responses\": {\r\n          \"200\": {\r\n            \"description\": \"Detailed article info\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IBbsArticle\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"Get an article with detailed info\",\r\n        \"description\": \"Get an article with detailed info.\\n\\nOpen an article with detailed info, increasing reading count.\\n\\n@param section Target section\\n@param id Target articles id\\n@returns Detailed article info\",\r\n        \"x-nestia-namespace\": \"bbs.articles.at\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"id\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target articles id\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Detailed article info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ]\r\n      },\r\n      \"put\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          },\r\n          {\r\n            \"name\": \"id\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target articles id\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"requestBody\": {\r\n          \"description\": \"Content to update\",\r\n          \"content\": {\r\n            \"application/json\": {\r\n              \"schema\": {\r\n                \"$ref\": \"#/components/schemas/IBbsArticle.IUpdate\"\r\n              }\r\n            }\r\n          },\r\n          \"required\": true,\r\n          \"x-nestia-encrypted\": false\r\n        },\r\n        \"responses\": {\r\n          \"201\": {\r\n            \"description\": \"Newly created content info\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IBbsArticle.ISnapshot\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"Update article\",\r\n        \"description\": \"Update article.\\n\\nWhen updating, this BBS system does not overwrite the content, but accumulate it.\\nTherefore, whenever an article being updated, length of {@link IBbsArticle.snapshots}\\nwould be increased and accumulated.\\n\\n@param section Target section\\n@param id Target articles id\\n@param input Content to update\\n@returns Newly created content info\",\r\n        \"x-nestia-namespace\": \"bbs.articles.update\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"id\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target articles id\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"input\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Content to update\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Newly created content info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ]\r\n      }\r\n    }\r\n  },\r\n  \"components\": {\r\n    \"schemas\": {\r\n      \"IBbsArticle.IRequest\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"search\": {\r\n            \"$ref\": \"#/components/schemas/IBbsArticle.IRequest.ISearch\"\r\n          },\r\n          \"sort\": {\r\n            \"$ref\": \"#/components/schemas/IPage.Sort_lt_IBbsArticle.IRequest.SortableColumns_gt_\"\r\n          },\r\n          \"page\": {\r\n            \"description\": \"Page number.\",\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"number\"\r\n          },\r\n          \"limit\": {\r\n            \"description\": \"Limitation of records per a page.\",\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"number\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"description\": \"Sorting options.\\n\\nThe plus sign means ASC and minus sign means DESC.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.IRequest.ISearch\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"writer\": {\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"description\": \"Searching options.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IPage.Sort_lt_IBbsArticle.IRequest.SortableColumns_gt_\": {\r\n        \"type\": \"array\",\r\n        \"items\": {\r\n          \"type\": \"string\",\r\n          \"enum\": [\r\n            \"-writer\",\r\n            \"-title\",\r\n            \"-created_at\",\r\n            \"-updated_at\",\r\n            \"+writer\",\r\n            \"+title\",\r\n            \"+created_at\",\r\n            \"+updated_at\"\r\n          ]\r\n        }\r\n      },\r\n      \"IPage_lt_IBbsArticle.ISummary_gt_\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"pagination\": {\r\n            \"$ref\": \"#/components/schemas/IPage.IPagination\"\r\n          },\r\n          \"data\": {\r\n            \"description\": \"List of records.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IBbsArticle.ISummary\"\r\n            }\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"pagination\",\r\n          \"data\"\r\n        ],\r\n        \"description\": \"List of records.\",\r\n        \"x-typia-jsDocTags\": [\r\n          {\r\n            \"name\": \"author\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Samchon\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ]\r\n      },\r\n      \"IPage.IPagination\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"current\": {\r\n            \"description\": \"Current page number.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\"\r\n          },\r\n          \"limit\": {\r\n            \"description\": \"Limitation of records per a page.\\n\\n@default 100\",\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"default\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"100\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\",\r\n            \"default\": 100\r\n          },\r\n          \"records\": {\r\n            \"description\": \"Count of total records in database.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\"\r\n          },\r\n          \"pages\": {\r\n            \"description\": \"Number of total pages.\\n\\nEqual to {@link records} / {@link limit} with ceiling.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"current\",\r\n          \"limit\",\r\n          \"records\",\r\n          \"pages\"\r\n        ],\r\n        \"description\": \"Number of total pages.\\n\\nEqual to {@link records} / {@link limit} with ceiling.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.ISummary\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"id\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"writer\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"created_at\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"updated_at\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"id\",\r\n          \"writer\",\r\n          \"title\",\r\n          \"created_at\",\r\n          \"updated_at\"\r\n        ],\r\n        \"description\": \"Summarized info.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"id\": {\r\n            \"description\": \"Primary Key.\\n\\n@format uuid\",\r\n            \"x-typia-metaTags\": [\r\n              {\r\n                \"kind\": \"format\",\r\n                \"value\": \"uuid\"\r\n              }\r\n            ],\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"format\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"uuid\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"format\": \"uuid\"\r\n          },\r\n          \"section\": {\r\n            \"description\": \"Section code.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"writer\": {\r\n            \"description\": \"Name of nickname of writer.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"snapshots\": {\r\n            \"description\": \"List of snapshot contents.\\n\\nWhenever updating an article, its contents would be accumulated.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IBbsArticle.ISnapshot\"\r\n            }\r\n          },\r\n          \"created_at\": {\r\n            \"description\": \"Creation time of the article.\\n\\n@format date-time\",\r\n            \"x-typia-metaTags\": [\r\n              {\r\n                \"kind\": \"format\",\r\n                \"value\": \"datetime\"\r\n              }\r\n            ],\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"format\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"date-time\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"format\": \"date-time\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"id\",\r\n          \"section\",\r\n          \"writer\",\r\n          \"snapshots\",\r\n          \"created_at\"\r\n        ],\r\n        \"description\": \"Creation time of the article.\\n\\n@format date-time\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.ISnapshot\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"id\": {\r\n            \"description\": \"Primary key of individual content.\\n\\n@format uuid\",\r\n            \"x-typia-metaTags\": [\r\n              {\r\n                \"kind\": \"format\",\r\n                \"value\": \"uuid\"\r\n              }\r\n            ],\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"format\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"uuid\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"format\": \"uuid\"\r\n          },\r\n          \"created_at\": {\r\n            \"description\": \"Creation time of this content.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"description\": \"Title of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"description\": \"Content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"format\": {\r\n            \"description\": \"Format of the content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"enum\": [\r\n              \"md\",\r\n              \"html\",\r\n              \"txt\"\r\n            ]\r\n          },\r\n          \"files\": {\r\n            \"description\": \"List of files (to be) attached.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IAttachmentFile\"\r\n            }\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"id\",\r\n          \"created_at\",\r\n          \"title\",\r\n          \"body\",\r\n          \"format\",\r\n          \"files\"\r\n        ],\r\n        \"description\": \"Creation time of this content.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IAttachmentFile\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"name\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"extension\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"nullable\": true\r\n          },\r\n          \"url\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"name\",\r\n          \"extension\",\r\n          \"url\"\r\n        ],\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.IStore\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"writer\": {\r\n            \"description\": \"Name or nickname of the writer.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"description\": \"Title of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"description\": \"Content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"format\": {\r\n            \"description\": \"Format of the content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"enum\": [\r\n              \"md\",\r\n              \"html\",\r\n              \"txt\"\r\n            ]\r\n          },\r\n          \"files\": {\r\n            \"description\": \"List of files (to be) attached.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IAttachmentFile\"\r\n            }\r\n          },\r\n          \"password\": {\r\n            \"description\": \"Password of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"writer\",\r\n          \"title\",\r\n          \"body\",\r\n          \"format\",\r\n          \"files\",\r\n          \"password\"\r\n        ],\r\n        \"description\": \"Name or nickname of the writer.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.IUpdate\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"title\": {\r\n            \"description\": \"Title of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"description\": \"Content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"format\": {\r\n            \"description\": \"Format of the content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"enum\": [\r\n              \"md\",\r\n              \"html\",\r\n              \"txt\"\r\n            ]\r\n          },\r\n          \"files\": {\r\n            \"description\": \"List of files (to be) attached.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IAttachmentFile\"\r\n            }\r\n          },\r\n          \"password\": {\r\n            \"description\": \"Password of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"title\",\r\n          \"body\",\r\n          \"format\",\r\n          \"files\",\r\n          \"password\"\r\n        ],\r\n        \"description\": \"Password of the article.\",\r\n        \"x-typia-jsDocTags\": []\r\n      }\r\n    }\r\n  }\r\n}"
         | 
| 73 | 
            +
                    "content": "{\r\n  \"openapi\": \"3.0.1\",\r\n  \"servers\": [\r\n    {\r\n      \"url\": \"http://localhost:37001\",\r\n      \"description\": \"Local Server\"\r\n    }\r\n  ],\r\n  \"info\": {\r\n    \"version\": \"0.1.0\",\r\n    \"title\": \"@ORGANIZATION/PROJECT\",\r\n    \"description\": \"Starter kit of Nestia\",\r\n    \"license\": {\r\n      \"name\": \"MIT\"\r\n    }\r\n  },\r\n  \"paths\": {\r\n    \"/bbs/articles/{section}\": {\r\n      \"patch\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"requestBody\": {\r\n          \"description\": \"Pagination request info with searching and sorting options\",\r\n          \"content\": {\r\n            \"application/json\": {\r\n              \"schema\": {\r\n                \"$ref\": \"#/components/schemas/IBbsArticle.IRequest\"\r\n              }\r\n            }\r\n          },\r\n          \"required\": true,\r\n          \"x-nestia-encrypted\": false\r\n        },\r\n        \"responses\": {\r\n          \"201\": {\r\n            \"description\": \"Paged articles witb summarization\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IPage_lt_IBbsArticle.ISummary_gt_\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"List up entire articles, but paginated and summarized\",\r\n        \"description\": \"List up entire articles, but paginated and summarized.\\n\\nThis method is for listing up summarized articles with pagination.\\n\\nIf you want, you can search and sort articles with specific conditions.\",\r\n        \"x-nestia-namespace\": \"bbs.articles.index\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"input\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Pagination request info with searching and sorting options\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Paged articles witb summarization\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ],\r\n        \"x-nestia-method\": \"PATCH\"\r\n      },\r\n      \"post\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"requestBody\": {\r\n          \"description\": \"New article info\",\r\n          \"content\": {\r\n            \"application/json\": {\r\n              \"schema\": {\r\n                \"$ref\": \"#/components/schemas/IBbsArticle.IStore\"\r\n              }\r\n            }\r\n          },\r\n          \"required\": true,\r\n          \"x-nestia-encrypted\": false\r\n        },\r\n        \"responses\": {\r\n          \"201\": {\r\n            \"description\": \"Newly created article info\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IBbsArticle\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"Store a new article\",\r\n        \"description\": \"Store a new article.\\n\\nStore a new article and returns its detailed record info.\",\r\n        \"x-nestia-namespace\": \"bbs.articles.store\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"input\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"New article info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Newly created article info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ],\r\n        \"x-nestia-method\": \"POST\"\r\n      }\r\n    },\r\n    \"/bbs/articles/{section}/{id}\": {\r\n      \"get\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          },\r\n          {\r\n            \"name\": \"id\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target articles id\",\r\n            \"schema\": {\r\n              \"format\": \"uuid\",\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"responses\": {\r\n          \"200\": {\r\n            \"description\": \"Detailed article info\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IBbsArticle\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"Get an article with detailed info\",\r\n        \"description\": \"Get an article with detailed info.\\n\\nOpen an article with detailed info, increasing reading count.\",\r\n        \"x-nestia-namespace\": \"bbs.articles.at\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"id\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target articles id\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Detailed article info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ],\r\n        \"x-nestia-method\": \"GET\"\r\n      },\r\n      \"put\": {\r\n        \"tags\": [],\r\n        \"parameters\": [\r\n          {\r\n            \"name\": \"section\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target section\",\r\n            \"schema\": {\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          },\r\n          {\r\n            \"name\": \"id\",\r\n            \"in\": \"path\",\r\n            \"description\": \"Target articles id\",\r\n            \"schema\": {\r\n              \"format\": \"uuid\",\r\n              \"type\": \"string\"\r\n            },\r\n            \"required\": true\r\n          }\r\n        ],\r\n        \"requestBody\": {\r\n          \"description\": \"Content to update\",\r\n          \"content\": {\r\n            \"application/json\": {\r\n              \"schema\": {\r\n                \"$ref\": \"#/components/schemas/IBbsArticle.IUpdate\"\r\n              }\r\n            }\r\n          },\r\n          \"required\": true,\r\n          \"x-nestia-encrypted\": false\r\n        },\r\n        \"responses\": {\r\n          \"201\": {\r\n            \"description\": \"Newly created content info\",\r\n            \"content\": {\r\n              \"application/json\": {\r\n                \"schema\": {\r\n                  \"$ref\": \"#/components/schemas/IBbsArticle.ISnapshot\"\r\n                }\r\n              }\r\n            },\r\n            \"x-nestia-encrypted\": false\r\n          }\r\n        },\r\n        \"summary\": \"Update article\",\r\n        \"description\": \"Update article.\\n\\nWhen updating, this BBS system does not overwrite the content, but accumulate it.\\nTherefore, whenever an article being updated, length of {@link IBbsArticle.snapshots }\\nwould be increased and accumulated.\",\r\n        \"x-nestia-namespace\": \"bbs.articles.update\",\r\n        \"x-nestia-jsDocTags\": [\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"section\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target section\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"id\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Target articles id\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"param\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"input\",\r\n                \"kind\": \"parameterName\"\r\n              },\r\n              {\r\n                \"text\": \" \",\r\n                \"kind\": \"space\"\r\n              },\r\n              {\r\n                \"text\": \"Content to update\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          },\r\n          {\r\n            \"name\": \"returns\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Newly created content info\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ],\r\n        \"x-nestia-method\": \"PUT\"\r\n      }\r\n    }\r\n  },\r\n  \"components\": {\r\n    \"schemas\": {\r\n      \"IBbsArticle.IRequest\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"search\": {\r\n            \"$ref\": \"#/components/schemas/IBbsArticle.IRequest.ISearch\"\r\n          },\r\n          \"sort\": {\r\n            \"$ref\": \"#/components/schemas/IPage.Sort_lt_IBbsArticle.IRequest.SortableColumns_gt_\"\r\n          },\r\n          \"page\": {\r\n            \"description\": \"Page number.\",\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"number\"\r\n          },\r\n          \"limit\": {\r\n            \"description\": \"Limitation of records per a page.\",\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"number\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"description\": \"Page request info with some options.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.IRequest.ISearch\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"writer\": {\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"x-typia-required\": false,\r\n            \"x-typia-optional\": true,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"description\": \"Searching options.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IPage.Sort_lt_IBbsArticle.IRequest.SortableColumns_gt_\": {\r\n        \"description\": \"Sorting column specialization.\\n\\nThe plus means ascending order and the minus means descending order.\",\r\n        \"type\": \"array\",\r\n        \"items\": {\r\n          \"description\": \"Sorting column specialization.\\n\\nThe plus means ascending order and the minus means descending order.\",\r\n          \"type\": \"string\",\r\n          \"enum\": [\r\n            \"-writer\",\r\n            \"-title\",\r\n            \"-created_at\",\r\n            \"-updated_at\",\r\n            \"+writer\",\r\n            \"+title\",\r\n            \"+created_at\",\r\n            \"+updated_at\"\r\n          ]\r\n        }\r\n      },\r\n      \"IPage_lt_IBbsArticle.ISummary_gt_\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"pagination\": {\r\n            \"$ref\": \"#/components/schemas/IPage.IPagination\"\r\n          },\r\n          \"data\": {\r\n            \"description\": \"List of records.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IBbsArticle.ISummary\"\r\n            }\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"pagination\",\r\n          \"data\"\r\n        ],\r\n        \"description\": \"A page.\\n\\nCollection of records with pagination indformation.\",\r\n        \"x-typia-jsDocTags\": [\r\n          {\r\n            \"name\": \"author\",\r\n            \"text\": [\r\n              {\r\n                \"text\": \"Samchon\",\r\n                \"kind\": \"text\"\r\n              }\r\n            ]\r\n          }\r\n        ]\r\n      },\r\n      \"IPage.IPagination\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"current\": {\r\n            \"description\": \"Current page number.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\"\r\n          },\r\n          \"limit\": {\r\n            \"description\": \"Limitation of records per a page.\",\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"default\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"100\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\",\r\n            \"default\": 100\r\n          },\r\n          \"records\": {\r\n            \"description\": \"Count of total records in database.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\"\r\n          },\r\n          \"pages\": {\r\n            \"description\": \"Number of total pages.\\n\\nEqual to {@link records } / {@link limit } with ceiling.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"number\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"current\",\r\n          \"limit\",\r\n          \"records\",\r\n          \"pages\"\r\n        ],\r\n        \"description\": \"Page information.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.ISummary\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"id\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"writer\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"created_at\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"updated_at\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"id\",\r\n          \"writer\",\r\n          \"title\",\r\n          \"created_at\",\r\n          \"updated_at\"\r\n        ],\r\n        \"description\": \"Summarized info.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"id\": {\r\n            \"description\": \"Primary Key.\",\r\n            \"x-typia-metaTags\": [\r\n              {\r\n                \"kind\": \"format\",\r\n                \"value\": \"uuid\"\r\n              }\r\n            ],\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"format\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"uuid\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"format\": \"uuid\"\r\n          },\r\n          \"section\": {\r\n            \"description\": \"Section code.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"writer\": {\r\n            \"description\": \"Name of nickname of writer.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"snapshots\": {\r\n            \"description\": \"List of snapshot contents.\\n\\nWhenever updating an article, its contents would be accumulated.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IBbsArticle.ISnapshot\"\r\n            }\r\n          },\r\n          \"created_at\": {\r\n            \"description\": \"Creation time of the article.\",\r\n            \"x-typia-metaTags\": [\r\n              {\r\n                \"kind\": \"format\",\r\n                \"value\": \"datetime\"\r\n              }\r\n            ],\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"format\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"date-time\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"format\": \"date-time\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"id\",\r\n          \"section\",\r\n          \"writer\",\r\n          \"snapshots\",\r\n          \"created_at\"\r\n        ],\r\n        \"description\": \"BBS article.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.ISnapshot\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"id\": {\r\n            \"description\": \"Primary key of individual content.\",\r\n            \"x-typia-metaTags\": [\r\n              {\r\n                \"kind\": \"format\",\r\n                \"value\": \"uuid\"\r\n              }\r\n            ],\r\n            \"x-typia-jsDocTags\": [\r\n              {\r\n                \"name\": \"format\",\r\n                \"text\": [\r\n                  {\r\n                    \"text\": \"uuid\",\r\n                    \"kind\": \"text\"\r\n                  }\r\n                ]\r\n              }\r\n            ],\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"format\": \"uuid\"\r\n          },\r\n          \"created_at\": {\r\n            \"description\": \"Creation time of this content.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"description\": \"Title of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"description\": \"Content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"format\": {\r\n            \"description\": \"Format of the content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"enum\": [\r\n              \"md\",\r\n              \"html\",\r\n              \"txt\"\r\n            ]\r\n          },\r\n          \"files\": {\r\n            \"description\": \"List of files (to be) attached.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IAttachmentFile\"\r\n            }\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"id\",\r\n          \"created_at\",\r\n          \"title\",\r\n          \"body\",\r\n          \"format\",\r\n          \"files\"\r\n        ],\r\n        \"description\": \"Content info.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IAttachmentFile\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"name\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"extension\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"nullable\": true\r\n          },\r\n          \"url\": {\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"name\",\r\n          \"extension\",\r\n          \"url\"\r\n        ],\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.IStore\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"writer\": {\r\n            \"description\": \"Name or nickname of the writer.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"title\": {\r\n            \"description\": \"Title of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"description\": \"Content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"format\": {\r\n            \"description\": \"Format of the content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"enum\": [\r\n              \"md\",\r\n              \"html\",\r\n              \"txt\"\r\n            ]\r\n          },\r\n          \"files\": {\r\n            \"description\": \"List of files (to be) attached.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IAttachmentFile\"\r\n            }\r\n          },\r\n          \"password\": {\r\n            \"description\": \"Password of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"writer\",\r\n          \"title\",\r\n          \"body\",\r\n          \"format\",\r\n          \"files\",\r\n          \"password\"\r\n        ],\r\n        \"description\": \"Store info.\",\r\n        \"x-typia-jsDocTags\": []\r\n      },\r\n      \"IBbsArticle.IUpdate\": {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n          \"title\": {\r\n            \"description\": \"Title of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"body\": {\r\n            \"description\": \"Content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          },\r\n          \"format\": {\r\n            \"description\": \"Format of the content body.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\",\r\n            \"enum\": [\r\n              \"md\",\r\n              \"html\",\r\n              \"txt\"\r\n            ]\r\n          },\r\n          \"files\": {\r\n            \"description\": \"List of files (to be) attached.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"array\",\r\n            \"items\": {\r\n              \"$ref\": \"#/components/schemas/IAttachmentFile\"\r\n            }\r\n          },\r\n          \"password\": {\r\n            \"description\": \"Password of the article.\",\r\n            \"x-typia-required\": true,\r\n            \"x-typia-optional\": false,\r\n            \"type\": \"string\"\r\n          }\r\n        },\r\n        \"nullable\": false,\r\n        \"required\": [\r\n          \"title\",\r\n          \"body\",\r\n          \"format\",\r\n          \"files\",\r\n          \"password\"\r\n        ],\r\n        \"description\": \"Update info.\",\r\n        \"x-typia-jsDocTags\": []\r\n      }\r\n    }\r\n  }\r\n}"
         | 
| 74 74 | 
             
                },
         | 
| 75 75 | 
             
                {
         | 
| 76 76 | 
             
                    "location": "/packages/api",
         | 
| @@ -117,10 +117,15 @@ exports.TEMPLATE = [ | |
| 117 117 | 
             
                    "file": "MapUtil.ts",
         | 
| 118 118 | 
             
                    "content": "export namespace MapUtil {\r\n    export function take<Key, T>(\r\n        dict: Map<Key, T>,\r\n        key: Key,\r\n        generator: () => T,\r\n    ): T {\r\n        const oldbie: T | undefined = dict.get(key);\r\n        if (oldbie) return oldbie;\r\n\r\n        const value: T = generator();\r\n        dict.set(key, value);\r\n        return value;\r\n    }\r\n}\r\n"
         | 
| 119 119 | 
             
                },
         | 
| 120 | 
            +
                {
         | 
| 121 | 
            +
                    "location": "/test/helpers",
         | 
| 122 | 
            +
                    "file": "ArgumentParser.ts",
         | 
| 123 | 
            +
                    "content": "import commander from 'commander';\r\nimport * as inquirer from 'inquirer';\r\n\r\nexport namespace ArgumentParser {\r\n    export type Inquiry<T> = (\r\n        command: commander.Command,\r\n        prompt: (opt?: inquirer.StreamOptions) => inquirer.PromptModule,\r\n        action: (closure: (options: Partial<T>) => Promise<T>) => Promise<T>,\r\n    ) => Promise<T>;\r\n\r\n    export interface Prompt {\r\n        select: (\r\n            name: string,\r\n        ) => (\r\n            message: string,\r\n        ) => <Choice extends string>(choices: Choice[]) => Promise<Choice>;\r\n        boolean: (name: string) => (message: string) => Promise<boolean>;\r\n    }\r\n\r\n    export const parse = async <T>(\r\n        inquiry: (\r\n            command: commander.Command,\r\n            prompt: Prompt,\r\n            action: (\r\n                closure: (options: Partial<T>) => Promise<T>,\r\n            ) => Promise<T>,\r\n        ) => Promise<T>,\r\n    ): Promise<T> => {\r\n        // TAKE OPTIONS\r\n        const action = (closure: (options: Partial<T>) => Promise<T>) =>\r\n            new Promise<T>((resolve, reject) => {\r\n                commander.program.action(async (options) => {\r\n                    try {\r\n                        resolve(await closure(options));\r\n                    } catch (exp) {\r\n                        reject(exp);\r\n                    }\r\n                });\r\n                commander.program.parseAsync().catch(reject);\r\n            });\r\n\r\n        const select =\r\n            (name: string) =>\r\n            (message: string) =>\r\n            async <Choice extends string>(choices: Choice[]): Promise<Choice> =>\r\n                (\r\n                    await inquirer.createPromptModule()({\r\n                        type: 'list',\r\n                        name,\r\n                        message,\r\n                        choices,\r\n                    })\r\n                )[name];\r\n        const boolean = (name: string) => async (message: string) =>\r\n            (\r\n                await inquirer.createPromptModule()({\r\n                    type: 'confirm',\r\n                    name,\r\n                    message,\r\n                })\r\n            )[name] as boolean;\r\n\r\n        const output: T | Error = await (async () => {\r\n            try {\r\n                return await inquiry(\r\n                    commander.program,\r\n                    { select, boolean },\r\n                    action,\r\n                );\r\n            } catch (error) {\r\n                return error as Error;\r\n            }\r\n        })();\r\n\r\n        // RETURNS\r\n        if (output instanceof Error) throw output;\r\n        return output;\r\n    };\r\n}\r\n"
         | 
| 124 | 
            +
                },
         | 
| 120 125 | 
             
                {
         | 
| 121 126 | 
             
                    "location": "/test",
         | 
| 122 127 | 
             
                    "file": "index.ts",
         | 
| 123 | 
            -
                    "content": "import { DynamicExecutor } from \"@nestia/e2e\";\r\n\r\nimport api from \"@ORGANIZATION/PROJECT-api\";\r\n\r\nimport { Backend } from \"../src/Backend\";\r\nimport { Configuration } from \"../src/Configuration\";\r\nimport { SGlobal } from \"../src/SGlobal\";\r\n\r\nasync function main(): Promise<void> {\r\n    SGlobal.testing = true;\r\n\r\n    // BACKEND SERVER\r\n    const backend: Backend = new Backend();\r\n    await backend.open();\r\n\r\n    //----\r\n    // CLINET CONNECTOR\r\n    //----\r\n    // DO TEST\r\n    const connection: api.IConnection = {\r\n        host: `http://127.0.0.1:${await Configuration.API_PORT()}`,\r\n    };\r\n    const report: DynamicExecutor.IReport = await DynamicExecutor.validate({\r\n        prefix: \"test\",\r\n        parameters: () => [connection],\r\n    })(__dirname + \"/features\");\r\n\r\n    await backend.close();\r\n\r\n    const failures: DynamicExecutor.IReport.IExecution[] =\r\n        report.executions.filter((exec) => exec.error !== null);\r\n    if (failures.length === 0) {\r\n        console.log(\"Success\");\r\n        console.log(\"Elapsed time\", report.time.toLocaleString(), `ms`);\r\n    } else {\r\n        for (const f of failures) console.log(f.error);\r\n        process.exit(-1);\r\n    }\r\n}\r\nmain().catch((exp) => {\r\n    console.log(exp);\r\n    process.exit(-1);\r\n});\r\n"
         | 
| 128 | 
            +
                    "content": "import { DynamicExecutor } from \"@nestia/e2e\";\r\n\r\nimport api from \"@ORGANIZATION/PROJECT-api\";\r\n\r\nimport { Backend } from \"../src/Backend\";\r\nimport { Configuration } from \"../src/Configuration\";\r\nimport { SGlobal } from \"../src/SGlobal\";\r\nimport { ArgumentParser } from \"./helpers/ArgumentParser\";\r\n\r\ninterface IOptions {\r\n    include?: string[];\r\n    exclude?: string[];\r\n}\r\n\r\nconst getOptions = () =>\r\n    ArgumentParser.parse<IOptions>(async (command, prompt, action) => {\r\n        // command.option(\"--mode <string>\", \"target mode\");\r\n        // command.option(\"--reset <true|false>\", \"reset local DB or not\");\r\n        command.option(\"--include <string...>\", \"include feature files\");\r\n        command.option(\"--exclude <string...>\", \"exclude feature files\");\r\n\r\n        prompt;\r\n\r\n        return action(async (options) => {\r\n            // if (typeof options.reset === \"string\")\r\n            //     options.reset = options.reset === \"true\";\r\n            // options.mode ??= await prompt.select(\"mode\")(\"Select mode\")([\r\n            //     \"LOCAL\",\r\n            //     \"DEV\",\r\n            //     \"REAL\",\r\n            // ]);\r\n            // options.reset ??= await prompt.boolean(\"reset\")(\"Reset local DB\");\r\n            return options as IOptions;\r\n        });\r\n    });\r\n\r\nasync function main(): Promise<void> {\r\n    const options: IOptions = await getOptions();\r\n    SGlobal.testing = true;\r\n\r\n    // BACKEND SERVER\r\n    const backend: Backend = new Backend();\r\n    await backend.open();\r\n\r\n    //----\r\n    // CLINET CONNECTOR\r\n    //----\r\n    // DO TEST\r\n    const connection: api.IConnection = {\r\n        host: `http://127.0.0.1:${await Configuration.API_PORT()}`,\r\n    };\r\n    const report: DynamicExecutor.IReport = await DynamicExecutor.validate({\r\n        prefix: \"test\",\r\n        parameters: () => [\r\n            {\r\n                host: connection.host,\r\n                encryption: connection.encryption,\r\n            },\r\n        ],\r\n        filter: (func) =>\r\n            (!options.include?.length ||\r\n                (options.include ?? []).some((str) => func.includes(str))) &&\r\n            (!options.exclude?.length ||\r\n                (options.exclude ?? []).every((str) => !func.includes(str))),\r\n    })(__dirname + \"/features\");\r\n\r\n    await backend.close();\r\n\r\n    const failures: DynamicExecutor.IReport.IExecution[] =\r\n        report.executions.filter((exec) => exec.error !== null);\r\n    if (failures.length === 0) {\r\n        console.log(\"Success\");\r\n        console.log(\"Elapsed time\", report.time.toLocaleString(), `ms`);\r\n    } else {\r\n        for (const f of failures) console.log(f.error);\r\n        process.exit(-1);\r\n    }\r\n}\r\nmain().catch((exp) => {\r\n    console.log(exp);\r\n    process.exit(-1);\r\n});\r\n"
         | 
| 124 129 | 
             
                },
         | 
| 125 130 | 
             
                {
         | 
| 126 131 | 
             
                    "location": "/test",
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"file":"TEMPLATE.js","sourceRoot":"","sources":["../../src/bundles/TEMPLATE.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG;IACpB;QACI,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,6lCAA6lC;KAC3mC;IACD;QACI,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,qtBAAqtB;KACnuB;IACD;QACI,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,+lBAA+lB;KAC7mB;IACD;QACI,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,YAAY;QACpB,SAAS,EAAE,sFAAsF;KACpG;IACD;QACI,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,iIAAiI;KAC/I;IACD;QACI,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE, | 
| 1 | 
            +
            {"version":3,"file":"TEMPLATE.js","sourceRoot":"","sources":["../../src/bundles/TEMPLATE.ts"],"names":[],"mappings":"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"}
         |