diff --git a/backend/db.json b/backend/db.json new file mode 100644 index 0000000..4d7f5c0 --- /dev/null +++ b/backend/db.json @@ -0,0 +1,22 @@ +[ + { + "id": 0, + "firstName": "", + "middleName": "", + "lastName": "", + "email": "", + "phone": "", + "role": 0, + "address": "" + }, + { + "id": 1, + "firstName": "", + "middleName": "", + "lastName": "", + "email": "", + "phone": "", + "role": 0, + "address": "" + } +] \ No newline at end of file diff --git a/backend/interface.js b/backend/interface.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/interface.ts b/backend/interface.ts new file mode 100644 index 0000000..8c7a21b --- /dev/null +++ b/backend/interface.ts @@ -0,0 +1,11 @@ +export interface DataTypeOfUser{ + id:number; + firstName : string; + middleName:string; + lastName:string; + phone:string; + email:string; + address:string; + role:number; + +} \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..e91487b --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1461 @@ +{ + "name": "exprscode-1", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@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==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@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==", + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg==", + "requires": { + "@types/express": "*" + } + }, + "@types/express": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", + "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@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==", + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" + }, + "@types/node": { + "version": "13.7.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.6.tgz", + "integrity": "sha512-eyK7MWD0R1HqVTp+PtwRgFeIsemzuj4gBFSQxfPHY5iMjS7474e5wq+VFgTcdpyHeNxyKSaetYAjdMLJlKoWqA==" + }, + "@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==" + }, + "@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==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "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" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "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==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nodemon": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", + "integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pg": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz", + "integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "0.1.3", + "pg-packet-stream": "^1.1.0", + "pg-pool": "^2.0.10", + "pg-types": "^2.1.0", + "pgpass": "1.x", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } + } + }, + "pg-connection-string": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", + "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-packet-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", + "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" + }, + "pg-pool": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz", + "integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", + "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", + "requires": { + "split": "^1.0.0" + } + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz", + "integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "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==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "router": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/router/-/router-1.3.4.tgz", + "integrity": "sha512-a5uZFwgKExBZzh4U5jujU05DkImy9/ub8omiU7RlZlNnSF07tjvNJTOgHdZOjKDeUZqlkpz8CjDoz5SY3kimOA==", + "requires": { + "array-flatten": "3.0.0", + "debug": "2.6.9", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "dependencies": { + "array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "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" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..0f342a8 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,26 @@ +{ + "name": "exprscode-1", + "version": "1.0.0", + "description": "this is to learn express", + "main": "server.js", + "type": "module", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js" + }, + "author": "shivam", + "license": "ISC", + "dependencies": { + "@types/cors": "^2.8.6", + "@types/express": "^4.17.2", + "@types/node": "^13.7.6", + "cors": "^2.8.5", + "express": "^4.17.1", + "path": "^0.12.7", + "pg": "^7.18.2", + "router": "^1.3.4" + }, + "devDependencies": { + "nodemon": "^2.0.2" + } +} diff --git a/backend/routes/api.js b/backend/routes/api.js new file mode 100644 index 0000000..7b37679 --- /dev/null +++ b/backend/routes/api.js @@ -0,0 +1,60 @@ +import express from "express"; +import { users } from "../server.js"; +import fs from "fs"; +export let router = express.Router(); +// router.use(function (req, res, next) { +// // .. some logic here .. like any other middleware +// next() +// }) +router.get('/getUsers', (req, res) => { + res.json(users); +}); +router.get('/getUsers/:id', (req, res) => { + users.splice(parseInt(req.params.id), 1); + console.log(req.url); + let i = 0; + users.forEach((element) => { + element.id = i++; + }); + i = 0; + updateDb(); + res.status(200); + res.send('success'); +}); +function updateDb() { + fs.writeFile('db.json', JSON.stringify(users, null, 2), function (err) { + if (err) { + console.log(err); + } + else { + console.log("JSON saved"); + } + }); +} +router.post('/saveUser', (req, res) => { + users.push(req.body); + res.status(200); + updateDb(); + res.send('success'); +}); +router.post('/updateUser:id', (req, res) => { + const found = users.some((member) => member.id === parseInt(req.params.id)); + if (found) { + const updMember = req.body; + users.forEach((member) => { + if (member.id === parseInt(req.params.id)) { + member.firstName = updMember.firstName; + member.middleName = updMember.middleName; + member.lastName = updMember.lastName; + member.email = updMember.email; + member.phone = updMember.phone; + member.role = updMember.role; + member.address = updMember.address; + res.json({ msg: 'Member updated', member }); + } + }); + } + else { + res.status(400).json({ msg: `No member with the id of ${req.params.id}` }); + } +}); diff --git a/backend/routes/api.ts b/backend/routes/api.ts new file mode 100644 index 0000000..c2436d5 --- /dev/null +++ b/backend/routes/api.ts @@ -0,0 +1,66 @@ +import express from "express" +import { users } from "../server.js"; +import fs from "fs"; +import { DataTypeOfUser } from "../interface.js"; +export let router = express.Router(); + + +// router.use(function (req, res, next) { +// // .. some logic here .. like any other middleware +// next() +// }) + +router.get('/getUsers',(req , res)=>{ + res.json(users); +}); +router.get('/getUsers/:id', (req, res) => { + users.splice(parseInt(req.params.id),1); + console.log(req.url) + let i = 0; + users.forEach((element: { id: number; })=> { + element.id = i++; + }); + i = 0; + updateDb(); + res.status(200); + res.send('success') + }); +function updateDb(){ + fs.writeFile('db.json', JSON.stringify(users,null,2), function(err) { + if (err) { + console.log(err); + } else { + console.log("JSON saved"); + }}) +} + +router.post('/saveUser',(req , res)=>{ +users.push(req.body); +res.status(200); +updateDb(); +res.send('success') + +}) + +router.post('/updateUser:id', (req, res) => { + const found = users.some((member: { id: number; }) => member.id === parseInt(req.params.id)); + + if (found) { + const updMember:DataTypeOfUser = req.body; + users.forEach((member:DataTypeOfUser) => { + if (member.id === parseInt(req.params.id)) { + member.firstName = updMember.firstName; + member.middleName = updMember.middleName; + member.lastName = updMember.lastName; + member.email = updMember.email; + member.phone=updMember.phone; + member.role = updMember.role; + member.address = updMember.address; + + res.json({ msg: 'Member updated', member }); + } + }); + } else { + res.status(400).json({ msg: `No member with the id of ${req.params.id}` }); + } + }); diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..0a4a5f3 --- /dev/null +++ b/backend/server.js @@ -0,0 +1,24 @@ +import fs from "fs"; +import express from "express"; +import { router } from "./routes/api.js"; +import cors from "cors"; +const app = express(); +function dataFetch() { + let data = JSON.parse(fs.readFileSync("db.json")); + return data; +} +app.use(function (req, res, next) { + res.header("Access-Control-Allow-Origin", "http://127.0.0.1:5500"); // update to match the domain you will make the request from + res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + next(); +}); +export let users = dataFetch(); +// let __dirname = path.resolve(); +app.use(express.json()); +app.use('/api', router); +app.use(express.urlencoded({ extended: false })); +app.use(cors()); +const PORT = process.env.PORT || 5000; +app.listen(PORT, () => { + console.log("this server now starts at port " + PORT); +}); diff --git a/backend/server.ts b/backend/server.ts new file mode 100644 index 0000000..d6c950f --- /dev/null +++ b/backend/server.ts @@ -0,0 +1,31 @@ +import fs from "fs"; +import express from "express"; +import { router } from "./routes/api.js"; +import cors from "cors"; + + +const app = express(); +function dataFetch (){ + let data=JSON.parse(fs.readFileSync("db.json")as any); + return data; +} +app.use(function(req, res, next) { + res.header("Access-Control-Allow-Origin", "http://127.0.0.1:5500"); // update to match the domain you will make the request from + res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + next(); + }); + +export let users = dataFetch(); + +// let __dirname = path.resolve(); +app.use(express.json()); +app.use('/api', router,) +app.use(express.urlencoded({extended: false})); +app.use(cors()); + +const PORT = process.env.PORT || 5000; + + + app.listen(PORT, ()=>{ + console.log("this server now starts at port "+PORT); + }) \ No newline at end of file diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..c05edb9 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,66 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "es6", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + // "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/frontEnd/ButtonsAction.js b/frontEnd/ButtonsAction.js new file mode 100644 index 0000000..26a5364 --- /dev/null +++ b/frontEnd/ButtonsAction.js @@ -0,0 +1,27 @@ +import { dataFetch } from "./DataFetch.js"; +import { objUserTable } from "./userView.js"; +import { objClassGetID } from "./GetID.js"; +let loadDataBtn = document.getElementById("loadData"); +loadDataBtn.onclick = dataFetch; +let refreshBtn = document.getElementById("refreshData"); +refreshBtn.onclick = objUserTable.refreshTable; +export let clickable = function (e) { + objFindID.listen(e); +}; +export let tableWhole = document.getElementById("table"); +export function addEvent() { + tableWhole.addEventListener("click", clickable); +} +export function removeEvent() { + tableWhole.removeEventListener("click", clickable); +} +class FindID { + listen(event) { + let eid = event.target.id; + if (eid) { + objClassGetID.passID(eid); + console.log(eid); + } + } +} +export let objFindID = new FindID(); diff --git a/frontEnd/ButtonsAction.ts b/frontEnd/ButtonsAction.ts new file mode 100644 index 0000000..258b154 --- /dev/null +++ b/frontEnd/ButtonsAction.ts @@ -0,0 +1,29 @@ +import { dataFetch } from "./DataFetch.js"; +import { objUserTable } from "./userView.js"; +import { objClassGetID } from "./GetID.js"; +let loadDataBtn:HTMLButtonElement = document.getElementById("loadData")as HTMLButtonElement; +loadDataBtn.onclick = dataFetch; +let refreshBtn :HTMLButtonElement = document.getElementById("refreshData")as HTMLButtonElement; +refreshBtn.onclick = objUserTable.refreshTable; + +export let clickable = function(event:MouseEvent){ + objFindID.listen(event); +} + +export let tableWhole:HTMLTableElement = document.getElementById("table")as HTMLTableElement; +export function addEvent(){ + tableWhole.addEventListener("click", clickable); +} +export function removeEvent(){ + tableWhole.removeEventListener("click", clickable); +} + +class FindID{ + listen(event:MouseEvent){ + let elementId = (event.target as HTMLInputElement).id; + if(elementId) + { + objClassGetID.passID(elementId); +}} +} +export let objFindID = new FindID(); \ No newline at end of file diff --git a/frontEnd/DataFetch.js b/frontEnd/DataFetch.js new file mode 100644 index 0000000..92089a0 --- /dev/null +++ b/frontEnd/DataFetch.js @@ -0,0 +1,9 @@ +import { objUserTable } from "./userView.js"; +import { addEvent } from "./ButtonsAction.js"; +export let urlData = 'http://localhost:5000/api/users'; +export async function dataFetch() { + let users = await fetch(urlData) + .then(resp => { return (resp.json()); }); + objUserTable.getUsers(users); + addEvent(); +} diff --git a/frontEnd/DataFetch.ts b/frontEnd/DataFetch.ts new file mode 100644 index 0000000..68d2d55 --- /dev/null +++ b/frontEnd/DataFetch.ts @@ -0,0 +1,12 @@ +import {DataTypeOfUser} from "./interface.js"; +import {objUserTable } from "./userView.js"; +import { addEvent } from "./ButtonsAction.js"; + +export let urlData = 'http://localhost:5000/api/getUsers' + +export async function dataFetch(){ + let users:DataTypeOfUser[]= await fetch(urlData) + .then(resp=>{return(resp.json())}) + objUserTable.getUsers(users); + addEvent(); + } \ No newline at end of file diff --git a/frontEnd/GetID.js b/frontEnd/GetID.js new file mode 100644 index 0000000..2058c68 --- /dev/null +++ b/frontEnd/GetID.js @@ -0,0 +1,21 @@ +import { objUserTable } from "./userView.js"; +export class ClassGetID { + passID(ID) { + let length = ID.length; + let IDno = ID.charAt(length - 1); + if ((ID.charAt(length - 2) + ID.charAt(length - 1)) <= '99') { + IDno = ID.charAt(length - 2) + ID.charAt(length - 1); + } + if (ID == "delete" + (IDno)) { + let rowElement = document.getElementById(ID); + console.log(rowElement); + objUserTable.deleteRecord(rowElement); + } + else if (ID == "edit" + (IDno)) { + let rowElement = document.getElementById(ID); + let rowNumber = parseInt(IDno); + objUserTable.editRecord(rowElement, rowNumber); + } + } +} +export let objClassGetID = new ClassGetID(); diff --git a/frontEnd/GetID.ts b/frontEnd/GetID.ts new file mode 100644 index 0000000..31f86a8 --- /dev/null +++ b/frontEnd/GetID.ts @@ -0,0 +1,22 @@ +import { objUserTable } from "./userView.js"; +export class ClassGetID{ + passID(ID:string){ + let length = ID.length; + let IDno =ID.charAt(length-1); + if((ID.charAt(length-2)+ID.charAt(length-1))<='99'){ + IDno = ID.charAt(length-2)+ID.charAt(length-1); + } + + if(ID=="delete"+(IDno)){ + let rowElement :Node= document.getElementById(ID)!; + console.log(rowElement) + objUserTable.deleteRecord(rowElement) + } + else if(ID=="edit"+(IDno)){ + let rowElement:Node=document.getElementById(ID)!; + let rowNumber = parseInt(IDno) + objUserTable.editRecord(rowElement , rowNumber); + } + } +} +export let objClassGetID = new ClassGetID(); \ No newline at end of file diff --git a/frontEnd/addUser.js b/frontEnd/addUser.js new file mode 100644 index 0000000..3e96ef8 --- /dev/null +++ b/frontEnd/addUser.js @@ -0,0 +1,52 @@ +import { objUserTable } from "./userView.js"; +import { urlData } from "./DataFetch.js"; +export let addUserBtn = document.createElement('button'); +class AddUser { + addUserButton() { + addUserBtn.innerHTML = 'ADD USER'; + addUserBtn.setAttribute('class', 'w3-button refresh'); + document.body.appendChild(addUserBtn); + addUserBtn.style.display = 'none'; + addUserBtn.onclick = async function () { + let users = await fetch(urlData) + .then(resp => { return (resp.json()); }); + objAddUser.addUserData(users); + }; + } + addUserData(users) { + let i = users.length; + let addUser = { + "id": i, + "firstName": "", + "middleName": "", + "lastName": "", + "email": "", + "phone": "", + "role": 0, + "address": "" + }; + users.push(addUser); + let table = document.getElementById('userData'); + table.innerHTML = ""; + objUserTable.getUsers(users); + addUserBtn.disabled = true; + let rowElement = document.getElementById('edit' + i); + let rowNumber = i; + objUserTable.editRecord(rowElement, rowNumber); + fetch('http://localhost:5000/api/savedata', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(addUser), + }) + .then((response) => response.json()) + .then((addUser) => { + console.log('Success'); + }) + .catch((error) => { + console.error('Error:', error); + }); + } +} +export let objAddUser = new AddUser(); diff --git a/frontEnd/addUser.ts b/frontEnd/addUser.ts new file mode 100644 index 0000000..9d69da2 --- /dev/null +++ b/frontEnd/addUser.ts @@ -0,0 +1,57 @@ +import { DataTypeOfUser } from "./interface"; +import { objUserTable } from "./userView.js"; +import { urlData } from "./DataFetch.js"; + + export let addUserBtn = document.createElement('button'); + +class AddUser{ + addUserButton(){ +addUserBtn.innerHTML='ADD USER'; +addUserBtn.setAttribute('class','w3-button refresh'); +document.body.appendChild(addUserBtn); +addUserBtn.style.display = 'none' +addUserBtn.onclick = async function(){ + let users:DataTypeOfUser[]= await fetch(urlData) + .then(resp=>{return(resp.json())}) + objAddUser.addUserData(users); +} + } + addUserData(users:DataTypeOfUser[]){ + let i = users.length; + + let addUser:DataTypeOfUser = { + "id": i, + "firstName" :"", + "middleName": "", + "lastName":"", + "email":"", + "phone":"", + "role":0, + "address":"" + } + + users.push(addUser); + let table:HTMLTableElement = document.getElementById('userData')as HTMLTableElement; + table.innerHTML=""; + objUserTable.getUsers(users); + addUserBtn.disabled=true; + let rowElement:Node=document.getElementById('edit'+i)!; + let rowNumber = i; + objUserTable.editRecord(rowElement , rowNumber); + fetch('http://localhost:5000/api/saveUser', { + method: 'POST', // or 'PUT' + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(addUser), +}) +.then((response) => response.json()) +.then((addUser) => { + console.log('Success') +}) +.catch((error) => { + console.error('Error:', error); +}); + } +} +export let objAddUser = new AddUser(); \ No newline at end of file diff --git a/frontEnd/afterValidation.js b/frontEnd/afterValidation.js new file mode 100644 index 0000000..2abc8de --- /dev/null +++ b/frontEnd/afterValidation.js @@ -0,0 +1,9 @@ +class AfterValidation { + afterValidation(rowNumber, editedData) { + for (let j = 0; j < 6; j++) { + let selectedElements = document.getElementsByClassName("element" + rowNumber)[j]; + selectedElements.innerHTML = editedData[j]; + } + } +} +export let objAfterValidation = new AfterValidation(); diff --git a/frontEnd/afterValidation.ts b/frontEnd/afterValidation.ts new file mode 100644 index 0000000..8124876 --- /dev/null +++ b/frontEnd/afterValidation.ts @@ -0,0 +1,10 @@ +class AfterValidation{ + afterValidation(rowNumber:number, editedData:string[]){ + for(let j=0;j<6;j++) + { + let selectedElements = document.getElementsByClassName("element"+rowNumber)[j]; + selectedElements.innerHTML = editedData[j]; + } + } +} +export let objAfterValidation = new AfterValidation(); \ No newline at end of file diff --git a/frontEnd/db.json b/frontEnd/db.json new file mode 100644 index 0000000..c4caa93 --- /dev/null +++ b/frontEnd/db.json @@ -0,0 +1,62 @@ +[ + { + "id":0, + "firstName":"Kartik", + "middleName": "" , + "lastName" : "Grover", + "email": "grover@abc.com", + "phone": "7347666700", + "role" : 1, + "address": "234/23" + }, + { + "id":1, + "firstName" : "Gary", + "middleName" : "", + "lastName" : "malhotra", + "email" : "gmalhotra@abc.com", + "phone" : "7767676769", + "role" : 1, + "address" : "634/73" + }, + { + "id":2, + "firstName" : "Vidyut", + "middleName" : "", + "lastName" : "Pandita", + "email" : "vidyut@abc.com", + "phone" : "7397235927", + "role" : 2, + "address" : "635/93" + }, + { + "id":3, + "firstName" : "navidar", + "middleName" : "", + "lastName" : "singh", + "email" : "gmalhotra@abc.com", + "phone" : "7767676769", + "role" : 2, + "address" : "634/73" + }, + { + "id":4, + "firstName" : "bulakar", + "middleName" : "", + "lastName" : "bhagjana", + "email" : "gmalhotra@abc.com", + "phone" : "7767676769", + "role" : 0, + "address" : "634/73" + }, + { + "id":5, + "firstName" : "tasty", + "middleName" : "", + "lastName" : "chicken", + "email" : "gmalhotra@abc.com", + "phone" : "7767676769", + "role" : 1, + "address" : "634/73" + } +] \ No newline at end of file diff --git a/frontEnd/enum.js b/frontEnd/enum.js new file mode 100644 index 0000000..96c7543 --- /dev/null +++ b/frontEnd/enum.js @@ -0,0 +1,6 @@ +export var Role; +(function (Role) { + Role[Role["ADMIN"] = 0] = "ADMIN"; + Role[Role["DEVELOPER"] = 1] = "DEVELOPER"; + Role[Role["MANAGER"] = 2] = "MANAGER"; +})(Role || (Role = {})); diff --git a/frontEnd/enum.ts b/frontEnd/enum.ts new file mode 100644 index 0000000..9665e0f --- /dev/null +++ b/frontEnd/enum.ts @@ -0,0 +1 @@ +export enum Role {ADMIN, DEVELOPER , MANAGER} \ No newline at end of file diff --git a/frontEnd/formValidation.js b/frontEnd/formValidation.js new file mode 100644 index 0000000..f4fe9eb --- /dev/null +++ b/frontEnd/formValidation.js @@ -0,0 +1,110 @@ +import { objAfterValidation } from "./afterValidation.js"; +import { objShowError } from "./showError.js"; +import { objUserTable } from "./userView.js"; +class Validate { + validateFirstNlast(name) { + let firstNameRGEX = /[A-z]{1,10}$/; + let firstNameResult = firstNameRGEX.test(name.trim()); + return firstNameResult; + } + validateEmail(email) { + let emailRGEX = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/; + let emailResult = emailRGEX.test(email.trim()); + return emailResult; + } + validatePhone(phone) { + let phoneRGEX = /^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/; + let phoneResult = phoneRGEX.test(phone.trim()); + return phoneResult; + } + formValidate(rowElement, rowNumber, cloneData) { + let editedData = []; + let firstName = document.getElementsByClassName("inputData")[0]; + let middleName = document.getElementsByClassName("inputData")[1]; + let lastName = document.getElementsByClassName("inputData")[2]; + let email = document.getElementsByClassName("inputData")[3]; + let phone = document.getElementsByClassName("inputData")[4]; + let address = document.getElementsByClassName("inputData")[5]; + let phoneResult = objValidation.validatePhone(phone.value); + if (phoneResult) { + editedData[4] = phone.value; + } + else { + objShowError.passPhone(phone); + } + let firstNameResult = this.validateFirstNlast(firstName.value); + if (firstNameResult) { + editedData[0] = firstName.value; + } + else { + objShowError.passFirst(firstName); + } + let middleNameResult = this.validateFirstNlast(middleName.value); + if (middleNameResult || middleName.value.trim() == "") { + middleNameResult = true; + editedData[1] = middleName.value; + } + else { + objShowError.passMiddle(middleName); + } + let lastNameResult = this.validateFirstNlast(lastName.value); + if (lastNameResult) { + editedData[2] = lastName.value; + } + else { + objShowError.passLast(lastName); + } + let emailResult = this.validateEmail(email.value); + if (emailResult) { + editedData[3] = email.value; + } + else { + objShowError.passEmail(email); + } + editedData[5] = address.value; + if (phoneResult === false || firstNameResult === false || middleNameResult === false || lastNameResult === false || emailResult === false) { + return; + } + else { + let selectRole = document.getElementById("drop"); + let roleData = selectRole.value; + let rollno; + if (roleData == 'ADMIN') { + rollno = 0; + } + else if (roleData == "DEVELOPER") { + rollno = 1; + } + else { + rollno = 2; + } + objAfterValidation.afterValidation(rowNumber, editedData); + let updatedUser = { + "firstName": editedData[0], + "middleName": editedData[1], + "lastName": editedData[2], + "email": editedData[3], + "phone": editedData[4], + "address": editedData[5], + "role": rollno + }; + let ID = objUserTable.currentRow(rowElement); + fetch(`http://localhost:5000/api/updateuser${ID}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(updatedUser), + }) + .then((response) => response.json()) + .then((addUser) => { + console.log('Success'); + }) + .catch((error) => { + console.error('Error:', error); + }); + return 1; + } + } +} +export let objValidation = new Validate(); diff --git a/frontEnd/formValidation.ts b/frontEnd/formValidation.ts new file mode 100644 index 0000000..c0e412b --- /dev/null +++ b/frontEnd/formValidation.ts @@ -0,0 +1,116 @@ +import { objAfterValidation } from "./afterValidation.js"; +import { objShowError } from "./showError.js"; +import { objUserTable } from "./userView.js"; + +class Validate { + validateFirstNlast(name:string){ + let firstNameRGEX = /[A-z]{1,10}$/; + let firstNameResult = firstNameRGEX.test(name.trim()); + return firstNameResult; + } + validateEmail(email:string){ + let emailRGEX = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/; + let emailResult = emailRGEX.test(email.trim()); + return emailResult; + } + validatePhone(phone:string){ + let phoneRGEX = /^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/; + let phoneResult = phoneRGEX.test(phone.trim()); + return phoneResult; + } + formValidate(rowElement:Node,rowNumber :number ,cloneData:string[]){ + let editedData:string[]=[]; +let firstName = (document.getElementsByClassName("inputData")[0]as HTMLInputElement); +let middleName = (document.getElementsByClassName("inputData")[1]as HTMLInputElement); +let lastName= (document.getElementsByClassName("inputData")[2]as HTMLInputElement); +let email = (document.getElementsByClassName("inputData")[3]as HTMLInputElement); +let phone = (document.getElementsByClassName("inputData")[4]as HTMLInputElement); +let address = (document.getElementsByClassName("inputData")[5]as HTMLInputElement); + let phoneResult = objValidation.validatePhone(phone.value); + if(phoneResult) + { + editedData[4] = phone.value; + } + else{ + objShowError.passPhone(phone); + } + let firstNameResult = this.validateFirstNlast(firstName.value); + if(firstNameResult) + { + editedData[0] = firstName.value; + } + else{ + objShowError.passFirst(firstName); + } + let middleNameResult = this.validateFirstNlast(middleName.value); + if(middleNameResult||middleName.value.trim()==""){ + middleNameResult= true; + editedData[1] = middleName.value; + } + else{ + objShowError.passMiddle(middleName); + } + let lastNameResult = this.validateFirstNlast(lastName.value); + if(lastNameResult){ + editedData[2] = lastName.value; + } + else{ + objShowError.passLast(lastName); + } + let emailResult = this.validateEmail(email.value); + if(emailResult) + { + editedData[3] = email.value; + } + else{ + objShowError.passEmail(email); + } + editedData[5]=address.value; + if(phoneResult===false||firstNameResult===false||middleNameResult===false||lastNameResult===false||emailResult===false){ + return; + } + else{ + let selectRole:HTMLSelectElement = document.getElementById("drop")as HTMLSelectElement; + let roleData = selectRole.value; + let rollno; + if(roleData=='ADMIN'){ + rollno = 0; + } + else if(roleData=="DEVELOPER"){ + rollno = 1; + } + else{ + rollno = 2; + } + objAfterValidation.afterValidation(rowNumber,editedData) + let updatedUser = { + "firstName":editedData[0], + "middleName":editedData[1], + "lastName":editedData[2], + "email":editedData[3], + "phone":editedData[4], + "address":editedData[5], + "role": rollno + + } + let ID = objUserTable.currentRow(rowElement); + fetch(`http://localhost:5000/api/updateuser${ID}`, { + method: 'POST', // or 'PUT' + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(updatedUser), +}) +.then((response) => response.json()) +.then((addUser) => { + console.log('Success') +}) +.catch((error) => { + console.error('Error:', error); +}); + return 1; + } + } + +} +export let objValidation = new Validate(); diff --git a/frontEnd/home.html b/frontEnd/home.html new file mode 100644 index 0000000..0386d47 --- /dev/null +++ b/frontEnd/home.html @@ -0,0 +1,37 @@ + + + + + + + + + + typescript + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontEnd/interface.js b/frontEnd/interface.js new file mode 100644 index 0000000..e69de29 diff --git a/frontEnd/interface.ts b/frontEnd/interface.ts new file mode 100644 index 0000000..cc8e78c --- /dev/null +++ b/frontEnd/interface.ts @@ -0,0 +1,22 @@ +import { Role } from "./enum.js"; +export interface DataTypeOfUser { + id : number; + firstName: string; + middleName:string; + lastName : string; + email:string; + phone:string; + role:Role; + address:string; + // length:number; + // data : Array; +} +export interface validateVar{ + firstName: string; + middleName:string; + lastName : string; + email:string; + phone:string; + address:string; + editedData:string[]; +} \ No newline at end of file diff --git a/frontEnd/showError.js b/frontEnd/showError.js new file mode 100644 index 0000000..e059be4 --- /dev/null +++ b/frontEnd/showError.js @@ -0,0 +1,40 @@ +export let error = document.createElement("td"); +error.setAttribute("class", "invalid"); +class ShowError { + passPhone(phone) { + let phoneField = phone.parentNode?.parentNode; + error.textContent = "Enter the correct Phone Number"; + error.style.display = "none"; + phoneField.appendChild(error); + error.style.display = "block"; + } + passFirst(firstName) { + let nameField = firstName.parentNode?.parentNode; + error.textContent = "Enter the correct First Name"; + error.style.display = "none"; + nameField.appendChild(error); + error.style.display = "block"; + } + passMiddle(middleName) { + let nameField = middleName.parentNode?.parentNode; + error.textContent = "Enter the correct Middle Name"; + error.style.display = "none"; + nameField.appendChild(error); + error.style.display = "block"; + } + passLast(lastName) { + let nameField = lastName.parentNode?.parentNode; + error.textContent = "Enter the correct Last Name"; + error.style.display = "none"; + nameField.appendChild(error); + error.style.display = "block"; + } + passEmail(email) { + let emailField = email.parentNode?.parentNode; + error.textContent = "Enter the correct Email"; + error.style.display = "none"; + emailField.appendChild(error); + error.style.display = "block"; + } +} +export let objShowError = new ShowError(); diff --git a/frontEnd/showError.ts b/frontEnd/showError.ts new file mode 100644 index 0000000..6a2efbc --- /dev/null +++ b/frontEnd/showError.ts @@ -0,0 +1,48 @@ +export let error = document.createElement("td"); +error.setAttribute("class", "invalid"); +class ShowError{ + passPhone(phone:HTMLInputElement){ + let phoneField = phone.parentNode?.parentNode as HTMLTableRowElement; + error.textContent = "Enter the correct Phone Number" + error.style.display = "none"; + phoneField.appendChild(error); + error.style.display = "block"; + + } + passFirst(firstName:HTMLInputElement){ + let nameField = firstName.parentNode?.parentNode as HTMLTableRowElement; + error.textContent = "Enter the correct First Name" + error.style.display = "none"; + nameField.appendChild(error); + error.style.display = "block"; + + } + passMiddle(middleName:HTMLInputElement){ + let nameField = middleName.parentNode?.parentNode as HTMLTableRowElement; + error.textContent = "Enter the correct Middle Name" + error.style.display = "none"; + nameField.appendChild(error); + error.style.display = "block"; + + + } + passLast(lastName:HTMLInputElement){ + let nameField = lastName.parentNode?.parentNode as HTMLTableRowElement; + error.textContent = "Enter the correct Last Name" + error.style.display = "none"; + nameField.appendChild(error); + error.style.display = "block"; + + + } + passEmail(email:HTMLInputElement){ + let emailField = email.parentNode?.parentNode as HTMLTableRowElement; + error.textContent = "Enter the correct Email" + error.style.display = "none"; + emailField.appendChild(error); + error.style.display = "block"; + + + } +} +export let objShowError = new ShowError(); \ No newline at end of file diff --git a/frontEnd/styles.css b/frontEnd/styles.css new file mode 100644 index 0000000..a019cbf --- /dev/null +++ b/frontEnd/styles.css @@ -0,0 +1,30 @@ +.w3-button +{ + text-decoration: greenyellow; + color: rgb(255, 255, 255); + background-color: rgb(0, 140, 255); + stroke-opacity: 50%; + border-radius: 20px; +} +.load-Btn{ + border-collapse: collapse; + margin-left: 50%; + margin-right: 50%; + margin-top: 20%; + color: rgb(255, 255, 255); + background-color: rgb(49, 182, 49); + border-radius: 20px; +} +.refresh{ + margin: auto; + margin-top: 1%; + +} +.w3-table{ + margin-top: 1%; +} +.invalid{ + color: darkred; + font-size: small; + +} \ No newline at end of file diff --git a/frontEnd/tsconfig.json b/frontEnd/tsconfig.json new file mode 100644 index 0000000..897ed5a --- /dev/null +++ b/frontEnd/tsconfig.json @@ -0,0 +1,66 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ESNext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/frontEnd/userView.js b/frontEnd/userView.js new file mode 100644 index 0000000..22c63d5 --- /dev/null +++ b/frontEnd/userView.js @@ -0,0 +1,116 @@ +import { Role } from "./enum.js"; +import { dataFetch } from "./DataFetch.js"; +import { addEvent, removeEvent } from "./ButtonsAction.js"; +import { objValidation } from "./formValidation.js"; +import { error } from "./showError.js"; +import { addUserBtn, objAddUser } from "./addUser.js"; +export class UserTable { + getUsers(users) { + document.getElementById("loadData").style.display = "none"; + document.getElementById("refreshData").style.display = "block"; + document.getElementById("table").style.visibility = "visible"; + addUserBtn.style.display = "block"; + let tableData = document.getElementById("userData"); + for (let i = 0; i < users.length; i++) { + let row = tableData.insertRow(); + row.insertCell().innerHTML = ` ${users[i].firstName}`; + row.insertCell().innerHTML = ` ${users[i].middleName}`; + row.insertCell().innerHTML = ` ${users[i].lastName}`; + row.insertCell().innerHTML = ` ${users[i].email}`; + row.insertCell().innerHTML = ` ${users[i].phone}`; + row.insertCell().innerHTML = ` ${Role[users[i].role]}`; + row.insertCell().innerHTML = ` ${users[i].address}`; + row.insertCell().innerHTML = ``; + row.insertCell().innerHTML = ``; + } + } + async deleteRecord(row) { + let table = document.getElementById("userData"); + let current = objUserTable.currentRow(row); + let deleteUrl = `http://localhost:5000/api/users${current}`; + fetch(deleteUrl) + .catch((error) => { + console.error('Error:', error); + }); + table.deleteRow(current); + } + editRecord(rowElement, rowNumber) { + removeEvent(); + let cloneData = []; + let editButton = document.getElementById("edit" + rowNumber); + editButton.setAttribute("value", "SAVE"); + async function pass() { + await objUserTable.saveRecord({ rowElement, rowNumber, cloneData }); + } + editButton.onclick = pass; + let deleteButton = document.getElementById("delete" + rowNumber); + deleteButton.setAttribute("value", "CANCEL"); + deleteButton.onclick = function () { + objUserTable.cancel(cloneData, rowNumber, roleData); + }; + for (let i = 0; i < 6; i++) { + let selectedElements = document.getElementsByClassName("element" + rowNumber)[i]; + cloneData[i] = selectedElements.textContent; + selectedElements.innerHTML = ``; + } + let roleOption = document.getElementById("role" + rowNumber); + let roleData = roleOption.innerHTML; + roleOption.innerHTML = ``; + } + cancel(cloneData, rowNumber, roleData) { + for (let i = 0; i < 6; i++) { + let selectedElements = document.getElementsByClassName("element" + rowNumber)[i]; + selectedElements.innerHTML = cloneData[i]; + } + let role = document.getElementById("role" + rowNumber); + role.innerHTML = roleData; + let editButton = document.getElementById("edit" + rowNumber); + editButton.setAttribute("value", "EDIT"); + editButton.removeAttribute('click'); + let deleteButton = document.getElementById("delete" + rowNumber); + deleteButton.setAttribute("value", "DELETE"); + error.style.display = "none"; + setTimeout(addEvent, 400); + } + currentRow(rowElement) { + let currentRow = rowElement.parentNode.parentNode.rowIndex - 1; + return currentRow; + } + async saveRecord({ rowElement, rowNumber, cloneData }) { + console.log("does this executes?"); + let result = objValidation.formValidate(rowElement, rowNumber, cloneData); + let selectRole = document.getElementById("drop"); + let roleData = selectRole.value; + let role = document.getElementById("role" + rowNumber); + if (result == undefined) { + objUserTable.sameRecord(rowElement, rowNumber); + return; + } + role.innerHTML = roleData; + error.style.display = "none"; + let saveButton = document.getElementById("edit" + rowNumber); + saveButton.setAttribute("value", "EDIT"); + let deleteButton = document.getElementById("delete" + rowNumber); + deleteButton.setAttribute("value", "DELETE"); + addUserBtn.disabled = false; + setTimeout(addEvent, 400); + } + sameRecord(rowElement, rowNumber) { + let cloneData = []; + let editButton = document.getElementById("edit" + rowNumber); + editButton.setAttribute("value", "SAVE"); + async function pass() { + await objUserTable.saveRecord({ rowElement, rowNumber, cloneData }); + } + editButton.onclick = pass; + } + refreshTable() { + let table = document.getElementById("userData"); + table.innerHTML = ""; + dataFetch(); + removeEvent(); + addEvent(); + } +} +export let objUserTable = new UserTable(); +objAddUser.addUserButton(); diff --git a/frontEnd/userView.ts b/frontEnd/userView.ts new file mode 100644 index 0000000..d2250a2 --- /dev/null +++ b/frontEnd/userView.ts @@ -0,0 +1,132 @@ +import { DataTypeOfUser } from "./interface.js"; +import { Role } from "./enum.js"; +import {dataFetch } from "./DataFetch.js"; +import { addEvent,removeEvent} from "./ButtonsAction.js"; +import { objValidation } from "./formValidation.js"; +import { error } from "./showError.js"; +import { addUserBtn, objAddUser } from "./addUser.js"; + + +export class UserTable{ + getUsers(users:DataTypeOfUser[]){ + document.getElementById("loadData")!.style.display="none"; + document.getElementById("refreshData")!.style.display="block"; + document.getElementById("table")!.style.visibility="visible"; + addUserBtn.style.display="block"; + let tableData: HTMLTableElement = document.getElementById("userData") as HTMLTableElement; + for(let i=0;i ${users[i].firstName}` + row.insertCell().innerHTML = ` ${users[i].middleName}` + row.insertCell().innerHTML = ` ${users[i].lastName}` + row.insertCell().innerHTML = ` ${users[i].email}` + row.insertCell().innerHTML = ` ${users[i].phone}` + row.insertCell().innerHTML = ` ${Role[users[i].role]}` + row.insertCell().innerHTML = ` ${users[i].address}` + row.insertCell().innerHTML = ``; + row.insertCell().innerHTML = ``; + } + + } + async deleteRecord(row:Node){ + + let table :HTMLTableElement= document.getElementById("userData") as HTMLTableElement; + let current:number = objUserTable.currentRow(row); + let deleteUrl = `http://localhost:5000/api/getUsers/${current}`; + fetch(deleteUrl) + .catch((error) => { + console.error('Error:', error);}); + table.deleteRow(current); + + } + + editRecord(rowElement:Node, rowNumber:number){ + removeEvent(); + let cloneData:Array=[]; + let editButton:HTMLButtonElement = document.getElementById("edit"+rowNumber) as HTMLButtonElement; + editButton.setAttribute("value", "SAVE"); + async function pass (){ + await objUserTable.saveRecord({rowElement,rowNumber,cloneData}); + + } + editButton.onclick = pass; + + let deleteButton:HTMLButtonElement = document.getElementById("delete"+rowNumber) as HTMLButtonElement; + deleteButton.setAttribute("value","CANCEL"); + deleteButton.onclick = function(){ + objUserTable.cancel(cloneData,rowNumber,roleData); + } + for(let i=0;i<6;i++) + { + let selectedElements=document.getElementsByClassName("element"+rowNumber)[i]; + cloneData[i]=selectedElements.textContent!; + selectedElements.innerHTML = `` + } + let roleOption:HTMLTableRowElement = document.getElementById("role"+rowNumber) as HTMLTableRowElement; + let roleData=roleOption.innerHTML; + roleOption.innerHTML=`` + } + cancel(cloneData:string[], rowNumber:number,roleData:string){ + for(let i=0;i<6;i++) + { + let selectedElements = document.getElementsByClassName("element"+rowNumber)[i]; + selectedElements.innerHTML = cloneData[i]; + } + let role :HTMLTableRowElement= document.getElementById("role"+rowNumber)as HTMLTableRowElement; + role.innerHTML = roleData; + let editButton :HTMLButtonElement=document.getElementById("edit"+rowNumber) as HTMLButtonElement; + editButton.setAttribute("value", "EDIT"); + editButton.removeAttribute('click') + let deleteButton:HTMLButtonElement=document.getElementById("delete"+rowNumber) as HTMLButtonElement; + deleteButton.setAttribute("value","DELETE"); + error.style.display = "none"; + setTimeout(addEvent,400); + } + currentRow(rowElement:Node){ + let currentRow :number= ((rowElement.parentNode as HTMLTableElement).parentNode as HTMLTableRowElement).rowIndex-1; + return currentRow; + } + async saveRecord({ rowElement,rowNumber, cloneData }: { rowElement:Node;rowNumber: number; cloneData: string[]; }){ + console.log("does this executes?") + let result =objValidation.formValidate(rowElement,rowNumber,cloneData); + let selectRole:HTMLSelectElement = document.getElementById("drop")as HTMLSelectElement; + let roleData = selectRole.value; + let role :HTMLTableRowElement= document.getElementById("role"+rowNumber) as HTMLTableRowElement; + if(result == undefined) + { + objUserTable.sameRecord(rowElement,rowNumber); + return; + } + role.innerHTML = roleData; + error.style.display = "none"; + let saveButton:HTMLButtonElement = document.getElementById("edit"+rowNumber) as HTMLButtonElement; + saveButton.setAttribute("value", "EDIT"); + let deleteButton:HTMLButtonElement=document.getElementById("delete"+rowNumber)as HTMLButtonElement; + deleteButton.setAttribute("value", "DELETE"); + addUserBtn.disabled=false; + setTimeout(addEvent,400); + + } + sameRecord(rowElement:Node,rowNumber:number){ + let cloneData:Array=[]; + let editButton:HTMLButtonElement = document.getElementById("edit"+rowNumber) as HTMLButtonElement; + editButton.setAttribute("value", "SAVE"); + async function pass (){ + await objUserTable.saveRecord({rowElement,rowNumber,cloneData});} + editButton.onclick = pass; + } + + + + refreshTable(){ + let table:HTMLTableElement= document.getElementById("userData") as HTMLTableElement; + table.innerHTML=""; + dataFetch(); + removeEvent(); + addEvent(); + } +} +export let objUserTable = new UserTable(); +objAddUser.addUserButton(); +