From d5f0a29959fd5d5505ebe852ab921b6953308c3c Mon Sep 17 00:00:00 2001 From: Simon Larsen Date: Mon, 9 Jun 2025 14:08:56 +0100 Subject: [PATCH] feat: Update package dependencies and add OpenAPI spec generation - Added @readme/openapi-parser as a dependency in Scripts/package.json. - Introduced a new script command "generate-openapi-spec" in package.json for generating OpenAPI specifications. - Removed the obsolete test_schema_permissions.js file. - Created a new script (GenerateSpec.ts) to generate and validate the OpenAPI spec, saving it to openapi.json. --- Scripts/OpenAPI/GenerateSpec.ts | 24 + Scripts/package-lock.json | 853 +++++++++++++++++++++----------- Scripts/package.json | 5 +- package.json | 3 +- test_schema_permissions.js | 42 -- 5 files changed, 594 insertions(+), 333 deletions(-) create mode 100644 Scripts/OpenAPI/GenerateSpec.ts delete mode 100644 test_schema_permissions.js diff --git a/Scripts/OpenAPI/GenerateSpec.ts b/Scripts/OpenAPI/GenerateSpec.ts new file mode 100644 index 0000000000..9aa0559169 --- /dev/null +++ b/Scripts/OpenAPI/GenerateSpec.ts @@ -0,0 +1,24 @@ +import OpenAPI from "Common/Server/Utils/OpenAPI"; +import fs from "fs"; +import { validate, ValidationResult } from "@readme/openapi-parser"; +import JSONFunctions from "Common/Types/JSONFunctions"; +import BadDataException from "Common/Types/Exception/BadDataException"; + +const spec = OpenAPI.generateOpenAPISpec(); + +const validationResult: ValidationResult = await validate( + JSONFunctions.toString(spec) +); + +if (validationResult.valid) { + console.log("OpenAPI spec is valid."); +} else { + throw new BadDataException("OpenAPI spec validation failed."); +} + +// Write the OpenAPI spec to a file + +const outputPath = "./openapi.json"; +fs.writeFileSync(outputPath, JSON.stringify(spec, null, 2), "utf8"); + +console.log(`OpenAPI spec generated and saved to ${outputPath}`); diff --git a/Scripts/package-lock.json b/Scripts/package-lock.json index 67b631889c..7c4eaf3fb9 100644 --- a/Scripts/package-lock.json +++ b/Scripts/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { + "@readme/openapi-parser": "^4.1.0", "Common": "file:../Common", - "ejs": "^3.1.10", "ts-node": "^10.9.2" }, @@ -23,38 +23,137 @@ } }, "../Common": { - "name": "common", + "name": "@oneuptime/common", "version": "1.0.0", - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@types/crypto-js": "^4.1.1", - "@types/nanoid-dictionary": "^4.2.0", + "@asteasolutions/zod-to-openapi": "^7.3.2", + "@bull-board/express": "^5.21.4", + "@clickhouse/client": "^1.10.1", + "@elastic/elasticsearch": "^8.12.1", + "@monaco-editor/react": "^4.4.6", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.52.1", + "@opentelemetry/context-zone": "^1.25.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.52.1", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.52.1", + "@opentelemetry/exporter-trace-otlp-http": "^0.52.1", + "@opentelemetry/exporter-trace-otlp-proto": "^0.52.1", + "@opentelemetry/id-generator-aws-xray": "^1.2.2", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-fetch": "^0.52.1", + "@opentelemetry/instrumentation-xml-http-request": "^0.52.1", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-logs": "^0.52.1", + "@opentelemetry/sdk-metrics": "^1.25.1", + "@opentelemetry/sdk-node": "^0.52.1", + "@opentelemetry/sdk-trace-node": "^1.25.1", + "@opentelemetry/sdk-trace-web": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.26.0", + "@remixicon/react": "^4.2.0", + "@tippyjs/react": "^4.2.6", + "@types/crypto-js": "^4.2.2", + "@types/qrcode": "^1.5.5", + "@types/react-highlight": "^0.12.8", + "@types/react-syntax-highlighter": "^15.5.13", "@types/uuid": "^8.3.4", - "axios": "^0.26.1", - "crypto-js": "^4.1.1", + "acme-client": "^5.3.0", + "airtable": "^0.12.2", + "axios": "^1.7.2", + "bullmq": "^5.3.3", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "cron-parser": "^4.8.1", + "crypto-js": "^4.2.0", + "dotenv": "^16.4.4", + "ejs": "^3.1.10", + "express": "^4.21.1", + "formik": "^2.4.6", + "history": "^5.3.0", + "ioredis": "^5.3.2", + "json2csv": "^5.0.7", "json5": "^2.2.3", - "moment": "^2.29.2", - "moment-timezone": "^0.5.40", - "nanoid": "^3.3.2", - "nanoid-dictionary": "^4.3.0", - "posthog-js": "^1.37.0", - "process": "^0.11.10", - "reflect-metadata": "^0.1.13", + "jsonwebtoken": "^9.0.0", + "jwt-decode": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^12.0.2", + "moment": "^2.30.1", + "moment-timezone": "^0.5.45", + "node-cron": "^3.0.3", + "nodemailer": "^6.9.10", + "otpauth": "^9.3.1", + "pg": "^8.7.3", + "playwright": "^1.50.0", + "posthog-js": "^1.139.6", + "prop-types": "^15.8.1", + "qrcode": "^1.5.3", + "react": "^18.3.1", + "react-beautiful-dnd": "^13.1.1", + "react-big-calendar": "^1.13.0", + "react-color": "^2.19.3", + "react-dom": "^18.3.1", + "react-dropzone": "^14.2.2", + "react-error-boundary": "^4.0.13", + "react-highlight": "^0.15.0", + "react-markdown": "^8.0.3", + "react-router-dom": "^6.24.1", + "react-select": "^5.4.0", + "react-spinners": "^0.14.1", + "react-syntax-highlighter": "^15.5.0", + "react-toggle": "^4.1.3", + "reactflow": "^11.11.4", + "recharts": "^2.12.7", + "redis-semaphore": "^5.5.1", + "reflect-metadata": "^0.2.2", + "remark-gfm": "^3.0.1", + "slackify-markdown": "^4.4.0", "slugify": "^1.6.5", - "typeorm": "^0.3.6", - "uuid": "^8.3.2" + "socket.io": "^4.7.4", + "socket.io-client": "^4.7.5", + "stripe": "^10.17.0", + "tailwind-merge": "^2.5.2", + "tippy.js": "^6.3.7", + "twilio": "^4.22.0", + "typeorm": "^0.3.20", + "typeorm-extension": "^2.2.13", + "universal-cookie": "^7.2.1", + "use-async-effect": "^2.2.6", + "uuid": "^8.3.2", + "zod": "^3.25.30" }, "devDependencies": { - "@faker-js/faker": "^6.3.1", - "@types/jest": "^27.5.2", - "@types/node": "^17.0.22", - "jest": "^27.5.1", - "ts-jest": "^27.1.4" + "@faker-js/faker": "^8.0.2", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.3", + "@types/cookie-parser": "^1.4.4", + "@types/cors": "^2.8.12", + "@types/ejs": "^3.1.1", + "@types/express": "^4.17.13", + "@types/jest": "^28.1.4", + "@types/json2csv": "^5.0.3", + "@types/jsonwebtoken": "^8.5.9", + "@types/lodash": "^4.14.202", + "@types/node": "^17.0.45", + "@types/node-cron": "^3.0.7", + "@types/nodemailer": "^6.4.7", + "@types/react": "^18.2.38", + "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-big-calendar": "^1.8.5", + "@types/react-color": "^3.0.6", + "@types/react-test-renderer": "^18.0.0", + "@types/react-toggle": "^4.0.3", + "jest": "^28.1.1", + "jest-environment-jsdom": "^29.7.0", + "jest-mock-extended": "^3.0.5", + "react-test-renderer": "^18.2.0", + "ts-jest": "^28.0.5" } }, "../CommonServer": { "name": "common-server", "version": "1.0.0", + "extraneous": true, "license": "MIT", "dependencies": { "@elastic/elasticsearch": "^8.1.0", @@ -70,7 +169,6 @@ "axios": "^1.3.3", "bullmq": "^3.6.6", "Common": "file:../Common", - "cors": "^2.8.5", "cron-parser": "^4.8.1", "dotenv": "^16.0.0", @@ -108,10 +206,10 @@ "../Model": { "name": "model", "version": "1.0.0", + "extraneous": true, "license": "ISC", "dependencies": { "Common": "file:../Common", - "typeorm": "^0.3.7" }, "devDependencies": { @@ -134,13 +232,49 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-13.0.4.tgz", + "integrity": "sha512-uL4dmc/lM3EA0i6oTflN1GZpMmZWYKllmcbGAzwYO/Wp9r+RGoTw4RBstCh0ri/yqoQo+itAt3GWLLgW8RIEEg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -339,10 +473,10 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -370,91 +504,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", @@ -629,6 +678,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -714,6 +772,15 @@ "npm": ">=6.0.0" } }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.10.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1024,6 +1091,55 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@readme/better-ajv-errors": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-2.3.2.tgz", + "integrity": "sha512-T4GGnRAlY3C339NhoUpgJJFsMYko9vIgFAlhgV+/vEGFw66qEY4a4TRJIAZBcX/qT1pq5DvXSme+SQODHOoBrw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/runtime": "^7.22.5", + "@humanwhocodes/momoa": "^2.0.3", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/@readme/openapi-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-4.1.0.tgz", + "integrity": "sha512-zZaGaOJ+0bYPGkPK4ekspE1BoO1iifxe5d3rsAE6AqFCoyHCjt/xMDtmJpy4slFdd1YtEv/VHhBpB1FlNClCNw==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^13.0.1", + "@readme/better-ajv-errors": "^2.3.2", + "@readme/openapi-schemas": "^3.1.0", + "@types/json-schema": "^7.0.15", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@readme/openapi-schemas": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-schemas/-/openapi-schemas-3.1.0.tgz", + "integrity": "sha512-9FC/6ho8uFa8fV50+FPy/ngWN53jaUu4GRXlAjcxIRrzhltJnpKkBG2Tp0IDraFJeWrOpk84RJ9EMEEYzaI1Bw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -1155,6 +1271,12 @@ "pretty-format": "^27.0.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", @@ -1247,6 +1369,36 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1634,10 +1786,6 @@ "resolved": "../Common", "link": true }, - "node_modules/CommonServer": { - "resolved": "../CommonServer", - "link": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1971,6 +2119,12 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1983,6 +2137,22 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -3078,7 +3248,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -3157,6 +3327,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", @@ -3169,6 +3345,15 @@ "node": ">=6" } }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -3182,7 +3367,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, "engines": { "node": ">=6" } @@ -3331,10 +3515,6 @@ "node": "*" } }, - "node_modules/Model": { - "resolved": "../Model", - "link": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3410,6 +3590,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, "node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3521,10 +3708,10 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3643,6 +3830,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -4477,13 +4673,38 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, + "@apidevtools/json-schema-ref-parser": { + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-13.0.4.tgz", + "integrity": "sha512-uL4dmc/lM3EA0i6oTflN1GZpMmZWYKllmcbGAzwYO/Wp9r+RGoTw4RBstCh0ri/yqoQo+itAt3GWLLgW8RIEEg==", "requires": { - "@babel/highlight": "^7.18.6" + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "requires": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -4632,10 +4853,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" }, "@babel/helper-validator-option": { "version": "7.18.6", @@ -4654,75 +4874,6 @@ "@babel/types": "^7.20.5" } }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "@babel/parser": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", @@ -4846,6 +4997,11 @@ "@babel/helper-plugin-utils": "^7.19.0" } }, + "@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==" + }, "@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -4917,6 +5073,11 @@ "integrity": "sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ==", "dev": true }, + "@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==" + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -5163,6 +5324,37 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@readme/better-ajv-errors": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-2.3.2.tgz", + "integrity": "sha512-T4GGnRAlY3C339NhoUpgJJFsMYko9vIgFAlhgV+/vEGFw66qEY4a4TRJIAZBcX/qT1pq5DvXSme+SQODHOoBrw==", + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/runtime": "^7.22.5", + "@humanwhocodes/momoa": "^2.0.3", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0", + "picocolors": "^1.1.1" + } + }, + "@readme/openapi-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-4.1.0.tgz", + "integrity": "sha512-zZaGaOJ+0bYPGkPK4ekspE1BoO1iifxe5d3rsAE6AqFCoyHCjt/xMDtmJpy4slFdd1YtEv/VHhBpB1FlNClCNw==", + "requires": { + "@apidevtools/json-schema-ref-parser": "^13.0.1", + "@readme/better-ajv-errors": "^2.3.2", + "@readme/openapi-schemas": "^3.1.0", + "@types/json-schema": "^7.0.15", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0" + } + }, + "@readme/openapi-schemas": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-schemas/-/openapi-schemas-3.1.0.tgz", + "integrity": "sha512-9FC/6ho8uFa8fV50+FPy/ngWN53jaUu4GRXlAjcxIRrzhltJnpKkBG2Tp0IDraFJeWrOpk84RJ9EMEEYzaI1Bw==" + }, "@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -5291,6 +5483,11 @@ "pretty-format": "^27.0.0" } }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, "@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", @@ -5367,6 +5564,23 @@ "debug": "4" } }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "requires": {} + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -5654,76 +5868,125 @@ "Common": { "version": "file:../Common", "requires": { - "@faker-js/faker": "^6.3.1", - "@types/crypto-js": "^4.1.1", - "@types/jest": "^27.5.2", - "@types/nanoid-dictionary": "^4.2.0", - "@types/node": "^17.0.22", - "@types/uuid": "^8.3.4", - "axios": "^0.26.1", - "crypto-js": "^4.1.1", - "jest": "^27.5.1", - "json5": "^2.2.3", - "moment": "^2.29.2", - "moment-timezone": "^0.5.40", - "nanoid": "^3.3.2", - "nanoid-dictionary": "^4.3.0", - "posthog-js": "^1.37.0", - "process": "^0.11.10", - "reflect-metadata": "^0.1.13", - "slugify": "^1.6.5", - "ts-jest": "^27.1.4", - "typeorm": "^0.3.6", - "uuid": "^8.3.2" - } - }, - "CommonServer": { - "version": "file:../CommonServer", - "requires": { - "@elastic/elasticsearch": "^8.1.0", - "@faker-js/faker": "^6.3.1", - "@opentelemetry/api": "^1.1.0", - "@opentelemetry/auto-instrumentations-node": "^0.31.0", - "@opentelemetry/sdk-node": "^0.30.0", + "@asteasolutions/zod-to-openapi": "^7.3.2", + "@bull-board/express": "^5.21.4", + "@clickhouse/client": "^1.10.1", + "@elastic/elasticsearch": "^8.12.1", + "@faker-js/faker": "^8.0.2", + "@monaco-editor/react": "^4.4.6", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.52.1", + "@opentelemetry/context-zone": "^1.25.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.52.1", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.52.1", + "@opentelemetry/exporter-trace-otlp-http": "^0.52.1", + "@opentelemetry/exporter-trace-otlp-proto": "^0.52.1", + "@opentelemetry/id-generator-aws-xray": "^1.2.2", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-fetch": "^0.52.1", + "@opentelemetry/instrumentation-xml-http-request": "^0.52.1", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-logs": "^0.52.1", + "@opentelemetry/sdk-metrics": "^1.25.1", + "@opentelemetry/sdk-node": "^0.52.1", + "@opentelemetry/sdk-trace-node": "^1.25.1", + "@opentelemetry/sdk-trace-web": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.26.0", + "@remixicon/react": "^4.2.0", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.3", + "@tippyjs/react": "^4.2.6", + "@types/cookie-parser": "^1.4.4", "@types/cors": "^2.8.12", + "@types/crypto-js": "^4.2.2", "@types/ejs": "^3.1.1", "@types/express": "^4.17.13", - "@types/gridfs-stream": "^0.5.35", - "@types/jest": "^27.4.1", + "@types/jest": "^28.1.4", "@types/json2csv": "^5.0.3", "@types/jsonwebtoken": "^8.5.9", - "@types/markdown-it": "^12.2.3", - "@types/node": "^17.0.22", + "@types/lodash": "^4.14.202", + "@types/node": "^17.0.45", + "@types/node-cron": "^3.0.7", "@types/nodemailer": "^6.4.7", - "airtable": "^0.11.3", - "axios": "^1.3.3", - "bullmq": "^3.6.6", - "Common": "file:../Common", - + "@types/qrcode": "^1.5.5", + "@types/react": "^18.2.38", + "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-big-calendar": "^1.8.5", + "@types/react-color": "^3.0.6", + "@types/react-highlight": "^0.12.8", + "@types/react-syntax-highlighter": "^15.5.13", + "@types/react-test-renderer": "^18.0.0", + "@types/react-toggle": "^4.0.3", + "@types/uuid": "^8.3.4", + "acme-client": "^5.3.0", + "airtable": "^0.12.2", + "axios": "^1.7.2", + "bullmq": "^5.3.3", + "cookie-parser": "^1.4.7", "cors": "^2.8.5", "cron-parser": "^4.8.1", - "dotenv": "^16.0.0", - "ejs": "^3.1.8", - "express": "^4.17.3", - "gridfs-stream": "^1.1.1", - "handlebars": "^4.7.7", + "crypto-js": "^4.2.0", + "dotenv": "^16.4.4", + "ejs": "^3.1.10", + "express": "^4.21.1", + "formik": "^2.4.6", + "history": "^5.3.0", "ioredis": "^5.3.2", - "jest": "^27.5.1", + "jest": "^28.1.1", + "jest-environment-jsdom": "^29.7.0", + "jest-mock-extended": "^3.0.5", "json2csv": "^5.0.7", + "json5": "^2.2.3", "jsonwebtoken": "^9.0.0", - "markdown-it": "^13.0.1", - "node-device-detector": "^2.0.0", - "nodemailer": "^6.7.3", - "nodemailer-express-handlebars": "^5.0.0", + "jwt-decode": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^12.0.2", + "moment": "^2.30.1", + "moment-timezone": "^0.5.45", + "node-cron": "^3.0.3", + "nodemailer": "^6.9.10", + "otpauth": "^9.3.1", "pg": "^8.7.3", - "socket.io": "^4.4.1", + "playwright": "^1.50.0", + "posthog-js": "^1.139.6", + "prop-types": "^15.8.1", + "qrcode": "^1.5.3", + "react": "^18.3.1", + "react-beautiful-dnd": "^13.1.1", + "react-big-calendar": "^1.13.0", + "react-color": "^2.19.3", + "react-dom": "^18.3.1", + "react-dropzone": "^14.2.2", + "react-error-boundary": "^4.0.13", + "react-highlight": "^0.15.0", + "react-markdown": "^8.0.3", + "react-router-dom": "^6.24.1", + "react-select": "^5.4.0", + "react-spinners": "^0.14.1", + "react-syntax-highlighter": "^15.5.0", + "react-test-renderer": "^18.2.0", + "react-toggle": "^4.1.3", + "reactflow": "^11.11.4", + "recharts": "^2.12.7", + "redis-semaphore": "^5.5.1", + "reflect-metadata": "^0.2.2", + "remark-gfm": "^3.0.1", + "slackify-markdown": "^4.4.0", + "slugify": "^1.6.5", + "socket.io": "^4.7.4", + "socket.io-client": "^4.7.5", "stripe": "^10.17.0", - "ts-jest": "^27.1.4", - "twilio": "^4.13.0", - "typeorm": "^0.3.10", + "tailwind-merge": "^2.5.2", + "tippy.js": "^6.3.7", + "ts-jest": "^28.0.5", + "twilio": "^4.22.0", + "typeorm": "^0.3.20", "typeorm-extension": "^2.2.13", - "vm2": "^3.9.14", - "winston": "^3.6.0" + "universal-cookie": "^7.2.1", + "use-async-effect": "^2.2.6", + "uuid": "^8.3.2", + "zod": "^3.25.30" } }, "concat-map": { @@ -5973,6 +6236,11 @@ "jest-message-util": "^27.5.1" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5985,6 +6253,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==" + }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -6828,8 +7101,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", @@ -6888,12 +7160,22 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "json5": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -6903,8 +7185,7 @@ "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levn": { "version": "0.3.0", @@ -7020,18 +7301,6 @@ "brace-expansion": "^1.1.7" } }, - "Model": { - "version": "file:../Model", - "requires": { - "@types/jest": "^27.4.1", - "@types/node": "^17.0.22", - "Common": "file:../Common", - - "jest": "^27.5.1", - "ts-jest": "^27.1.4", - "typeorm": "^0.3.7" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -7095,6 +7364,12 @@ "mimic-fn": "^2.1.0" } }, + "openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "peer": true + }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -7176,10 +7451,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", @@ -7267,6 +7541,11 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", diff --git a/Scripts/package.json b/Scripts/package.json index 29a1ac1572..876443b877 100644 --- a/Scripts/package.json +++ b/Scripts/package.json @@ -6,9 +6,8 @@ "compile": "tsc" }, "dependencies": { + "@readme/openapi-parser": "^4.1.0", "Common": "file:../Common", - - "ejs": "^3.1.10", "ts-node": "^10.9.2" }, @@ -21,4 +20,4 @@ }, "author": "OneUptime (https://oneuptime.com/)", "license": "Apache-2.0" -} \ No newline at end of file +} diff --git a/package.json b/package.json index d5170ac8a9..8362d2138a 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,8 @@ "deploy-test": "kubectl config use-context oneuptime-test && helm upgrade oneuptime ./HelmChart/Public/oneuptime -f ./HelmChart/Public/oneuptime/values.yaml -f ./HelmChart/Values/test.values.yaml", "template-deploy-test": "kubectl config use-context oneuptime-test && helm template oneuptime ./HelmChart/Public/oneuptime -f ./HelmChart/Public/oneuptime/values.yaml -f ./HelmChart/Values/test.values.yaml --debug", "deploy-prod": "kubectl config use-context oneuptime-prod && helm upgrade oneuptime ./HelmChart/Public/oneuptime -f ./HelmChart/Public/oneuptime/values.yaml -f ./HelmChart/Values/prod.values.yaml", - "generate-postgres-migration": "export $(grep -v '^#' config.env | xargs) && node --require ts-node/register ./node_modules/typeorm/cli.js migration:generate ./Common/Server/Infrastructure/Postgres/SchemaMigrations/MigrationName -d ./Common/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts" + "generate-postgres-migration": "export $(grep -v '^#' config.env | xargs) && node --require ts-node/register ./node_modules/typeorm/cli.js migration:generate ./Common/Server/Infrastructure/Postgres/SchemaMigrations/MigrationName -d ./Common/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts", + "generate-openapi-spec": "node --require ts-node/register ./Scripts/OpenAPI/GenerateSpec.ts" }, "repository": { "type": "git", diff --git a/test_schema_permissions.js b/test_schema_permissions.js deleted file mode 100644 index d0240a0d50..0000000000 --- a/test_schema_permissions.js +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env node - -// Simple test script to validate schema generation with permission filtering -const fs = require('fs'); -const path = require('path'); - -console.log('Testing schema permission filtering...'); - -// Check if the ModelSchema.ts file has the correct changes -const modelSchemaPath = path.join(__dirname, 'Common/Utils/Schema/ModelSchema.ts'); - -if (fs.existsSync(modelSchemaPath)) { - const content = fs.readFileSync(modelSchemaPath, 'utf8'); - - // Check for the updated formatPermissionsForSchema method - const hasCorrectPermissionMessage = content.includes('No access - restricted access only'); - console.log('āœ“ formatPermissionsForSchema updated:', hasCorrectPermissionMessage ? 'PASS' : 'FAIL'); - - // Check for permission filtering in getModelSchema - const hasGeneralSchemaFiltering = content.includes('// Get column access control for permission filtering') && - content.includes('const columnAccessControl: Dictionary = model.getColumnAccessControlForAllColumns();') && - content.includes('hasReadPermissions'); - console.log('āœ“ getModelSchema permission filtering:', hasGeneralSchemaFiltering ? 'PASS' : 'FAIL'); - - // Check for permission filtering in buildModelSchema - const hasBuildSchemaFiltering = content.includes('// Filter out columns with no permissions (root-only access)') && - content.includes('hasPermissions = true;'); - console.log('āœ“ buildModelSchema permission filtering:', hasBuildSchemaFiltering ? 'PASS' : 'FAIL'); - - if (hasCorrectPermissionMessage && hasGeneralSchemaFiltering && hasBuildSchemaFiltering) { - console.log('\nšŸŽ‰ All permission filtering changes implemented successfully!'); - console.log('\nSummary of changes:'); - console.log('1. formatPermissionsForSchema now returns "No access - restricted access only" for empty permissions'); - console.log('2. getModelSchema now filters out columns with no read permissions'); - console.log('3. buildModelSchema filters columns based on operation-specific permissions (create/read/update)'); - console.log('\nColumns with empty permission arrays will now be excluded from OpenAPI schemas entirely.'); - } else { - console.log('\nāŒ Some changes are missing. Please review the implementation.'); - } -} else { - console.log('āŒ ModelSchema.ts file not found at expected location.'); -}