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]`)
+
+
+
+2. Enter "securing-safe-food" as the database name
+
+
+
+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"