From 8f974840e0483abac839389173fabc1594596d03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20S=C4=85siadek?= <100174940+kimi1723@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:03:53 +0100 Subject: [PATCH 1/2] types --- index.js | 40 ++++---- index.ts | 165 ++++++++++++++++++++++++++++++++ package-lock.json | 233 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 6 ++ tsconfig.json | 9 ++ 5 files changed, 431 insertions(+), 22 deletions(-) create mode 100644 index.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tsconfig.json diff --git a/index.js b/index.js index c0f3ec3..eca4f6c 100644 --- a/index.js +++ b/index.js @@ -51,7 +51,7 @@ class Observable { observer.complete(); return () => { - console.log('unsubscribed'); + console.log("unsubscribed"); }; }); } @@ -61,28 +61,24 @@ class Observable { observer._unsubscribe = this._subscribe(observer); - return ({ + return { unsubscribe() { observer.unsubscribe(); - } - }); + }, + }; } } -const HTTP_POST_METHOD = 'POST'; -const HTTP_GET_METHOD = 'GET'; +const HTTP_POST_METHOD = "POST"; +const HTTP_GET_METHOD = "GET"; const HTTP_STATUS_OK = 200; const HTTP_STATUS_INTERNAL_SERVER_ERROR = 500; - const userMock = { - name: 'User Name', + name: "User Name", age: 26, - roles: [ - 'user', - 'admin' - ], + roles: ["user", "admin"], createdAt: new Date(), isDeleated: false, }; @@ -90,38 +86,38 @@ const userMock = { const requestsMock = [ { method: HTTP_POST_METHOD, - host: 'service.example', - path: 'user', + host: "service.example", + path: "user", body: userMock, params: {}, }, { method: HTTP_GET_METHOD, - host: 'service.example', - path: 'user', + host: "service.example", + path: "user", params: { - id: '3f5h67s4s' + id: "3f5h67s4s", }, - } + }, ]; const handleRequest = (request) => { // handling of request - return {status: HTTP_STATUS_OK}; + return { status: HTTP_STATUS_OK }; }; const handleError = (error) => { // handling of error - return {status: HTTP_STATUS_INTERNAL_SERVER_ERROR}; + return { status: HTTP_STATUS_INTERNAL_SERVER_ERROR }; }; -const handleComplete = () => console.log('complete'); +const handleComplete = () => console.log("complete"); const requests$ = Observable.from(requestsMock); const subscription = requests$.subscribe({ next: handleRequest, error: handleError, - complete: handleComplete + complete: handleComplete, }); subscription.unsubscribe(); diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..e3bead3 --- /dev/null +++ b/index.ts @@ -0,0 +1,165 @@ +enum HttpMethod { + GET = "GET", + POST = "POST", +} + +enum HttpStatus { + OK = 200, + INTERNAL_SERVER_ERROR = 500, +} + +interface User { + readonly name: string; + readonly age: number; + readonly roles: string[]; + readonly createdAt: Date; + readonly isDeleted: boolean; +} + +interface RequestMock { + readonly method: HttpMethod; + readonly host: string; + readonly path: string; + readonly body?: User; + readonly params?: { + readonly id?: string; + }; +} + +type RequestsMock = ReadonlyArray; + +interface HandlerReturnType { + status: HttpStatus; +} + +interface Handlers { + next: (value: RequestMock) => HandlerReturnType; + error: (error: Error) => HandlerReturnType; + complete: () => void; +} + +class Observer { + isUnsubscribed: boolean; + handlers: Handlers; + _unsubscribe?: () => void; + + constructor(handlers: Handlers) { + this.handlers = handlers; + this.isUnsubscribed = false; + } + + next(value: RequestMock) { + if (this.handlers.next && !this.isUnsubscribed) { + this.handlers.next(value); + } + } + + error(error: Error) { + if (!this.isUnsubscribed) { + if (this.handlers.error) { + this.handlers.error(error); + } + + this.unsubscribe(); + } + } + + complete() { + if (!this.isUnsubscribed) { + if (this.handlers.complete) { + this.handlers.complete(); + } + + this.unsubscribe(); + } + } + + unsubscribe() { + this.isUnsubscribed = true; + + if (this._unsubscribe) { + this._unsubscribe(); + } + } +} + +type Subscribe = (observer: Observer) => () => void; + +class Observable { + _subscribe: Subscribe; + + constructor(subscribe: Subscribe) { + this._subscribe = subscribe; + } + + static from(values: RequestsMock) { + return new Observable((observer) => { + values.forEach((value) => observer.next(value)); + + observer.complete(); + + return () => { + console.log("unsubscribed"); + }; + }); + } + + subscribe(obs: Handlers) { + const observer = new Observer(obs); + + observer._unsubscribe = this._subscribe(observer); + + return { + unsubscribe() { + observer.unsubscribe(); + }, + }; + } +} + +const userMock: User = { + name: "User Name", + age: 26, + roles: ["user", "admin"], + createdAt: new Date(), + isDeleted: false, +}; + +const requestsMock: RequestsMock = [ + { + method: HttpMethod.POST, + host: "service.example", + path: "user", + body: userMock, + params: {}, + }, + { + method: HttpMethod.GET, + host: "service.example", + path: "user", + params: { + id: "3f5h67s4s", + }, + }, +]; + +const handleRequest = (request: RequestMock): HandlerReturnType => { + // handling of request + return { status: HttpStatus.OK }; +}; +const handleError = (error: Error): HandlerReturnType => { + // handling of error + return { status: HttpStatus.INTERNAL_SERVER_ERROR }; +}; + +const handleComplete = () => console.log("complete"); + +const requests$ = Observable.from(requestsMock); + +const subscription = requests$.subscribe({ + next: handleRequest, + error: handleError, + complete: handleComplete, +}); + +subscription.unsubscribe(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9f33bc2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,233 @@ +{ + "name": "ts-capstone", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "ts-node": "^10.9.2", + "typescript": "^5.6.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a9978e0 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "ts-node": "^10.9.2", + "typescript": "^5.6.3" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..77b7c52 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ESNext", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node" + } +} From fd7272c252b0c0301c4cd5d52bae17d61bcf2a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20S=C4=85siadek?= <100174940+kimi1723@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:11:14 +0100 Subject: [PATCH 2/2] Update index.ts --- index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.ts b/index.ts index e3bead3..0e245fb 100644 --- a/index.ts +++ b/index.ts @@ -20,10 +20,10 @@ interface RequestMock { readonly method: HttpMethod; readonly host: string; readonly path: string; - readonly body?: User; - readonly params?: { + readonly params: { readonly id?: string; }; + readonly body?: User; } type RequestsMock = ReadonlyArray;