diff --git a/.gitignore b/.gitignore index 9e87049f..edcebc15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,visualstudiocode,git,node # Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,visualstudiocode,git,node +.vscode/ + ### Custom ## build/ reports/ diff --git a/packages/architectura/docker/services/node/Dockerfile b/packages/architectura/docker/services/node/Dockerfile index eb534e75..680858f9 100644 --- a/packages/architectura/docker/services/node/Dockerfile +++ b/packages/architectura/docker/services/node/Dockerfile @@ -1,10 +1,11 @@ FROM node:lts-bullseye RUN apt-get update && apt-get install -y --no-install-recommends \ - nano \ - screen \ - htop \ - bash + bash \ + htop \ + nano \ + screen \ + && apt-get clean USER root diff --git a/packages/architectura/src/core/server/rich-client-request.mts b/packages/architectura/src/core/server/rich-client-request.mts index a198a9eb..54d301bd 100644 --- a/packages/architectura/src/core/server/rich-client-request.mts +++ b/packages/architectura/src/core/server/rich-client-request.mts @@ -22,7 +22,7 @@ class RichClientRequest extends IncomingMessage private query: ParsedUrlQuery; private contentType: string | undefined; private boundary: string | undefined; - private rawBody: Promise; + private rawBody: Promise = Promise.resolve(Buffer.alloc(0)); /** * Create a new rich client request. @@ -42,7 +42,6 @@ class RichClientRequest extends IncomingMessage this.query = parseQuery(""); this.contentType = undefined; this.boundary = undefined; - this.rawBody = Promise.resolve(Buffer.alloc(0)); } /** @@ -59,26 +58,7 @@ class RichClientRequest extends IncomingMessage this.initialized = true; - const CONTENT_TYPE_HEADER: string | undefined = this.getHeader("Content-Type"); - - if (CONTENT_TYPE_HEADER !== undefined) - { - this.contentType = CONTENT_TYPE_HEADER; - - if (CONTENT_TYPE_HEADER.startsWith("multipart/form-data; boundary=")) - { - this.contentType = ContentTypeEnum.FORM_DATA; - - const BOUNDARY_IDENTIFIER: string = CONTENT_TYPE_HEADER.replace("multipart/form-data; boundary=", ""); - - if (BOUNDARY_IDENTIFIER.length === 0) - { - throw new Error(`Received invalid multipart/form-data header: ${this.contentType}.`); - } - - this.boundary = `--${BOUNDARY_IDENTIFIER}`; - } - } + this.parseContentType(); const COOKIE_HEADER: string | undefined = this.getHeader("Cookie"); @@ -450,6 +430,32 @@ class RichClientRequest extends IncomingMessage } */ + private parseContentType(): void + { + const CONTENT_TYPE_HEADER: string | undefined = this.getHeader("Content-Type"); + + if (CONTENT_TYPE_HEADER === undefined) + { + return; + } + + this.contentType = CONTENT_TYPE_HEADER; + + if (CONTENT_TYPE_HEADER.startsWith("multipart/form-data; boundary=")) + { + this.contentType = ContentTypeEnum.FORM_DATA; + + const BOUNDARY_IDENTIFIER: string = CONTENT_TYPE_HEADER.replace("multipart/form-data; boundary=", ""); + + if (BOUNDARY_IDENTIFIER.length === 0) + { + throw new Error(`Received invalid multipart/form-data header: ${this.contentType}.`); + } + + this.boundary = `--${BOUNDARY_IDENTIFIER}`; + } + } + private async listenForContent(): Promise { return await new Promise( diff --git a/packages/instrumenta/.c8rc.json b/packages/instrumenta/.c8rc.json new file mode 100644 index 00000000..bc0a834b --- /dev/null +++ b/packages/instrumenta/.c8rc.json @@ -0,0 +1,21 @@ +{ + "src": "./src", + "exclude": [ + "mock", + "test" + ], + "extension": [ + ".mts" + ], + "reporter": [ + "html" + ], + "report-dir": "./coverage", + "skip-full": true, + "check-coverage": true, + "all": true, + "statements": 100, + "branches": 100, + "functions": 100, + "lines": 100 +} diff --git a/packages/instrumenta/.mocharc.json b/packages/instrumenta/.mocharc.json new file mode 100644 index 00000000..01c8aa53 --- /dev/null +++ b/packages/instrumenta/.mocharc.json @@ -0,0 +1,16 @@ +{ + "extension": [ + "mts" + ], + "node-option": [ + "loader=tsx" + ], + "spec": [ + "test/**/*.spec.mts" + ], + "timeout": 5000, + "parallel": true, + "checkLeaks": true, + "diff": true, + "forbidPending": true +} diff --git a/packages/instrumenta/LICENSE b/packages/instrumenta/LICENSE new file mode 100644 index 00000000..11ce4ee2 --- /dev/null +++ b/packages/instrumenta/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 VitruviusLabs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/instrumenta/eslint.config.mjs b/packages/instrumenta/eslint.config.mjs new file mode 100644 index 00000000..bb6f95cb --- /dev/null +++ b/packages/instrumenta/eslint.config.mjs @@ -0,0 +1,3 @@ +import configurations from "../../eslint.config.mjs"; + +export default configurations; diff --git a/packages/instrumenta/package.json b/packages/instrumenta/package.json new file mode 100644 index 00000000..f3ba6573 --- /dev/null +++ b/packages/instrumenta/package.json @@ -0,0 +1,15 @@ +{ + "name": "@vitruvius-labs/instrumenta", + "version": "0.1.0", + "description": "A package providing tools to work with the Architectura framework.", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "Vitruvius Labs", + "contributors": [ + "Nicolas \"SmashingQuasar\" Lebacq" + ], + "license": "ISC", + "packageManager": "pnpm@10.10.0" +} diff --git a/packages/instrumenta/src/main.mts b/packages/instrumenta/src/main.mts new file mode 100644 index 00000000..daf22241 --- /dev/null +++ b/packages/instrumenta/src/main.mts @@ -0,0 +1,25 @@ +import { extractInterfaceName } from "./utility/open-api/extract-interface-name.mjs"; +import { extractInterfaceProperties } from "./utility/open-api/extract-interface-properties.mjs"; +// import { interfaceToOpenAPISchema } from "./utility/open-api/interface-to-open-api-schema.mjs"; + +const interfaceContent: string = ` +import type { SearchFragmentDateInterface } from "../../entity/auxiliary/search-fragment-date/definition/interface/search-fragment-date.interface.mjs"; + +interface BaseSearchPayloadInterface +{ + page?: number; + limit?: number; + uuids?: Array; + createdAt?: SearchFragmentDateInterface; +} + +export type { BaseSearchPayloadInterface }; +`; + +const name: string | undefined = extractInterfaceName(interfaceContent); +const properties: Record = extractInterfaceProperties(interfaceContent); +// const fullResult: string = interfaceToOpenAPISchema(interfaceContent); + +console.debug(name); +console.debug(properties); +// console.debug(fullResult); diff --git a/packages/instrumenta/src/utility/open-api/interface/definition/interface/interface-instantiation.interface.mts b/packages/instrumenta/src/utility/open-api/interface/definition/interface/interface-instantiation.interface.mts new file mode 100644 index 00000000..212623de --- /dev/null +++ b/packages/instrumenta/src/utility/open-api/interface/definition/interface/interface-instantiation.interface.mts @@ -0,0 +1,6 @@ +interface InterfaceInstantiationInterface +{ + content: string; +} + +export type { InterfaceInstantiationInterface }; diff --git a/packages/instrumenta/src/utility/open-api/interface/interface.mts b/packages/instrumenta/src/utility/open-api/interface/interface.mts new file mode 100644 index 00000000..dd944c8a --- /dev/null +++ b/packages/instrumenta/src/utility/open-api/interface/interface.mts @@ -0,0 +1,59 @@ +import type { InterfaceInstantiationInterface } from "./definition/interface/interface-instantiation.interface.mjs"; + +class Interface +{ + private static readonly NameRegularExpression: RegExp = /interface\s+(?\w+)\s*\{?/g; + private static readonly PropertiesRegularExpression: RegExp = /(?[a-zA-Z]\w*)\??:\s*(?[a-zA-Z][\w<>]*)/g; + + private readonly contents: string; + private name: string | undefined; + private readonly properties: Record = {}; + + public constructor(parameters: InterfaceInstantiationInterface) + { + this.contents = parameters.content; + } + + protected extractName(): void + { + const match: RegExpExecArray | null = Interface.NameRegularExpression.exec(this.contents); + + if (match === null) + { + return undefined; + } + + const name: string | undefined = match.groups?.["name"]; + + Interface.NameRegularExpression.lastIndex = 0; + + this.name = name; + } + + protected extractProperties(): void + { + let match: RegExpExecArray | null = Interface.PropertiesRegularExpression.exec(this.contents); + + if (match === null) + { + return; + } + + while (match !== null) + { + const property: string | undefined = match.groups?.["property"]; + const type: string | undefined = match.groups?.["type"]; + + if (property !== undefined && type !== undefined) + { + this.properties[property] = type; + } + + match = Interface.PropertiesRegularExpression.exec(this.contents); + } + + Interface.PropertiesRegularExpression.lastIndex = 0; + } +} + +export { Interface }; diff --git a/packages/instrumenta/tsconfig.build.json b/packages/instrumenta/tsconfig.build.json new file mode 100644 index 00000000..093cc419 --- /dev/null +++ b/packages/instrumenta/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./build/esm", + "declarationDir": "./build/types", + "rootDir": "./src", + "declaration": true, + "declarationMap": false, + "removeComments": false, + "sourceMap": false, + "noEmit": false, + "listFiles": false, + "listEmittedFiles": false + }, + "include": [ + "./src" + ] +} diff --git a/packages/instrumenta/tsconfig.eslint.json b/packages/instrumenta/tsconfig.eslint.json new file mode 100644 index 00000000..e3fc6e6b --- /dev/null +++ b/packages/instrumenta/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": {}, + "include": [ + "./src", + "./test", + "./mock" + ] +} diff --git a/packages/instrumenta/tsconfig.json b/packages/instrumenta/tsconfig.json new file mode 100755 index 00000000..4066ce62 --- /dev/null +++ b/packages/instrumenta/tsconfig.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "../../tsconfig.json", + "compilerOptions": { + "allowSyntheticDefaultImports": true + }, + "include": [ + "./src", + "./test", + "./mock" + ], + "exclude": [ + "./node_modules" + ] +} diff --git a/packages/instrumenta/tsconfig.mocha.json b/packages/instrumenta/tsconfig.mocha.json new file mode 100644 index 00000000..73373ac4 --- /dev/null +++ b/packages/instrumenta/tsconfig.mocha.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "include": [ + ".", + "./**/.*", + "./**/*.json" + ], + "ts-node": { + "files": true, + "swc": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08b8fe69..4bd48552 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,6 +112,8 @@ importers: packages/functional: {} + packages/instrumenta: {} + packages/mockingbird: dependencies: '@vitruvius-labs/ts-predicate': @@ -128,6 +130,18 @@ importers: packages/ts-predicate: {} + shared/architectura-benchmark: + dependencies: + '@vitruvius-labs/architectura': + specifier: ^5.0.1 + version: 5.0.1 + + shared/fastify-benchmark: + dependencies: + fastify: + specifier: ^5.4.0 + version: 5.4.0 + packages: '@ampproject/remapping@2.3.0': @@ -701,6 +715,24 @@ packages: resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/ajv-compiler@4.0.2': + resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} + + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} + + '@fastify/fast-json-stringify-compiler@5.0.3': + resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} + + '@fastify/forwarded@3.0.0': + resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} + + '@fastify/merge-json-schemas@0.2.1': + resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} + + '@fastify/proxy-addr@5.0.0': + resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1044,6 +1076,20 @@ packages: resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitruvius-labs/architectura@5.0.1': + resolution: {integrity: sha512-4RiZMAPVyjJOSG3wdKRM2VMA0P6O/vcYxYYqh1wVJhWhHssrQUATq/jxGEN76y4SzI8vsfR7U63/2d1YtAdI9g==} + + '@vitruvius-labs/toolbox@0.2.1': + resolution: {integrity: sha512-u1ByMp8kzBVt5bp5+cwDnfSi88TLhmbtVnDgLuSgdhKuCF9XHwDNoqBHFS7xUUZ8WxDALuzbqcZgbacFZLZPlQ==} + engines: {node: '>=18.0.0'} + + '@vitruvius-labs/ts-predicate@6.2.0': + resolution: {integrity: sha512-2TGhi+hOzwIgY+WObLfCC3fiRlq1t/Nzh1Zs7k1Gvx+1lh6xTpSBt0BrlR9E54buNunuw0btUOViGW0fj+jb5g==} + engines: {node: '>=18.0.0'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1058,6 +1104,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1113,6 +1167,13 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@9.1.0: + resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1251,6 +1312,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1320,6 +1385,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} @@ -1458,6 +1527,9 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1472,12 +1544,25 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stringify@6.0.1: + resolution: {integrity: sha512-s7SJE83QKBZwg54dIbD5rCtzOBVD43V1ReWXXYqBgwCwHLYAAT0RQc/FmrQglXqWPpz6omtryJQOau5jI4Nrvg==} + fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fastify@5.4.0: + resolution: {integrity: sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1509,6 +1594,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-my-way@9.3.0: + resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==} + engines: {node: '>=20'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1672,6 +1761,10 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1760,6 +1853,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-schema-ref-resolver@2.0.1: + resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1781,6 +1877,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1920,6 +2019,10 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -1995,6 +2098,16 @@ packages: engines: {node: '>=0.10'} hasBin: true + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2003,6 +2116,12 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -2018,6 +2137,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -2025,6 +2147,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} @@ -2052,6 +2178,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2068,9 +2198,19 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex2@5.0.0: + resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + secure-json-parse@4.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2088,6 +2228,9 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2127,10 +2270,17 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -2179,6 +2329,9 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -2191,6 +2344,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -2927,6 +3084,29 @@ snapshots: '@eslint/core': 0.13.0 levn: 0.4.1 + '@fastify/ajv-compiler@4.0.2': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.6 + + '@fastify/error@4.2.0': {} + + '@fastify/fast-json-stringify-compiler@5.0.3': + dependencies: + fast-json-stringify: 6.0.1 + + '@fastify/forwarded@3.0.0': {} + + '@fastify/merge-json-schemas@0.2.1': + dependencies: + dequal: 2.0.3 + + '@fastify/proxy-addr@5.0.0': + dependencies: + '@fastify/forwarded': 3.0.0 + ipaddr.js: 2.2.0 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -3356,6 +3536,19 @@ snapshots: '@typescript-eslint/types': 8.30.1 eslint-visitor-keys: 4.2.0 + '@vitruvius-labs/architectura@5.0.1': + dependencies: + '@vitruvius-labs/toolbox': 0.2.1 + '@vitruvius-labs/ts-predicate': 6.2.0 + + '@vitruvius-labs/toolbox@0.2.1': + dependencies: + '@vitruvius-labs/ts-predicate': 6.2.0 + + '@vitruvius-labs/ts-predicate@6.2.0': {} + + abstract-logging@2.0.1: {} + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -3366,6 +3559,10 @@ snapshots: acorn@8.14.1: {} + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -3417,6 +3614,13 @@ snapshots: assertion-error@2.0.1: {} + atomic-sleep@1.0.0: {} + + avvio@9.1.0: + dependencies: + '@fastify/error': 4.2.0 + fastq: 1.19.1 + balanced-match@1.0.2: {} binary-extensions@2.3.0: {} @@ -3561,6 +3765,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@1.0.2: {} + core-util-is@1.0.3: {} create-require@1.1.1: {} @@ -3671,6 +3877,8 @@ snapshots: deep-is@0.1.4: {} + dequal@2.0.3: {} + des.js@1.1.0: dependencies: inherits: 2.0.4 @@ -3858,6 +4066,8 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-decode-uri-component@1.0.1: {} + fast-deep-equal@3.1.3: {} fast-equals@5.2.2: {} @@ -3872,10 +4082,43 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-json-stringify@6.0.1: + dependencies: + '@fastify/merge-json-schemas': 0.2.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.6 + json-schema-ref-resolver: 2.0.1 + rfdc: 1.4.1 + fast-levenshtein@2.0.6: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + fast-uri@3.0.6: {} + fastify@5.4.0: + dependencies: + '@fastify/ajv-compiler': 4.0.2 + '@fastify/error': 4.2.0 + '@fastify/fast-json-stringify-compiler': 5.0.3 + '@fastify/proxy-addr': 5.0.0 + abstract-logging: 2.0.1 + avvio: 9.1.0 + fast-json-stringify: 6.0.1 + find-my-way: 9.3.0 + light-my-request: 6.6.0 + pino: 9.7.0 + process-warning: 5.0.0 + rfdc: 1.4.1 + secure-json-parse: 4.0.0 + semver: 7.7.1 + toad-cache: 3.7.0 + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -3902,6 +4145,12 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-my-way@9.3.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -4038,6 +4287,8 @@ snapshots: ini@4.1.1: {} + ipaddr.js@2.2.0: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -4103,6 +4354,10 @@ snapshots: json-buffer@3.0.1: {} + json-schema-ref-resolver@2.0.1: + dependencies: + dequal: 2.0.3 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -4120,6 +4375,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + light-my-request@6.6.0: + dependencies: + cookie: 1.0.2 + process-warning: 4.0.1 + set-cookie-parser: 2.7.1 + lilconfig@3.1.3: {} lint-staged@15.5.1: @@ -4268,6 +4529,8 @@ snapshots: object-inspect@1.13.4: {} + on-exit-leak-free@2.1.2: {} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -4328,12 +4591,36 @@ snapshots: pidtree@0.6.0: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.0.0: {} + + pino@9.7.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + prelude-ls@1.2.1: {} pretty-ms@9.2.0: dependencies: parse-ms: 4.0.0 + process-warning@4.0.1: {} + + process-warning@5.0.0: {} + progress@2.0.3: {} punycode@2.3.1: {} @@ -4344,6 +4631,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -4352,6 +4641,8 @@ snapshots: dependencies: picomatch: 2.3.1 + real-require@0.2.0: {} + repeat-string@1.6.1: {} require-directory@2.1.1: {} @@ -4369,6 +4660,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + ret@0.5.0: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -4383,8 +4676,16 @@ snapshots: safe-buffer@5.2.1: {} + safe-regex2@5.0.0: + dependencies: + ret: 0.5.0 + + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} + secure-json-parse@4.0.0: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -4395,6 +4696,8 @@ snapshots: dependencies: randombytes: 2.1.0 + set-cookie-parser@2.7.1: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4449,8 +4752,14 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + source-map@0.7.4: {} + split2@4.2.0: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -4499,6 +4808,10 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -4512,6 +4825,8 @@ snapshots: dependencies: is-number: 7.0.0 + toad-cache@3.7.0: {} + tree-kill@1.2.2: {} ts-api-utils@2.1.0(typescript@5.8.3): diff --git a/vitruvius-labs-typescript.code-workspace b/vitruvius-labs-typescript.code-workspace index 6bcc31fa..347841ca 100644 --- a/vitruvius-labs-typescript.code-workspace +++ b/vitruvius-labs-typescript.code-workspace @@ -24,6 +24,10 @@ "name": "architectura", "path": "packages/architectura" }, + { + "name": "instrumenta", + "path": "packages/instrumenta" + }, { "name": "aws-signature-v4", "path": "packages/aws-signature-v4"