diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..c0ee816e --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +DATABASE_HOST=localhost +DATABASE_PORT=5432 +DATABASE_NAME=securing-safe-food +DATABASE_USERNAME=postgres +DATABASE_PASSWORD=PLACEHOLDER_PASSWORD \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6033c03e..0e2cd373 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ Thumbs.db # Environment file *.env *.env.* +!.env.example diff --git a/README.md b/README.md index fa1b09c0..a9f3469e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,30 @@ -# Scaffolding +# Securing Safe Food ✨ **This workspace has been generated by [Nx, a Smart, fast and extensible build system.](https://nx.dev)** ✨ +## Environment Setup + +Install app dependencies by running this at the repo root (`ssf`) + +``` +yarn install +``` + +To setup your backend, follow the backend-specific instructions [here](apps/backend/README.md) + +*Note: you may need to prefix your `nx` commands with `npx`. For example, to serve the frontend, if: +``` +nx serve frontend +``` + +doesn't work, try: + +``` +npx nx serve frontend +``` + ## Start the app To start the development server run `nx serve frontend`. Open your browser and navigate to http://localhost:4200/. Happy coding! diff --git a/apps/backend/README.md b/apps/backend/README.md new file mode 100644 index 00000000..8e4e513c --- /dev/null +++ b/apps/backend/README.md @@ -0,0 +1,28 @@ +## Backend Setup + +This part can be a little tricky! If you run into some confusing errors along the way, don't be afraid to reach out if have any trouble! + +You'll need to download: + +1. [PostgreSQL](https://www.postgresql.org/download/) +2. [PgAdmin 4](https://www.pgadmin.org/download/) (if PostgreSQL didn't come with it) + +Then, set up a database called `securing-safe-food`. If you're not familiar with how to do so, it's easy to do through PgAdmin + +1. Open PgAdmin and configure your credentials (if necessary). Then, right click on the `Databases` dropdown (under `Servers` > `PostgreSQL [version]`) + +![alt text](resources/pg-setup-1.png) + +2. Enter "securing-safe-food" as the database name + +![alt text](resources/pg-setup-2.png) + +Next, create a file called `.env` in the **root directory** (under `ssf/`) and copy over the contents from `.env.example`. Replace `DATABASE_PASSWORD` with the password you entered for the `postgres` user (NOT necessarily your PgAdmin master password!) + +You can check that your database connection details are correct by running `nx serve backend` - if you can see the following line in the terminal, then you've got it right! + +``` +"LOG 🚀 Application is running on: http://localhost:3000/api" +``` + +Finally, run `yarn run typeorm:migrate` to load all the tables into your database. If everything is set up correctly, you should see "Migration ... has been executed successfully." in the terminal. \ No newline at end of file diff --git a/apps/backend/resources/pg-setup-1.png b/apps/backend/resources/pg-setup-1.png new file mode 100644 index 00000000..0d401be4 Binary files /dev/null and b/apps/backend/resources/pg-setup-1.png differ diff --git a/apps/backend/resources/pg-setup-2.png b/apps/backend/resources/pg-setup-2.png new file mode 100644 index 00000000..5c8805fc Binary files /dev/null and b/apps/backend/resources/pg-setup-2.png differ diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 0a6461c8..8fc31d76 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -5,22 +5,20 @@ import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UsersModule } from './users/users.module'; import { AuthModule } from './auth/auth.module'; -import { PluralNamingStrategy } from './strategies/plural-naming.strategy'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import typeorm from './config/typeorm'; @Module({ imports: [ - TypeOrmModule.forRoot({ - type: 'mongodb', - host: '127.0.0.1', - port: 27017, - database: 'c4cOpsTest', - // username: 'root', - // password: 'root', - autoLoadEntities: true, - // entities: [join(__dirname, '**/**.entity.{ts,js}')], - // Setting synchronize: true shouldn't be used in production - otherwise you can lose production data - synchronize: true, - namingStrategy: new PluralNamingStrategy(), + ConfigModule.forRoot({ + isGlobal: true, + load: [typeorm], + }), + // Load TypeORM config async so we can target the config file (config/typeorm.ts) for migrations + TypeOrmModule.forRootAsync({ + inject: [ConfigService], + useFactory: async (configService: ConfigService) => + configService.get('typeorm'), }), UsersModule, AuthModule, diff --git a/apps/backend/src/config/typeorm.ts b/apps/backend/src/config/typeorm.ts new file mode 100644 index 00000000..e75f65b3 --- /dev/null +++ b/apps/backend/src/config/typeorm.ts @@ -0,0 +1,23 @@ +import { registerAs } from '@nestjs/config'; +import { PluralNamingStrategy } from '../strategies/plural-naming.strategy'; +import { DataSource, DataSourceOptions } from 'typeorm'; +import { User1725726359198 } from '../migrations/1725726359198-User'; +import { AddTables1726524792261 } from '../migrations/1726524792261-addTables'; + +const config = { + type: 'postgres', + host: `${process.env.DATABASE_HOST}`, + port: parseInt(`${process.env.DATABASE_PORT}`, 10), + database: `${process.env.DATABASE_NAME}`, + username: `${process.env.DATABASE_USERNAME}`, + password: `${process.env.DATABASE_PASSWORD}`, + autoLoadEntities: true, + synchronize: false, + namingStrategy: new PluralNamingStrategy(), + // Glob patterns (e.g. ../migrations/**.ts) are deprecated, so we have to manually specify each migration + // TODO: see if there's still a way to dynamically load all migrations + migrations: [User1725726359198, AddTables1726524792261], +}; + +export default registerAs('typeorm', () => config); +export const connectionSource = new DataSource(config as DataSourceOptions); diff --git a/apps/backend/src/migrations/1725726359198-User.ts b/apps/backend/src/migrations/1725726359198-User.ts new file mode 100644 index 00000000..6c887ca3 --- /dev/null +++ b/apps/backend/src/migrations/1725726359198-User.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class User1725726359198 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + status VARCHAR(20), + first_name VARCHAR(255), + last_name VARCHAR(255), + email VARCHAR(255) + )`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE IF EXISTS users`); + } +} diff --git a/apps/backend/src/migrations/1726524792261-addTables.ts b/apps/backend/src/migrations/1726524792261-addTables.ts new file mode 100644 index 00000000..df2c7bf0 --- /dev/null +++ b/apps/backend/src/migrations/1726524792261-addTables.ts @@ -0,0 +1,39 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTables1726524792261 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS pantries ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + address VARCHAR(255) NOT NULL, + approved BOOLEAN NOT NULL, + ssf_representative_id INT NOT NULL, + pantry_representative_id INT NOT NULL, + restrictions TEXT[] NOT NULL, + + CONSTRAINT fk_ssf_representative_id FOREIGN KEY(ssf_representative_id) REFERENCES users(id), + CONSTRAINT fk_pantry_representative_id FOREIGN KEY(pantry_representative_id) REFERENCES users(id) + ); + + CREATE TABLE IF NOT EXISTS donations ( + id SERIAL PRIMARY KEY, + restrictions TEXT[] NOT NULL, + due_date TIMESTAMP NOT NULL, + pantry_id INT NOT NULL, + status VARCHAR(50) NOT NULL, + feedback TEXT, + contents TEXT NOT NULL, + + CONSTRAINT fk_pantry_id FOREIGN KEY(pantry_id) REFERENCES pantries(id) + ); + `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP TABLE IF EXISTS pantries; DROP TABLE IF EXISTS donations;`, + ); + } +} diff --git a/apps/backend/src/strategies/plural-naming.strategy.ts b/apps/backend/src/strategies/plural-naming.strategy.ts index bf3a5122..b3b3614d 100644 --- a/apps/backend/src/strategies/plural-naming.strategy.ts +++ b/apps/backend/src/strategies/plural-naming.strategy.ts @@ -1,22 +1,10 @@ -import { DefaultNamingStrategy, NamingStrategyInterface } from 'typeorm'; +import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; -export class PluralNamingStrategy - extends DefaultNamingStrategy - implements NamingStrategyInterface -{ - tableName(targetName: string, userSpecifiedName: string | undefined): string { - return userSpecifiedName || targetName.toLowerCase() + 's'; // Pluralize the table name - } - - columnName( - propertyName: string, - customName: string, - embeddedPrefixes: string[], - ): string { - return propertyName; - } - - relationName(propertyName: string): string { - return propertyName; +// Extend SnakeNamingStrategy to follow Postgres naming conventions +export class PluralNamingStrategy extends SnakeNamingStrategy { + tableName(targetName: string, userSpecifiedName: string): string { + return ( + userSpecifiedName || super.tableName(targetName, userSpecifiedName) + 's' + ); // Pluralize the table name } } diff --git a/apps/backend/src/users/user.entity.ts b/apps/backend/src/users/user.entity.ts index dc537091..52afafc0 100644 --- a/apps/backend/src/users/user.entity.ts +++ b/apps/backend/src/users/user.entity.ts @@ -1,16 +1,17 @@ -import { Entity, Column, ObjectIdColumn, ObjectId } from 'typeorm'; +import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; -import type { Status } from './types'; +import { Status } from './types'; @Entity() export class User { - @ObjectIdColumn() - _id: ObjectId; - - @Column({ primary: true }) + @PrimaryGeneratedColumn() id: number; - @Column() + @Column({ + type: 'varchar', + length: 20, + default: Status.STANDARD, + }) status: Status; @Column() diff --git a/apps/frontend/index.html b/apps/frontend/index.html index 47f54c98..ebde308b 100644 --- a/apps/frontend/index.html +++ b/apps/frontend/index.html @@ -2,7 +2,7 @@ - Frontend + SSF diff --git a/apps/frontend/public/favicon.ico b/apps/frontend/public/favicon.ico index 317ebcb2..c4f6a143 100644 Binary files a/apps/frontend/public/favicon.ico and b/apps/frontend/public/favicon.ico differ diff --git a/apps/frontend/src/app.tsx b/apps/frontend/src/app.tsx index a51df65b..444b5bb2 100644 --- a/apps/frontend/src/app.tsx +++ b/apps/frontend/src/app.tsx @@ -20,6 +20,7 @@ const router = createBrowserRouter([ export const App: React.FC = () => { useEffect(() => { + document.title = 'SSF'; apiClient.getHello().then((res) => console.log(res)); }, []); diff --git a/package.json b/package.json index 3f851e45..67a0cd6e 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,15 @@ "lint": "eslint apps/frontend --ext .ts,.tsx --fix && eslint apps/backend --ext .ts,.tsx --fix", "prepush": "yarn run format:check && yarn run lint:check", "prepush:fix": "yarn run format && yarn run lint", - "prepare": "husky install" + "prepare": "husky install", + "typeorm:migrate": "npx ts-node -r dotenv/config ./node_modules/typeorm/cli.js migration:run -d apps/backend/src/config/typeorm.ts" }, "private": true, "dependencies": { "@aws-sdk/client-cognito-identity-provider": "^3.410.0", "@nestjs/cli": "^10.1.17", "@nestjs/common": "^10.0.2", + "@nestjs/config": "^3.2.3", "@nestjs/core": "^10.0.2", "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^10.0.2", @@ -26,17 +28,20 @@ "axios": "^1.5.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "dotenv": "^16.4.5", "global": "^4.4.0", "jwks-rsa": "^3.1.0", "mongodb": "^6.1.0", "passport": "^0.6.0", "passport-jwt": "^4.0.1", + "pg": "^8.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", - "typeorm": "^0.3.17" + "typeorm": "^0.3.17", + "typeorm-naming-strategies": "^4.1.0" }, "devDependencies": { "@nestjs/schematics": "^10.0.2", @@ -74,6 +79,8 @@ "nx-cloud": "^16.4.0", "prettier": "^2.6.2", "ts-jest": "^29.1.0", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3", "vite": "^4.3.9", "vitest": "^0.32.0" diff --git a/yarn.lock b/yarn.lock index 90853e9d..5f15ca32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2116,6 +2116,15 @@ iterare "1.2.1" tslib "2.6.2" +"@nestjs/config@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-3.2.3.tgz#569888a33ada50b0f182002015e152e054990016" + integrity sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w== + dependencies: + dotenv "16.4.5" + dotenv-expand "10.0.0" + lodash "4.17.21" + "@nestjs/core@^10.0.2": version "10.2.7" resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-10.2.7.tgz#26ca5cc63504b54a08c4cdc6da9300c9b8904fde" @@ -5703,11 +5712,16 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dotenv-expand@~10.0.0: +dotenv-expand@10.0.0, dotenv-expand@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== +dotenv@16.4.5, dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotenv@^16.0.3, dotenv@~16.3.1: version "16.3.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" @@ -9553,6 +9567,62 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.4.tgz#f543862adfa49fa4e14bc8a8892d2a84d754246d" + integrity sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.2.tgz#3a592370b8ae3f02a7c8130d245bc02fa2c5f3f2" + integrity sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg== + +pg-protocol@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.1.tgz#21333e6d83b01faaebfe7a33a7ad6bfd9ed38cb3" + integrity sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + 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" + +pg@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.12.0.tgz#9341724db571022490b657908f65aee8db91df79" + integrity sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ== + dependencies: + pg-connection-string "^2.6.4" + pg-pool "^3.6.2" + pg-protocol "^1.6.1" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -9884,6 +9954,28 @@ postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -10797,6 +10889,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11324,6 +11421,25 @@ ts-node@10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths-webpack-plugin@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz#84008fc3e3e0658fdb0262758b07b4da6265ff1a" @@ -11342,7 +11458,7 @@ tsconfig-paths-webpack-plugin@4.1.0: enhanced-resolve "^5.7.0" tsconfig-paths "^4.1.2" -tsconfig-paths@4.2.0, tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2: +tsconfig-paths@4.2.0, tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== @@ -11474,6 +11590,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typeorm-naming-strategies@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-4.1.0.tgz#1ec6eb296c8d7b69bb06764d5b9083ff80e814a9" + integrity sha512-vPekJXzZOTZrdDvTl1YoM+w+sUIfQHG4kZTpbFYoTsufyv9NIBRe4Q+PdzhEAFA2std3D9LZHEb1EjE9zhRpiQ== + typeorm@^0.3.17: version "0.3.17" resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949"