From 1348eab71f168d2b379ddf13369d122d91be3f91 Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Fri, 24 Apr 2026 20:26:30 +0300 Subject: [PATCH] rm hudozka-api --- modules/hudozka-api/.dockerignore | 4 - modules/hudozka-api/.gitignore | 3 - modules/hudozka-api/Dockerfile | 27 - modules/hudozka-api/package-lock.json | 1216 ----------------- modules/hudozka-api/package.json | 36 - .../hudozka-api/src/controllers/breadcrumb.ts | 23 - modules/hudozka-api/src/controllers/file.ts | 32 - modules/hudozka-api/src/controllers/image.ts | 39 - modules/hudozka-api/src/controllers/page.ts | 117 -- modules/hudozka-api/src/controllers/tag.ts | 22 - modules/hudozka-api/src/core/Data.ts | 18 - modules/hudozka-api/src/core/Document.ts | 68 - modules/hudozka-api/src/core/Image.ts | 66 - modules/hudozka-api/src/core/Page.ts | 105 -- modules/hudozka-api/src/core/Tag.ts | 23 - modules/hudozka-api/src/db.ts | 46 - modules/hudozka-api/src/factory/file.ts | 38 - modules/hudozka-api/src/factory/image.ts | 24 - modules/hudozka-api/src/factory/page.ts | 41 - modules/hudozka-api/src/lib/array.ts | 31 - modules/hudozka-api/src/lib/store.ts | 19 - modules/hudozka-api/src/lib/translit.ts | 80 -- modules/hudozka-api/src/lib/url.ts | 48 - modules/hudozka-api/src/server.ts | 42 - modules/hudozka-api/src/types.ts | 6 - modules/hudozka-api/tsconfig.json | 23 - 26 files changed, 2197 deletions(-) delete mode 100644 modules/hudozka-api/.dockerignore delete mode 100644 modules/hudozka-api/.gitignore delete mode 100644 modules/hudozka-api/Dockerfile delete mode 100644 modules/hudozka-api/package-lock.json delete mode 100644 modules/hudozka-api/package.json delete mode 100644 modules/hudozka-api/src/controllers/breadcrumb.ts delete mode 100644 modules/hudozka-api/src/controllers/file.ts delete mode 100644 modules/hudozka-api/src/controllers/image.ts delete mode 100644 modules/hudozka-api/src/controllers/page.ts delete mode 100644 modules/hudozka-api/src/controllers/tag.ts delete mode 100644 modules/hudozka-api/src/core/Data.ts delete mode 100644 modules/hudozka-api/src/core/Document.ts delete mode 100644 modules/hudozka-api/src/core/Image.ts delete mode 100644 modules/hudozka-api/src/core/Page.ts delete mode 100644 modules/hudozka-api/src/core/Tag.ts delete mode 100644 modules/hudozka-api/src/db.ts delete mode 100644 modules/hudozka-api/src/factory/file.ts delete mode 100644 modules/hudozka-api/src/factory/image.ts delete mode 100644 modules/hudozka-api/src/factory/page.ts delete mode 100644 modules/hudozka-api/src/lib/array.ts delete mode 100644 modules/hudozka-api/src/lib/store.ts delete mode 100644 modules/hudozka-api/src/lib/translit.ts delete mode 100644 modules/hudozka-api/src/lib/url.ts delete mode 100644 modules/hudozka-api/src/server.ts delete mode 100644 modules/hudozka-api/src/types.ts delete mode 100644 modules/hudozka-api/tsconfig.json diff --git a/modules/hudozka-api/.dockerignore b/modules/hudozka-api/.dockerignore deleted file mode 100644 index a3824d6b..00000000 --- a/modules/hudozka-api/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.env -*.tar -node_modules - diff --git a/modules/hudozka-api/.gitignore b/modules/hudozka-api/.gitignore deleted file mode 100644 index b8595258..00000000 --- a/modules/hudozka-api/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.env -*.tar diff --git a/modules/hudozka-api/Dockerfile b/modules/hudozka-api/Dockerfile deleted file mode 100644 index 51cf6dfc..00000000 --- a/modules/hudozka-api/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# BUILD -FROM node:12-alpine as build -WORKDIR /app - -COPY package.json package-lock.json ./ -RUN npm ci - -COPY . . - -# Building app -RUN npm run build - -# RUNTIME -FROM node:12-alpine -WORKDIR /app - -COPY package.json package-lock.json ./ -RUN npm install --production - -COPY --from=build /app/build ./build - -EXPOSE 80 -ENV PORT 80 -ENV NODE_ENV production - -# Running the app -CMD [ "npm", "start" ] diff --git a/modules/hudozka-api/package-lock.json b/modules/hudozka-api/package-lock.json deleted file mode 100644 index a944ce5a..00000000 --- a/modules/hudozka-api/package-lock.json +++ /dev/null @@ -1,1216 +0,0 @@ -{ - "name": "hudozka-api", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "dotenv": "^8.2.0", - "express": "^4.22.1", - "feed": "^4.0.0", - "lodash": "^4.18.1", - "mongodb": "^3.7.4", - "sitemap": "^1.5.0" - }, - "devDependencies": { - "@types/classnames": "^2.2.9", - "@types/express": "^4.17.2", - "@types/mongodb": "^3.3.16", - "@types/node": "^13.7.1", - "ts-node": "^8.6.2", - "typescript": "^3.7.5" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bson": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.1.tgz", - "integrity": "sha512-K6VAEdLVJFBxKp8m5cRTbUfeZpuSvOuLKJLrgw9ANIXo00RiyGzgH4BKWWR4F520gV4tWmxG7q9sKQRVDuzrBw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/classnames": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.9.tgz", - "integrity": "sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A==", - "dev": true - }, - "node_modules/@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", - "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", - "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", - "dev": true - }, - "node_modules/@types/mongodb": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.3.16.tgz", - "integrity": "sha512-i1Ov36BXdp+urtPsaSvrNfCdsaVn4Ukq1m1kGyzdWB1+eg3gJ68unXU5LNmnF4EAMRFY6FXZzA7/W3NST40b8g==", - "dev": true, - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "node_modules/@types/serve-static": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/feed": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.1.0.tgz", - "integrity": "sha512-dAXWXM8QMxZ1DRnAxDmy1MaWZFlh1Ku7TU3onbXgHrVJynsxkNGPUed1AxszVW8AXo43xExronVkIqK+ACsoBA==", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "license": "MIT" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sitemap": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-1.13.0.tgz", - "integrity": "sha1-Vpy+IYAgKSamKiZs094Jyc60P4M=", - "dependencies": { - "underscore": "^1.7.0", - "url-join": "^1.1.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ts-node": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", - "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-script": "dist/script.js" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/modules/hudozka-api/package.json b/modules/hudozka-api/package.json deleted file mode 100644 index 4a1ac09c..00000000 --- a/modules/hudozka-api/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "hudozka-api", - "private": true, - "version": "1.0.0", - "description": "", - "main": "src/server.ts", - "scripts": { - "start": "node build/server.js", - "dev": "ts-node src/server.ts", - "build": "tsc", - "sitemap": "node scripts/sitemap.js", - "feed": "node scripts/feed.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/tmshv/hudozka" - }, - "author": "Roman Timashev", - "license": "ISC", - "dependencies": { - "dotenv": "^8.2.0", - "express": "^4.22.1", - "feed": "^4.0.0", - "lodash": "^4.18.1", - "mongodb": "^3.7.4", - "sitemap": "^1.5.0" - }, - "devDependencies": { - "@types/classnames": "^2.2.9", - "@types/express": "^4.17.2", - "@types/mongodb": "^3.3.16", - "@types/node": "^13.7.1", - "ts-node": "^8.6.2", - "typescript": "^3.7.5" - } -} diff --git a/modules/hudozka-api/src/controllers/breadcrumb.ts b/modules/hudozka-api/src/controllers/breadcrumb.ts deleted file mode 100644 index cda40fb5..00000000 --- a/modules/hudozka-api/src/controllers/breadcrumb.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { getPathWaterfall } from '../lib/url' -import { Breadcrumb } from '../types' -import Page from '../core/Page' - -export async function getItems(path: string): Promise { - const bc = getPathWaterfall(path) - const parts = await Promise.all(bc.map(async href => { - const resource = await Page.findByUrl(href) - - if (!resource) { - return null - } - - const name = resource.title - - return { - name, - href, - } - })) - - return parts.filter(Boolean) -} diff --git a/modules/hudozka-api/src/controllers/file.ts b/modules/hudozka-api/src/controllers/file.ts deleted file mode 100644 index e0a9b69b..00000000 --- a/modules/hudozka-api/src/controllers/file.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Request, Response } from 'express' -import Document from '../core/Document' -import { encodeFile, encodeFileUrl } from '../factory/file' - -export async function getItem(req: Request, res: Response) { - const slug = req.params.slug - const item = await Document.findBySlug(slug) - if (item) { - res.json(encodeFile(item)) - } else { - res.status(404) - res.json({ - error: `Resource ${slug} not found` - }) - } -} - -export async function getUrls(req: Request, res: Response) { - const data = await Document.find({}) - - if (data) { - const items = data.map(encodeFileUrl) - res.json({ - items - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} diff --git a/modules/hudozka-api/src/controllers/image.ts b/modules/hudozka-api/src/controllers/image.ts deleted file mode 100644 index 24d303d4..00000000 --- a/modules/hudozka-api/src/controllers/image.ts +++ /dev/null @@ -1,39 +0,0 @@ -import Image from '../core/Image' -import { encodeImage } from '../factory/image' -import { Request, Response } from 'express' -import { oid } from '../db' - -export async function getItem(req: Request, res: Response) { - const slug = req.params.slug - const id = oid(slug) - if (!id) { - res.status(400) - return res.json({ - error: `Failed to parse ${slug} as ObjectId` - }) - } - - const image = await Image.findById(id) - if (image) { - res.json(encodeImage(image)) - } else { - res.status(404) - res.json({ - error: `Resource ${slug} not found` - }) - } -} - -export async function getItemByFile(req: Request, res: Response) { - const file = req.query.file - const image = await Image.findByFile(file) - - if (image) { - res.json(encodeImage(image)) - } else { - res.status(404) - res.json({ - error: `Resource ${file} not found` - }) - } -} diff --git a/modules/hudozka-api/src/controllers/page.ts b/modules/hudozka-api/src/controllers/page.ts deleted file mode 100644 index 2ad77df4..00000000 --- a/modules/hudozka-api/src/controllers/page.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { pick } from 'lodash' -import { Request, Response } from 'express' -import Page from '../core/Page' -import { dropTrailingSlash, readQueryArray, readQueryInt, readQueryString } from '../lib/url' -import { encodePage } from '../factory/page' -import * as breadcrumb from './breadcrumb' -import { isArrayOk } from '../lib/array' - -function getSort(sortBy: string) { - if (!sortBy) { - return null - } - - if (sortBy.charAt(0) === '-') { - const key = sortBy.substr(1, sortBy.length) - - return { - [key]: -1, - } - } - - return { - [sortBy]: 1, - } -} - -async function resolveItem(page: Page) { - const breadcrumbs = await breadcrumb.getItems(page.getUrl()) - page.setBreadcrumb(breadcrumbs) - - return page -} - -export async function getItem(req: Request, res: Response) { - const pageUrl = dropTrailingSlash(req.query.page) - const resource = await Page.findByUrl(pageUrl) - - if (resource) { - const page = await resolveItem(resource) - res.json(encodePage(page)) - } else { - res.status(404) - res.json({ - error: `Resource ${pageUrl} not found` - }) - } -} - -export async function getAll(req: Request, res: Response) { - const items = await Page.find({}) - - if (items) { - res.json({ - items, - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} - -export async function getByTags(req: Request, res: Response) { - const skip = readQueryInt(req, 'skip') - const limit = readQueryInt(req, 'limit') - const sortBy = readQueryString(req, 'sortBy') - const sort = getSort(sortBy) - const fields = readQueryArray(req, 'field') - - const tags = readQueryArray(req, 'tag') - if (tags.length === 0) { - res.status(400) - return res.json({ - error: `No tags in request` - }) - } - - const options = { skip, limit, sort } - const models = await Page.find({ - tags: { $in: tags }, - }, options) - - if (models) { - const pages = await Promise.all(models.map(resolveItem)) - const encodedItems = pages.map(encodePage) - const items = isArrayOk(fields) - ? encodedItems.map(x => pick(x, fields)) - : encodedItems - - res.json({ - items, - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} - -export async function getUrls(req: Request, res: Response) { - const data = await Page.find({}) - - if (data) { - const items = data.map(x => x.url) - - res.json({ - items, - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} diff --git a/modules/hudozka-api/src/controllers/tag.ts b/modules/hudozka-api/src/controllers/tag.ts deleted file mode 100644 index 0185cbf8..00000000 --- a/modules/hudozka-api/src/controllers/tag.ts +++ /dev/null @@ -1,22 +0,0 @@ -import Page from '../core/Page' -import { Request, Response } from 'express' -import { unique } from '../lib/array' - -export async function getAll(req: Request, res: Response) { - const data = await Page.find({}) - const tags = data - .flatMap(x => x.tags) - .filter(x => x.isValid()) - const items = unique(tags, t => t.slug) - - if (data) { - res.json({ - items, - }) - } else { - res.status(404) - res.json({ - error: `Not found` - }) - } -} diff --git a/modules/hudozka-api/src/core/Data.ts b/modules/hudozka-api/src/core/Data.ts deleted file mode 100644 index 8b0846d0..00000000 --- a/modules/hudozka-api/src/core/Data.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Collection } from 'mongodb' -import * as db from '../db' - -const store = new Map() - -export default class Data { - static setStore(key: string, collection: Collection) { - store.set(key, collection) - } - - static getStore(key: string): Collection { - return store.get(key) - } - - static getCollection(name: string): Collection { - return db.collection(name) - } -} diff --git a/modules/hudozka-api/src/core/Document.ts b/modules/hudozka-api/src/core/Document.ts deleted file mode 100644 index 94639ace..00000000 --- a/modules/hudozka-api/src/core/Document.ts +++ /dev/null @@ -1,68 +0,0 @@ -import Data from './Data' -import Image from './Image' -import { find, findOne } from '../lib/store' - -const store = () => Data.getStore('Document') - -export default class Document { - static async find(query, options = {}): Promise { - const items = await find(store(), query, options as any) - - return Promise.all(items.map(processDocument)) - } - - static async findBySlug(slug: string) { - const data = await findOne(store(), { id: slug }) - if (!data) return null - - return processDocument(data) - } - - public id: any - public hash: any - public file: any - public fileInfo: FileInfo - public type: any - public title: any - public category: any - public url: any - public preview: Image - public viewUrl: any - - constructor(data: { preview: Image, [name: string]: any }) { - this.id = data.id - this.hash = data.hash - this.file = data.file - // In the future: use fileInfo only - this.fileInfo = data.fileInfo - ? new FileInfo(data.fileInfo) - : new FileInfo(data.file) - this.type = data.type - this.title = data.title - this.category = data.category - this.url = data.url - - this.preview = data.preview - this.viewUrl = `/document/${this.id}` - } -} - -class FileInfo { - public name: string - public size: number - - constructor(data) { - this.name = data.name - this.size = data.size - } -} - -const processDocument = async data => { - const imageId = data.preview - const preview = await Image.findById(imageId) - - return new Document({ - ...data, - preview, - }) -} diff --git a/modules/hudozka-api/src/core/Image.ts b/modules/hudozka-api/src/core/Image.ts deleted file mode 100644 index 034453b7..00000000 --- a/modules/hudozka-api/src/core/Image.ts +++ /dev/null @@ -1,66 +0,0 @@ -import Data from './Data' -import { findOne } from '../lib/store' -import { ObjectId } from 'mongodb' - -/** - * - * {a: {}, b: {}, ...} -> Map (a: Class, b: Class) - * - * @param Class - * @param object - */ -function mapOf(Class, object) { - return Object - .entries(object) - .reduce((map, i) => ( - map.set(i[0], new Class(i[1])) - ), new Map()) -} - -const store = () => Data.getStore('Image') - -export default class Image { - static async findById(id: ObjectId) { - const data = await findOne(store(), { _id: id }) - if (!data) return null - - const artifacts = data.data - return new Image({ ...data, artifacts }) - } - - static async findByFile(file: string) { - const data = await findOne(store(), { file }) - if (!data) return null - - const artifacts = data.data - return new Image({ ...data, artifacts }) - } - public hash: string - public file: string - public artifacts: Map - - constructor({ hash, file, artifacts }) { - this.hash = hash - this.file = file - - this.artifacts = mapOf(ImageArtifact, artifacts) - } - - getArtifact(size: string) { - return this.artifacts.get(size) - } -} - -class ImageArtifact { - public url: string - public size: string - public width: number - public height: number - - constructor({ url, size, width, height }) { - this.url = url - this.size = size - this.width = width - this.height = height - } -} diff --git a/modules/hudozka-api/src/core/Page.ts b/modules/hudozka-api/src/core/Page.ts deleted file mode 100644 index 3cfb0a6b..00000000 --- a/modules/hudozka-api/src/core/Page.ts +++ /dev/null @@ -1,105 +0,0 @@ -import Data from './Data' -import { find as storeFind, findOne, total } from '../lib/store' -import Image from './Image' -import { Tag } from './Tag' -import { ObjectId } from 'mongodb' -import { Breadcrumb } from '../types' - -const store = () => Data.getStore('Page') - -type PageDto = { - [name: string]: any - preview?: ObjectId - images: ObjectId[] -} - -export default class Page { - static async find(query, options = {}): Promise { - const items = await storeFind(store(), query, options as any) - - return Promise.all(items.map(processPage)) - } - - static async findByUrl(url: string) { - const item = await findOne(store(), { url }) - - return !item - ? null - : processPage(item) - } - - static async total(query = {}) { - return total(store(), query) - } - - public id: any - public hash: any - public file: any - public url: string - public content: any - public title: any - public date: Date - public tags: Tag[] - public data: any - public images: ObjectId[] - public documents: any - public preview?: Image - public tokens: any[] - public description: string - public featured: boolean - - private breadcrumb: Breadcrumb - - constructor(data: { [name: string]: any }) { - this.id = data.id - this.hash = data.hash - this.file = data.file - this.url = data.url - this.content = data.content - this.title = data.title - this.data = data.data - this.date = data.date - this.images = data.images - this.documents = data.documents - this.preview = data.preview - this.tokens = data.tokens - this.tags = (data.tags || []).map((x: string) => new Tag(x, x)) - this.featured = data.featured - this.description = data.description - } - - public setBreadcrumb(value: Breadcrumb) { - this.breadcrumb = value - return this - } - - public getBreadcrumb() { - return this.breadcrumb - } - - public getUrl() { - return this.url - } -} - -function firstItem(items: T[] = []): T { - return items.length - ? items[0] - : null -} - -async function processPage(item: PageDto): Promise { - let preview: Image = null - const previewId = item.preview - ? item.preview - : firstItem(item.images) - - if (previewId) { - preview = await Image.findById(previewId) - } - - return new Page({ - ...item, - preview, - }) -} diff --git a/modules/hudozka-api/src/core/Tag.ts b/modules/hudozka-api/src/core/Tag.ts deleted file mode 100644 index 2f121c2d..00000000 --- a/modules/hudozka-api/src/core/Tag.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { translit } from '../lib/translit' - -export class Tag { - public static fromCyrillic(tag: string) { - const slug = tag - ? translit(tag).toLowerCase() - : tag - - return new Tag(tag, slug) - } - - public name: string - public slug: string - - constructor(name: string, slug: string) { - this.name = name - this.slug = slug - } - - public isValid() { - return !!this.slug - } -} diff --git a/modules/hudozka-api/src/db.ts b/modules/hudozka-api/src/db.ts deleted file mode 100644 index ecfb9fe4..00000000 --- a/modules/hudozka-api/src/db.ts +++ /dev/null @@ -1,46 +0,0 @@ -import Data from './core/Data' -import { MongoClient, ObjectId, Db } from 'mongodb' - -var db: Db - -export async function connect(dbName: string, mongoUri: string) { - if (db) { - return db - } - const connection = await MongoClient.connect(mongoUri, { useUnifiedTopology: true }) - db = init(connection.db(dbName)) - return db -} - -export function collection(name: string) { - return db.collection(name) -} - -export type ObjectIdLike = ObjectId | string -export function oid(i: ObjectIdLike | { _id: ObjectIdLike }): ObjectId | null { - if (i instanceof ObjectId) { - return i - } else if (typeof i === 'string') { - try { - return new ObjectId(i) - } catch (error) { - console.error(error) - return null - } - } else if (i instanceof Object) { - return '_id' in i ? oid(i._id) : null - } - - return null -} - -function init(db: Db) { - console.log('INIT DB') - - Data.setStore('Page', db.collection('pages')) - Data.setStore('Image', db.collection('images')) - Data.setStore('Document', db.collection('documents')) - Data.setStore('Settings', db.collection('settings')) - - return db -} diff --git a/modules/hudozka-api/src/factory/file.ts b/modules/hudozka-api/src/factory/file.ts deleted file mode 100644 index 2bf7b6ba..00000000 --- a/modules/hudozka-api/src/factory/file.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Document from '../core/Document' -import { encodeImage, ImageDto } from './image' - -export type FileDto = { - url: string - slug: string - name: string - cover?: ImageDto - filepath: string - file: { - name: string - size: number - type: string - src: string - } -} - -export function encodeFile(file: Document): FileDto { - const cover = file.preview ? encodeImage(file.preview) : null - - return { - url: encodeFileUrl(file), - slug: file.id, - cover, - name: file.title, - filepath: file.file, - file: { - type: 'application/pdf', - name: file.fileInfo.name, - size: file.fileInfo.size, - src: file.url, - } - } -} - -export function encodeFileUrl(file: Document): string { - return `/document/${file.id}` -} diff --git a/modules/hudozka-api/src/factory/image.ts b/modules/hudozka-api/src/factory/image.ts deleted file mode 100644 index 2aca2408..00000000 --- a/modules/hudozka-api/src/factory/image.ts +++ /dev/null @@ -1,24 +0,0 @@ -import Image from '../core/Image' - -const ORIGINAL = 'original' - -export type ImageDto = { - width: number - height: number - src: string - filepath: string -} - -export function encodeImage(image: Image): ImageDto { - const a = image.getArtifact(ORIGINAL) - if (!image) { - return null - } - - return { - src: a.url, - width: a.width, - height: a.height, - filepath: image.file, - } -} diff --git a/modules/hudozka-api/src/factory/page.ts b/modules/hudozka-api/src/factory/page.ts deleted file mode 100644 index 8d15d528..00000000 --- a/modules/hudozka-api/src/factory/page.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { encodeImage, ImageDto } from './image' -import Page from '../core/Page' -import { Breadcrumb } from '../types' -import { Tag } from '../core/Tag' - -type Token = { - token: string - data: any -} - -type PageDto = { - title: string - date?: string - url: string - data: string - description: string - cover?: ImageDto - tokens: Token[] - tags: Tag[] - featured: boolean - breadcrumb: Breadcrumb -} - -export function encodePage(page: Page): PageDto { - const cover = page.preview ? encodeImage(page.preview) : null - const date = page.date ? page.date.toString() : null - const breadcrumb = page.getBreadcrumb() - - return { - title: page.title, - url: page.url, - data: page.data, - description: page.description, - tokens: page.tokens, - tags: page.tags, - featured: page.featured, - cover, - date, - breadcrumb, - } -} diff --git a/modules/hudozka-api/src/lib/array.ts b/modules/hudozka-api/src/lib/array.ts deleted file mode 100644 index cacae12b..00000000 --- a/modules/hudozka-api/src/lib/array.ts +++ /dev/null @@ -1,31 +0,0 @@ -export function unique(items: T[], key: (item: T) => string): T[] { - const map = new Map(items.map(x => [key(x), x])) - - return [...map.values()] -} - -export function ensureArray(value: T | T[]): T[] { - if (!value) { - return [] - } - - if (Array.isArray(value)) { - return value - } - - return [value] -} - -/** - * - * Check if array has one item at least - * - * @param items - */ -export function isArrayOk(items: T[]): boolean { - if (!Array.isArray(items)) { - return false - } - - return items.length > 0 -} diff --git a/modules/hudozka-api/src/lib/store.ts b/modules/hudozka-api/src/lib/store.ts deleted file mode 100644 index d7cb40ba..00000000 --- a/modules/hudozka-api/src/lib/store.ts +++ /dev/null @@ -1,19 +0,0 @@ -export async function find(collection, query, { sort, skip, limit }) { - const cursor = collection.find(query) - - if (sort) cursor.sort(sort) - if (skip) cursor.skip(skip) - if (limit) cursor.limit(limit) - - return cursor.toArray() -} - -export async function findOne(collection, query) { - return collection.findOne(query) -} - -export async function total(collection, query) { - return collection - .find(query) - .count() -} diff --git a/modules/hudozka-api/src/lib/translit.ts b/modules/hudozka-api/src/lib/translit.ts deleted file mode 100644 index 87c24347..00000000 --- a/modules/hudozka-api/src/lib/translit.ts +++ /dev/null @@ -1,80 +0,0 @@ -const map = new Map([ - ['', '_'], - - ['А', 'A'], - ['а', 'a'], - ['Б', 'B'], - ['б', 'b'], - ['В', 'V'], - ['в', 'v'], - ['Г', 'G'], - ['г', 'g'], - ['Д', 'D'], - ['д', 'd'], - ['Е', 'E'], - ['е', 'e'], - ['Ё', 'E'], - ['ё', 'e'], - ['Ж', 'Zh'], - ['ж', 'zh'], - ['З', 'Z'], - ['з', 'z'], - ['И', 'I'], - ['и', 'i'], - ['Й', 'Y'], - ['й', 'y'], - ['К', 'K'], - ['к', 'k'], - ['Л', 'L'], - ['л', 'l'], - ['М', 'M'], - ['м', 'm'], - ['Н', 'N'], - ['н', 'n'], - ['О', 'O'], - ['о', 'o'], - ['П', 'P'], - ['п', 'p'], - ['Р', 'R'], - ['р', 'r'], - ['С', 'S'], - ['с', 's'], - ['Т', 'T'], - ['т', 't'], - ['У', 'U'], - ['у', 'u'], - ['Ф', 'F'], - ['ф', 'f'], - ['Х', 'Kh'], - ['х', 'kh'], - ['Ц', 'Ts'], - ['ц', 'ts'], - ['Ч', 'Ch'], - ['ч', 'ch'], - ['Ш', 'Sh'], - ['ш', 'sh'], - ['Щ', 'Sch'], - ['щ', 'sch'], - ['ь', ''], - ['Ы', 'Y'], - ['ы', 'y'], - ['ъ', ''], - ['Э', 'E'], - ['э', 'e'], - ['Ю', 'Yu'], - ['ю', 'yu'], - ['Я', 'Ya'], - ['я', 'ya'], -]) - -export function translit(sample: string): string { - return [...sample] - .map(char => { - if (map.has(char)) { - return map.get(char) - } - - return '' - }) - .join('') -} diff --git a/modules/hudozka-api/src/lib/url.ts b/modules/hudozka-api/src/lib/url.ts deleted file mode 100644 index f7e0ea79..00000000 --- a/modules/hudozka-api/src/lib/url.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Request } from 'express' -import { ensureArray } from './array' - -export function dropTrailingSlash(path: string) { - if (path === '/' || path === '') { - return '/' - } - - const lastChar = path.charAt(path.length - 1) - if (lastChar === '/') { - return path.substr(0, path.length - 1) - } - - return path -} - -export function getPathWaterfall(path: string): string[] { - const parts = path - .split('/') - .filter(Boolean) - .reduce((acc, part, index, parts) => { - const i = index + 1 - const item = `/${parts.slice(0, i).join('/')}` - return [ - ...acc, - item - ] - }, []) - - return ['/', ...parts] -} - -export function readQueryInt(req: Request, key: string) { - const int = (value: string | string[]) => parseInt(Array.isArray(value) - ? value[0] - : value - ) - - return int(req.query[key]) || 0 -} - -export function readQueryString(req: Request, key: string) { - return `${req.query[key]}` -} - -export function readQueryArray(req: Request, key: string) { - return ensureArray(req.query[key]) -} diff --git a/modules/hudozka-api/src/server.ts b/modules/hudozka-api/src/server.ts deleted file mode 100644 index fb63eddc..00000000 --- a/modules/hudozka-api/src/server.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { config } from 'dotenv' -import express from 'express' -import { connect } from './db' -import * as file from './controllers/file' -import * as page from './controllers/page' -import * as image from './controllers/image' -import * as tag from './controllers/tag' - -async function main() { - const port = process.env.PORT || '3000' - const mongoUri = process.env.MONGO_URI - - try { - await connect('hudozka', mongoUri) - - console.log('connected') - } catch (e) { - console.error(e.message) - - process.exit(1) - } - - const app = express() - app.get('/files/urls', file.getUrls) - app.get('/files/:slug', file.getItem) - - app.get('/pages', page.getAll) - app.get('/pages/urls', page.getUrls) - app.get('/pages/tags', page.getByTags) - app.get('/page', page.getItem) - - app.get('/image', image.getItem) - - app.get('/tags', tag.getAll) - - app.listen(port, () => { - console.log(`> Ready on http://localhost:${port}`) - }) -} - -config() -main() diff --git a/modules/hudozka-api/src/types.ts b/modules/hudozka-api/src/types.ts deleted file mode 100644 index 238157c9..00000000 --- a/modules/hudozka-api/src/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type BreadcrumbPart = { - name: string - href: string -} - -export type Breadcrumb = BreadcrumbPart[] diff --git a/modules/hudozka-api/tsconfig.json b/modules/hudozka-api/tsconfig.json deleted file mode 100644 index c0262a52..00000000 --- a/modules/hudozka-api/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./build", - "target": "esnext", - "lib": [ - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "esModuleInterop": true, - "module": "commonjs", - "moduleResolution": "node", - "resolveJsonModule": true - }, - "exclude": [ - "node_modules" - ], - "include": [ - "**/*.ts" - ] -}