Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
c9b8614f53
|
|||
|
cbf1da31c9
|
|||
|
fd18e56251
|
|||
|
3bb8b202b0
|
|||
|
d1c4744231
|
|||
|
fe90414dd9
|
|||
|
21ceb9fa26
|
@@ -10,12 +10,9 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 19
|
||||
- run: npm i -g pnpm@10.7 && pnpm i
|
||||
- run: pnpm licenses:export
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
- run: bun install --frozen-lockfile
|
||||
- run: bun licenses:export
|
||||
- name: Login to registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
|
||||
282
AGENTS.md
Normal file
282
AGENTS.md
Normal file
@@ -0,0 +1,282 @@
|
||||
# AGENTS.md — LfK Backend
|
||||
|
||||
Guidance for agentic coding agents working in this repository.
|
||||
|
||||
---
|
||||
|
||||
## Project Overview
|
||||
|
||||
Express + [`routing-controllers`](https://github.com/typestack/routing-controllers) REST API written in TypeScript. Uses TypeORM for database access (SQLite in dev/test, PostgreSQL or MySQL in production). OpenAPI docs are auto-generated from decorators at startup.
|
||||
|
||||
**Runtime & Package Manager**: Bun (replaces Node.js + npm/pnpm).
|
||||
|
||||
---
|
||||
|
||||
## Build / Run / Test Commands
|
||||
|
||||
### Development
|
||||
|
||||
```sh
|
||||
bun run dev # Start dev server with auto-reload (uses Bun's --watch)
|
||||
```
|
||||
|
||||
**Auto-reload**: The `dev` script uses Bun's built-in `--watch` flag, which automatically restarts the server when TypeScript files in `src/` change. Bun runs TypeScript directly - no build step needed.
|
||||
|
||||
**Performance**: Bun delivers 8-15% better latency under concurrent load compared to Node.js. See `BUN_BENCHMARK_RESULTS.md` for details.
|
||||
|
||||
### Build
|
||||
|
||||
```sh
|
||||
bun run build # rimraf dist && tsc && copy static assets → dist/
|
||||
```
|
||||
|
||||
**Note**: The build script exists for legacy compatibility and type-checking, but is **not required** for development or production. Bun runs TypeScript source files directly.
|
||||
|
||||
### Production
|
||||
|
||||
```sh
|
||||
bun start # bun src/app.ts (runs TypeScript directly)
|
||||
```
|
||||
|
||||
### Tests
|
||||
|
||||
Tests are **integration tests** that hit a live running server via HTTP. The server must be started before Jest is invoked.
|
||||
|
||||
```sh
|
||||
# Full CI test flow (generates .env, starts server, runs jest):
|
||||
bun run test:ci
|
||||
|
||||
# Run Jest directly (server must already be running):
|
||||
bun test
|
||||
|
||||
# Watch mode:
|
||||
bun run test:watch
|
||||
|
||||
# Run a single test file:
|
||||
bunx jest src/tests/runners/runner_add.spec.ts
|
||||
|
||||
# Run tests matching a name pattern:
|
||||
bunx jest --testNamePattern="POST /api/runners"
|
||||
|
||||
# Run all tests in a subdirectory:
|
||||
bunx jest src/tests/runners/
|
||||
```
|
||||
|
||||
# Run all tests in a subdirectory:
|
||||
bunx jest src/tests/runners/
|
||||
```
|
||||
|
||||
> **Important:** `bun test` alone will fail unless the dev server is already running on `http://localhost:<config.internal_port>`. In CI, `start-server-and-test` handles this automatically via `bun run test:ci`.
|
||||
|
||||
### Other Utilities
|
||||
|
||||
```sh
|
||||
bun run seed # Sync DB schema and run seeders
|
||||
bun run openapi:export # Export OpenAPI spec to file
|
||||
bun run docs # Generate TypeDoc documentation
|
||||
bun run licenses:export # Export third-party license report
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## TypeScript Configuration
|
||||
|
||||
- **Target:** ES2020, **Module:** CommonJS
|
||||
- **`strict: false`** — TypeScript strictness is disabled; types are used but not exhaustively enforced
|
||||
- **`experimentalDecorators: true`** and **`emitDecoratorMetadata: true`** — required by `routing-controllers`, `TypeORM`, and `class-validator`
|
||||
- Spec files (`**/*.spec.ts`) are excluded from compilation
|
||||
- Source root: `src/`, output: `dist/`
|
||||
|
||||
---
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
### No Linter / Formatter Configured
|
||||
|
||||
There is no ESLint or Prettier configuration. Follow the patterns already established in the codebase rather than introducing new tooling.
|
||||
|
||||
### Imports
|
||||
|
||||
- Use named imports for decorator packages: `import { Get, JsonController, Param } from 'routing-controllers'`
|
||||
- Use named imports for TypeORM: `import { Column, Entity, getConnectionManager } from 'typeorm'`
|
||||
- Use named imports for class-validator: `import { IsInt, IsOptional, IsString } from 'class-validator'`
|
||||
- Use `import * as X from 'module'` for modules without clean default exports (e.g., `import * as jwt from 'jsonwebtoken'`)
|
||||
- Use default imports for simple modules (e.g., `import cookie from 'cookie'`)
|
||||
- `reflect-metadata` is imported once at the top of `src/app.ts` — do not re-import it
|
||||
- No barrel/index re-export files; import source files directly by path
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
| Construct | Convention | Example |
|
||||
|---|---|---|
|
||||
| Classes | `PascalCase` | `RunnerController`, `CreateRunner` |
|
||||
| Files | `PascalCase.ts` matching class name | `RunnerController.ts` |
|
||||
| Local variables | `camelCase` (some `snake_case` in tests) | `accessToken`, `access_token` |
|
||||
| DB entity fields | `snake_case` preferred | `created_at`, `updated_at` |
|
||||
| Controller methods | REST-conventional | `getAll`, `getOne`, `post`, `put`, `remove` |
|
||||
| Custom errors | `{Entity}{Issue}Error` | `RunnerNotFoundError`, `RunnerIdsNotMatchingError` |
|
||||
| Response DTOs | `Response{Entity}` | `ResponseRunner`, `ResponseAuth` |
|
||||
| Create DTOs | `Create{Entity}` | `CreateRunner` |
|
||||
| Update DTOs | `Update{Entity}` | `UpdateRunner` |
|
||||
| Enums | `PascalCase` | `ResponseObjectType`, `PermissionAction` |
|
||||
|
||||
### Formatting
|
||||
|
||||
- 4-space indentation (observed throughout the codebase)
|
||||
- Single quotes for string literals in most files
|
||||
- No trailing semicolons style inconsistency — follow what's already in the file you're editing
|
||||
|
||||
### Types
|
||||
|
||||
- Add TypeScript types to all function parameters and return values
|
||||
- Use `class-validator` decorators (`@IsString`, `@IsInt`, `@IsOptional`, `@IsUUID`, etc.) on every DTO and response class field — these drive both runtime validation and OpenAPI schema generation
|
||||
- Use abstract classes for shared entity base types (e.g., `abstract class Participant`)
|
||||
- Use interfaces for response contracts (e.g., `interface IResponse`)
|
||||
- Use enums for typed string/number constants
|
||||
- Avoid `any` where possible; when unavoidable, keep it localised
|
||||
- `strict` is off — but still annotate types explicitly rather than relying on inference
|
||||
|
||||
### Controller Pattern
|
||||
|
||||
```typescript
|
||||
import { Authorized, Body, Delete, Get, JsonController, Param, Post, Put } from 'routing-controllers';
|
||||
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
|
||||
|
||||
@JsonController('/runners')
|
||||
@Authorized()
|
||||
export class RunnerController {
|
||||
@Get('/')
|
||||
@OpenAPI({ description: 'Returns all runners' })
|
||||
@ResponseSchema(ResponseRunner, { isArray: true })
|
||||
async getAll() { ... }
|
||||
|
||||
@Get('/:id')
|
||||
@ResponseSchema(ResponseRunner)
|
||||
async getOne(@Param('id') id: number) { ... }
|
||||
|
||||
@Post('/')
|
||||
@ResponseSchema(ResponseRunner)
|
||||
async post(@Body({ validate: true }) createRunner: CreateRunner) { ... }
|
||||
|
||||
@Put('/:id')
|
||||
@ResponseSchema(ResponseRunner)
|
||||
async put(@Param('id') id: number, @Body({ validate: true }) updateRunner: UpdateRunner) { ... }
|
||||
|
||||
@Delete('/:id')
|
||||
@ResponseSchema(ResponseRunner)
|
||||
async remove(@Param('id') id: number) { ... }
|
||||
}
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
|
||||
- Define custom error classes in `src/errors/` extending `routing-controllers` error types (`NotFoundError`, `NotAcceptableError`, etc.)
|
||||
- Every custom error class must include `@IsString()` decorated `name` and `message` fields for OpenAPI schema generation
|
||||
- Throw custom errors directly in controllers: `throw new RunnerNotFoundError()`
|
||||
- Use try/catch in controllers and re-throw meaningful errors; do not swallow errors silently
|
||||
- The global `ErrorHandler` middleware (registered in `src/middlewares/`) catches all unhandled errors and serialises them as JSON — do not duplicate this logic in controllers
|
||||
- Auth errors are thrown from `src/middlewares/authchecker.ts`, not from individual controllers
|
||||
|
||||
### Entity Pattern (TypeORM)
|
||||
|
||||
- Entities live in `src/models/entities/`
|
||||
- Decorate every entity with `@Entity()` and every column with the appropriate `@Column`, `@PrimaryGeneratedColumn`, etc.
|
||||
- Use `@CreateDateColumn()` / `@UpdateDateColumn()` for timestamp fields
|
||||
- Use table inheritance (`@TableInheritance` + `@ChildEntity`) for polymorphic entities
|
||||
- Access repositories via `getConnectionManager().get().getRepository(EntityClass)` — do not inject repositories as constructor dependencies
|
||||
- Database schema is synchronised automatically on startup (`connection.synchronize()`) — no manual migration files
|
||||
|
||||
### DTO Pattern (Create / Update)
|
||||
|
||||
- Create DTOs in `src/models/actions/create/` and `src/models/actions/update/`
|
||||
- Use `class-validator` decorators for every field
|
||||
- `@IsOptional()` for fields that are not required on update; all fields on create DTOs should be mandatory unless explicitly optional in the API contract
|
||||
- Response DTOs live in `src/models/responses/` and follow the `Response{Entity}` naming pattern
|
||||
|
||||
---
|
||||
|
||||
## Test Style Guidelines
|
||||
|
||||
> **IMPORTANT: Do not run existing tests and do not create new tests.** The existing test suite in `src/tests/` is outdated and no longer reflects the current state of the codebase. Ignore all test files when working in this repository. Do not write new tests for any changes or additions.
|
||||
|
||||
All tests are integration tests in `src/tests/` organised by domain entity:
|
||||
|
||||
```
|
||||
src/tests/
|
||||
auth/
|
||||
auth_login.spec.ts
|
||||
auth_refresh.spec.ts
|
||||
runners/
|
||||
runner_add.spec.ts
|
||||
runner_get.spec.ts
|
||||
runner_update.spec.ts
|
||||
runner_delete.spec.ts
|
||||
...
|
||||
```
|
||||
|
||||
### Test File Template
|
||||
|
||||
```typescript
|
||||
import axios from 'axios';
|
||||
import { config } from '../../config';
|
||||
const base = "http://localhost:" + config.internal_port;
|
||||
|
||||
let access_token: string;
|
||||
let axios_config: object;
|
||||
|
||||
beforeAll(async () => {
|
||||
jest.setTimeout(20000);
|
||||
const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" });
|
||||
access_token = res.data["access_token"];
|
||||
axios_config = {
|
||||
headers: { "authorization": "Bearer " + access_token },
|
||||
validateStatus: undefined // prevents axios from throwing on non-2xx responses
|
||||
};
|
||||
});
|
||||
|
||||
describe('POST /api/runners working', () => {
|
||||
it('creating a runner with required params should return 200', async () => {
|
||||
const res = await axios.post(base + '/api/runners', { ... }, axios_config);
|
||||
expect(res.status).toEqual(200);
|
||||
expect(res.headers['content-type']).toContain("application/json");
|
||||
});
|
||||
});
|
||||
|
||||
describe('POST /api/runners failing', () => {
|
||||
it('creating a runner without required params should return 400', async () => {
|
||||
const res = await axios.post(base + '/api/runners', {}, axios_config);
|
||||
expect(res.status).toEqual(400);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
- Always set `validateStatus: undefined` in `axios_config` to prevent axios throwing on error responses
|
||||
- Group tests by HTTP verb + route in `describe()` blocks; separate "working" and "failing" cases
|
||||
- Use `jest.setTimeout(20000)` in `beforeAll` for slow integration tests
|
||||
- Assert both `res.status` and `res.headers['content-type']` on success paths
|
||||
|
||||
---
|
||||
|
||||
## Environment Configuration
|
||||
|
||||
- Copy `.env.example` to `.env` and fill in values before running locally
|
||||
- Database type is set via `DB_TYPE` env var (`sqlite`, `postgres`, or `mysql`)
|
||||
- Server port is set via `INTERNAL_PORT` (accessed as `config.internal_port` in code)
|
||||
- All config values are validated at startup in `src/config.ts`
|
||||
- CI env is generated by `bun run test:ci:generate_env` (`scripts/create_testenv.ts`)
|
||||
|
||||
### NATS Configuration
|
||||
|
||||
The backend uses **NATS JetStream** as a KV cache for scan intake performance optimization.
|
||||
|
||||
- `NATS_URL` — connection URL for NATS server (default: `nats://localhost:4222`)
|
||||
- `NATS_PREWARM` — if `true`, preloads all runner state into the KV cache at startup to eliminate DB reads from the first scan onward (default: `false`)
|
||||
|
||||
**KV buckets** (auto-created by `NatsClient` at startup):
|
||||
- `station_state` — station token cache (1-hour TTL)
|
||||
- `card_state` — card→runner mapping cache (1-hour TTL)
|
||||
- `runner_state` — runner display name, total distance, latest scan timestamp (no TTL, CAS-based updates)
|
||||
|
||||
**Development**: NATS runs in Docker via `docker-compose.yml` (port 4222). The JetStream volume is persisted to `./nats-data/` to survive container restarts.
|
||||
|
||||
**Station intake hot path**: `POST /api/scans/trackscans` from scan stations uses a KV-first flow that eliminates DB reads on cache hits and prevents race conditions via compare-and-swap (CAS) updates. See `SCAN_NATS_PLAN.md` for full architecture details.
|
||||
17
CHANGELOG.md
17
CHANGELOG.md
@@ -2,9 +2,26 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||
|
||||
#### [1.7.2](https://git.odit.services/lfk/backend/compare/1.7.1...1.7.2)
|
||||
|
||||
- fix(dev): We did it funky bun dev workarounds are no more [`3bb8b20`](https://git.odit.services/lfk/backend/commit/3bb8b202b00f8b7c52c700373ed09a92714528be)
|
||||
- docs: Added agents file to support ai assisted coding [`cbf1da3`](https://git.odit.services/lfk/backend/commit/cbf1da31c9f02a810d8c85caae60ab9483f826c2)
|
||||
- refactor(dev): Yeet the funky dev script out of this codebase [`fd18e56`](https://git.odit.services/lfk/backend/commit/fd18e562518f5b3437f11ceb68e69e50f042891e)
|
||||
|
||||
#### [1.7.1](https://git.odit.services/lfk/backend/compare/1.7.0...1.7.1)
|
||||
|
||||
> 20 February 2026
|
||||
|
||||
- fix(ci): Switch to bun in ci [`fe90414`](https://git.odit.services/lfk/backend/commit/fe90414dd910baff8107197408575b6af0cc4cbf)
|
||||
- perf(db): Added indexes [`21ceb9f`](https://git.odit.services/lfk/backend/commit/21ceb9fa265df2f2193a6c4fb58080ead9c72bf8)
|
||||
- chore(release): 1.7.1 [`d1c4744`](https://git.odit.services/lfk/backend/commit/d1c47442314508a95bfa66b83740c957b75f152a)
|
||||
|
||||
#### [1.7.0](https://git.odit.services/lfk/backend/compare/1.6.0...1.7.0)
|
||||
|
||||
> 20 February 2026
|
||||
|
||||
- refactor: Bun by default [`240bd9c`](https://git.odit.services/lfk/backend/commit/240bd9cba10636bfc100ea2732508d805639f105)
|
||||
- chore(release): 1.7.0 [`5081819`](https://git.odit.services/lfk/backend/commit/5081819281eacd6beb8d4876f0a9df71c901e84e)
|
||||
|
||||
#### [1.6.0](https://git.odit.services/lfk/backend/compare/1.5.2...1.6.0)
|
||||
|
||||
|
||||
589
PERFORMANCE_IDEAS.md
Normal file
589
PERFORMANCE_IDEAS.md
Normal file
@@ -0,0 +1,589 @@
|
||||
# Performance Optimization Ideas for LfK Backend
|
||||
|
||||
This document outlines potential performance improvements for the LfK backend API, organized by impact and complexity.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Already Implemented
|
||||
|
||||
### 1. Bun Runtime Migration
|
||||
**Status**: Complete
|
||||
**Impact**: 8-15% latency improvement
|
||||
**Details**: Migrated from Node.js to Bun runtime, achieving:
|
||||
- Parallel throughput: +8.3% (306 → 331 scans/sec)
|
||||
- Parallel p50 latency: -9.5% (21ms → 19ms)
|
||||
|
||||
### 2. NATS KV Cache for Scan Intake
|
||||
**Status**: Complete (based on code analysis)
|
||||
**Impact**: Significant reduction in DB reads for hot path
|
||||
**Details**: `ScanController.stationIntake()` uses NATS JetStream KV store to cache:
|
||||
- Station tokens (1-hour TTL)
|
||||
- Card→Runner mappings (1-hour TTL)
|
||||
- Runner state (no TTL, CAS-based updates)
|
||||
- Eliminates DB reads on cache hits
|
||||
- Prevents race conditions via compare-and-swap (CAS)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 High Impact, Low-Medium Complexity
|
||||
|
||||
### 3. Add Database Indexes
|
||||
**Priority**: HIGH
|
||||
**Complexity**: Low
|
||||
**Estimated Impact**: 30-70% query time reduction
|
||||
|
||||
**Problem**: TypeORM synchronize() doesn't automatically create indexes on foreign keys or commonly queried fields.
|
||||
|
||||
**Observations**:
|
||||
- Heavy use of `find()` with complex nested relations (e.g., `['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track']`)
|
||||
- No explicit `@Index()` decorators found in entity files
|
||||
- Frequent filtering by foreign keys (runner_id, track_id, station_id, card_id)
|
||||
|
||||
**Recommended Indexes**:
|
||||
|
||||
```typescript
|
||||
// src/models/entities/Scan.ts
|
||||
@Index(['runner', 'timestamp']) // For runner scan history queries
|
||||
@Index(['station', 'timestamp']) // For station-based queries
|
||||
@Index(['card']) // For card lookup
|
||||
|
||||
// src/models/entities/Runner.ts
|
||||
@Index(['email']) // For authentication/lookup
|
||||
@Index(['group']) // For group-based queries
|
||||
|
||||
// src/models/entities/RunnerCard.ts
|
||||
@Index(['runner']) // For card→runner lookups
|
||||
@Index(['code']) // For barcode scans
|
||||
|
||||
// src/models/entities/Donation.ts
|
||||
@Index(['runner']) // For runner donations
|
||||
@Index(['donor']) // For donor contributions
|
||||
```
|
||||
|
||||
**Implementation Steps**:
|
||||
1. Audit all entities and add `@Index()` decorators
|
||||
2. Test query performance with `EXPLAIN` before/after
|
||||
3. Monitor index usage with database tools
|
||||
4. Consider composite indexes for frequently combined filters
|
||||
|
||||
**Expected Results**:
|
||||
- 50-70% faster JOIN operations
|
||||
- 30-50% faster foreign key lookups
|
||||
- Reduced database CPU usage
|
||||
|
||||
---
|
||||
|
||||
### 4. Implement Query Result Caching
|
||||
**Priority**: HIGH
|
||||
**Complexity**: Medium
|
||||
**Estimated Impact**: 50-90% latency reduction for repeated queries
|
||||
|
||||
**Problem**: Stats endpoints and frequently accessed data (org totals, team rankings, runner lists) are recalculated on every request.
|
||||
|
||||
**Observations**:
|
||||
- `StatsController` methods load entire datasets with deep relations:
|
||||
- `getRunnerStats()`: loads all runners with scans, groups, donations
|
||||
- `getTeamStats()`: loads all teams with nested runner data
|
||||
- `getOrgStats()`: loads all orgs with teams, runners, scans
|
||||
- Many `find()` calls without any caching layer
|
||||
- Data changes infrequently (only during scan intake)
|
||||
|
||||
**Solution Options**:
|
||||
|
||||
**Option A: NATS KV Cache (Recommended)**
|
||||
```typescript
|
||||
// src/nats/StatsKV.ts
|
||||
export async function getOrgStatsCache(): Promise<ResponseOrgStats[] | null> {
|
||||
const kv = await NatsClient.getKV('stats_cache', { ttl: 60 * 1000 }); // 60s TTL
|
||||
const entry = await kv.get('org_stats');
|
||||
return entry ? JSON.parse(entry.string()) : null;
|
||||
}
|
||||
|
||||
export async function setOrgStatsCache(stats: ResponseOrgStats[]): Promise<void> {
|
||||
const kv = await NatsClient.getKV('stats_cache', { ttl: 60 * 1000 });
|
||||
await kv.put('org_stats', JSON.stringify(stats));
|
||||
}
|
||||
|
||||
// Invalidate on scan creation
|
||||
// src/controllers/ScanController.ts (after line 173)
|
||||
await invalidateStatsCache(); // Clear stats on new scan
|
||||
```
|
||||
|
||||
**Option B: In-Memory Cache with TTL**
|
||||
```typescript
|
||||
// src/cache/MemoryCache.ts
|
||||
import NodeCache from 'node-cache';
|
||||
|
||||
const cache = new NodeCache({ stdTTL: 60 }); // 60s TTL
|
||||
|
||||
export function getCached<T>(key: string): T | undefined {
|
||||
return cache.get<T>(key);
|
||||
}
|
||||
|
||||
export function setCached<T>(key: string, value: T, ttl?: number): void {
|
||||
cache.set(key, value, ttl);
|
||||
}
|
||||
|
||||
export function invalidatePattern(pattern: string): void {
|
||||
const keys = cache.keys().filter(k => k.includes(pattern));
|
||||
cache.del(keys);
|
||||
}
|
||||
```
|
||||
|
||||
**Option C: Redis Cache** (if Redis is already in stack)
|
||||
|
||||
**Recommended Cache Strategy**:
|
||||
- **TTL**: 30-60 seconds for stats endpoints
|
||||
- **Invalidation**: On scan creation, runner updates, donation changes
|
||||
- **Keys**: `stats:org`, `stats:team:${id}`, `stats:runner:${id}`
|
||||
- **Warm on startup**: Pre-populate cache for critical endpoints
|
||||
|
||||
**Expected Results**:
|
||||
- 80-90% latency reduction for stats endpoints (from ~500ms to ~50ms)
|
||||
- 70-80% reduction in database load
|
||||
- Improved user experience for dashboards and leaderboards
|
||||
|
||||
---
|
||||
|
||||
### 5. Lazy Load Relations & DTOs
|
||||
**Priority**: HIGH
|
||||
**Complexity**: Medium
|
||||
**Estimated Impact**: 40-60% query time reduction
|
||||
|
||||
**Problem**: Many queries eagerly load deeply nested relations that aren't always needed.
|
||||
|
||||
**Observations**:
|
||||
```typescript
|
||||
// Current: Loads everything
|
||||
scan = await this.scanRepository.findOne(
|
||||
{ id: scan.id },
|
||||
{ relations: ['runner', 'track', 'runner.scans', 'runner.group',
|
||||
'runner.scans.track', 'card', 'station'] }
|
||||
);
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
|
||||
**A. Create Lightweight Response DTOs**
|
||||
```typescript
|
||||
// src/models/responses/ResponseScanLight.ts
|
||||
export class ResponseScanLight {
|
||||
@IsInt() id: number;
|
||||
@IsInt() distance: number;
|
||||
@IsInt() timestamp: number;
|
||||
@IsBoolean() valid: boolean;
|
||||
// Omit nested runner.scans, runner.group, etc.
|
||||
}
|
||||
|
||||
// Use for list views
|
||||
@Get()
|
||||
@ResponseSchema(ResponseScanLight, { isArray: true })
|
||||
async getAll() {
|
||||
const scans = await this.scanRepository.find({
|
||||
relations: ['runner', 'track'] // Minimal relations
|
||||
});
|
||||
return scans.map(s => new ResponseScanLight(s));
|
||||
}
|
||||
|
||||
// Keep detailed DTO for single-item views
|
||||
@Get('/:id')
|
||||
@ResponseSchema(ResponseScan) // Full details
|
||||
async getOne(@Param('id') id: number) { ... }
|
||||
```
|
||||
|
||||
**B. Use Query Builder for Selective Loading**
|
||||
```typescript
|
||||
// Instead of loading all scans with runner relations:
|
||||
const scans = await this.scanRepository
|
||||
.createQueryBuilder('scan')
|
||||
.leftJoinAndSelect('scan.runner', 'runner')
|
||||
.leftJoinAndSelect('scan.track', 'track')
|
||||
.select([
|
||||
'scan.id', 'scan.distance', 'scan.timestamp', 'scan.valid',
|
||||
'runner.id', 'runner.firstname', 'runner.lastname',
|
||||
'track.id', 'track.name'
|
||||
])
|
||||
.where('scan.id = :id', { id })
|
||||
.getOne();
|
||||
```
|
||||
|
||||
**C. Implement GraphQL-style Field Selection**
|
||||
```typescript
|
||||
@Get()
|
||||
async getAll(@QueryParam('fields') fields?: string) {
|
||||
const relations = [];
|
||||
if (fields?.includes('runner')) relations.push('runner');
|
||||
if (fields?.includes('track')) relations.push('track');
|
||||
return this.scanRepository.find({ relations });
|
||||
}
|
||||
```
|
||||
|
||||
**Expected Results**:
|
||||
- 40-60% faster list queries
|
||||
- 50-70% reduction in data transfer size
|
||||
- Reduced JOIN complexity and memory usage
|
||||
|
||||
---
|
||||
|
||||
### 6. Pagination Optimization
|
||||
**Priority**: MEDIUM
|
||||
**Complexity**: Low
|
||||
**Estimated Impact**: 20-40% improvement for large result sets
|
||||
|
||||
**Problem**: Current pagination uses `skip/take` which becomes slow with large offsets.
|
||||
|
||||
**Current Implementation**:
|
||||
```typescript
|
||||
// Inefficient for large page numbers (e.g., page=1000)
|
||||
scans = await this.scanRepository.find({
|
||||
skip: page * page_size, // Scans 100,000 rows to skip them
|
||||
take: page_size
|
||||
});
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
|
||||
**A. Cursor-Based Pagination (Recommended)**
|
||||
```typescript
|
||||
@Get()
|
||||
async getAll(
|
||||
@QueryParam('cursor') cursor?: number, // Last ID from previous page
|
||||
@QueryParam('page_size') page_size: number = 100
|
||||
) {
|
||||
const query = this.scanRepository.createQueryBuilder('scan')
|
||||
.orderBy('scan.id', 'ASC')
|
||||
.take(page_size + 1); // Get 1 extra to determine if more pages exist
|
||||
|
||||
if (cursor) {
|
||||
query.where('scan.id > :cursor', { cursor });
|
||||
}
|
||||
|
||||
const scans = await query.getMany();
|
||||
const hasMore = scans.length > page_size;
|
||||
const results = scans.slice(0, page_size);
|
||||
const nextCursor = hasMore ? results[results.length - 1].id : null;
|
||||
|
||||
return {
|
||||
data: results.map(s => s.toResponse()),
|
||||
pagination: { nextCursor, hasMore }
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
**B. Add Total Count Caching**
|
||||
```typescript
|
||||
// Cache total counts to avoid expensive COUNT(*) queries
|
||||
const totalCache = new Map<string, { count: number, expires: number }>();
|
||||
|
||||
async function getTotalCount(repo: Repository<any>): Promise<number> {
|
||||
const cacheKey = repo.metadata.tableName;
|
||||
const cached = totalCache.get(cacheKey);
|
||||
|
||||
if (cached && cached.expires > Date.now()) {
|
||||
return cached.count;
|
||||
}
|
||||
|
||||
const count = await repo.count();
|
||||
totalCache.set(cacheKey, { count, expires: Date.now() + 60000 }); // 60s TTL
|
||||
return count;
|
||||
}
|
||||
```
|
||||
|
||||
**Expected Results**:
|
||||
- 60-80% faster pagination for large page numbers
|
||||
- Consistent query performance regardless of offset
|
||||
- Better mobile app experience with cursor-based loading
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Medium Impact, Medium Complexity
|
||||
|
||||
### 7. Database Connection Pooling Optimization
|
||||
**Priority**: MEDIUM
|
||||
**Complexity**: Medium
|
||||
**Estimated Impact**: 10-20% improvement under load
|
||||
|
||||
**Current**: Default TypeORM connection pooling (likely 10 connections)
|
||||
|
||||
**Recommendations**:
|
||||
```typescript
|
||||
// ormconfig.js
|
||||
module.exports = {
|
||||
// ... existing config
|
||||
extra: {
|
||||
// PostgreSQL specific
|
||||
max: 20, // Max pool size (adjust based on load)
|
||||
min: 5, // Min pool size
|
||||
idleTimeoutMillis: 30000, // Close idle connections after 30s
|
||||
connectionTimeoutMillis: 2000,
|
||||
|
||||
// MySQL specific
|
||||
connectionLimit: 20,
|
||||
waitForConnections: true,
|
||||
queueLimit: 0
|
||||
},
|
||||
|
||||
// Enable query logging in dev to identify slow queries
|
||||
logging: process.env.NODE_ENV !== 'production' ? ['query', 'error'] : ['error'],
|
||||
maxQueryExecutionTime: 1000, // Log queries taking >1s
|
||||
};
|
||||
```
|
||||
|
||||
**Monitor**:
|
||||
- Connection pool exhaustion
|
||||
- Query execution times
|
||||
- Active connection count
|
||||
|
||||
---
|
||||
|
||||
### 8. Bulk Operations for Import
|
||||
**Priority**: MEDIUM
|
||||
**Complexity**: Medium
|
||||
**Estimated Impact**: 50-80% faster imports
|
||||
|
||||
**Problem**: Import endpoints likely save entities one-by-one in loops.
|
||||
|
||||
**Solution**:
|
||||
```typescript
|
||||
// Instead of:
|
||||
for (const runnerData of importData) {
|
||||
const runner = await createRunner.toEntity();
|
||||
await this.runnerRepository.save(runner); // N queries
|
||||
}
|
||||
|
||||
// Use bulk insert:
|
||||
const runners = await Promise.all(
|
||||
importData.map(data => createRunner.toEntity())
|
||||
);
|
||||
await this.runnerRepository.save(runners); // 1 query
|
||||
|
||||
// Or use raw query for massive imports:
|
||||
await getConnection()
|
||||
.createQueryBuilder()
|
||||
.insert()
|
||||
.into(Runner)
|
||||
.values(runners)
|
||||
.execute();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. Response Compression
|
||||
**Priority**: MEDIUM
|
||||
**Complexity**: Low
|
||||
**Estimated Impact**: 60-80% reduction in response size
|
||||
|
||||
**Implementation**:
|
||||
```typescript
|
||||
// src/app.ts
|
||||
import compression from 'compression';
|
||||
|
||||
const app = createExpressServer({ ... });
|
||||
app.use(compression({
|
||||
level: 6, // Compression level (1-9)
|
||||
threshold: 1024, // Only compress responses >1KB
|
||||
filter: (req, res) => {
|
||||
if (req.headers['x-no-compression']) return false;
|
||||
return compression.filter(req, res);
|
||||
}
|
||||
}));
|
||||
```
|
||||
|
||||
**Benefits**:
|
||||
- 70-80% smaller JSON responses
|
||||
- Faster transfer times on slow networks
|
||||
- Reduced bandwidth costs
|
||||
|
||||
**Dependencies**: `bun add compression @types/compression`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Lower Priority / High Complexity
|
||||
|
||||
### 10. Implement Read Replicas
|
||||
**Priority**: LOW (requires infrastructure)
|
||||
**Complexity**: High
|
||||
**Estimated Impact**: 30-50% read query improvement
|
||||
|
||||
**When to Consider**:
|
||||
- Database CPU consistently >70%
|
||||
- Read-heavy workload (already true for stats endpoints)
|
||||
- Running PostgreSQL/MySQL in production
|
||||
|
||||
**Implementation**:
|
||||
```typescript
|
||||
// ormconfig.js
|
||||
module.exports = {
|
||||
type: 'postgres',
|
||||
replication: {
|
||||
master: {
|
||||
host: process.env.DB_WRITE_HOST,
|
||||
port: 5432,
|
||||
username: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME,
|
||||
},
|
||||
slaves: [
|
||||
{
|
||||
host: process.env.DB_READ_REPLICA_1,
|
||||
port: 5432,
|
||||
username: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME,
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 11. Move to Serverless/Edge Functions
|
||||
**Priority**: LOW (architectural change)
|
||||
**Complexity**: Very High
|
||||
**Estimated Impact**: Variable (depends on workload)
|
||||
|
||||
**Considerations**:
|
||||
- Good for: Infrequent workloads, global distribution
|
||||
- Bad for: High-frequency scan intake (cold starts)
|
||||
- May conflict with TypeORM's connection model
|
||||
|
||||
---
|
||||
|
||||
### 12. GraphQL API Layer
|
||||
**Priority**: LOW (major refactor)
|
||||
**Complexity**: Very High
|
||||
**Estimated Impact**: 30-50% for complex queries
|
||||
|
||||
**Benefits**:
|
||||
- Clients request only needed fields
|
||||
- Single request for complex nested data
|
||||
- Better mobile app performance
|
||||
|
||||
**Trade-offs**:
|
||||
- Complete rewrite of controller layer
|
||||
- Learning curve for frontend teams
|
||||
- More complex caching strategy
|
||||
|
||||
---
|
||||
|
||||
## 📊 Recommended Implementation Order
|
||||
|
||||
**Phase 1: Quick Wins** (1-2 weeks)
|
||||
1. Add database indexes → Controllers still work, immediate improvement
|
||||
2. Enable response compression → One-line change in `app.ts`
|
||||
3. Implement cursor-based pagination → Better mobile UX
|
||||
|
||||
**Phase 2: Caching Layer** (2-3 weeks)
|
||||
4. Add NATS KV cache for stats endpoints
|
||||
5. Create lightweight response DTOs for list views
|
||||
6. Cache total counts for pagination
|
||||
|
||||
**Phase 3: Query Optimization** (2-3 weeks)
|
||||
7. Refactor controllers to use query builder with selective loading
|
||||
8. Optimize database connection pooling
|
||||
9. Implement bulk operations for imports
|
||||
|
||||
**Phase 4: Infrastructure** (ongoing)
|
||||
10. Monitor query performance and add more indexes as needed
|
||||
11. Consider read replicas when database becomes bottleneck
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Performance Monitoring Recommendations
|
||||
|
||||
### Add Metrics Endpoint
|
||||
```typescript
|
||||
// src/controllers/MetricsController.ts
|
||||
import { performance } from 'perf_hooks';
|
||||
|
||||
const requestMetrics = {
|
||||
totalRequests: 0,
|
||||
avgLatency: 0,
|
||||
p95Latency: 0,
|
||||
dbQueryCount: 0,
|
||||
cacheHitRate: 0,
|
||||
};
|
||||
|
||||
@JsonController('/metrics')
|
||||
export class MetricsController {
|
||||
@Get()
|
||||
@Authorized('ADMIN') // Restrict to admins
|
||||
async getMetrics() {
|
||||
return requestMetrics;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Enable Query Logging
|
||||
```typescript
|
||||
// ormconfig.js
|
||||
logging: ['query', 'error'],
|
||||
maxQueryExecutionTime: 1000, // Warn on queries >1s
|
||||
```
|
||||
|
||||
### Add Request Timing Middleware
|
||||
```typescript
|
||||
// src/middlewares/TimingMiddleware.ts
|
||||
export function timingMiddleware(req: Request, res: Response, next: NextFunction) {
|
||||
const start = performance.now();
|
||||
|
||||
res.on('finish', () => {
|
||||
const duration = performance.now() - start;
|
||||
if (duration > 1000) {
|
||||
consola.warn(`Slow request: ${req.method} ${req.path} took ${duration}ms`);
|
||||
}
|
||||
});
|
||||
|
||||
next();
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Performance Testing Commands
|
||||
|
||||
```bash
|
||||
# Run baseline benchmark
|
||||
bun run benchmark > baseline.txt
|
||||
|
||||
# After implementing changes, compare
|
||||
bun run benchmark > optimized.txt
|
||||
diff baseline.txt optimized.txt
|
||||
|
||||
# Load testing with artillery (if added)
|
||||
artillery quick --count 100 --num 10 http://localhost:4010/api/runners
|
||||
|
||||
# Database query profiling (PostgreSQL)
|
||||
EXPLAIN ANALYZE SELECT * FROM scan WHERE runner_id = 1;
|
||||
|
||||
# Check database indexes
|
||||
SELECT * FROM pg_indexes WHERE tablename = 'scan';
|
||||
|
||||
# Monitor NATS cache hit rate
|
||||
# (Add custom logging in NATS KV functions)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎓 Key Principles
|
||||
|
||||
1. **Measure first**: Always benchmark before and after changes
|
||||
2. **Start with indexes**: Biggest impact, lowest risk
|
||||
3. **Cache strategically**: Stats endpoints benefit most
|
||||
4. **Lazy load by default**: Only eager load when absolutely needed
|
||||
5. **Monitor in production**: Use APM tools (New Relic, DataDog, etc.)
|
||||
|
||||
---
|
||||
|
||||
## 📚 Additional Resources
|
||||
|
||||
- [TypeORM Performance Tips](https://typeorm.io/performance)
|
||||
- [PostgreSQL Index Best Practices](https://www.postgresql.org/docs/current/indexes.html)
|
||||
- [Bun Performance Benchmarks](https://bun.sh/docs/runtime/performance)
|
||||
- [NATS JetStream KV Guide](https://docs.nats.io/nats-concepts/jetstream/key-value-store)
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2026-02-20
|
||||
**Status**: Ready for review and prioritization
|
||||
283
bun.lock
283
bun.lock
@@ -19,6 +19,7 @@
|
||||
"csvtojson": "2.0.10",
|
||||
"dotenv": "8.2.0",
|
||||
"express": "4.17.1",
|
||||
"glob": "^13.0.6",
|
||||
"jsonwebtoken": "8.5.1",
|
||||
"libphonenumber-js": "1.9.9",
|
||||
"mysql": "2.18.1",
|
||||
@@ -46,12 +47,10 @@
|
||||
"auto-changelog": "2.4.0",
|
||||
"cp-cli": "2.0.0",
|
||||
"jest": "26.6.3",
|
||||
"nodemon": "2.0.7",
|
||||
"release-it": "14.2.2",
|
||||
"rimraf": "3.0.2",
|
||||
"start-server-and-test": "1.11.7",
|
||||
"ts-jest": "26.5.0",
|
||||
"ts-node": "10.9.2",
|
||||
"typedoc": "0.20.19",
|
||||
"typescript": "5.9.3",
|
||||
},
|
||||
@@ -452,8 +451,6 @@
|
||||
|
||||
"bignumber.js": ["bignumber.js@9.0.0", "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz", {}, "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="],
|
||||
|
||||
"binary-extensions": ["binary-extensions@2.1.0", "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz", {}, "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="],
|
||||
|
||||
"bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="],
|
||||
|
||||
"bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="],
|
||||
@@ -514,8 +511,6 @@
|
||||
|
||||
"check-password-strength": ["check-password-strength@2.0.2", "", {}, "sha512-Dh1h1XZkRBbkKdoZip18xdFjuBU0v2SYvF1l/ZkqMTkwB4j3OiDLMTv1o63K2UI3wTnPLQPTTkGWwpLab60muA=="],
|
||||
|
||||
"chokidar": ["chokidar@3.4.3", "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz", { "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.5.0" } }, "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ=="],
|
||||
|
||||
"chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
|
||||
|
||||
"ci-info": ["ci-info@2.0.0", "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="],
|
||||
@@ -622,7 +617,7 @@
|
||||
|
||||
"data-urls": ["data-urls@2.0.0", "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz", { "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0" } }, "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ=="],
|
||||
|
||||
"debug": ["debug@3.2.7", "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
|
||||
"debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"decamelize": ["decamelize@1.2.0", "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz", {}, "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="],
|
||||
|
||||
@@ -822,7 +817,7 @@
|
||||
|
||||
"github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="],
|
||||
|
||||
"glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
"glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="],
|
||||
|
||||
"glob-parent": ["glob-parent@5.1.1", "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ=="],
|
||||
|
||||
@@ -848,7 +843,7 @@
|
||||
|
||||
"has-ansi": ["has-ansi@2.0.0", "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE="],
|
||||
|
||||
"has-flag": ["has-flag@3.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", {}, "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="],
|
||||
"has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"has-unicode": ["has-unicode@2.0.1", "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz", {}, "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="],
|
||||
|
||||
@@ -890,8 +885,6 @@
|
||||
|
||||
"ignore": ["ignore@5.1.8", "", {}, "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="],
|
||||
|
||||
"ignore-by-default": ["ignore-by-default@1.0.1", "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", {}, "sha1-SMptcvbGo68Aqa1K5odr44ieKwk="],
|
||||
|
||||
"import-cwd": ["import-cwd@3.0.0", "", { "dependencies": { "import-from": "^3.0.0" } }, "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg=="],
|
||||
|
||||
"import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="],
|
||||
@@ -932,8 +925,6 @@
|
||||
|
||||
"is-arrayish": ["is-arrayish@0.2.1", "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz", {}, "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="],
|
||||
|
||||
"is-binary-path": ["is-binary-path@2.1.0", "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
|
||||
|
||||
"is-buffer": ["is-buffer@1.1.6", "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="],
|
||||
|
||||
"is-ci": ["is-ci@2.0.0", "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz", { "dependencies": { "ci-info": "^2.0.0" }, "bin": "bin.js" }, "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="],
|
||||
@@ -964,7 +955,7 @@
|
||||
|
||||
"is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="],
|
||||
|
||||
"is-npm": ["is-npm@4.0.0", "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz", {}, "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig=="],
|
||||
"is-npm": ["is-npm@5.0.0", "", {}, "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
@@ -1156,7 +1147,7 @@
|
||||
|
||||
"lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="],
|
||||
|
||||
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
|
||||
"lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
|
||||
|
||||
"lunr": ["lunr@2.3.9", "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="],
|
||||
|
||||
@@ -1208,7 +1199,7 @@
|
||||
|
||||
"minimist": ["minimist@1.2.5", "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz", {}, "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="],
|
||||
|
||||
"minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
|
||||
"minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
|
||||
|
||||
"minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="],
|
||||
|
||||
@@ -1268,9 +1259,7 @@
|
||||
|
||||
"node-notifier": ["node-notifier@8.0.1", "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz", { "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.2.0", "semver": "^7.3.2", "shellwords": "^0.1.1", "uuid": "^8.3.0", "which": "^2.0.2" } }, "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA=="],
|
||||
|
||||
"nodemon": ["nodemon@2.0.7", "", { "dependencies": { "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.3", "update-notifier": "^4.1.0" }, "bin": { "nodemon": "bin/nodemon.js" } }, "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA=="],
|
||||
|
||||
"nopt": ["nopt@1.0.10", "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz", { "dependencies": { "abbrev": "1" }, "bin": "bin/nopt.js" }, "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4="],
|
||||
"nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="],
|
||||
|
||||
"normalize-package-data": ["normalize-package-data@2.5.0", "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="],
|
||||
|
||||
@@ -1370,6 +1359,8 @@
|
||||
|
||||
"path-parse": ["path-parse@1.0.6", "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz", {}, "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="],
|
||||
|
||||
"path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
|
||||
|
||||
"path-to-regexp": ["path-to-regexp@0.1.7", "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", {}, "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="],
|
||||
|
||||
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
|
||||
@@ -1436,8 +1427,6 @@
|
||||
|
||||
"psl": ["psl@1.8.0", "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz", {}, "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="],
|
||||
|
||||
"pstree.remy": ["pstree.remy@1.1.8", "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz", {}, "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="],
|
||||
|
||||
"pump": ["pump@3.0.0", "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="],
|
||||
|
||||
"punycode": ["punycode@2.1.1", "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz", {}, "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="],
|
||||
@@ -1466,8 +1455,6 @@
|
||||
|
||||
"readable-stream": ["readable-stream@2.3.7", "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw=="],
|
||||
|
||||
"readdirp": ["readdirp@3.5.0", "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ=="],
|
||||
|
||||
"rechoir": ["rechoir@0.6.2", "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz", { "dependencies": { "resolve": "^1.1.6" } }, "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q="],
|
||||
|
||||
"reflect-metadata": ["reflect-metadata@0.1.13", "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz", {}, "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="],
|
||||
@@ -1660,7 +1647,7 @@
|
||||
|
||||
"strip-json-comments": ["strip-json-comments@2.0.1", "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", {}, "sha1-PFMZQukIwml8DsNEhYwobHygpgo="],
|
||||
|
||||
"supports-color": ["supports-color@5.5.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
|
||||
"supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"supports-hyperlinks": ["supports-hyperlinks@2.1.0", "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA=="],
|
||||
|
||||
@@ -1704,8 +1691,6 @@
|
||||
|
||||
"toidentifier": ["toidentifier@1.0.0", "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz", {}, "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="],
|
||||
|
||||
"touch": ["touch@3.1.0", "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz", { "dependencies": { "nopt": "~1.0.10" }, "bin": { "nodetouch": "bin/nodetouch.js" } }, "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA=="],
|
||||
|
||||
"tough-cookie": ["tough-cookie@3.0.1", "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz", { "dependencies": { "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg=="],
|
||||
|
||||
"tr46": ["tr46@2.0.2", "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg=="],
|
||||
@@ -1750,8 +1735,6 @@
|
||||
|
||||
"uid-safe": ["uid-safe@2.1.5", "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz", { "dependencies": { "random-bytes": "~1.0.0" } }, "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA=="],
|
||||
|
||||
"undefsafe": ["undefsafe@2.0.3", "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz", { "dependencies": { "debug": "^2.2.0" } }, "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A=="],
|
||||
|
||||
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
||||
|
||||
"union-value": ["union-value@1.0.1", "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz", { "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="],
|
||||
@@ -1770,7 +1753,7 @@
|
||||
|
||||
"unset-value": ["unset-value@1.0.0", "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz", { "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" } }, "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk="],
|
||||
|
||||
"update-notifier": ["update-notifier@4.1.3", "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz", { "dependencies": { "boxen": "^4.2.0", "chalk": "^3.0.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.3.1", "is-npm": "^4.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.0.0", "pupa": "^2.0.1", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" } }, "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A=="],
|
||||
"update-notifier": ["update-notifier@5.0.1", "", { "dependencies": { "boxen": "^4.2.0", "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.3.2", "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.1.0", "pupa": "^2.1.1", "semver": "^7.3.2", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" } }, "sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg=="],
|
||||
|
||||
"uri-js": ["uri-js@4.4.0", "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g=="],
|
||||
|
||||
@@ -1874,8 +1857,6 @@
|
||||
|
||||
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
|
||||
|
||||
"@babel/core/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"@babel/core/semver": ["semver@5.7.1", "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", { "bin": "bin/semver" }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="],
|
||||
|
||||
"@babel/core/source-map": ["source-map@0.5.7", "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz", {}, "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="],
|
||||
@@ -1888,8 +1869,6 @@
|
||||
|
||||
"@babel/highlight/chalk": ["chalk@2.4.2", "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
|
||||
|
||||
"@babel/traverse/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.12.11", "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", {}, "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="],
|
||||
|
||||
"@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||
@@ -1922,9 +1901,9 @@
|
||||
|
||||
"@jest/pattern/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="],
|
||||
|
||||
"@jest/types/@types/node": ["@types/node@14.14.14", "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz", {}, "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ=="],
|
||||
"@jest/reporters/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"@octokit/endpoint/is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="],
|
||||
"@jest/types/@types/node": ["@types/node@14.14.14", "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz", {}, "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ=="],
|
||||
|
||||
"@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@5.5.0", "", { "dependencies": { "@types/node": ">= 8" } }, "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ=="],
|
||||
|
||||
@@ -1972,14 +1951,14 @@
|
||||
|
||||
"busboy/readable-stream": ["readable-stream@1.1.14", "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha1-fPTFTvZI44EwhMY23SB54WbAgdk="],
|
||||
|
||||
"cacache/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"cacache/lru-cache": ["lru-cache@6.0.0", "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
|
||||
"cacache/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
|
||||
|
||||
"chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"class-utils/define-property": ["define-property@0.2.5", "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="],
|
||||
|
||||
"clone-response/mimic-response": ["mimic-response@1.0.1", "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="],
|
||||
@@ -1988,10 +1967,6 @@
|
||||
|
||||
"co-body/raw-body": ["raw-body@2.4.1", "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz", { "dependencies": { "bytes": "3.1.0", "http-errors": "1.7.3", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA=="],
|
||||
|
||||
"content-disposition/safe-buffer": ["safe-buffer@5.1.2", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
|
||||
|
||||
"convert-source-map/safe-buffer": ["safe-buffer@5.1.2", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
|
||||
|
||||
"cookie-parser/cookie": ["cookie@0.4.0", "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz", {}, "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="],
|
||||
|
||||
"cookies/depd": ["depd@2.0.0", "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
||||
@@ -2000,12 +1975,10 @@
|
||||
|
||||
"cssstyle/cssom": ["cssom@0.3.8", "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="],
|
||||
|
||||
"debug/ms": ["ms@2.1.3", "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
"debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"dicer/readable-stream": ["readable-stream@1.1.14", "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha1-fPTFTvZI44EwhMY23SB54WbAgdk="],
|
||||
|
||||
"dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
|
||||
|
||||
"domexception/webidl-conversions": ["webidl-conversions@5.0.0", "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="],
|
||||
|
||||
"ecdsa-sig-formatter/safe-buffer": ["safe-buffer@5.2.1", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
@@ -2048,6 +2021,8 @@
|
||||
|
||||
"gauge/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"glob/minimatch": ["minimatch@10.2.2", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw=="],
|
||||
|
||||
"global-dirs/ini": ["ini@1.3.7", "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz", {}, "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="],
|
||||
|
||||
"has-ansi/ansi-regex": ["ansi-regex@2.1.1", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz", {}, "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="],
|
||||
@@ -2060,30 +2035,16 @@
|
||||
|
||||
"http-errors/inherits": ["inherits@2.0.3", "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz", {}, "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="],
|
||||
|
||||
"http-proxy-agent/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"https-proxy-agent/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
|
||||
|
||||
"is-accessor-descriptor/kind-of": ["kind-of@6.0.3", "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||
|
||||
"is-data-descriptor/kind-of": ["kind-of@6.0.3", "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||
|
||||
"is-descriptor/kind-of": ["kind-of@6.0.3", "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||
|
||||
"is-extendable/is-plain-object": ["is-plain-object@2.0.4", "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
|
||||
|
||||
"istanbul-lib-instrument/semver": ["semver@6.3.0", "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz", { "bin": "bin/semver.js" }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="],
|
||||
|
||||
"istanbul-lib-report/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"istanbul-lib-source-maps/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"jest-changed-files/execa": ["execa@4.1.0", "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="],
|
||||
|
||||
"jest-cli/yargs": ["yargs@15.4.1", "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="],
|
||||
|
||||
"jest-config/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"jest-config/pretty-format": ["pretty-format@26.6.2", "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz", { "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" } }, "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg=="],
|
||||
|
||||
"jest-diff/pretty-format": ["pretty-format@26.6.2", "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz", { "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" } }, "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg=="],
|
||||
@@ -2134,6 +2095,8 @@
|
||||
|
||||
"jest-runner/jest-message-util": ["jest-message-util@26.6.2", "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz", { "dependencies": { "@babel/code-frame": "^7.0.0", "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA=="],
|
||||
|
||||
"jest-runtime/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"jest-runtime/jest-message-util": ["jest-message-util@26.6.2", "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz", { "dependencies": { "@babel/code-frame": "^7.0.0", "@jest/types": "^26.6.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA=="],
|
||||
|
||||
"jest-runtime/jest-mock": ["jest-mock@26.6.2", "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz", { "dependencies": { "@jest/types": "^26.6.2", "@types/node": "*" } }, "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew=="],
|
||||
@@ -2164,8 +2127,6 @@
|
||||
|
||||
"jest-worker/@types/node": ["@types/node@14.14.14", "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz", {}, "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ=="],
|
||||
|
||||
"jest-worker/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"jsdom/acorn": ["acorn@7.4.1", "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz", { "bin": "bin/acorn" }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="],
|
||||
|
||||
"jsonwebtoken/semver": ["semver@5.7.1", "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", { "bin": "bin/semver" }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="],
|
||||
@@ -2182,14 +2143,14 @@
|
||||
|
||||
"koa-multer/multer": ["multer@1.3.0", "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz", { "dependencies": { "append-field": "^0.1.0", "busboy": "^0.2.11", "concat-stream": "^1.5.0", "mkdirp": "^0.5.1", "object-assign": "^3.0.0", "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" } }, "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI="],
|
||||
|
||||
"koa-router/debug": ["debug@3.2.7", "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
|
||||
|
||||
"koa-router/http-errors": ["http-errors@1.8.0", "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A=="],
|
||||
|
||||
"koa-router/koa-compose": ["koa-compose@3.2.1", "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz", { "dependencies": { "any-promise": "^1.1.0" } }, "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec="],
|
||||
|
||||
"koa-router/path-to-regexp": ["path-to-regexp@1.8.0", "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz", { "dependencies": { "isarray": "0.0.1" } }, "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA=="],
|
||||
|
||||
"lru-cache/yallist": ["yallist@3.1.1", "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||
|
||||
"make-dir/semver": ["semver@6.3.0", "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz", { "bin": "bin/semver.js" }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="],
|
||||
|
||||
"make-fetch-happen/lru-cache": ["lru-cache@6.0.0", "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
@@ -2210,36 +2171,22 @@
|
||||
|
||||
"minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
|
||||
|
||||
"mixin-deep/is-extendable": ["is-extendable@1.0.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="],
|
||||
|
||||
"multer/mkdirp": ["mkdirp@0.5.5", "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz", { "dependencies": { "minimist": "^1.2.5" }, "bin": "bin/cmd.js" }, "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="],
|
||||
|
||||
"mysql/safe-buffer": ["safe-buffer@5.1.2", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
|
||||
|
||||
"nanomatch/define-property": ["define-property@2.0.2", "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz", { "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="],
|
||||
|
||||
"nanomatch/extend-shallow": ["extend-shallow@3.0.2", "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="],
|
||||
|
||||
"nanomatch/kind-of": ["kind-of@6.0.3", "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||
"node-gyp/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"node-gyp/graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||
|
||||
"node-gyp/nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="],
|
||||
|
||||
"node-notifier/semver": ["semver@7.3.4", "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": "bin/semver.js" }, "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw=="],
|
||||
|
||||
"node-notifier/which": ["which@2.0.2", "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"nodemon/semver": ["semver@5.7.1", "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", { "bin": "bin/semver" }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="],
|
||||
|
||||
"normalize-package-data/semver": ["semver@5.7.1", "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", { "bin": "bin/semver" }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="],
|
||||
|
||||
"npm-run-path/path-key": ["path-key@3.1.1", "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"object-copy/define-property": ["define-property@0.2.5", "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="],
|
||||
|
||||
"object-copy/kind-of": ["kind-of@3.2.2", "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="],
|
||||
|
||||
"onigasm/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
|
||||
|
||||
"openapi3-ts/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
|
||||
|
||||
"os-locale/execa": ["execa@1.0.0", "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz", { "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.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" } }, "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA=="],
|
||||
@@ -2248,7 +2195,7 @@
|
||||
|
||||
"package-json/semver": ["semver@6.3.0", "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz", { "bin": "bin/semver.js" }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="],
|
||||
|
||||
"parse-path/qs": ["qs@6.9.4", "", {}, "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="],
|
||||
"parse-path/qs": ["qs@6.9.4", "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz", {}, "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="],
|
||||
|
||||
"parse-url/normalize-url": ["normalize-url@3.3.0", "", {}, "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="],
|
||||
|
||||
@@ -2256,26 +2203,14 @@
|
||||
|
||||
"pkg-dir/find-up": ["find-up@4.1.0", "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
|
||||
|
||||
"raw-body/http-errors": ["http-errors@1.7.2", "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg=="],
|
||||
|
||||
"read-pkg/type-fest": ["type-fest@0.6.0", "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="],
|
||||
|
||||
"read-pkg-up/find-up": ["find-up@4.1.0", "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
|
||||
|
||||
"read-pkg-up/type-fest": ["type-fest@0.8.1", "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="],
|
||||
|
||||
"readable-stream/safe-buffer": ["safe-buffer@5.1.2", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
|
||||
|
||||
"readdirp/picomatch": ["picomatch@2.2.2", "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz", {}, "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="],
|
||||
|
||||
"regex-not/extend-shallow": ["extend-shallow@3.0.2", "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="],
|
||||
|
||||
"release-it/debug": ["debug@4.3.1", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"release-it/semver": ["semver@7.3.2", "", { "bin": "bin/semver.js" }, "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="],
|
||||
|
||||
"release-it/update-notifier": ["update-notifier@5.0.1", "", { "dependencies": { "boxen": "^4.2.0", "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.3.2", "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.1.0", "pupa": "^2.1.1", "semver": "^7.3.2", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" } }, "sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg=="],
|
||||
|
||||
"release-it/uuid": ["uuid@8.3.1", "", { "bin": "dist/bin/uuid" }, "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg=="],
|
||||
|
||||
"request/form-data": ["form-data@2.3.3", "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="],
|
||||
@@ -2290,6 +2225,10 @@
|
||||
|
||||
"request-promise-native/tough-cookie": ["tough-cookie@2.5.0", "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="],
|
||||
|
||||
"rimraf/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"routing-controllers/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"routing-controllers-openapi/openapi3-ts": ["openapi3-ts@1.4.0", "https://registry.yarnpkg.com/openapi3-ts/-/openapi3-ts-1.4.0.tgz", {}, "sha512-8DmE2oKayvSkIR3XSZ4+pRliBsx19bSNeIzkTPswY8r4wvjX86bMxsORdqwAwMxE8PefOcSAT2auvi/0TZe9yA=="],
|
||||
|
||||
"routing-controllers-openapi/path-to-regexp": ["path-to-regexp@2.4.0", "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz", {}, "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w=="],
|
||||
@@ -2320,6 +2259,8 @@
|
||||
|
||||
"sha.js/safe-buffer": ["safe-buffer@5.2.1", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"shelljs/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"snapdragon/debug": ["debug@2.6.9", "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||
|
||||
"snapdragon/define-property": ["define-property@0.2.5", "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="],
|
||||
@@ -2334,8 +2275,6 @@
|
||||
|
||||
"socks-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||
|
||||
"split-string/extend-shallow": ["extend-shallow@3.0.2", "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="],
|
||||
|
||||
"split2/readable-stream": ["readable-stream@3.6.0", "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="],
|
||||
|
||||
"sshpk/tweetnacl": ["tweetnacl@0.14.5", "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz", {}, "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="],
|
||||
@@ -2344,51 +2283,41 @@
|
||||
|
||||
"stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
|
||||
"start-server-and-test/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
|
||||
"start-server-and-test/execa": ["execa@3.4.0", "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g=="],
|
||||
|
||||
"static-extend/define-property": ["define-property@0.2.5", "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="],
|
||||
|
||||
"string_decoder/safe-buffer": ["safe-buffer@5.1.2", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
|
||||
|
||||
"supports-hyperlinks/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"supports-hyperlinks/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
"tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
|
||||
|
||||
"tar-fs/chownr": ["chownr@1.1.4", "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="],
|
||||
|
||||
"tar-stream/readable-stream": ["readable-stream@3.6.0", "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="],
|
||||
|
||||
"test-exclude/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"to-object-path/kind-of": ["kind-of@3.2.2", "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="],
|
||||
|
||||
"to-regex/define-property": ["define-property@2.0.2", "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz", { "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="],
|
||||
|
||||
"to-regex/extend-shallow": ["extend-shallow@3.0.2", "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="],
|
||||
|
||||
"ts-jest/@types/jest": ["@types/jest@26.0.19", "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.19.tgz", { "dependencies": { "jest-diff": "^26.0.0", "pretty-format": "^26.0.0" } }, "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ=="],
|
||||
|
||||
"ts-jest/yargs-parser": ["yargs-parser@20.2.4", "", {}, "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="],
|
||||
|
||||
"tunnel-agent/safe-buffer": ["safe-buffer@5.2.1", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"typedoc/fs-extra": ["fs-extra@9.0.1", "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^1.0.0" } }, "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ=="],
|
||||
|
||||
"typeorm/debug": ["debug@4.3.1", "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="],
|
||||
"typeorm/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"typeorm/tslib": ["tslib@1.14.1", "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="],
|
||||
|
||||
"typeorm-seeding/glob": ["glob@7.1.6", "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="],
|
||||
|
||||
"typeorm-seeding/ora": ["ora@4.0.3", "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz", { "dependencies": { "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.2.0", "is-interactive": "^1.0.0", "log-symbols": "^3.0.0", "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg=="],
|
||||
|
||||
"typeorm-seeding/yargs": ["yargs@15.3.1", "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.1" } }, "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA=="],
|
||||
|
||||
"undefsafe/debug": ["debug@2.6.9", "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||
|
||||
"union-value/is-extendable": ["is-extendable@0.1.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz", {}, "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="],
|
||||
|
||||
"unset-value/has-value": ["has-value@0.3.1", "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz", { "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" } }, "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8="],
|
||||
|
||||
"update-notifier/chalk": ["chalk@3.0.0", "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="],
|
||||
"update-notifier/semver": ["semver@7.3.2", "", { "bin": "bin/semver.js" }, "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="],
|
||||
|
||||
"v8-to-istanbul/source-map": ["source-map@0.7.3", "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz", {}, "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="],
|
||||
|
||||
@@ -2396,19 +2325,13 @@
|
||||
|
||||
"wide-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"windows-release/execa": ["execa@4.1.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="],
|
||||
|
||||
"wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"yargonaut/chalk": ["chalk@1.1.3", "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg="],
|
||||
|
||||
"yargs/yargs-parser": ["yargs-parser@20.2.4", "", {}, "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="],
|
||||
|
||||
"@babel/core/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
|
||||
|
||||
"@babel/traverse/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
"@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
|
||||
|
||||
"@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
|
||||
|
||||
@@ -2452,14 +2375,10 @@
|
||||
|
||||
"boxen/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"boxen/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"busboy/readable-stream/isarray": ["isarray@0.0.1", "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz", {}, "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="],
|
||||
|
||||
"busboy/readable-stream/string_decoder": ["string_decoder@0.10.31", "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz", {}, "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="],
|
||||
|
||||
"chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"class-utils/define-property/is-descriptor": ["is-descriptor@0.1.6", "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="],
|
||||
|
||||
"co-body/raw-body/http-errors": ["http-errors@1.7.3", "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw=="],
|
||||
@@ -2504,16 +2423,10 @@
|
||||
|
||||
"gauge/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"glob/minimatch/brace-expansion": ["brace-expansion@5.0.2", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw=="],
|
||||
|
||||
"has-values/is-number/kind-of": ["kind-of@3.2.2", "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="],
|
||||
|
||||
"http-proxy-agent/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"https-proxy-agent/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"istanbul-lib-report/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"istanbul-lib-source-maps/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"jest-cli/yargs/cliui": ["cliui@6.0.0", "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="],
|
||||
|
||||
"jest-cli/yargs/find-up": ["find-up@4.1.0", "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
|
||||
@@ -2524,20 +2437,14 @@
|
||||
|
||||
"jest-cli/yargs/yargs-parser": ["yargs-parser@18.1.3", "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="],
|
||||
|
||||
"jest-config/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-config/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-config/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-diff/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-diff/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-diff/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-each/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-each/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-each/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
@@ -2548,22 +2455,16 @@
|
||||
|
||||
"jest-jasmine2/jest-message-util/stack-utils": ["stack-utils@2.0.3", "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw=="],
|
||||
|
||||
"jest-jasmine2/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-jasmine2/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-jasmine2/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-leak-detector/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-leak-detector/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-leak-detector/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"jest-message-util/@jest/types/@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="],
|
||||
|
||||
"jest-message-util/@jest/types/@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="],
|
||||
@@ -2572,8 +2473,6 @@
|
||||
|
||||
"jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"jest-message-util/micromatch/braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"jest-message-util/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
@@ -2622,22 +2521,16 @@
|
||||
|
||||
"jest-snapshot/jest-message-util/stack-utils": ["stack-utils@2.0.3", "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw=="],
|
||||
|
||||
"jest-snapshot/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-snapshot/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-snapshot/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-snapshot/semver/lru-cache": ["lru-cache@6.0.0", "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
|
||||
"jest-validate/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-validate/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-validate/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-worker/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"koa-multer/multer/append-field": ["append-field@0.1.0", "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz", {}, "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo="],
|
||||
|
||||
"koa-multer/multer/mkdirp": ["mkdirp@0.5.5", "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz", { "dependencies": { "minimist": "^1.2.5" }, "bin": "bin/cmd.js" }, "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="],
|
||||
@@ -2652,14 +2545,12 @@
|
||||
|
||||
"koa/http-errors/setprototypeof": ["setprototypeof@1.2.0", "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
|
||||
|
||||
"mixin-deep/is-extendable/is-plain-object": ["is-plain-object@2.0.4", "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
|
||||
|
||||
"nanomatch/extend-shallow/is-extendable": ["is-extendable@1.0.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="],
|
||||
|
||||
"node-notifier/semver/lru-cache": ["lru-cache@6.0.0", "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
|
||||
"object-copy/define-property/is-descriptor": ["is-descriptor@0.1.6", "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="],
|
||||
|
||||
"onigasm/lru-cache/yallist": ["yallist@3.1.1", "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||
|
||||
"os-locale/execa/cross-spawn": ["cross-spawn@6.0.5", "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="],
|
||||
|
||||
"os-locale/execa/get-stream": ["get-stream@4.1.0", "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz", { "dependencies": { "pump": "^3.0.0" } }, "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="],
|
||||
@@ -2688,16 +2579,8 @@
|
||||
|
||||
"pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
|
||||
|
||||
"raw-body/http-errors/inherits": ["inherits@2.0.3", "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz", {}, "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="],
|
||||
|
||||
"read-pkg-up/find-up/locate-path": ["locate-path@5.0.0", "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
|
||||
|
||||
"regex-not/extend-shallow/is-extendable": ["is-extendable@1.0.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="],
|
||||
|
||||
"release-it/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"release-it/update-notifier/is-npm": ["is-npm@5.0.0", "", {}, "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="],
|
||||
|
||||
"sane/anymatch/normalize-path": ["normalize-path@2.1.1", "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk="],
|
||||
|
||||
"sane/execa/cross-spawn": ["cross-spawn@6.0.5", "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="],
|
||||
@@ -2720,18 +2603,12 @@
|
||||
|
||||
"snapdragon/extend-shallow/is-extendable": ["is-extendable@0.1.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz", {}, "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="],
|
||||
|
||||
"split-string/extend-shallow/is-extendable": ["is-extendable@1.0.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="],
|
||||
|
||||
"split2/readable-stream/string_decoder": ["string_decoder@1.3.0", "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
|
||||
|
||||
"start-server-and-test/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"static-extend/define-property/is-descriptor": ["is-descriptor@0.1.6", "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="],
|
||||
|
||||
"tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
|
||||
|
||||
"to-regex/extend-shallow/is-extendable": ["is-extendable@1.0.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="],
|
||||
|
||||
"ts-jest/@types/jest/pretty-format": ["pretty-format@26.6.2", "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz", { "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" } }, "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg=="],
|
||||
|
||||
"typedoc/fs-extra/jsonfile": ["jsonfile@6.1.0", "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz", { "dependencies": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="],
|
||||
@@ -2752,18 +2629,10 @@
|
||||
|
||||
"typeorm-seeding/yargs/yargs-parser": ["yargs-parser@18.1.3", "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="],
|
||||
|
||||
"typeorm/debug/ms": ["ms@2.1.2", "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
||||
|
||||
"undefsafe/debug/ms": ["ms@2.0.0", "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz", {}, "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="],
|
||||
|
||||
"unset-value/has-value/has-values": ["has-values@0.1.4", "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz", {}, "sha1-bWHeldkd/Km5oCCJrThL/49it3E="],
|
||||
|
||||
"unset-value/has-value/isobject": ["isobject@2.1.0", "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz", { "dependencies": { "isarray": "1.0.0" } }, "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk="],
|
||||
|
||||
"update-notifier/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"update-notifier/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"wide-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"yargonaut/chalk/ansi-styles": ["ansi-styles@2.2.1", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz", {}, "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="],
|
||||
@@ -2774,9 +2643,9 @@
|
||||
|
||||
"@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
|
||||
|
||||
"@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
|
||||
"@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", {}, "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="],
|
||||
|
||||
"@jest/console/jest-message-util/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
"@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
|
||||
|
||||
"@jest/console/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
@@ -2784,16 +2653,12 @@
|
||||
|
||||
"@jest/console/jest-message-util/stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
|
||||
"@jest/core/jest-message-util/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"@jest/core/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"@jest/core/jest-message-util/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"@jest/core/jest-message-util/stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
|
||||
"@jest/fake-timers/jest-message-util/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"@jest/fake-timers/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"@jest/fake-timers/jest-message-util/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
@@ -2814,8 +2679,6 @@
|
||||
|
||||
"bl/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"boxen/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"class-utils/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", { "dependencies": { "kind-of": "^3.0.2" } }, "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="],
|
||||
|
||||
"class-utils/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", { "dependencies": { "kind-of": "^3.0.2" } }, "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y="],
|
||||
@@ -2846,7 +2709,7 @@
|
||||
|
||||
"expect/jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"expect/jest-util/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
"glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.3", "", {}, "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g=="],
|
||||
|
||||
"jest-cli/yargs/cliui/wrap-ansi": ["wrap-ansi@6.2.0", "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
|
||||
|
||||
@@ -2854,30 +2717,18 @@
|
||||
|
||||
"jest-jasmine2/jest-message-util/stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
|
||||
"jest-matcher-utils/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"jest-message-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"jest-message-util/micromatch/braces/fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"jest-mock/@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-mock/@jest/types/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"jest-mock/jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-mock/jest-util/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"jest-runner/jest-message-util/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-runner/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-runner/jest-message-util/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"jest-runner/jest-message-util/stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
|
||||
"jest-runtime/jest-message-util/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"jest-runtime/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-runtime/jest-message-util/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
@@ -2890,8 +2741,6 @@
|
||||
|
||||
"jest-snapshot/jest-message-util/stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
|
||||
"nanomatch/extend-shallow/is-extendable/is-plain-object": ["is-plain-object@2.0.4", "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
|
||||
|
||||
"object-copy/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", { "dependencies": { "kind-of": "^3.0.2" } }, "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="],
|
||||
|
||||
"object-copy/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", { "dependencies": { "kind-of": "^3.0.2" } }, "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y="],
|
||||
@@ -2914,7 +2763,7 @@
|
||||
|
||||
"package-json/got/cacheable-request/keyv": ["keyv@3.1.0", "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz", { "dependencies": { "json-buffer": "3.0.0" } }, "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA=="],
|
||||
|
||||
"package-json/got/cacheable-request/lowercase-keys": ["lowercase-keys@2.0.0", "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="],
|
||||
"package-json/got/cacheable-request/lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="],
|
||||
|
||||
"package-json/got/cacheable-request/responselike": ["responselike@1.0.2", "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz", { "dependencies": { "lowercase-keys": "^1.0.0" } }, "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec="],
|
||||
|
||||
@@ -2922,8 +2771,6 @@
|
||||
|
||||
"read-pkg-up/find-up/locate-path/p-locate": ["p-locate@4.1.0", "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
|
||||
|
||||
"regex-not/extend-shallow/is-extendable/is-plain-object": ["is-plain-object@2.0.4", "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
|
||||
|
||||
"sane/execa/cross-spawn/path-key": ["path-key@2.0.1", "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz", {}, "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="],
|
||||
|
||||
"sane/execa/cross-spawn/semver": ["semver@5.7.1", "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", { "bin": "bin/semver" }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="],
|
||||
@@ -2944,8 +2791,6 @@
|
||||
|
||||
"snapdragon/define-property/is-descriptor/kind-of": ["kind-of@5.1.0", "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz", {}, "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="],
|
||||
|
||||
"split-string/extend-shallow/is-extendable/is-plain-object": ["is-plain-object@2.0.4", "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
|
||||
|
||||
"split2/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"static-extend/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", { "dependencies": { "kind-of": "^3.0.2" } }, "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="],
|
||||
@@ -2956,10 +2801,6 @@
|
||||
|
||||
"tar-stream/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"to-regex/extend-shallow/is-extendable/is-plain-object": ["is-plain-object@2.0.4", "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
|
||||
|
||||
"ts-jest/@types/jest/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"ts-jest/@types/jest/pretty-format/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"ts-jest/@types/jest/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
@@ -2968,18 +2809,12 @@
|
||||
|
||||
"typeorm-seeding/ora/chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"typeorm-seeding/ora/chalk/supports-color": ["supports-color@7.2.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"typeorm-seeding/ora/log-symbols/chalk": ["chalk@2.4.2", "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
|
||||
|
||||
"typeorm-seeding/yargs/cliui/wrap-ansi": ["wrap-ansi@6.2.0", "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
|
||||
|
||||
"typeorm-seeding/yargs/find-up/locate-path": ["locate-path@5.0.0", "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
|
||||
|
||||
"unset-value/has-value/isobject/isarray": ["isarray@1.0.0", "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz", {}, "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="],
|
||||
|
||||
"update-notifier/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"wide-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"yargonaut/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz", {}, "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="],
|
||||
@@ -2988,12 +2823,8 @@
|
||||
|
||||
"@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
|
||||
|
||||
"@jest/globals/expect/jest-matcher-utils/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"@jest/globals/expect/jest-matcher-utils/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"@jest/globals/expect/jest-message-util/pretty-format/ansi-regex": ["ansi-regex@5.0.0", "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz", {}, "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="],
|
||||
|
||||
"@jest/globals/expect/jest-message-util/pretty-format/react-is": ["react-is@17.0.1", "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz", {}, "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="],
|
||||
|
||||
"@jest/globals/expect/jest-message-util/stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
||||
@@ -3018,16 +2849,10 @@
|
||||
|
||||
"expand-brackets/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="],
|
||||
|
||||
"expect/jest-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"jest-cli/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-cli/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
|
||||
|
||||
"jest-mock/@jest/types/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"jest-mock/jest-util/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"jest-runtime/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"jest-runtime/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
|
||||
@@ -3050,8 +2875,6 @@
|
||||
|
||||
"sane/micromatch/braces/extend-shallow/is-extendable": ["is-extendable@0.1.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz", {}, "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="],
|
||||
|
||||
"sane/micromatch/braces/fill-range/extend-shallow": ["extend-shallow@2.0.1", "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="],
|
||||
|
||||
"sane/micromatch/braces/fill-range/is-number": ["is-number@3.0.0", "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz", { "dependencies": { "kind-of": "^3.0.2" } }, "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU="],
|
||||
|
||||
"sane/micromatch/braces/fill-range/to-regex-range": ["to-regex-range@2.1.1", "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz", { "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg="],
|
||||
@@ -3064,8 +2887,6 @@
|
||||
|
||||
"static-extend/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="],
|
||||
|
||||
"typeorm-seeding/ora/chalk/supports-color/has-flag": ["has-flag@4.0.0", "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"typeorm-seeding/ora/log-symbols/chalk/ansi-styles": ["ansi-styles@3.2.1", "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
|
||||
|
||||
"typeorm-seeding/ora/log-symbols/chalk/supports-color": ["supports-color@5.5.0", "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
|
||||
@@ -3084,8 +2905,6 @@
|
||||
|
||||
"jest-runtime/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
|
||||
|
||||
"sane/micromatch/braces/fill-range/extend-shallow/is-extendable": ["is-extendable@0.1.1", "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz", {}, "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="],
|
||||
|
||||
"sane/micromatch/braces/fill-range/is-number/kind-of": ["kind-of@3.2.2", "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="],
|
||||
|
||||
"typeorm-seeding/ora/log-symbols/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
|
||||
|
||||
71
licenses.md
71
licenses.md
@@ -379,6 +379,77 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
# glob
|
||||
**Author**: Isaac Z. Schlueter <i@izs.me> (https://blog.izs.me/)
|
||||
**Repo**: [object Object]
|
||||
**License**: BlueOak-1.0.0
|
||||
**Description**: the most correct and second fastest glob implementation in JavaScript
|
||||
## License Text
|
||||
All packages under `src/` are licensed according to the terms in
|
||||
their respective `LICENSE` or `LICENSE.md` files.
|
||||
|
||||
The remainder of this project is licensed under the Blue Oak
|
||||
Model License, as follows:
|
||||
|
||||
-----
|
||||
|
||||
# Blue Oak Model License
|
||||
|
||||
Version 1.0.0
|
||||
|
||||
## Purpose
|
||||
|
||||
This license gives everyone as much permission to work with
|
||||
this software as possible, while protecting contributors
|
||||
from liability.
|
||||
|
||||
## Acceptance
|
||||
|
||||
In order to receive this license, you must agree to its
|
||||
rules. The rules of this license are both obligations
|
||||
under that agreement and conditions to your license.
|
||||
You must not do anything with this software that triggers
|
||||
a rule that you cannot or will not follow.
|
||||
|
||||
## Copyright
|
||||
|
||||
Each contributor licenses you to do everything with this
|
||||
software that would otherwise infringe that contributor's
|
||||
copyright in it.
|
||||
|
||||
## Notices
|
||||
|
||||
You must ensure that everyone who gets a copy of
|
||||
any part of this software from you, with or without
|
||||
changes, also gets the text of this license or a link to
|
||||
<https://blueoakcouncil.org/license/1.0.0>.
|
||||
|
||||
## Excuse
|
||||
|
||||
If anyone notifies you in writing that you have not
|
||||
complied with [Notices](#notices), you can keep your
|
||||
license by taking all practical steps to comply within 30
|
||||
days after the notice. If you do not do so, your license
|
||||
ends immediately.
|
||||
|
||||
## Patent
|
||||
|
||||
Each contributor licenses you to do everything with this
|
||||
software that would otherwise infringe any patent claims
|
||||
they can license or become able to license.
|
||||
|
||||
## Reliability
|
||||
|
||||
No contributor can revoke this license.
|
||||
|
||||
## No Liability
|
||||
|
||||
***As far as the law allows, this software comes as is,
|
||||
without any warranty or condition, and no contributor
|
||||
will be liable to anyone for any damages related to this
|
||||
software or this license, under any kind of legal claim.***
|
||||
|
||||
|
||||
# jsonwebtoken
|
||||
**Author**: auth0
|
||||
**Repo**: [object Object]
|
||||
|
||||
10
ormconfig.js
10
ormconfig.js
@@ -1,8 +1,6 @@
|
||||
const dotenv = require('dotenv');
|
||||
dotenv.config();
|
||||
//
|
||||
// Bun workflow: always compile first, then run from dist/
|
||||
const SOURCE_PATH = 'dist';
|
||||
|
||||
module.exports = {
|
||||
type: process.env.DB_TYPE,
|
||||
host: process.env.DB_HOST,
|
||||
@@ -10,7 +8,7 @@ module.exports = {
|
||||
username: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME,
|
||||
// Always load compiled .js files from dist/ (TypeORM entities have circular deps)
|
||||
entities: [ `${SOURCE_PATH}/**/entities/*.js` ],
|
||||
seeds: [ `${SOURCE_PATH}/**/seeds/*.js` ]
|
||||
// Run directly from TypeScript source (Bun workflow)
|
||||
entities: ["src/models/entities/**/*.ts"],
|
||||
seeds: ["src/seeds/**/*.ts"]
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@odit/lfk-backend",
|
||||
"version": "1.7.0",
|
||||
"version": "1.7.2",
|
||||
"main": "src/app.ts",
|
||||
"repository": "https://git.odit.services/lfk/backend",
|
||||
"author": {
|
||||
@@ -36,6 +36,7 @@
|
||||
"csvtojson": "2.0.10",
|
||||
"dotenv": "8.2.0",
|
||||
"express": "4.17.1",
|
||||
"glob": "^13.0.6",
|
||||
"jsonwebtoken": "8.5.1",
|
||||
"libphonenumber-js": "1.9.9",
|
||||
"mysql": "2.18.1",
|
||||
@@ -71,8 +72,8 @@
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "bun scripts/dev_watch.ts",
|
||||
"start": "bun dist/app.js",
|
||||
"dev": "bun --watch src/app.ts",
|
||||
"start": "bun src/app.ts",
|
||||
"build": "rimraf ./dist && tsc && cp-cli ./src/static ./dist/static",
|
||||
"docs": "typedoc --out docs src",
|
||||
"test": "jest",
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
#!/usr/bin/env bun
|
||||
/**
|
||||
* Development watch script for Bun
|
||||
*
|
||||
* Watches src/ for changes, rebuilds on change, and restarts the server.
|
||||
* This is necessary because we must compile TypeScript first due to circular
|
||||
* TypeORM entity dependencies that Bun's TS loader cannot handle directly.
|
||||
*/
|
||||
|
||||
import { watch } from "fs";
|
||||
import { spawn } from "child_process";
|
||||
import consola from "consola";
|
||||
|
||||
let serverProcess: ReturnType<typeof spawn> | null = null;
|
||||
let isRebuilding = false;
|
||||
let pendingRestart = false;
|
||||
let debounceTimer: NodeJS.Timeout | null = null;
|
||||
let watcherReady = false;
|
||||
|
||||
function killServer() {
|
||||
return new Promise<void>((resolve) => {
|
||||
if (serverProcess) {
|
||||
consola.info("Stopping server...");
|
||||
serverProcess.kill();
|
||||
serverProcess = null;
|
||||
// Wait for port to be fully released (longer on Windows)
|
||||
setTimeout(resolve, 2000);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function startServer() {
|
||||
consola.info("Starting server...");
|
||||
serverProcess = spawn("bun", ["dist/app.js"], {
|
||||
stdio: "inherit",
|
||||
shell: true,
|
||||
});
|
||||
|
||||
serverProcess.on("error", (err) => {
|
||||
consola.error("Server process error:", err);
|
||||
});
|
||||
|
||||
serverProcess.on("exit", (code) => {
|
||||
if (code !== null && code !== 0 && code !== 143) {
|
||||
consola.error(`Server exited with code ${code}`);
|
||||
}
|
||||
});
|
||||
|
||||
// Enable watcher after initial server start
|
||||
if (!watcherReady) {
|
||||
setTimeout(() => {
|
||||
watcherReady = true;
|
||||
consola.success("👀 Watching for file changes...");
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
async function rebuild() {
|
||||
if (isRebuilding) {
|
||||
pendingRestart = true;
|
||||
return;
|
||||
}
|
||||
|
||||
isRebuilding = true;
|
||||
pendingRestart = false;
|
||||
|
||||
consola.info("Rebuilding...");
|
||||
await killServer();
|
||||
|
||||
const buildProcess = spawn("bun", ["run", "build"], {
|
||||
stdio: "inherit",
|
||||
shell: true,
|
||||
});
|
||||
|
||||
buildProcess.on("exit", (code) => {
|
||||
isRebuilding = false;
|
||||
|
||||
if (code === 0) {
|
||||
consola.success("Build complete!");
|
||||
startServer();
|
||||
|
||||
if (pendingRestart) {
|
||||
consola.info("Change detected during build, rebuilding again...");
|
||||
setTimeout(() => rebuild(), 100);
|
||||
}
|
||||
} else {
|
||||
consola.error(`Build failed with code ${code}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Initial build and start
|
||||
consola.info("🔄 Development mode - watching for changes...");
|
||||
rebuild();
|
||||
|
||||
// Watch src/ for changes (including subdirectories)
|
||||
const watcher = watch(
|
||||
"./src",
|
||||
{ recursive: true },
|
||||
(eventType, filename) => {
|
||||
if (!watcherReady) return; // Ignore changes during initial build
|
||||
|
||||
if (filename && filename.endsWith(".ts")) {
|
||||
// Ignore test files and declaration files
|
||||
if (filename.endsWith(".spec.ts") || filename.endsWith(".d.ts")) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Debounce: wait 500ms for multiple rapid changes
|
||||
if (debounceTimer) {
|
||||
clearTimeout(debounceTimer);
|
||||
}
|
||||
|
||||
debounceTimer = setTimeout(() => {
|
||||
consola.info(`File changed: ${filename}`);
|
||||
rebuild();
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// Cleanup on exit
|
||||
process.on("SIGINT", () => {
|
||||
consola.info("\nShutting down...");
|
||||
if (debounceTimer) clearTimeout(debounceTimer);
|
||||
killServer();
|
||||
watcher.close();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
process.on("SIGTERM", () => {
|
||||
if (debounceTimer) clearTimeout(debounceTimer);
|
||||
killServer();
|
||||
watcher.close();
|
||||
process.exit(0);
|
||||
});
|
||||
47
src/app.ts
47
src/app.ts
@@ -7,8 +7,28 @@ import authchecker from "./middlewares/authchecker";
|
||||
import { ErrorHandler } from './middlewares/ErrorHandler';
|
||||
import UserChecker from './middlewares/UserChecker';
|
||||
|
||||
// Always use .js when running from dist/ (Bun workflow: always build first)
|
||||
const CONTROLLERS_FILE_EXTENSION = 'js';
|
||||
// Import all controllers directly to avoid Bun + routing-controllers glob/require issues
|
||||
import { AuthController } from './controllers/AuthController';
|
||||
import { DonationController } from './controllers/DonationController';
|
||||
import { DonorController } from './controllers/DonorController';
|
||||
import { GroupContactController } from './controllers/GroupContactController';
|
||||
import { ImportController } from './controllers/ImportController';
|
||||
import { MeController } from './controllers/MeController';
|
||||
import { PermissionController } from './controllers/PermissionController';
|
||||
import { RunnerCardController } from './controllers/RunnerCardController';
|
||||
import { RunnerController } from './controllers/RunnerController';
|
||||
import { RunnerOrganizationController } from './controllers/RunnerOrganizationController';
|
||||
import { RunnerSelfServiceController } from './controllers/RunnerSelfServiceController';
|
||||
import { RunnerTeamController } from './controllers/RunnerTeamController';
|
||||
import { ScanController } from './controllers/ScanController';
|
||||
import { ScanStationController } from './controllers/ScanStationController';
|
||||
import { StatsClientController } from './controllers/StatsClientController';
|
||||
import { StatsController } from './controllers/StatsController';
|
||||
import { StatusController } from './controllers/StatusController';
|
||||
import { TrackController } from './controllers/TrackController';
|
||||
import { UserController } from './controllers/UserController';
|
||||
import { UserGroupController } from './controllers/UserGroupController';
|
||||
|
||||
const app = createExpressServer({
|
||||
authorizationChecker: authchecker,
|
||||
currentUserChecker: UserChecker,
|
||||
@@ -16,7 +36,28 @@ const app = createExpressServer({
|
||||
development: config.development,
|
||||
cors: true,
|
||||
routePrefix: "/api",
|
||||
controllers: [`${__dirname}/controllers/*.${CONTROLLERS_FILE_EXTENSION}`],
|
||||
controllers: [
|
||||
AuthController,
|
||||
DonationController,
|
||||
DonorController,
|
||||
GroupContactController,
|
||||
ImportController,
|
||||
MeController,
|
||||
PermissionController,
|
||||
RunnerCardController,
|
||||
RunnerController,
|
||||
RunnerOrganizationController,
|
||||
RunnerSelfServiceController,
|
||||
RunnerTeamController,
|
||||
ScanController,
|
||||
ScanStationController,
|
||||
StatsClientController,
|
||||
StatsController,
|
||||
StatusController,
|
||||
TrackController,
|
||||
UserController,
|
||||
UserGroupController,
|
||||
],
|
||||
});
|
||||
|
||||
async function main() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Request } from "express";
|
||||
import type { Request } from "express";
|
||||
import * as jwt from "jsonwebtoken";
|
||||
import { BadRequestError, Body, Delete, Get, JsonController, OnUndefined, Param, Post, QueryParam, Req, UseBefore } from 'routing-controllers';
|
||||
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Request } from "express";
|
||||
import type { Request } from "express";
|
||||
import { Authorized, Body, Delete, Get, HttpError, JsonController, OnUndefined, Param, Post, Put, QueryParam, Req, UseBefore } from 'routing-controllers';
|
||||
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
|
||||
import { Repository, getConnection, getConnectionManager } from 'typeorm';
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { createConnection } from "typeorm";
|
||||
import { runSeeder } from 'typeorm-seeding';
|
||||
import consola from 'consola';
|
||||
import { config } from '../config';
|
||||
import { ConfigFlag } from '../models/entities/ConfigFlags';
|
||||
import SeedPublicOrg from '../seeds/SeedPublicOrg';
|
||||
@@ -11,6 +12,11 @@ import SeedUsers from '../seeds/SeedUsers';
|
||||
*/
|
||||
export default async () => {
|
||||
const connection = await createConnection();
|
||||
|
||||
// Log discovered entities for debugging
|
||||
consola.info(`TypeORM discovered ${connection.entityMetadatas.length} entities:`);
|
||||
consola.info(connection.entityMetadatas.map(m => m.name).sort().join(', '));
|
||||
|
||||
await connection.synchronize();
|
||||
|
||||
//The data seeding part
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
import { IsInt, IsNotEmpty, IsPositive } from "class-validator";
|
||||
import { ChildEntity, Column, ManyToOne } from "typeorm";
|
||||
import { ChildEntity, Column, Index, ManyToOne } from "typeorm";
|
||||
import { ResponseDistanceDonation } from '../responses/ResponseDistanceDonation';
|
||||
import { Donation } from "./Donation";
|
||||
import { Runner } from "./Runner";
|
||||
import type { Runner } from "./Runner";
|
||||
|
||||
/**
|
||||
* Defines the DistanceDonation entity.
|
||||
* For distanceDonations a donor pledges to donate a certain amount for each kilometer ran by a runner.
|
||||
*/
|
||||
*/
|
||||
@ChildEntity()
|
||||
@Index(['runner'])
|
||||
export class DistanceDonation extends Donation {
|
||||
/**
|
||||
* The donation's associated runner.
|
||||
* Used as the source of the donation's distance.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => Runner, runner => runner.distanceDonations)
|
||||
runner: Runner;
|
||||
@ManyToOne(() => require("./Runner").Runner, (runner: Runner) => runner.distanceDonations)
|
||||
runner!: Runner;
|
||||
|
||||
/**
|
||||
* The donation's amount donated per distance.
|
||||
|
||||
@@ -2,17 +2,18 @@ import {
|
||||
IsInt,
|
||||
IsPositive
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { ResponseDonation } from '../responses/ResponseDonation';
|
||||
import { Donor } from './Donor';
|
||||
import type { Donor } from './Donor';
|
||||
|
||||
/**
|
||||
* Defines the Donation entity.
|
||||
* A donation just associates a donor with a donation amount.
|
||||
* The specifics of the amoun's determination has to be implemented in child classes.
|
||||
*/
|
||||
*/
|
||||
@Entity()
|
||||
@TableInheritance({ column: { name: "type", type: "varchar" } })
|
||||
@Index(['donor'])
|
||||
export abstract class Donation {
|
||||
/**
|
||||
* Autogenerated unique id (primary key).
|
||||
@@ -24,8 +25,8 @@ export abstract class Donation {
|
||||
/**
|
||||
* The donations's donor.
|
||||
*/
|
||||
@ManyToOne(() => Donor, donor => donor.donations)
|
||||
donor: Donor;
|
||||
@ManyToOne(() => require("./Donor").Donor, (donor: Donor) => donor.donations)
|
||||
donor!: Donor;
|
||||
|
||||
/**
|
||||
* The donation's amount in cents (or whatever your currency's smallest unit is.).
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { IsBoolean, IsInt } from "class-validator";
|
||||
import { ChildEntity, Column, OneToMany } from "typeorm";
|
||||
import { ResponseDonor } from '../responses/ResponseDonor';
|
||||
import { Donation } from './Donation';
|
||||
import type { Donation } from './Donation';
|
||||
import { Participant } from "./Participant";
|
||||
|
||||
/**
|
||||
@@ -21,8 +21,8 @@ export class Donor extends Participant {
|
||||
* Used to link the participant as the donor of a donation.
|
||||
* Attention: Only runner's can be associated as a distanceDonations distance source.
|
||||
*/
|
||||
@OneToMany(() => Donation, donation => donation.donor, { nullable: true })
|
||||
donations: Donation[];
|
||||
@OneToMany(() => require("./Donation").Donation, (donation: Donation) => donation.donor, { nullable: true })
|
||||
donations!: Donation[];
|
||||
|
||||
/**
|
||||
* Returns the total donations of a donor based on his linked donations.
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
import {
|
||||
IsEmail,
|
||||
IsInt,
|
||||
IsNotEmpty,
|
||||
IsOptional,
|
||||
IsPhoneNumber,
|
||||
|
||||
IsPositive,
|
||||
|
||||
IsString
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { config } from '../../config';
|
||||
import { ResponseGroupContact } from '../responses/ResponseGroupContact';
|
||||
import { Address } from "./Address";
|
||||
import { RunnerGroup } from "./RunnerGroup";
|
||||
import {
|
||||
IsEmail,
|
||||
IsInt,
|
||||
IsNotEmpty,
|
||||
IsOptional,
|
||||
IsPhoneNumber,
|
||||
|
||||
IsPositive,
|
||||
|
||||
IsString
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { config } from '../../config';
|
||||
import { ResponseGroupContact } from '../responses/ResponseGroupContact';
|
||||
import { Address } from "./Address";
|
||||
import type { RunnerGroup } from "./RunnerGroup";
|
||||
|
||||
/**
|
||||
* Defines the GroupContact entity.
|
||||
@@ -77,11 +77,11 @@ export class GroupContact {
|
||||
@IsEmail()
|
||||
email?: string;
|
||||
|
||||
/**
|
||||
* Used to link contacts to groups.
|
||||
*/
|
||||
@OneToMany(() => RunnerGroup, group => group.contact, { nullable: true })
|
||||
groups: RunnerGroup[];
|
||||
/**
|
||||
* Used to link contacts to groups.
|
||||
*/
|
||||
@OneToMany(() => require("./RunnerGroup").RunnerGroup, (group: RunnerGroup) => group.contact, { nullable: true })
|
||||
groups!: RunnerGroup[];
|
||||
|
||||
@Column({ type: 'bigint', nullable: true, readonly: true })
|
||||
@IsInt()
|
||||
|
||||
@@ -9,18 +9,19 @@ import {
|
||||
|
||||
IsString
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, Index, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { config } from '../../config';
|
||||
import { ResponseParticipant } from '../responses/ResponseParticipant';
|
||||
import { Address } from "./Address";
|
||||
|
||||
/**
|
||||
* Defines the Participant entity.
|
||||
* Participans can donate and therefor be associated with donation entities.
|
||||
*/
|
||||
@Entity()
|
||||
@TableInheritance({ column: { name: "type", type: "varchar" } })
|
||||
export abstract class Participant {
|
||||
/**
|
||||
* Defines the Participant entity.
|
||||
* Participans can donate and therefor be associated with donation entities.
|
||||
*/
|
||||
@Entity()
|
||||
@TableInheritance({ column: { name: "type", type: "varchar" } })
|
||||
@Index(['email'])
|
||||
export abstract class Participant {
|
||||
/**
|
||||
* Autogenerated unique id (primary key).
|
||||
*/
|
||||
|
||||
@@ -8,7 +8,7 @@ import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, PrimaryGenerated
|
||||
import { PermissionAction } from '../enums/PermissionAction';
|
||||
import { PermissionTarget } from '../enums/PermissionTargets';
|
||||
import { ResponsePermission } from '../responses/ResponsePermission';
|
||||
import { Principal } from './Principal';
|
||||
import type { Principal } from './Principal';
|
||||
/**
|
||||
* Defines the Permission entity.
|
||||
* Permissions can be granted to principals.
|
||||
@@ -26,8 +26,8 @@ export class Permission {
|
||||
/**
|
||||
* The permission's principal.
|
||||
*/
|
||||
@ManyToOne(() => Principal, principal => principal.permissions)
|
||||
principal: Principal;
|
||||
@ManyToOne(() => require("./Principal").Principal, (principal: Principal) => principal.permissions)
|
||||
principal!: Principal;
|
||||
|
||||
/**
|
||||
* The permission's target.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { IsInt, IsPositive } from 'class-validator';
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, OneToMany, PrimaryGeneratedColumn, TableInheritance } from 'typeorm';
|
||||
import { ResponsePrincipal } from '../responses/ResponsePrincipal';
|
||||
import { Permission } from './Permission';
|
||||
import type { Permission } from './Permission';
|
||||
|
||||
/**
|
||||
* Defines the principal entity.
|
||||
@@ -20,8 +20,8 @@ export abstract class Principal {
|
||||
/**
|
||||
* The participant's permissions.
|
||||
*/
|
||||
@OneToMany(() => Permission, permission => permission.principal, { nullable: true })
|
||||
permissions: Permission[];
|
||||
@OneToMany(() => require("./Permission").Permission, (permission: Permission) => permission.principal, { nullable: true })
|
||||
permissions!: Permission[];
|
||||
|
||||
@Column({ type: 'bigint', nullable: true, readonly: true })
|
||||
@IsInt()
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
import { IsInt, IsNotEmpty, IsOptional, IsString } from "class-validator";
|
||||
import { ChildEntity, Column, ManyToOne, OneToMany } from "typeorm";
|
||||
import { ChildEntity, Column, Index, ManyToOne, OneToMany } from "typeorm";
|
||||
import { ResponseRunner } from '../responses/ResponseRunner';
|
||||
import { DistanceDonation } from "./DistanceDonation";
|
||||
import type { DistanceDonation } from "./DistanceDonation";
|
||||
import { Participant } from "./Participant";
|
||||
import { RunnerCard } from "./RunnerCard";
|
||||
import type { RunnerCard } from "./RunnerCard";
|
||||
import { RunnerGroup } from "./RunnerGroup";
|
||||
import { Scan } from "./Scan";
|
||||
import type { Scan } from "./Scan";
|
||||
|
||||
/**
|
||||
* Defines the runner entity.
|
||||
* Runners differ from participants in being able to actually accumulate a ran distance through scans.
|
||||
* Runner's get organized in groups.
|
||||
*/
|
||||
*/
|
||||
@ChildEntity()
|
||||
@Index(['group'])
|
||||
export class Runner extends Participant {
|
||||
/**
|
||||
* The runner's associated group.
|
||||
@@ -26,22 +27,22 @@ export class Runner extends Participant {
|
||||
* The runner's associated distanceDonations.
|
||||
* Used to link runners to distanceDonations in order to calculate the donation's amount based on the distance the runner ran.
|
||||
*/
|
||||
@OneToMany(() => DistanceDonation, distanceDonation => distanceDonation.runner, { nullable: true })
|
||||
distanceDonations: DistanceDonation[];
|
||||
@OneToMany(() => require("./DistanceDonation").DistanceDonation, (distanceDonation: DistanceDonation) => distanceDonation.runner, { nullable: true })
|
||||
distanceDonations!: DistanceDonation[];
|
||||
|
||||
/**
|
||||
* The runner's associated cards.
|
||||
* Used to link runners to cards - yes a runner be associated with multiple cards this came in handy in the past.
|
||||
*/
|
||||
@OneToMany(() => RunnerCard, card => card.runner, { nullable: true })
|
||||
cards: RunnerCard[];
|
||||
@OneToMany(() => require("./RunnerCard").RunnerCard, (card: RunnerCard) => card.runner, { nullable: true })
|
||||
cards!: RunnerCard[];
|
||||
|
||||
/**
|
||||
* The runner's associated scans.
|
||||
* Used to link runners to scans (valid and fraudulant).
|
||||
*/
|
||||
@OneToMany(() => Scan, scan => scan.runner, { nullable: true })
|
||||
scans: Scan[];
|
||||
@OneToMany(() => require("./Scan").Scan, (scan: Scan) => scan.runner, { nullable: true })
|
||||
scans!: Scan[];
|
||||
|
||||
/**
|
||||
* The last time the runner requested a selfservice link.
|
||||
|
||||
@@ -6,18 +6,20 @@ import {
|
||||
IsOptional,
|
||||
IsPositive
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, Index, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { RunnerCardIdOutOfRangeError } from '../../errors/RunnerCardErrors';
|
||||
import { ResponseRunnerCard } from '../responses/ResponseRunnerCard';
|
||||
import { Runner } from "./Runner";
|
||||
import { TrackScan } from "./TrackScan";
|
||||
import type { Runner } from "./Runner";
|
||||
import type { TrackScan } from "./TrackScan";
|
||||
|
||||
/**
|
||||
* Defines the RunnerCard entity.
|
||||
* A runnerCard is a physical representation for a runner.
|
||||
* It can be associated with a runner to create scans via the scan station's.
|
||||
*/
|
||||
*/
|
||||
@Entity()
|
||||
@Index(['runner'])
|
||||
@Index(['enabled'])
|
||||
export class RunnerCard {
|
||||
/**
|
||||
* Autogenerated unique id (primary key).
|
||||
@@ -31,8 +33,8 @@ export class RunnerCard {
|
||||
* To increase reusability a card can be reassigned.
|
||||
*/
|
||||
@IsOptional()
|
||||
@ManyToOne(() => Runner, runner => runner.cards, { nullable: true })
|
||||
runner: Runner;
|
||||
@ManyToOne(() => require("./Runner").Runner, (runner: Runner) => runner.cards, { nullable: true })
|
||||
runner!: Runner;
|
||||
|
||||
/**
|
||||
* Is the card enabled (for fraud reasons)?
|
||||
@@ -46,8 +48,8 @@ export class RunnerCard {
|
||||
* The card's associated scans.
|
||||
* Used to link cards to track scans.
|
||||
*/
|
||||
@OneToMany(() => TrackScan, scan => scan.track, { nullable: true })
|
||||
scans: TrackScan[];
|
||||
@OneToMany(() => require("./TrackScan").TrackScan, (scan: TrackScan) => scan.card, { nullable: true })
|
||||
scans!: TrackScan[];
|
||||
|
||||
@Column({ type: 'bigint', nullable: true, readonly: true })
|
||||
@IsInt()
|
||||
|
||||
@@ -8,7 +8,7 @@ import {
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { ResponseRunnerGroup } from '../responses/ResponseRunnerGroup';
|
||||
import { GroupContact } from "./GroupContact";
|
||||
import { Runner } from "./Runner";
|
||||
import type { Runner } from "./Runner";
|
||||
|
||||
/**
|
||||
* Defines the RunnerGroup entity.
|
||||
@@ -44,8 +44,8 @@ export abstract class RunnerGroup {
|
||||
* The group's associated runners.
|
||||
* Used to link runners to a runner group.
|
||||
*/
|
||||
@OneToMany(() => Runner, runner => runner.group, { nullable: true })
|
||||
runners: Runner[];
|
||||
@OneToMany(() => require("./Runner").Runner, (runner: Runner) => runner.group, { nullable: true })
|
||||
runners!: Runner[];
|
||||
|
||||
@Column({ type: 'bigint', nullable: true, readonly: true })
|
||||
@IsInt()
|
||||
|
||||
@@ -4,7 +4,7 @@ import { ResponseRunnerOrganization } from '../responses/ResponseRunnerOrganizat
|
||||
import { Address } from './Address';
|
||||
import { Runner } from './Runner';
|
||||
import { RunnerGroup } from "./RunnerGroup";
|
||||
import { RunnerTeam } from "./RunnerTeam";
|
||||
import type { RunnerTeam } from "./RunnerTeam";
|
||||
|
||||
/**
|
||||
* Defines the RunnerOrganization entity.
|
||||
@@ -24,8 +24,8 @@ export class RunnerOrganization extends RunnerGroup {
|
||||
* The organization's teams.
|
||||
* Used to link teams to a organization.
|
||||
*/
|
||||
@OneToMany(() => RunnerTeam, team => team.parentGroup, { nullable: true })
|
||||
teams: RunnerTeam[];
|
||||
@OneToMany(() => require("./RunnerTeam").RunnerTeam, (team: RunnerTeam) => team.parentGroup, { nullable: true })
|
||||
teams!: RunnerTeam[];
|
||||
|
||||
/**
|
||||
* The organization's api key for self-service registration.
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
import { IsNotEmpty } from "class-validator";
|
||||
import { ChildEntity, ManyToOne } from "typeorm";
|
||||
import { ChildEntity, Index, ManyToOne } from "typeorm";
|
||||
import { ResponseRunnerTeam } from '../responses/ResponseRunnerTeam';
|
||||
import { RunnerGroup } from "./RunnerGroup";
|
||||
import { RunnerOrganization } from "./RunnerOrganization";
|
||||
import type { RunnerOrganization } from "./RunnerOrganization";
|
||||
|
||||
/**
|
||||
* Defines the RunnerTeam entity.
|
||||
* This usually is a school class or department in a company.
|
||||
*/
|
||||
*/
|
||||
@ChildEntity()
|
||||
@Index(['parentGroup'])
|
||||
export class RunnerTeam extends RunnerGroup {
|
||||
|
||||
/**
|
||||
@@ -16,7 +17,7 @@ export class RunnerTeam extends RunnerGroup {
|
||||
* Every team has to be part of a runnerOrganization - this get's checked on creation and update.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => RunnerOrganization, org => org.teams, { nullable: true })
|
||||
@ManyToOne(() => require("./RunnerOrganization").RunnerOrganization, (org: RunnerOrganization) => org.teams, { nullable: true })
|
||||
parentGroup?: RunnerOrganization;
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,16 +5,19 @@ import {
|
||||
|
||||
IsPositive
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||
import { ResponseScan } from '../responses/ResponseScan';
|
||||
import { Runner } from "./Runner";
|
||||
import type { Runner } from "./Runner";
|
||||
|
||||
/**
|
||||
* Defines the Scan entity.
|
||||
* A scan basicly adds a certain distance to a runner's total ran distance.
|
||||
*/
|
||||
*/
|
||||
@Entity()
|
||||
@TableInheritance({ column: { name: "type", type: "varchar" } })
|
||||
@Index(['runner'])
|
||||
@Index(['runner', 'created_at'])
|
||||
@Index(['valid'])
|
||||
export class Scan {
|
||||
/**
|
||||
* Autogenerated unique id (primary key).
|
||||
@@ -28,8 +31,8 @@ export class Scan {
|
||||
* This is important to link ran distances to runners.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => Runner, runner => runner.scans, { nullable: false })
|
||||
runner: Runner;
|
||||
@ManyToOne(() => require("./Runner").Runner, (runner: Runner) => runner.scans, { nullable: false })
|
||||
runner!: Runner;
|
||||
|
||||
/**
|
||||
* Is the scan valid (for fraud reasons).
|
||||
|
||||
@@ -6,16 +6,19 @@ import {
|
||||
IsPositive,
|
||||
IsString
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, Index, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { ResponseScanStation } from '../responses/ResponseScanStation';
|
||||
import { Track } from "./Track";
|
||||
import { TrackScan } from "./TrackScan";
|
||||
import type { Track } from "./Track";
|
||||
import type { TrackScan } from "./TrackScan";
|
||||
|
||||
/**
|
||||
* Defines the ScanStation entity.
|
||||
* ScanStations get used to create TrackScans for runners based on a scan of their runnerCard.
|
||||
*/
|
||||
*/
|
||||
@Entity()
|
||||
@Index(['track'])
|
||||
@Index(['prefix'])
|
||||
@Index(['enabled'])
|
||||
export class ScanStation {
|
||||
/**
|
||||
* Autogenerated unique id (primary key).
|
||||
@@ -38,8 +41,8 @@ export class ScanStation {
|
||||
* All scans created by this station will also be associated with this track.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => Track, track => track.stations, { nullable: false })
|
||||
track: Track;
|
||||
@ManyToOne(() => require("./Track").Track, (track: Track) => track.stations, { nullable: false })
|
||||
track!: Track;
|
||||
|
||||
/**
|
||||
* The client's api key prefix.
|
||||
@@ -69,8 +72,8 @@ export class ScanStation {
|
||||
/**
|
||||
* Used to link track scans to a scan station.
|
||||
*/
|
||||
@OneToMany(() => TrackScan, scan => scan.track, { nullable: true })
|
||||
scans: TrackScan[];
|
||||
@OneToMany(() => require("./TrackScan").TrackScan, (scan: TrackScan) => scan.station, { nullable: true })
|
||||
scans!: TrackScan[];
|
||||
|
||||
/**
|
||||
* Is this station enabled?
|
||||
|
||||
@@ -7,8 +7,8 @@ import {
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { ResponseTrack } from '../responses/ResponseTrack';
|
||||
import { ScanStation } from "./ScanStation";
|
||||
import { TrackScan } from "./TrackScan";
|
||||
import type { ScanStation } from "./ScanStation";
|
||||
import type { TrackScan } from "./TrackScan";
|
||||
|
||||
/**
|
||||
* Defines the Track entity.
|
||||
@@ -53,15 +53,15 @@ export class Track {
|
||||
* Used to link scan stations to a certain track.
|
||||
* This makes the configuration of the scan stations easier.
|
||||
*/
|
||||
@OneToMany(() => ScanStation, station => station.track, { nullable: true })
|
||||
stations: ScanStation[];
|
||||
@OneToMany(() => require("./ScanStation").ScanStation, (station: ScanStation) => station.track, { nullable: true })
|
||||
stations!: ScanStation[];
|
||||
|
||||
/**
|
||||
* Used to link track scans to a track.
|
||||
* The scan will derive it's distance from the track's distance.
|
||||
*/
|
||||
@OneToMany(() => TrackScan, scan => scan.track, { nullable: true })
|
||||
scans: TrackScan[];
|
||||
@OneToMany(() => require("./TrackScan").TrackScan, (scan: TrackScan) => scan.track, { nullable: true })
|
||||
scans!: TrackScan[];
|
||||
|
||||
@Column({ type: 'bigint', nullable: true, readonly: true })
|
||||
@IsInt()
|
||||
|
||||
@@ -6,42 +6,47 @@ import {
|
||||
|
||||
IsPositive
|
||||
} from "class-validator";
|
||||
import { ChildEntity, Column, ManyToOne } from "typeorm";
|
||||
import { ChildEntity, Column, Index, ManyToOne } from "typeorm";
|
||||
import { ResponseTrackScan } from '../responses/ResponseTrackScan';
|
||||
import { RunnerCard } from "./RunnerCard";
|
||||
import type { RunnerCard } from "./RunnerCard";
|
||||
import { Scan } from "./Scan";
|
||||
import { ScanStation } from "./ScanStation";
|
||||
import { Track } from "./Track";
|
||||
import type { ScanStation } from "./ScanStation";
|
||||
import type { Track } from "./Track";
|
||||
|
||||
/**
|
||||
* Defines the TrackScan entity.
|
||||
* A track scan usaually get's generated by a scan station.
|
||||
*/
|
||||
*/
|
||||
@ChildEntity()
|
||||
@Index(['track'])
|
||||
@Index(['card'])
|
||||
@Index(['station'])
|
||||
@Index(['timestamp'])
|
||||
@Index(['station', 'timestamp'])
|
||||
export class TrackScan extends Scan {
|
||||
/**
|
||||
* The scan's associated track.
|
||||
* This is used to determine the scan's distance.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => Track, track => track.scans, { nullable: true })
|
||||
track: Track;
|
||||
@ManyToOne(() => require("./Track").Track, (track: Track) => track.scans, { nullable: true })
|
||||
track!: Track;
|
||||
|
||||
/**
|
||||
* The runnerCard associated with the scan.
|
||||
* This get's saved for documentation and management purposes.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => RunnerCard, card => card.scans, { nullable: true })
|
||||
card: RunnerCard;
|
||||
@ManyToOne(() => require("./RunnerCard").RunnerCard, (card: RunnerCard) => card.scans, { nullable: true })
|
||||
card!: RunnerCard;
|
||||
|
||||
/**
|
||||
* The scanning station that created the scan.
|
||||
* Mainly used for logging and traceing back scans (or errors)
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
@ManyToOne(() => ScanStation, station => station.scans, { nullable: true })
|
||||
station: ScanStation;
|
||||
@ManyToOne(() => require("./ScanStation").ScanStation, (station: ScanStation) => station.scans, { nullable: true })
|
||||
station!: ScanStation;
|
||||
|
||||
/**
|
||||
* The scan's distance in meters.
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
import { IsBoolean, IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUrl, IsUUID } from "class-validator";
|
||||
import { ChildEntity, Column, JoinTable, ManyToMany, OneToMany } from "typeorm";
|
||||
import { config } from '../../config';
|
||||
import { ResponsePrincipal } from '../responses/ResponsePrincipal';
|
||||
import { ResponseUser } from '../responses/ResponseUser';
|
||||
import { Permission } from './Permission';
|
||||
import { Principal } from './Principal';
|
||||
import { UserAction } from './UserAction';
|
||||
import { UserGroup } from './UserGroup';
|
||||
import { IsBoolean, IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUrl, IsUUID } from "class-validator";
|
||||
import { ChildEntity, Column, Index, JoinTable, ManyToMany, OneToMany } from "typeorm";
|
||||
import { config } from '../../config';
|
||||
import { ResponsePrincipal } from '../responses/ResponsePrincipal';
|
||||
import { ResponseUser } from '../responses/ResponseUser';
|
||||
import { Permission } from './Permission';
|
||||
import { Principal } from './Principal';
|
||||
import type { UserAction } from './UserAction';
|
||||
import { UserGroup } from './UserGroup';
|
||||
|
||||
/**
|
||||
* Defines the User entity.
|
||||
* Users are the ones that can use the "admin" webui and do stuff in the backend.
|
||||
*/
|
||||
@ChildEntity()
|
||||
export class User extends Principal {
|
||||
/**
|
||||
* Defines the User entity.
|
||||
* Users are the ones that can use the "admin" webui and do stuff in the backend.
|
||||
*/
|
||||
@ChildEntity()
|
||||
@Index(['enabled'])
|
||||
export class User extends Principal {
|
||||
/**
|
||||
* The user's uuid.
|
||||
* Mainly gets used as a per-user salt for the password hash.
|
||||
@@ -124,11 +125,11 @@ export class User extends Principal {
|
||||
|
||||
/**
|
||||
* The actions performed by this user.
|
||||
* For documentation purposes only, will be implemented later.
|
||||
*/
|
||||
@IsOptional()
|
||||
@OneToMany(() => UserAction, action => action.user, { nullable: true })
|
||||
actions: UserAction[]
|
||||
* For documentation purposes only, will be implemented later.
|
||||
*/
|
||||
@IsOptional()
|
||||
@OneToMany(() => require("./UserAction").UserAction, (action: UserAction) => action.user, { nullable: true })
|
||||
actions!: UserAction[]
|
||||
|
||||
/**
|
||||
* Resolves all permissions granted to this user through groups.
|
||||
|
||||
@@ -8,7 +8,7 @@ import {
|
||||
} from "class-validator";
|
||||
import { BeforeInsert, BeforeUpdate, Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { PermissionAction } from '../enums/PermissionAction';
|
||||
import { User } from './User';
|
||||
import type { User } from './User';
|
||||
|
||||
/**
|
||||
* Defines the UserAction entity.
|
||||
@@ -26,8 +26,8 @@ export class UserAction {
|
||||
/**
|
||||
* The user that performed the action.
|
||||
*/
|
||||
@ManyToOne(() => User, user => user.actions)
|
||||
user: User
|
||||
@ManyToOne(() => require("./User").User, (user: User) => user.actions)
|
||||
user!: User
|
||||
|
||||
/**
|
||||
* The actions's target (e.g. Track#2)
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Donation } from '../entities/Donation';
|
||||
import { DonationStatus } from '../enums/DonationStatus';
|
||||
import { ResponseObjectType } from '../enums/ResponseObjectType';
|
||||
import { IResponse } from './IResponse';
|
||||
import { ResponseDonor } from './ResponseDonor';
|
||||
import type { ResponseDonor } from './ResponseDonor';
|
||||
|
||||
/**
|
||||
* Defines the donation response.
|
||||
@@ -33,7 +33,7 @@ export class ResponseDonation implements IResponse {
|
||||
* The donation's donor.
|
||||
*/
|
||||
@IsNotEmpty()
|
||||
donor: ResponseDonor;
|
||||
donor?: ResponseDonor;
|
||||
|
||||
/**
|
||||
* The donation's amount in the smalles unit of your currency (default: euro cent).
|
||||
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
import { Donor } from '../entities/Donor';
|
||||
import { ResponseObjectType } from '../enums/ResponseObjectType';
|
||||
import { IResponse } from './IResponse';
|
||||
import { ResponseDonation } from './ResponseDonation';
|
||||
import type { ResponseDonation } from './ResponseDonation';
|
||||
import { ResponseParticipant } from './ResponseParticipant';
|
||||
|
||||
/**
|
||||
@@ -35,7 +35,7 @@ export class ResponseDonor extends ResponseParticipant implements IResponse {
|
||||
@IsInt()
|
||||
paidDonationAmount: number;
|
||||
|
||||
donations: Array<ResponseDonation>;
|
||||
donations?: Array<ResponseDonation>;
|
||||
|
||||
/**
|
||||
* Creates a ResponseRunner object from a runner.
|
||||
@@ -46,6 +46,7 @@ export class ResponseDonor extends ResponseParticipant implements IResponse {
|
||||
this.receiptNeeded = donor.receiptNeeded;
|
||||
this.donationAmount = donor.donationAmount;
|
||||
this.paidDonationAmount = donor.paidDonationAmount;
|
||||
const ResponseDonation = require('./ResponseDonation').ResponseDonation;
|
||||
this.donations = new Array<ResponseDonation>();
|
||||
if (donor.donations?.length > 0) {
|
||||
for (const donation of donor.donations) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import { RunnerOrganization } from '../entities/RunnerOrganization';
|
||||
import { ResponseObjectType } from '../enums/ResponseObjectType';
|
||||
import { IResponse } from './IResponse';
|
||||
import { ResponseRunnerGroup } from './ResponseRunnerGroup';
|
||||
import { ResponseRunnerTeam } from './ResponseRunnerTeam';
|
||||
import type { ResponseRunnerTeam } from './ResponseRunnerTeam';
|
||||
|
||||
/**
|
||||
* Defines the runnerOrganization response.
|
||||
@@ -37,7 +37,7 @@ export class ResponseRunnerOrganization extends ResponseRunnerGroup implements I
|
||||
* The runnerOrganization associated teams.
|
||||
*/
|
||||
@IsArray()
|
||||
teams: ResponseRunnerTeam[];
|
||||
teams?: ResponseRunnerTeam[];
|
||||
|
||||
/**
|
||||
* The organization's registration key.
|
||||
@@ -62,6 +62,7 @@ export class ResponseRunnerOrganization extends ResponseRunnerGroup implements I
|
||||
public constructor(org: RunnerOrganization) {
|
||||
super(org);
|
||||
this.address = org.address;
|
||||
const ResponseRunnerTeam = require('./ResponseRunnerTeam').ResponseRunnerTeam;
|
||||
this.teams = new Array<ResponseRunnerTeam>();
|
||||
if (org.teams) {
|
||||
for (let team of org.teams) {
|
||||
|
||||
@@ -3,7 +3,7 @@ import { RunnerTeam } from '../entities/RunnerTeam';
|
||||
import { ResponseObjectType } from '../enums/ResponseObjectType';
|
||||
import { IResponse } from './IResponse';
|
||||
import { ResponseRunnerGroup } from './ResponseRunnerGroup';
|
||||
import { ResponseRunnerOrganization } from './ResponseRunnerOrganization';
|
||||
import type { ResponseRunnerOrganization } from './ResponseRunnerOrganization';
|
||||
|
||||
/**
|
||||
* Defines the runnerTeam response.
|
||||
@@ -20,7 +20,7 @@ export class ResponseRunnerTeam extends ResponseRunnerGroup implements IResponse
|
||||
*/
|
||||
@IsObject()
|
||||
@IsNotEmpty()
|
||||
parentGroup: ResponseRunnerOrganization;
|
||||
parentGroup?: ResponseRunnerOrganization;
|
||||
|
||||
/**
|
||||
* Creates a ResponseRunnerTeam object from a runnerTeam.
|
||||
|
||||
Reference in New Issue
Block a user