diff --git a/benchmark/gland.ts b/benchmark/gland.ts new file mode 100644 index 0000000..e69de29 diff --git a/docs/CHANGELOG b/docs/CHANGELOG new file mode 100644 index 0000000..e69de29 diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/SECURITY b/docs/SECURITY new file mode 100644 index 0000000..e69de29 diff --git a/docs/SRS.md b/docs/SRS.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/documents/api/classes.md b/docs/documents/api/classes.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/documents/api/methods.md b/docs/documents/api/methods.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/documents/api/overview.md b/docs/documents/api/overview.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/documents/guides/getting-started.md b/docs/documents/guides/getting-started.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/documents/index.md b/docs/documents/index.md new file mode 100644 index 0000000..e69de29 diff --git a/examples/CRUD/.gitignore b/examples/CRUD/.gitignore deleted file mode 100644 index 30bc162..0000000 --- a/examples/CRUD/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules \ No newline at end of file diff --git a/examples/CRUD/app.ts b/examples/CRUD/app.ts deleted file mode 100644 index 34b5638..0000000 --- a/examples/CRUD/app.ts +++ /dev/null @@ -1,22 +0,0 @@ -import gland, { Context } from '../../dist'; -const app = new gland(); - -// Define a dynamic route with `all` method -app.all('/about', async (ctx: Context) => { - ctx.end('REQUEST ' + ctx.method + ctx.url); -}); - -(async () => { - const db = app.Qiu('mariadb', 'mahdi', 'root'); - const result = await db.run('SHOW DATABASES;'); - console.log('result:', result); -})(); - -app.load('router'); - -// Start the server -app.init({ - port: 3000, - host: '127.0.0.1', - logger: true, -}); diff --git a/examples/CRUD/db/index.json b/examples/CRUD/db/index.json deleted file mode 100644 index 1568a72..0000000 --- a/examples/CRUD/db/index.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "users": [ - { - "id": 1, - "name": "mahdi", - "role": "memeber" - } - ] -} diff --git a/examples/CRUD/package-lock.json b/examples/CRUD/package-lock.json deleted file mode 100644 index d60cc13..0000000 --- a/examples/CRUD/package-lock.json +++ /dev/null @@ -1,440 +0,0 @@ -{ - "name": "crud", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "crud", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@types/node": "^22.5.0", - "glands": "^1.0.3", - "graphql": "^16.9.0", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "devDependencies": { - "@types/ejs": "^3.1.5", - "ejs": "^3.1.10" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "license": "MIT" - }, - "node_modules/@types/ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", - "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/glands": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/glands/-/glands-1.0.3.tgz", - "integrity": "sha512-I2VBYcSJ593vC8Qu6N+F+fRV29ed3CoEE8qYmyXutRW/PEfQKVCqdfoyGbATr9FebOE8NWSnfMZpduVFj1DGhg==", - "license": "MIT", - "dependencies": { - "@types/node": "^22.0.0", - "typescript": "^5.5.4" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "license": "MIT" - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/examples/CRUD/package.json b/examples/CRUD/package.json deleted file mode 100644 index 5a3d42d..0000000 --- a/examples/CRUD/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "crud", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@types/ejs": "^3.1.5", - "ejs": "^3.1.10" - }, - "dependencies": { - "@types/node": "^22.5.0", - "glands": "^1.0.3", - "graphql": "^16.9.0", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - } -} diff --git a/examples/CRUD/router/crud.ts b/examples/CRUD/router/crud.ts deleted file mode 100644 index 8fc4bc4..0000000 --- a/examples/CRUD/router/crud.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { graphql, buildSchema } from 'graphql'; -import { exposed, Route, Context, All, Get, Post, Delete, Put } from '../../../dist'; -// Define a simple GraphQL schema -const schema = buildSchema(` - type Query { - hello(name: String): String -} -`); - -// Define the root resolver -const root = { - hello: ({ name }: { name: string }) => `Hello, ${name || 'world'}!`, -}; - - -@Route('/graphql') -@exposed -class GraphQLHandler { - @All() - async handleGraphQL(ctx: Context) { - const { query, variables } = ctx.body as { query: string; variables?: any }; - - // Execute the GraphQL query - const result = await graphql({ - schema, - source: query, - variableValues: variables, - rootValue: root, - }); - - // Send the result back as the response - ctx.writeHead(200, { - 'Content-Type': 'application/json', - }); - ctx.write(JSON.stringify(result)); - ctx.end(); - } -} - -import p from 'path'; -import * as fs from 'fs'; -const db = p.join(__dirname, '..', 'db', 'index.json'); -const usersData: Users = JSON.parse(fs.readFileSync(db, 'utf-8')); -interface User { - id: number; - name: string; - role: string; -} -interface Users { - users: User[]; -} -@Route('/') -@exposed -class CRUD { - @Get() - get(ctx: Context) { - ctx.writeHead(200, { - 'Content-Type': 'application/json', - }); - ctx.write(JSON.stringify(usersData)); - ctx.end(); - } - @Post() - post(ctx: Context) { - const { name } = ctx.body as { name: string }; - - // Find the last user's ID and increment it for the new user - const newId = usersData.users[usersData.users.length - 1].id + 1; - - // Create a new user object - const newUser = { - id: newId, - name: name, - role: 'member', // fixed typo from 'memebr' to 'member' - }; - - // Add the new user to the users array - usersData.users.push(newUser); - - // Convert users object to a JSON string and write it back to the file - fs.writeFileSync(db, JSON.stringify(usersData), 'utf-8'); - - // Send the response - ctx.writeHead(200, { - 'Content-Type': 'application/json', - }); - ctx.write(JSON.stringify(newUser)); - ctx.end(); - } - @Delete() - del(ctx: Context) { - const { name } = ctx.body as { name: string }; - - // Parse the existing users from the db.json file - const usersData = JSON.parse(fs.readFileSync(db, 'utf-8')); - - // Filter out the user to be deleted - usersData.users = usersData.users.filter((user: User) => user.name !== name); - - // Write the updated usersData back to the file - fs.writeFileSync(db, JSON.stringify(usersData), 'utf-8'); - ctx.writeHead(200, { - 'Content-Type': 'application/json', - }); - ctx.write(JSON.stringify(usersData.users)); - ctx.end(); - } - @Put() - put(ctx: Context) { - const { name, newName } = ctx.body as { name: string; newName: string }; - - // Parse the existing users from the db.json file - const usersData = JSON.parse(fs.readFileSync(db, 'utf-8')); - - // Find the user by the current name - const user = usersData.users.find((user: User) => user.name === name); - - if (user) { - // Update the user's name - user.name = newName; - - // Write the updated usersData back to the file - fs.writeFileSync(db, JSON.stringify(usersData), 'utf-8'); - - // Send the response with the updated user - ctx.writeHead(200, { - 'Content-Type': 'application/json', - }); - ctx.write(JSON.stringify(user)); - } else { - // If user not found, send a 404 response - ctx.writeHead(404, { - 'Content-Type': 'application/json', - }); - ctx.write(JSON.stringify({ message: 'User not found' })); - } - - ctx.end(); - } -} \ No newline at end of file diff --git a/examples/CRUD/test.ts b/examples/CRUD/test.ts deleted file mode 100644 index eac8761..0000000 --- a/examples/CRUD/test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import gland, { Context, NxtFunction } from 'glands'; -const g = new gland(); -async function log(ctx: Context, nxt: NxtFunction) { - console.log('Hello World'); - await nxt(); -} -g.use(log); -g.use('/', (ctx: Context) => { - ctx.end('hello World'); -}); -g.init({ host: 'localhost', port: 3000, logger: true }); diff --git a/lib/cli/Qiu.ts b/lib/cli/Qiu.ts index f6d8a51..2fd6406 100644 --- a/lib/cli/Qiu.ts +++ b/lib/cli/Qiu.ts @@ -2,11 +2,11 @@ import { exec } from 'child_process'; import { promisify } from 'util'; import { access, constants } from 'fs/promises'; import { DbTypes } from '../types'; -import { logger } from '../helper/logger'; import path from 'path'; import { readFile } from 'fs/promises'; +import { Factory } from '@medishn/gland-logger'; const execAsync = promisify(exec); - +const logger = new Factory({ level: 'info', transports: ['console'], timestampFormat: 'locale' }); class QiuError extends Error { constructor(message: string, public query: string, public dbType: string, public suggestion: string) { super(); @@ -70,7 +70,7 @@ export class Qiu { this.scriptCache.set(script, true); } catch { await execAsync(`chmod +x ${script}`); - logger.warn(`Execute permissions set for script: ${script}`, 'database'); + logger.log(`Execute permissions set for script: ${script}`,'warn','database'); this.scriptCache.set(script, true); } } @@ -94,7 +94,7 @@ export class Qiu { private handleError(message: string, query: string, suggestion: string = 'Please check the script or database configuration.'): never { const error = new QiuError(message, query, this.dbType, suggestion); - logger.error(`\n${error}`, Error(error.message), 'QIU ERROR'); + logger.log(`\n${error}`,'error','QIU ERROR') process.exit(1); } diff --git a/lib/core/router/request.ts b/lib/core/router/request.ts index f7ac3d6..3cd9ae4 100644 --- a/lib/core/router/request.ts +++ b/lib/core/router/request.ts @@ -1,5 +1,6 @@ +import { Factory } from '@medishn/gland-logger'; import { IncomingMessage } from 'http'; -import { logger } from '../../helper/logger'; +const logger = new Factory({ transports: ['console'], level: 'warn' }); const PROTO = IncomingMessage.prototype; PROTO.json = function (): Promise { return new Promise((resolve, reject) => { @@ -9,7 +10,7 @@ PROTO.json = function (): Promise { }); this.on('end', () => { if (!body) { - logger.warn('Request body is empty.'); + logger.log('Request body is empty.', 'warn'); resolve(undefined); } else { try { diff --git a/lib/helper/index.ts b/lib/helper/index.ts index 550e917..5c7b754 100644 --- a/lib/helper/index.ts +++ b/lib/helper/index.ts @@ -1,9 +1,9 @@ import { METHODS } from 'http'; import { Gland } from '../types'; -import { Logger } from './logger'; import { MidsFn } from '../types'; +import { Factory } from '@medishn/gland-logger'; +const logger = new Factory({ timestampFormat: 'locale', level: 'info' }); export namespace ServerUtils { - const logger = Logger.getInstance({ timestampFormat: 'locale', level: 'info' }); export function getMethod(): Array { return ( METHODS && @@ -25,7 +25,7 @@ export namespace ServerUtils { }; } static log(opts: Gland.ListenOptions) { - logger.info(Tools.logMsg(opts)); + logger.log(Tools.logMsg(opts), 'info'); } } export function normalize(middleware: MidsFn | MidsFn[]): MidsFn[] { diff --git a/lib/helper/logger.ts b/lib/helper/logger.ts deleted file mode 100644 index aa68f1e..0000000 --- a/lib/helper/logger.ts +++ /dev/null @@ -1,247 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -const LINE = '==========================\n\t'; -const BOX_BORDER = '─'.repeat(50); -type LogLevel = 'info' | 'warn' | 'error' | 'debug'; -interface LoggerOptions { - level?: LogLevel; - file?: string; - jsonFormat?: boolean; - timestampFormat?: 'iso' | 'locale'; - rotation?: { - enabled: boolean; - maxSize: number; // Maximum file size in bytes - maxFiles: number; // Maximum number of backup files - }; - errorHandling?: { - file: string; - console: boolean; - }; - transports?: Array<'console' | 'file'>; -} - -const logLevels: Record = { - info: 1, - warn: 2, - error: 3, - debug: 4, -}; - -const defaultOpts: LoggerOptions = { - level: 'info', - jsonFormat: false, - timestampFormat: 'iso', - rotation: { - enabled: false, - maxSize: 10485760, // 10 MB - maxFiles: 5, - }, - errorHandling: { - file: 'error.log', - console: true, - }, - transports: ['console', 'file'], -}; - -const logColors: Record = { - info: '\x1b[32m', // green - warn: '\x1b[33m', // yellow - error: '\x1b[31m', // red - debug: '\x1b[34m', // blue -}; - -const resetColor = '\x1b[0m'; - -const categoryHeaders: Record = { - server: LINE + 'SERVER:', - app: LINE + 'APP:', - middleware: LINE + 'MIDDLEWARE:', - database: LINE + 'DATABASE:', - default: LINE + 'INFO:', -}; - -const getFormattedTimestamp = (format: 'iso' | 'locale'): string => { - const now = new Date(); - return format === 'locale' - ? `${now.toLocaleDateString()} ${now.toLocaleTimeString()}` - : now.toISOString().replace('T', ' ').replace('Z', ''); -}; - -export class Logger { - private static instance: Logger; - private level: LogLevel; - private fileStream?: fs.WriteStream; - private jsonFormat: boolean; - private logFilePath: string = '/'; - private timestampFormat: 'iso' | 'locale'; - private lastCategory?: string; - private category: Record = { ...categoryHeaders }; - private rotation: { enabled: boolean; maxSize: number; maxFiles: number }; - private errorHandling: { file: string; console: boolean }; - private transports: Array<'console' | 'file'>; - - constructor(options: LoggerOptions = defaultOpts) { - this.level = options.level || defaultOpts.level!; - this.jsonFormat = options.jsonFormat ?? defaultOpts.jsonFormat!; - this.timestampFormat = options.timestampFormat ?? defaultOpts.timestampFormat!; - this.rotation = options.rotation ?? defaultOpts.rotation!; - this.errorHandling = options.errorHandling ?? defaultOpts.errorHandling!; - this.transports = options.transports ?? defaultOpts.transports!; - - if (options.file) { - // Ensure the 'logs' directory exists - const logsDir = path.join(process.cwd(), 'logs'); - if (!fs.existsSync(logsDir)) { - fs.mkdirSync(logsDir); - } - - // Create the full path to the log file - this.logFilePath = path.join(logsDir, options.file); - - this.fileStream = fs.createWriteStream(this.logFilePath, { flags: 'a' }); - this.fileStream.on('error', (err) => { - if (this.errorHandling.console) { - console.error(`Failed to write to log file: ${err.message}`); - } - if (this.errorHandling.file) { - fs.appendFileSync( - path.join(logsDir, this.errorHandling.file), - `Failed to write to log file: ${err.message}\n`, - ); - } - this.fileStream = undefined; - }); - } - } - - public static getInstance(options?: LoggerOptions): Logger { - if (!Logger.instance || (options && options.file && !Logger.instance.fileStream)) { - Logger.instance = new Logger(options || defaultOpts); - } - return Logger.instance; - } - - public addCategory(category: string, header: string): void { - this.category[category] = LINE + header; - } - - private getTimestamp(): string { - return getFormattedTimestamp(this.timestampFormat); - } - - private formatMessage(message: string, level: LogLevel, category?: string): string { - const timestamp = this.getTimestamp(); - const formattedCategory = category ? `[${category.toUpperCase()}]` : ''; - return `[${timestamp}] [${level.toUpperCase()}] ${formattedCategory}: ${message}`; - } - - private shouldLog(level: LogLevel): boolean { - return logLevels[level] >= logLevels[this.level]; - } - - private logToConsole(message: string, level: LogLevel, category?: string): void { - if (category && category !== this.lastCategory) { - console.log( - `${logColors[level]}${this.category[category] || this.category['default']}${resetColor}`, - ); - this.lastCategory = category; - } - console.log(`${logColors[level]}${message}${resetColor}\n`); - } - - private logToFile(message: string, level: LogLevel, category?: string): void { - if (this.fileStream) { - if (category && category !== this.lastCategory) { - this.fileStream.write(`${LINE}${this.category[category] || this.category['default']}\n`); - this.lastCategory = category; - } - this.fileStream.write(`${BOX_BORDER}\n`); - this.fileStream.write(`${message}\n`); - this.fileStream.write(`${BOX_BORDER}\n\n`); - - if (this.rotation?.enabled) { - this.rotateFileIfNeeded(); - } - } - } - - private async rotateFileIfNeeded(): Promise { - if (this.fileStream && this.logFilePath) { - const stats = await fs.promises.stat(this.logFilePath); - if (stats.size >= this.rotation!.maxSize) { - this.fileStream.end(); - this.rotateFiles(); - this.fileStream = fs.createWriteStream(this.logFilePath, { flags: 'a' }); - this.fileStream.on('error', (err) => { - console.error(`Failed to write to log file: ${err.message}`); - this.fileStream = undefined; - }); - } - } - } - - private async rotateFiles(): Promise { - const logFileBase = path.basename(this.logFilePath!); - const logFileDir = path.dirname(this.logFilePath!); - - for (let i = this.rotation!.maxFiles - 1; i > 0; i--) { - const oldFile = path.join(logFileDir, `${logFileBase}.${i}`); - const newFile = path.join(logFileDir, `${logFileBase}.${i + 1}`); - if (fs.existsSync(oldFile)) { - await fs.promises.rename(oldFile, newFile); - } - } - - const firstBackup = path.join(logFileDir, `${logFileBase}.1`); - await fs.promises.rename(this.logFilePath!, firstBackup); - } - - private async log(message: string, level: LogLevel, category?: string): Promise { - if (this.shouldLog(level)) { - const formattedMessage = this.formatMessage(message, level, category); - if (this.transports.includes('console')) { - this.logToConsole(formattedMessage, level, category); - } - if (this.transports.includes('file')) { - this.logToFile(formattedMessage, level, category); - } - } - } - - public async info(message: string, category?: string): Promise { - await this.log(message, 'info', category); - } - - public async warn(message: string, category?: string): Promise { - await this.log(message, 'warn', category); - } - - public async error(message: string, error?: Error, category?: string): Promise { - const errorMessage = error ? `${message}}` : message; - await this.log(errorMessage, 'error', category); - } - - public async debug(message: string, category?: string): Promise { - await this.log(message, 'debug', category); - } - - public setLevel(level: LogLevel): void { - this.level = level; - } - - public setJsonFormat(jsonFormat: boolean): void { - this.jsonFormat = jsonFormat; - } - - public setTimestampFormat(format: 'iso' | 'locale'): void { - this.timestampFormat = format; - } - - public closeFileStream(): void { - if (this.fileStream) { - this.fileStream.end(); - } - } -} - -export const logger = Logger.getInstance(); diff --git a/lib/index.ts b/lib/index.ts index 3be9f15..d317fd5 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,12 +1,12 @@ import { WebServer } from './core/server'; import { Qiu } from './cli/Qiu'; import { DbTypes, Context } from './types'; -import { Logger } from './helper/logger'; import { exposed, Route } from './core/decorators'; import { Delete, Get, Head, Options, Patch, Post, Put, All } from './core/router/index'; import { NxtFunction } from './types/index'; import { mid, mids } from './core/decorators/index'; import { Gmids } from './core/middleware'; +import { Factory } from '@medishn/gland-logger'; export { Context, NxtFunction }; export default class gland extends WebServer { constructor() { @@ -16,7 +16,7 @@ export default class gland extends WebServer { return Qiu.getInstance(types, user, password); } lg() { - return Logger; + return Factory; } } export { Get, Post, Put, Delete, Patch, Head, Options, Route, exposed, mid, mids, All }; diff --git a/package.json b/package.json index 7dccba9..121b65e 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,13 @@ "example": "examples" }, "scripts": { - "build": "tsc", - "pub":"npm run build & npm publish" + "test": "scripts/tests.sh", + "test:unit": "test/unit", + "test:e2e": "test/e2e", + "test:integration": "test/integration", + "test:performance": "test/performance", + "build": "rm -r dist/* & tsc", + "release": "scripts/release.sh" }, "repository": { "type": "git", @@ -38,10 +43,15 @@ }, "homepage": "https://github.com/medishen/gland#readme", "devDependencies": { - "ts-node": "^10.9.2" - }, - "dependencies": { + "@types/chai": "^4.3.19", + "@types/mocha": "^10.0.7", "@types/node": "^22.0.0", + "chai": "^5.1.1", + "mocha": "^10.7.3", + "ts-node": "^10.9.2", "typescript": "^5.5.4" + }, + "dependencies": { + "@medishn/gland-logger": "^1.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cae2467..b3474fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,16 +8,31 @@ importers: .: dependencies: + '@medishn/gland-logger': + specifier: ^1.0.3 + version: 1.0.3 + devDependencies: + '@types/chai': + specifier: ^4.3.19 + version: 4.3.19 + '@types/mocha': + specifier: ^10.0.7 + version: 10.0.7 '@types/node': specifier: ^22.0.0 version: 22.0.0 - typescript: - specifier: ^5.5.4 - version: 5.5.4 - devDependencies: + chai: + specifier: ^5.1.1 + version: 5.1.1 + mocha: + specifier: ^10.7.3 + version: 10.7.3 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.0.0)(typescript@5.5.4) + typescript: + specifier: ^5.5.4 + version: 5.5.4 packages: @@ -35,6 +50,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@medishn/gland-logger@1.0.3': + resolution: {integrity: sha512-+2V04pNSgr9rdH2rcNV9uj4dl+lUevc1ipNP/nXcc6EsBsN+9C1JWR3mbWuaT8AKKDPa61pLm6+2kT1ZU1C4ag==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -47,6 +65,12 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/chai@4.3.19': + resolution: {integrity: sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw==} + + '@types/mocha@10.0.7': + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} + '@types/node@22.0.0': resolution: {integrity: sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==} @@ -59,19 +83,295 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -97,10 +397,40 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + snapshots: '@cspotcode/source-map-support@0.8.1': @@ -116,6 +446,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@medishn/gland-logger@1.0.3': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -124,6 +456,10 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/chai@4.3.19': {} + + '@types/mocha@10.0.7': {} + '@types/node@22.0.0': dependencies: undici-types: 6.11.1 @@ -134,14 +470,271 @@ snapshots: acorn@8.12.1: {} + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + arg@4.1.3: {} + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + camelcase@6.3.0: {} + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + create-require@1.1.1: {} + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-eql@5.0.2: {} + diff@4.0.2: {} + diff@5.2.0: {} + + emoji-regex@8.0.0: {} + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + has-flag@4.0.0: {} + + he@1.2.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-unicode-supported@0.1.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + make-error@1.3.6: {} + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + mocha@10.7.3: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.1.3: {} + + normalize-path@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + pathval@2.0.0: {} + + picomatch@2.3.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + safe-buffer@5.2.1: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + ts-node@10.9.2(@types/node@22.0.0)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -166,4 +759,37 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100644 index 0000000..e69de29 diff --git a/scripts/tests.sh b/scripts/tests.sh new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/gland.spec.ts b/test/e2e/gland.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/logger.spec.ts b/test/e2e/logger.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/qiu.spec.ts b/test/e2e/qiu.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/integration/Qiu.spec.ts b/test/integration/Qiu.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/integration/metadata.spec.ts b/test/integration/metadata.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/integration/middleware.spec.ts b/test/integration/middleware.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/integration/router.spec.ts b/test/integration/router.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/integration/server.spec.ts b/test/integration/server.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/performance/Qiu.spec.ts b/test/performance/Qiu.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/performance/middleware.spec.ts b/test/performance/middleware.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/performance/router.spec.ts b/test/performance/router.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/performance/server.spec.ts b/test/performance/server.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/cli/Qiu.spec.ts b/test/unit/cli/Qiu.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/core/context.spec.ts b/test/unit/core/context.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/core/decorators.spec.ts b/test/unit/core/decorators.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/core/middleware.spec.ts b/test/unit/core/middleware.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/core/router/index.spec.ts b/test/unit/core/router/index.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/core/router/request.spec.ts b/test/unit/core/router/request.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/core/server.spec.ts b/test/unit/core/server.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/helper/index.spec.ts b/test/unit/helper/index.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/helper/load.spec.ts b/test/unit/helper/load.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/helper/parser.spec.ts b/test/unit/helper/parser.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/metadata/index.spec.ts b/test/unit/metadata/index.spec.ts new file mode 100644 index 0000000..e69de29