diff --git a/.github/review-instructions.md b/.github/review-instructions.md index dfca3a79b..860087eb3 100644 --- a/.github/review-instructions.md +++ b/.github/review-instructions.md @@ -55,7 +55,7 @@ High-priority issues that must be addressed immediately due to their potential t ### 1. High Priority: [Issue Title] -#### 🎯 Issue +#### 🚨 Issue Describe the issue clearly, including links to specific files and lines (e.g., file.js#L10). Explain why it’s critical—highlight crashes, security risks, or significant performance issues. @@ -65,9 +65,16 @@ Provide specific steps or alternative approaches to resolve the issue. #### ✨ Code Example +**Current**: [file](file.js#L10) Problematic code with path to the file and line of the code + ```typescript -// Before: Problematic code -// After: Improved version +// Code... +``` + +**Improvement**: Improved version + +```typescript +// Code... ``` #### 📚 Relevant Documentation @@ -92,9 +99,16 @@ Offer concrete steps or alternative approaches to mitigate the issue. #### ✨ Code Example +**Current**: [file](file.js#L10) Problematic code with path to the file and line of the code + ```typescript -// Before: Problematic code -// After: Improved version +// Code... +``` + +**Improvement**: Improved version + +```typescript +// Code... ``` #### 📚 Relevant Documentation @@ -119,9 +133,16 @@ Provide suggestions or alternative implementations to mitigate the issue. #### ✨ Code Example +**Current**: [file](file.js#L10) Problematic code with path to the file and line of the code + ```typescript -// Before: Problematic code -// After: Improved version +// Code... +``` + +**Improvement**: Improved version + +```typescript +// Code... ``` #### 📚 Relevant Documentation @@ -130,9 +151,20 @@ Include relevant resources for more information. --- +## 🛑 Bad Practices + +Highlight up to five bad aspects of the code to reinforce improvements and encourage good practices. Use different funny emoji at the beginning of each bad practice. + +- Emoji **Bad Practice 1**: + Describe a specific weakness (e.g., clear code structure) with an example reference (e.g., file.js#L20). Explain why it’s bad. +- Emoji **Bad Practice 2**: + Outline another negative feature (e.g., effective error handling) with a snippet reference. + +--- + ## ✅ Good Practices -Highlight one up to five positive aspects of the code to reinforce well-implemented patterns and encourage good practices. Use different funny emoji at the beginning of each good practice. +Highlight up to five positive aspects of the code to reinforce well-implemented patterns and encourage good practices. Use different funny emoji at the beginning of each good practice. - Emoji **Good Practice 1**: Describe a specific strength (e.g., clear code structure) with an example reference (e.g., file.js#L20). Explain why it’s commendable. diff --git a/libs/common/result/src/index.ts b/libs/common/result/src/index.ts index 25fd059b1..64dcadce4 100644 --- a/libs/common/result/src/index.ts +++ b/libs/common/result/src/index.ts @@ -1,4 +1,5 @@ export * from './lib/response-args.schema'; +export * from './lib/response-args'; export * from './lib/entity-cotnainer'; export * from './lib/entity-container.schema'; export * from './lib/result'; diff --git a/libs/common/result/src/lib/response-args.schema.ts b/libs/common/result/src/lib/response-args.schema.ts index 6360966e4..da8ea03ac 100644 --- a/libs/common/result/src/lib/response-args.schema.ts +++ b/libs/common/result/src/lib/response-args.schema.ts @@ -1,24 +1,28 @@ import { z } from 'zod'; +// @deprecated export const ResponseArgsSchema = z.object({ error: z.boolean(), invalidProperties: z.record(z.string()), message: z.string().optional(), }); -export function ResponseArgs(resultSchema: z.ZodType) { +// @deprecated +export function CreateResponseArgs(resultSchema: z.ZodType) { return ResponseArgsSchema.extend({ result: resultSchema, }); } +// @deprecated const ListResponseArgsSchema = ResponseArgsSchema.extend({ skip: z.number(), take: z.number(), hits: z.number(), }); -export function ListResponseArgs(resultSchema: z.ZodType) { +// @deprecated +export function CreateListResponseArgs(resultSchema: z.ZodType) { return ListResponseArgsSchema.extend({ result: resultSchema.array(), }); diff --git a/libs/common/result/src/lib/response-args.ts b/libs/common/result/src/lib/response-args.ts new file mode 100644 index 000000000..4458ded1b --- /dev/null +++ b/libs/common/result/src/lib/response-args.ts @@ -0,0 +1,12 @@ +export interface ResponseArgs { + error: boolean; + invalidProperties: Record; + message?: string; + result: T; +} + +export interface ListResponseArgs extends ResponseArgs { + skip: number; + take: number; + hits: number; +} diff --git a/libs/feature/return/containers/src/lib/return-details-header/return-details-header.component.ts b/libs/feature/return/containers/src/lib/return-details-header/return-details-header.component.ts index ba64c97d8..8d1073e29 100644 --- a/libs/feature/return/containers/src/lib/return-details-header/return-details-header.component.ts +++ b/libs/feature/return/containers/src/lib/return-details-header/return-details-header.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; import { isaActionChevronDown, isaNavigationKunden } from '@isa/icons'; +import { Buyer } from '@isa/oms/data-access'; import { InfoButtonComponent } from '@isa/ui/buttons'; import { NgIconComponent, provideIcons } from '@ng-icons/core'; -import { Buyer } from '@feature/return/services'; @Component({ selector: 'lib-return-details-header', diff --git a/libs/feature/return/containers/src/lib/return-results-item-list/return-results-item-list.component.ts b/libs/feature/return/containers/src/lib/return-results-item-list/return-results-item-list.component.ts index 0f57a484f..926e39e28 100644 --- a/libs/feature/return/containers/src/lib/return-results-item-list/return-results-item-list.component.ts +++ b/libs/feature/return/containers/src/lib/return-results-item-list/return-results-item-list.component.ts @@ -1,17 +1,12 @@ -import { DatePipe } from "@angular/common"; -import { - ChangeDetectionStrategy, - Component, - computed, - input, -} from "@angular/core"; -import { ReceiptListItem } from "@feature/return/services"; -import { ClientRowImports, ItemRowDataImports } from "@isa/ui/item-rows"; +import { DatePipe } from '@angular/common'; +import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; +import { ReceiptListItem } from '@isa/oms/data-access'; +import { ClientRowImports, ItemRowDataImports } from '@isa/ui/item-rows'; @Component({ - selector: "lib-return-results-item-list", - templateUrl: "./return-results-item-list.component.html", - styleUrls: ["./return-results-item-list.component.css"], + selector: 'lib-return-results-item-list', + templateUrl: './return-results-item-list.component.html', + styleUrls: ['./return-results-item-list.component.css'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ClientRowImports, ItemRowDataImports, DatePipe], @@ -23,13 +18,9 @@ export class ReturnResultsItemListComponent { const firstName = this.item()?.billing?.person?.firstName; const lastName = this.item()?.billing?.person?.lastName; const buyerName = [lastName, firstName].filter((f) => !!f); - const organisation = [this.item()?.billing?.organisation?.name].filter( - (f) => !!f, - ); + const organisation = [this.item()?.billing?.organisation?.name].filter((f) => !!f); - return [organisation.join(), buyerName.join(" ")] - .filter((f) => !!f) - .join(" - "); + return [organisation.join(), buyerName.join(' ')].filter((f) => !!f).join(' - '); }); receiptDate = computed(() => { @@ -50,6 +41,6 @@ export class ReturnResultsItemListComponent { address = computed(() => { const address = this.item()?.billing?.address; - return address ? [address.zipCode, address.city].join(" ") : ""; + return address ? [address.zipCode, address.city].join(' ') : ''; }); } diff --git a/libs/feature/return/pages/src/lib/main/main-page.component.ts b/libs/feature/return/pages/src/lib/main/main-page.component.ts index 42880326e..ff391d7ab 100644 --- a/libs/feature/return/pages/src/lib/main/main-page.component.ts +++ b/libs/feature/return/pages/src/lib/main/main-page.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { ReturnSearchStatus, ReturnSearchStore } from '@feature/return/services'; import { injectActivatedProcessId } from '@isa/core/process'; +import { ReturnSearchStatus, ReturnSearchStore } from '@isa/oms/data-access'; import { FilterService, SearchBarInputComponent, diff --git a/libs/feature/return/pages/src/lib/resolvers/query-settings.resolver-fn.ts b/libs/feature/return/pages/src/lib/resolvers/query-settings.resolver-fn.ts index d15500632..509450382 100644 --- a/libs/feature/return/pages/src/lib/resolvers/query-settings.resolver-fn.ts +++ b/libs/feature/return/pages/src/lib/resolvers/query-settings.resolver-fn.ts @@ -1,7 +1,7 @@ import { inject } from '@angular/core'; import { ResolveFn } from '@angular/router'; -import { ReturnSearchService } from '@feature/return/services'; import { QuerySettingsDTO } from '@generated/swagger/oms-api'; +import { ReturnSearchService } from '@isa/oms/data-access'; export const querySettingsResolverFn: ResolveFn = () => inject(ReturnSearchService).querySettings(); diff --git a/libs/feature/return/pages/src/lib/results/results-page.component.ts b/libs/feature/return/pages/src/lib/results/results-page.component.ts index cc919edc3..8127c0d9b 100644 --- a/libs/feature/return/pages/src/lib/results/results-page.component.ts +++ b/libs/feature/return/pages/src/lib/results/results-page.component.ts @@ -14,11 +14,7 @@ import { ReturnOrderByListComponent, } from '@feature/return/containers'; import { injectActivatedProcessId } from '@isa/core/process'; -import { - ReturnSearchEntity, - ReturnSearchStatus, - ReturnSearchStore, -} from '@feature/return/services'; + import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { FilterMenuButtonComponent, @@ -31,6 +27,7 @@ import { restoreScrollPosition } from '@isa/core/scroll-position'; import { Platform } from '@angular/cdk/platform'; import { NgIconComponent, provideIcons } from '@ng-icons/core'; import { isaActionSort } from '@isa/icons'; +import { ReturnSearchEntity, ReturnSearchStatus, ReturnSearchStore } from '@isa/oms/data-access'; type EmptyState = { title: string; diff --git a/libs/feature/return/pages/src/lib/return-pages.component.ts b/libs/feature/return/pages/src/lib/return-pages.component.ts index deb7516bf..9aefd5030 100644 --- a/libs/feature/return/pages/src/lib/return-pages.component.ts +++ b/libs/feature/return/pages/src/lib/return-pages.component.ts @@ -1,8 +1,8 @@ import { Component, effect, inject, untracked } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; -import { ReturnSearchStore } from '@feature/return/services'; import { injectActivatedProcessId } from '@isa/core/process'; +import { ReturnSearchStore } from '@isa/oms/data-access'; import { FilterService, provideQuerySettings } from '@isa/shared/filter'; @Component({ @@ -10,11 +10,7 @@ import { FilterService, provideQuerySettings } from '@isa/shared/filter'; imports: [RouterOutlet], templateUrl: './return-pages.component.html', styleUrl: './return-pages.component.css', - providers: [ - provideQuerySettings( - () => inject(ActivatedRoute).snapshot.data['querySettings'], - ), - ], + providers: [provideQuerySettings(() => inject(ActivatedRoute).snapshot.data['querySettings'])], }) export class ReturnPagesComponent { #route = inject(ActivatedRoute); @@ -56,10 +52,7 @@ export class ReturnPagesComponent { if (items) { if (items?.length === 1) { - return await this._navigateTo([ - 'receipt', - items[0].id.toString(), - ]); + return await this._navigateTo(['receipt', items[0].id.toString()]); } if (items?.length >= 0) { diff --git a/libs/feature/return/services/README.md b/libs/feature/return/services/README.md deleted file mode 100644 index 87b175e5e..000000000 --- a/libs/feature/return/services/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# feature-return-services - -This library was generated with [Nx](https://nx.dev). - -## Running unit tests - -Run `nx test feature-return-services` to execute the unit tests. diff --git a/libs/feature/return/services/eslint.config.mjs b/libs/feature/return/services/eslint.config.mjs deleted file mode 100644 index 7323f5897..000000000 --- a/libs/feature/return/services/eslint.config.mjs +++ /dev/null @@ -1,34 +0,0 @@ -import nx from '@nx/eslint-plugin'; -import baseConfig from '../../../../eslint.config.mjs'; - -export default [ - ...baseConfig, - ...nx.configs['flat/angular'], - ...nx.configs['flat/angular-template'], - { - files: ['**/*.ts'], - rules: { - '@angular-eslint/directive-selector': [ - 'error', - { - type: 'attribute', - prefix: 'lib', - style: 'camelCase', - }, - ], - '@angular-eslint/component-selector': [ - 'error', - { - type: 'element', - prefix: 'lib', - style: 'kebab-case', - }, - ], - }, - }, - { - files: ['**/*.html'], - // Override or add rules here - rules: {}, - }, -]; diff --git a/libs/feature/return/services/jest.config.ts b/libs/feature/return/services/jest.config.ts deleted file mode 100644 index 6e15f06bb..000000000 --- a/libs/feature/return/services/jest.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default { - displayName: 'feature-return-services', - preset: '../../../../jest.preset.js', - setupFilesAfterEnv: ['/src/test-setup.ts'], - coverageDirectory: '../../../../coverage/libs/feature/return/services', - transform: { - '^.+\\.(ts|mjs|js|html)$': [ - 'jest-preset-angular', - { - tsconfig: '/tsconfig.spec.json', - stringifyContentPathRegex: '\\.(html|svg)$', - }, - ], - }, - transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], - snapshotSerializers: [ - 'jest-preset-angular/build/serializers/no-ng-attributes', - 'jest-preset-angular/build/serializers/ng-snapshot', - 'jest-preset-angular/build/serializers/html-comment', - ], -}; diff --git a/libs/feature/return/services/project.json b/libs/feature/return/services/project.json deleted file mode 100644 index 0b08228a5..000000000 --- a/libs/feature/return/services/project.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "feature-return-services", - "$schema": "../../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/feature/return/services/src", - "prefix": "lib", - "projectType": "library", - "tags": [], - "targets": { - "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], - "options": { - "jestConfig": "libs/feature/return/services/jest.config.ts" - } - }, - "lint": { - "executor": "@nx/eslint:lint" - } - } -} diff --git a/libs/feature/return/services/src/index.ts b/libs/feature/return/services/src/index.ts deleted file mode 100644 index d71e61a89..000000000 --- a/libs/feature/return/services/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './lib/return-search.service'; -export * from './lib/return-search.store'; -export * from './lib/schemas'; diff --git a/libs/feature/return/services/src/lib/return-search.service.ts b/libs/feature/return/services/src/lib/return-search.service.ts deleted file mode 100644 index db8352fd4..000000000 --- a/libs/feature/return/services/src/lib/return-search.service.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { QuerySettingsDTO, ReceiptService } from '@generated/swagger/oms-api'; -import { map, Observable, throwError } from 'rxjs'; -import { - QueryTokenSchema, - QueryTokenInput, -} from './schemas/query-token.schema'; -import { - ListResponseArgs, - ListResponseArgsSchema, - ReceiptListItemSchema, -} from './schemas/receipt-list-item.schema'; -import { safeParse } from '@isa/utils/z-safe-parse'; - -@Injectable({ providedIn: 'root' }) -export class ReturnSearchService { - #receiptService = inject(ReceiptService); - - querySettings(): Observable { - return this.#receiptService.ReceiptQueryReceiptSettings().pipe( - map((res) => { - if (res.error || !res.result) { - throw new Error('Failed to fetch query settings'); - } - return res.result; - }), - ); - } - - search(queryToken: QueryTokenInput): Observable { - try { - queryToken = QueryTokenSchema.parse(queryToken); - } catch (error) { - return throwError(() => error); - } - - return this.#receiptService - .ReceiptQueryReceipt({ - queryToken, - }) - .pipe( - map((res) => { - if (res.error || !res.result) { - throw new Error('Failed to fetch receipt list items'); - } - - return safeParse(ListResponseArgsSchema, { - hits: res.hits, - skip: res.skip, - take: res.take, - error: res.error, - invalidProperties: res.invalidProperties, - result: safeParse(ReceiptListItemSchema.array(), res.result), - }); - }), - ); - } -} diff --git a/libs/feature/return/services/src/lib/return-search.store.ts b/libs/feature/return/services/src/lib/return-search.store.ts deleted file mode 100644 index 837ece68d..000000000 --- a/libs/feature/return/services/src/lib/return-search.store.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { patchState, signalStore, type, withMethods } from '@ngrx/signals'; -import { rxMethod } from '@ngrx/signals/rxjs-interop'; -import { - addEntity, - entityConfig, - updateEntity, - withEntities, -} from '@ngrx/signals/entities'; -import { debounceTime, distinctUntilChanged, pipe, switchMap, tap } from 'rxjs'; -import { ReturnSearchService } from './return-search.service'; -import { tapResponse } from '@ngrx/operators'; -import { inject } from '@angular/core'; -import { ReceiptListItem, QueryTokenSchema, ListResponseArgs } from './schemas'; - -export enum ReturnSearchStatus { - Idle = 'idle', - Pending = 'pending', - Success = 'success', - Error = 'error', -} - -export type ReturnSearchEntity = { - processId: number; - status: ReturnSearchStatus; - params?: Record; - items?: ReceiptListItem[]; - hits?: number; - error?: string | unknown; -}; - -const config = entityConfig({ - entity: type(), - selectId: (entity) => entity.processId, -}); - -export const ReturnSearchStore = signalStore( - { providedIn: 'root' }, - withEntities(config), - withMethods((store) => ({ - getEntity(processId: number): ReturnSearchEntity | undefined { - return store.entities().find((e) => e.processId === processId); - }, - })), - withMethods((store) => ({ - _getQueryToken({ - params, - skip = 0, - }: { - params: Record; - skip: number; - }) { - const { qs, orderBy = [], ...filter } = params; - return { - filter, - input: { - qs, - }, - orderBy, - skip, - take: 25, - }; - }, - _beforeSearch(processId: number) { - const entity = store.getEntity(processId); - if (entity) { - patchState( - store, - updateEntity( - { - id: processId, - changes: { - status: ReturnSearchStatus.Pending, - items: [], - hits: 0, - }, - }, - config, - ), - ); - } else { - const entity: ReturnSearchEntity = { - processId, - status: ReturnSearchStatus.Pending, - }; - patchState(store, addEntity(entity, config)); - } - }, - _beforeReload(processId: number) { - patchState( - store, - updateEntity( - { - id: processId, - changes: { - status: ReturnSearchStatus.Pending, - }, - }, - config, - ), - ); - }, - _handleSearchSuccess({ - processId, - response, - }: { - processId: number; - response: ListResponseArgs; - }) { - patchState( - store, - updateEntity( - { - id: processId, - changes: { - status: ReturnSearchStatus.Success, - hits: response.hits, - items: response.result, - }, - }, - config, - ), - ); - }, - _handleReloadSuccess({ - processId, - response, - }: { - processId: number; - response: ListResponseArgs; - }) { - const entityItems = store.getEntity(processId)?.items; - patchState( - store, - updateEntity( - { - id: processId, - changes: { - status: ReturnSearchStatus.Success, - hits: response.hits, - items: entityItems - ? [...entityItems, ...response.result] - : response.result, - }, - }, - config, - ), - ); - }, - _handleSearchError({ - processId, - error, - }: { - processId: number; - error: unknown; - }) { - console.error(error); - patchState( - store, - updateEntity( - { - id: processId, - changes: { - items: [], - hits: 0, - status: ReturnSearchStatus.Error, - error, - }, - }, - config, - ), - ); - }, - _handleReloadError({ - processId, - error, - }: { - processId: number; - error: unknown; - }) { - console.error(error); - patchState( - store, - updateEntity( - { - id: processId, - changes: { - status: ReturnSearchStatus.Error, - error, - }, - }, - config, - ), - ); - }, - })), - withMethods((store, returnSearchService = inject(ReturnSearchService)) => ({ - search: rxMethod<{ processId: number; params: Record }>( - pipe( - debounceTime(100), - distinctUntilChanged(), - tap(({ processId }) => store._beforeSearch(processId)), - switchMap(({ processId, params }) => - returnSearchService - .search( - QueryTokenSchema.parse(store._getQueryToken({ params, skip: 0 })), - ) - .pipe( - tapResponse( - (response) => - store._handleSearchSuccess({ processId, response }), - (error) => store._handleSearchError({ processId, error }), - ), - ), - ), - ), - ), - reload: rxMethod<{ processId: number; params: Record }>( - pipe( - debounceTime(100), - distinctUntilChanged(), - tap(({ processId }) => store._beforeReload(processId)), - switchMap(({ processId, params }) => - returnSearchService - .search( - QueryTokenSchema.parse( - store._getQueryToken({ - params, - skip: store.getEntity(processId)?.items?.length ?? 0, - }), - ), - ) - .pipe( - tapResponse( - (response) => - store._handleReloadSuccess({ processId, response }), - (error) => store._handleReloadError({ processId, error }), - ), - ), - ), - ), - ), - })), -); diff --git a/libs/feature/return/services/src/lib/schemas/address.schema.ts b/libs/feature/return/services/src/lib/schemas/address.schema.ts deleted file mode 100644 index f927392e0..000000000 --- a/libs/feature/return/services/src/lib/schemas/address.schema.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { z } from 'zod'; -import { GeoLocationSchema } from './geo-location.schema'; - -export const AddressSchema = z - .object({ - apartment: z.string().optional().describe('Apartment'), - careOf: z.string().optional().describe('c/o, zu Händen von'), - city: z.string().optional().describe('Ort'), - country: z - .string() - .regex(/^[A-Z]{3}$/) - .optional() - .describe('Land (ISO3166 A 3)'), - district: z.string().optional().describe('Stadtteil, District'), - geoLocation: GeoLocationSchema.optional().describe('Orts-Koordinaten'), - info: z.string().optional().describe('Adresszusatz'), - po: z.string().optional().describe('Postfach'), - region: z.string().optional().describe('Region'), - state: z.string().optional().describe('Bundesland, Bundesstaat, Kanton, ...'), - street: z.string().optional().describe('Straße'), - streetNumber: z.string().optional().describe('Hausnummer'), - zipCode: z.string().optional().describe('Postleitzahl'), - }) - .describe('AddressDTO'); - -export type Address = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/addressee.schema.ts b/libs/feature/return/services/src/lib/schemas/addressee.schema.ts deleted file mode 100644 index 614bdf4ec..000000000 --- a/libs/feature/return/services/src/lib/schemas/addressee.schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from 'zod'; -import { AddressSchema } from './address.schema'; -import { CommunicationDetailsSchema } from './communication-details.schemas'; -import { OrganisationSchema } from './receipt-list-item.schema'; -import { GenderSchema } from './gender.schema'; - -export const AddresseeSchema = z.object({ - address: AddressSchema.optional(), - communicationDetails: CommunicationDetailsSchema.optional(), - firstName: z.string().optional(), - lastName: z.string().optional(), - locale: z.string().optional(), - organisation: OrganisationSchema.optional(), - title: z.string().optional(), - gender: GenderSchema.optional(), -}); diff --git a/libs/feature/return/services/src/lib/schemas/branch.schema.ts b/libs/feature/return/services/src/lib/schemas/branch.schema.ts deleted file mode 100644 index 6970576d0..000000000 --- a/libs/feature/return/services/src/lib/schemas/branch.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { z } from 'zod'; - -export const BranchSchema = z.object({}); diff --git a/libs/feature/return/services/src/lib/schemas/buyer.schema.ts b/libs/feature/return/services/src/lib/schemas/buyer.schema.ts deleted file mode 100644 index 225c82e66..000000000 --- a/libs/feature/return/services/src/lib/schemas/buyer.schema.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { z } from 'zod'; -import { AddresseeSchema } from './addressee.schema'; - -export const BuyerSchema = AddresseeSchema.extend({}); - -export type Buyer = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/communication-details.schemas.ts b/libs/feature/return/services/src/lib/schemas/communication-details.schemas.ts deleted file mode 100644 index bba740b4f..000000000 --- a/libs/feature/return/services/src/lib/schemas/communication-details.schemas.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from 'zod'; - -export const CommunicationDetailsSchema = z.object({ - email: z.string().email(), - mobile: z.string().optional(), - phone: z.string().optional(), -}); - -export type CommunicationDetails = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/fetch-return-details.schema.ts b/libs/feature/return/services/src/lib/schemas/fetch-return-details.schema.ts deleted file mode 100644 index 8ced08148..000000000 --- a/libs/feature/return/services/src/lib/schemas/fetch-return-details.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -export const FetchReturnDetailsSchema = z.object({ - receiptId: z.number(), -}); - -export type FetchReturnDetails = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/geo-location.schema.ts b/libs/feature/return/services/src/lib/schemas/geo-location.schema.ts deleted file mode 100644 index 0f8f5c5de..000000000 --- a/libs/feature/return/services/src/lib/schemas/geo-location.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { z } from 'zod'; - -export const GeoLocationSchema = z.object({}); diff --git a/libs/feature/return/services/src/lib/schemas/index.ts b/libs/feature/return/services/src/lib/schemas/index.ts deleted file mode 100644 index 1236f66b4..000000000 --- a/libs/feature/return/services/src/lib/schemas/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -export * from './address.schema'; -export * from './address.type.schema'; -export * from './buyer.schema'; -export * from './communication-details.schemas'; -export * from './fetch-return-details.schema'; -export * from './geo-location.schema'; -export * from './label.schema'; -export * from './order.schema'; -export * from './payer-2.schema'; -export * from './payment-info.schema'; -export * from './payment.schema'; -export * from './query-token.schema'; -export * from './receipt-delivery-type.schema'; -export * from './receipt-item.schema'; -export * from './receipt-list-item.schema'; -export * from './receipt-type.schema'; -export * from './receipt.schema'; -export * from './response-args-of-receipt.schema'; -export * from './response-args.schema'; -export * from './shipping-address-2.schema'; -export * from './shipping-type.schema'; diff --git a/libs/feature/return/services/src/lib/schemas/label.schema.ts b/libs/feature/return/services/src/lib/schemas/label.schema.ts deleted file mode 100644 index d9a9835ef..000000000 --- a/libs/feature/return/services/src/lib/schemas/label.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { z } from 'zod'; - -export const LabelSchema = z.object({}); diff --git a/libs/feature/return/services/src/lib/schemas/order-item-type.schema.ts b/libs/feature/return/services/src/lib/schemas/order-item-type.schema.ts deleted file mode 100644 index ce5287bf9..000000000 --- a/libs/feature/return/services/src/lib/schemas/order-item-type.schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from 'zod'; - -export enum OrderItemType { - NotSet = 0, - SignleItem = 1, - VATBundle = 2, - ItemPrice = 4, - ComponentPrice = 8, - SubItem = 16, - Accessory = 32, - Set = 64, - Postage = 128, - HandlingFee = 256, - Voucher = 512, -} - -export const OrderItemTypeSchema = z.nativeEnum(OrderItemType); diff --git a/libs/feature/return/services/src/lib/schemas/order.schema.ts b/libs/feature/return/services/src/lib/schemas/order.schema.ts deleted file mode 100644 index 43a7f61b5..000000000 --- a/libs/feature/return/services/src/lib/schemas/order.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -export const OrderSchema = z.object({ - id: z.number(), - orderNumber: z.string(), - orderDate: z.coerce.date(), -}); diff --git a/libs/feature/return/services/src/lib/schemas/payer-2.schema.ts b/libs/feature/return/services/src/lib/schemas/payer-2.schema.ts deleted file mode 100644 index f89defb3e..000000000 --- a/libs/feature/return/services/src/lib/schemas/payer-2.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { AddresseeSchema } from './addressee.schema'; - -export const Payer2Schema = AddresseeSchema.extend({}); diff --git a/libs/feature/return/services/src/lib/schemas/payment-info.schema.ts b/libs/feature/return/services/src/lib/schemas/payment-info.schema.ts deleted file mode 100644 index f8222d8b2..000000000 --- a/libs/feature/return/services/src/lib/schemas/payment-info.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { z } from 'zod'; - -export const PaymentInfoSchema = z.object({}); diff --git a/libs/feature/return/services/src/lib/schemas/payment-status.schema.ts b/libs/feature/return/services/src/lib/schemas/payment-status.schema.ts deleted file mode 100644 index 1dd9ad6dd..000000000 --- a/libs/feature/return/services/src/lib/schemas/payment-status.schema.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from 'zod'; - -export enum PaymentStatus { - NotSet = 0, - ProformaInvoicePrinted = 1, - InvoicePrinted = 2, - Paid = 4, - OnApproval = 8, - Free = 16, - Dunning1 = 32, - ProformaInvoicePaid = 64, - Canceled = 128, - Dunning2 = 256, - PartiallyPaid = 512, - Outstanding = 1024, -} - -export const PaymentStatusSchema = z.nativeEnum(PaymentStatus); diff --git a/libs/feature/return/services/src/lib/schemas/payment.schema.ts b/libs/feature/return/services/src/lib/schemas/payment.schema.ts deleted file mode 100644 index d97052de9..000000000 --- a/libs/feature/return/services/src/lib/schemas/payment.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { z } from 'zod'; - -export const Payment = z.object({}); diff --git a/libs/feature/return/services/src/lib/schemas/price-value.schema.ts b/libs/feature/return/services/src/lib/schemas/price-value.schema.ts deleted file mode 100644 index f44d7dcdf..000000000 --- a/libs/feature/return/services/src/lib/schemas/price-value.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -export const PriceValueSchema = z.object({ - value: z.number(), - currency: z.string(), - currencySymbol: z.string().optional(), -}); diff --git a/libs/feature/return/services/src/lib/schemas/price.schema.ts b/libs/feature/return/services/src/lib/schemas/price.schema.ts deleted file mode 100644 index 22cd11367..000000000 --- a/libs/feature/return/services/src/lib/schemas/price.schema.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { z } from 'zod'; -import { PriceValueSchema } from './price-value.schema'; -import { VATValueSchema } from './vat-value.schema'; - -export const PriceSchema = z.object({ - value: PriceValueSchema, - vat: VATValueSchema, -}); diff --git a/libs/feature/return/services/src/lib/schemas/product.schema.ts b/libs/feature/return/services/src/lib/schemas/product.schema.ts deleted file mode 100644 index dd7c012d4..000000000 --- a/libs/feature/return/services/src/lib/schemas/product.schema.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from 'zod'; - -export const ProductSchema = z.object({ - name: z.string(), - contributors: z.string(), - ean: z.string(), - manufacturer: z.string(), - publicationDate: z.coerce.date(), - format: z.string(), - formatDetail: z.string(), -}); - -export type Product = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/receipt-delivery-type.schema.ts b/libs/feature/return/services/src/lib/schemas/receipt-delivery-type.schema.ts deleted file mode 100644 index 6d645a4b2..000000000 --- a/libs/feature/return/services/src/lib/schemas/receipt-delivery-type.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -export enum ReceiptDeliveryType { - NotSet = 0, -} - -export const ReceiptDeliveryTypeSchema = z.nativeEnum(ReceiptDeliveryType); diff --git a/libs/feature/return/services/src/lib/schemas/receipt-item.schema.ts b/libs/feature/return/services/src/lib/schemas/receipt-item.schema.ts deleted file mode 100644 index 925edc4de..000000000 --- a/libs/feature/return/services/src/lib/schemas/receipt-item.schema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { EntityContainerSchema } from '@isa/common/result'; -import { z } from 'zod'; -import { BranchSchema } from './branch.schema'; -import { OrderItemTypeSchema } from './order-item-type.schema'; -import { PaymentStatusSchema } from './payment-status.schema'; -import { ProductSchema } from './product.schema'; -import { PriceSchema } from './price.schema'; - -export const ReceiptItemSchema = z.object({ - id: z.number(), - lineNumber: z.number(), - orderBranch: EntityContainerSchema(BranchSchema), - orderItemType: OrderItemTypeSchema, - paymentStatus: PaymentStatusSchema, - product: ProductSchema, - price: PriceSchema, -}); - -export type ReceiptItem = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/receipt-list-item.schema.ts b/libs/feature/return/services/src/lib/schemas/receipt-list-item.schema.ts deleted file mode 100644 index a63bb8a76..000000000 --- a/libs/feature/return/services/src/lib/schemas/receipt-list-item.schema.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { z } from 'zod'; -import { ResponseArgsSchema } from './response-args.schema'; -import { CommunicationDetailsSchema } from './communication-details.schemas'; -import { AddressSchema } from './address.schema'; - -// PersonNamesDTO -export const PersonSchema = z.object({ - firstName: z.string().optional(), - gender: z.number().optional(), - lastName: z.string().optional(), - title: z.string().optional(), -}); - -// OrganisationDTO -export const OrganisationSchema = z.object({ - name: z.string(), -}); - -// AddresseeDTO -export const AddresseeSchema = z.object({ - person: PersonSchema, - address: AddressSchema.optional(), - organisation: OrganisationSchema.optional(), - communicationDetails: CommunicationDetailsSchema.optional(), -}); - -// ReceiptListItemDTO -export const ReceiptListItemSchema = z.object({ - id: z.number(), - label: z.string(), - orderNumber: z.string(), - receiptNumber: z.string(), - printedDate: z.string(), - billing: AddresseeSchema, -}); - -// ListResponseArgsOfReceiptListItemDTO -export const ListResponseArgsSchema = ResponseArgsSchema.extend({ - hits: z.number(), - skip: z.number(), - take: z.number(), - result: ReceiptListItemSchema.array(), -}); - -// TODO: Auslagern um ein generisches ListResponseArgs Schema zu haben -export function createListResponseArgsSchema(schema: z.ZodSchema) { - return ListResponseArgsSchema.extend({ - result: schema.array(), - }); -} - -export type ListResponseArgs = z.infer; -export type ReceiptListItem = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/receipt.schema.ts b/libs/feature/return/services/src/lib/schemas/receipt.schema.ts deleted file mode 100644 index 02738ef21..000000000 --- a/libs/feature/return/services/src/lib/schemas/receipt.schema.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { z } from 'zod'; -import { BuyerSchema } from './buyer.schema'; -import { EntityContainerSchema } from '@isa/common/result'; -import { ReceiptItemSchema } from './receipt-item.schema'; -import { ReceiptTypeSchema } from './receipt-type.schema'; -import { OrderSchema } from './order.schema'; -import { Payer2Schema } from './payer-2.schema'; -import { ShippingAddress2Schema } from './shipping-address-2.schema'; - -export const ReceiptSchema = z.object({ - id: z.number(), - receiptType: ReceiptTypeSchema, - buyer: BuyerSchema, - items: EntityContainerSchema(ReceiptItemSchema).array(), - printedDate: z.coerce.date(), - receiptNumber: z.string(), - order: EntityContainerSchema(OrderSchema), - billing: Payer2Schema, - shipping: ShippingAddress2Schema, -}); - -export type Receipt = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/response-args-of-receipt.schema.ts b/libs/feature/return/services/src/lib/schemas/response-args-of-receipt.schema.ts deleted file mode 100644 index 0e4f23bba..000000000 --- a/libs/feature/return/services/src/lib/schemas/response-args-of-receipt.schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ResponseArgs } from '@isa/common/result'; -import { ReceiptSchema } from './receipt.schema'; -import { z } from 'zod'; - -export const ResponseArgsOfReceiptSchema = ResponseArgs(ReceiptSchema); - -export type ResponseArgsOfReceipt = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/response-args.schema.ts b/libs/feature/return/services/src/lib/schemas/response-args.schema.ts deleted file mode 100644 index ea6f59df7..000000000 --- a/libs/feature/return/services/src/lib/schemas/response-args.schema.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from "zod"; - -export const ResponseArgsSchema = z.object({ - error: z.boolean(), - invalidProperties: z.record(z.string()).optional(), - message: z.string().optional(), -}); - -export type ResponseArgs = z.infer; diff --git a/libs/feature/return/services/src/lib/schemas/shipping-address-2.schema.ts b/libs/feature/return/services/src/lib/schemas/shipping-address-2.schema.ts deleted file mode 100644 index e689fcc42..000000000 --- a/libs/feature/return/services/src/lib/schemas/shipping-address-2.schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { AddresseeSchema } from './receipt-list-item.schema'; - -export const ShippingAddress2Schema = AddresseeSchema.extend({}); diff --git a/libs/feature/return/services/src/lib/schemas/type-of-delivery.schema.ts b/libs/feature/return/services/src/lib/schemas/type-of-delivery.schema.ts deleted file mode 100644 index dc4f500a5..000000000 --- a/libs/feature/return/services/src/lib/schemas/type-of-delivery.schema.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { z } from 'zod'; - -export enum TypeOfDelivery { - NotSet = 0, - Standard = 1, - Express = 2, - AirMail = 4, - SeeOrOverland = 8, - Courier = 16, - CashOnDelivery = 32, - DeliveryVehicle = 64, -} - -export const TypeOfDeliverySchema = z.nativeEnum(TypeOfDelivery); diff --git a/libs/feature/return/services/src/lib/schemas/validation-status.schema.ts b/libs/feature/return/services/src/lib/schemas/validation-status.schema.ts deleted file mode 100644 index 5e1aeede2..000000000 --- a/libs/feature/return/services/src/lib/schemas/validation-status.schema.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { z } from 'zod'; - -export enum ValidationStatus { - NotSet = 0, - Validate = 1, - ValidateManually = 2, - ValidateAutomatically = 4, -} - -export const ValidationStatusSchema = z.nativeEnum(ValidationStatus); diff --git a/libs/feature/return/services/src/lib/schemas/vat-type.schema.ts b/libs/feature/return/services/src/lib/schemas/vat-type.schema.ts deleted file mode 100644 index 98ed1961d..000000000 --- a/libs/feature/return/services/src/lib/schemas/vat-type.schema.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { z } from 'zod'; - -export enum VATType { - NotSet = 0, - ZeroRate = 1, - StandardRate = 2, - MediumRate = 4, - ReducedRate = 8, - VeryReducedRate = 16, - RateForServices = 32, - TaxPaidAtSource = 64, - MixedVAT = 128, -} - -export const VATTypeSchema = z.nativeEnum(VATType); diff --git a/libs/feature/return/services/src/lib/schemas/vat-value.schema.ts b/libs/feature/return/services/src/lib/schemas/vat-value.schema.ts deleted file mode 100644 index a341b4f77..000000000 --- a/libs/feature/return/services/src/lib/schemas/vat-value.schema.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { z } from 'zod'; -import { VATTypeSchema } from './vat-type.schema'; - -export const VATValueSchema = z.object({ - inPercent: z.number(), - value: z.number(), - vatType: VATTypeSchema, -}); diff --git a/libs/feature/return/services/src/test-setup.ts b/libs/feature/return/services/src/test-setup.ts deleted file mode 100644 index ea414013f..000000000 --- a/libs/feature/return/services/src/test-setup.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; - -setupZoneTestEnv({ - errorOnUnknownElements: true, - errorOnUnknownProperties: true, -}); diff --git a/libs/feature/return/services/tsconfig.json b/libs/feature/return/services/tsconfig.json deleted file mode 100644 index 52a0866e0..000000000 --- a/libs/feature/return/services/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true - }, - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.lib.json" - }, - { - "path": "./tsconfig.spec.json" - } - ], - "extends": "../../../../tsconfig.base.json", - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } -} diff --git a/libs/feature/return/services/tsconfig.lib.json b/libs/feature/return/services/tsconfig.lib.json deleted file mode 100644 index 3321c94ee..000000000 --- a/libs/feature/return/services/tsconfig.lib.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../../../dist/out-tsc", - "declaration": true, - "declarationMap": true, - "inlineSources": true, - "types": [] - }, - "exclude": ["src/**/*.spec.ts", "src/test-setup.ts", "jest.config.ts", "src/**/*.test.ts"], - "include": ["src/**/*.ts"] -} diff --git a/libs/feature/return/services/tsconfig.spec.json b/libs/feature/return/services/tsconfig.spec.json deleted file mode 100644 index 7af5e2542..000000000 --- a/libs/feature/return/services/tsconfig.spec.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../../../dist/out-tsc", - "module": "commonjs", - "target": "es2016", - "types": ["jest", "node"] - }, - "files": ["src/test-setup.ts"], - "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] -} diff --git a/libs/oms/data-access/src/index.ts b/libs/oms/data-access/src/index.ts index 6917f0f0d..db1f1a2e1 100644 --- a/libs/oms/data-access/src/index.ts +++ b/libs/oms/data-access/src/index.ts @@ -1,6 +1,9 @@ +export * from './lib/errors'; export * from './lib/models'; export * from './lib/schemas'; export * from './lib/return-details.service'; export * from './lib/return-details.store'; export * from './lib/return-process.service'; export * from './lib/return-process.store'; +export * from './lib/return-search.service'; +export * from './lib/return-search.store'; diff --git a/libs/oms/data-access/src/lib/errors/return-search.error.ts b/libs/oms/data-access/src/lib/errors/return-search.error.ts new file mode 100644 index 000000000..a10315af2 --- /dev/null +++ b/libs/oms/data-access/src/lib/errors/return-search.error.ts @@ -0,0 +1,38 @@ +import { ListResponseArgs } from '@isa/common/result'; +import { QueryTokenInput } from '../schemas'; +import { ReceiptListItem } from '../models'; + +export const ReturnSearchErrorCode = { + PARSE_QUERY_TOKEN: 'PARSE_QUERY_TOKEN', +} as const; + +export type ReturnSearchErrorCode = + (typeof ReturnSearchErrorCode)[keyof typeof ReturnSearchErrorCode]; + +export class ReturnSearchError extends Error { + constructor( + public readonly code: ReturnSearchErrorCode, + message?: string, + ) { + super(message || code); + } +} + +export class ReturnSearchParseQueryTokenError extends ReturnSearchError { + constructor( + public queryToken: QueryTokenInput, + messsage: string, + ) { + super(ReturnSearchErrorCode.PARSE_QUERY_TOKEN, messsage); + } +} + +export class ReturnSearchSearchError extends ReturnSearchError { + constructor( + messsage: string, + public queryToken: QueryTokenInput, + public response?: ListResponseArgs, + ) { + super(ReturnSearchErrorCode.PARSE_QUERY_TOKEN, messsage); + } +} diff --git a/libs/feature/return/services/src/lib/schemas/address.type.schema.ts b/libs/oms/data-access/src/lib/models/address-type.ts similarity index 55% rename from libs/feature/return/services/src/lib/schemas/address.type.schema.ts rename to libs/oms/data-access/src/lib/models/address-type.ts index 5b545d62c..7ab5821ab 100644 --- a/libs/feature/return/services/src/lib/schemas/address.type.schema.ts +++ b/libs/oms/data-access/src/lib/models/address-type.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - export enum AddressType { NotSet = 0, Billing = 1, @@ -7,5 +5,3 @@ export enum AddressType { Buyer = 4, PackageStation = 8, } - -export const AddressTypeSchema = z.nativeEnum(AddressType); diff --git a/libs/feature/return/services/src/lib/schemas/gender.schema.ts b/libs/oms/data-access/src/lib/models/gender.ts similarity index 50% rename from libs/feature/return/services/src/lib/schemas/gender.schema.ts rename to libs/oms/data-access/src/lib/models/gender.ts index 8f0789aec..b65b55ccd 100644 --- a/libs/feature/return/services/src/lib/schemas/gender.schema.ts +++ b/libs/oms/data-access/src/lib/models/gender.ts @@ -1,10 +1,6 @@ -import { z } from 'zod'; - export enum Gender { NotSet = 0, Neutrum = 1, Male = 2, Female = 4, } - -export const GenderSchema = z.nativeEnum(Gender); diff --git a/libs/oms/data-access/src/lib/models/index.ts b/libs/oms/data-access/src/lib/models/index.ts index b49a4a7c3..970930ed0 100644 --- a/libs/oms/data-access/src/lib/models/index.ts +++ b/libs/oms/data-access/src/lib/models/index.ts @@ -1,8 +1,12 @@ +export * from './address-type'; export * from './buyer'; export * from './eligible-for-return'; +export * from './gender'; export * from './product'; export * from './quantity'; export * from './receipt-item'; +export * from './receipt-list-item'; +export * from './receipt-type'; export * from './receipt'; export * from './return-process-answer'; export * from './return-process-question-key'; @@ -10,3 +14,4 @@ export * from './return-process-question-type'; export * from './return-process-question'; export * from './return-process-status'; export * from './return-process'; +export * from './shipping-type'; diff --git a/libs/oms/data-access/src/lib/models/receipt-list-item.ts b/libs/oms/data-access/src/lib/models/receipt-list-item.ts new file mode 100644 index 000000000..77a6578b9 --- /dev/null +++ b/libs/oms/data-access/src/lib/models/receipt-list-item.ts @@ -0,0 +1,5 @@ +import { ReceiptListItemDTO } from '@generated/swagger/oms-api'; + +export interface ReceiptListItem extends ReceiptListItemDTO { + id: number; +} diff --git a/libs/feature/return/services/src/lib/schemas/receipt-type.schema.ts b/libs/oms/data-access/src/lib/models/receipt-type.ts similarity index 80% rename from libs/feature/return/services/src/lib/schemas/receipt-type.schema.ts rename to libs/oms/data-access/src/lib/models/receipt-type.ts index 868871396..edea5fc31 100644 --- a/libs/feature/return/services/src/lib/schemas/receipt-type.schema.ts +++ b/libs/oms/data-access/src/lib/models/receipt-type.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - export enum ReceiptType { NotSet = 0, ShippingNote = 1, @@ -15,5 +13,3 @@ export enum ReceiptType { CashReceipt = 1024, ReturnReceipt = 2048, } - -export const ReceiptTypeSchema = z.nativeEnum(ReceiptType); diff --git a/libs/feature/return/services/src/lib/schemas/shipping-type.schema.ts b/libs/oms/data-access/src/lib/models/shipping-type.ts similarity index 69% rename from libs/feature/return/services/src/lib/schemas/shipping-type.schema.ts rename to libs/oms/data-access/src/lib/models/shipping-type.ts index 22a574df7..565151440 100644 --- a/libs/feature/return/services/src/lib/schemas/shipping-type.schema.ts +++ b/libs/oms/data-access/src/lib/models/shipping-type.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - export enum ShippingType { NotSet = 0, PostCard = 1, @@ -11,5 +9,3 @@ export enum ShippingType { Palette = 64, MerchandiseShipmentSmall = 128, } - -export const ShippingTypeSchema = z.nativeEnum(ShippingType); diff --git a/libs/oms/data-access/src/lib/return-search.service.ts b/libs/oms/data-access/src/lib/return-search.service.ts new file mode 100644 index 000000000..785513fa6 --- /dev/null +++ b/libs/oms/data-access/src/lib/return-search.service.ts @@ -0,0 +1,73 @@ +import { inject, Injectable } from '@angular/core'; +import { QuerySettingsDTO, ReceiptService } from '@generated/swagger/oms-api'; +import { map, Observable, throwError } from 'rxjs'; +import { QueryTokenInput, QueryTokenSchema } from './schemas'; +import { ReceiptListItem } from './models'; +import { ListResponseArgs } from '@isa/common/result'; +import { + ReturnSearchParseQueryTokenError, + ReturnSearchSearchError, +} from './errors/return-search.error'; +import { ZodError } from 'zod'; + +@Injectable({ providedIn: 'root' }) +export class ReturnSearchService { + #receiptService = inject(ReceiptService); + + /** + * Fetches query settings for receipt search. + * + * @returns {Observable} An observable containing the query settings. + * @throws {Error} If the query settings cannot be fetched. + */ + querySettings(): Observable { + return this.#receiptService.ReceiptQueryReceiptSettings().pipe( + map((res) => { + if (res.error || !res.result) { + throw new Error('Failed to fetch query settings'); + } + return res.result; + }), + ); + } + + /** + * Executes a search for receipts based on the provided query token. + * + * @param {QueryTokenInput} queryToken - The query token containing search parameters. + * @returns {Observable>} An observable containing the search results. + * @throws {ReturnSearchParseQueryTokenError} If the query token is invalid. + * @throws {ReturnSearchSearchError} If the search fails due to an API error. + */ + search(queryToken: QueryTokenInput): Observable> { + try { + queryToken = QueryTokenSchema.parse(queryToken); + } catch (error) { + if (error instanceof ZodError) { + return throwError(() => new ReturnSearchParseQueryTokenError(queryToken, error.message)); + } + if (error instanceof Error) { + return throwError(() => new ReturnSearchParseQueryTokenError(queryToken, error.message)); + } + return throwError(() => new ReturnSearchParseQueryTokenError(queryToken, 'Unknown error')); + } + + return this.#receiptService + .ReceiptQueryReceipt({ + queryToken, + }) + .pipe( + map((res) => { + if (res.error) { + throw new ReturnSearchSearchError( + res.message || 'Unknown Error', + queryToken, + res as ListResponseArgs, + ); + } + + return res as ListResponseArgs; + }), + ); + } +} diff --git a/libs/oms/data-access/src/lib/return-search.store.spec.ts b/libs/oms/data-access/src/lib/return-search.store.spec.ts new file mode 100644 index 000000000..97fd9563b --- /dev/null +++ b/libs/oms/data-access/src/lib/return-search.store.spec.ts @@ -0,0 +1,168 @@ +import { createServiceFactory } from '@ngneat/spectator/jest'; +import { ReturnSearchStore, ReturnSearchStatus } from './return-search.store'; +import { ReturnSearchService } from './return-search.service'; +import { of, throwError } from 'rxjs'; +import { ListResponseArgs } from '@isa/common/result'; +import { ReceiptListItem } from './models'; + +describe('ReturnSearchStore', () => { + const createService = createServiceFactory({ + service: ReturnSearchStore, + mocks: [ReturnSearchService], + }); + + it('should create the store', () => { + const spectator = createService(); + expect(spectator.service).toBeTruthy(); + }); + + describe('getEntity', () => { + it('should return undefined if the entity does not exist', () => { + const spectator = createService(); + const entity = spectator.service.getEntity(1); + expect(entity).toBeUndefined(); + }); + + it('should return the entity if it exists', () => { + const spectator = createService(); + spectator.service.beforeSearch(1); + const entity = spectator.service.getEntity(1); + expect(entity).toBeDefined(); + expect(entity?.processId).toBe(1); + }); + }); + + describe('beforeSearch', () => { + it('should initialize a new entity if it does not exist', () => { + const spectator = createService(); + spectator.service.beforeSearch(1); + const entity = spectator.service.getEntity(1); + expect(entity).toEqual({ + processId: 1, + status: ReturnSearchStatus.Pending, + }); + }); + + it('should reset an existing entity', () => { + const spectator = createService(); + spectator.service.beforeSearch(1); + spectator.service.handleSearchSuccess({ + processId: 1, + response: { hits: 10, result: [], error: false, skip: 0, take: 10, invalidProperties: {} }, + }); + + spectator.service.beforeSearch(1); + const entity = spectator.service.getEntity(1); + expect(entity?.status).toBe(ReturnSearchStatus.Pending); + expect(entity?.items).toEqual([]); + expect(entity?.hits).toBe(0); + }); + }); + + describe('handleSearchSuccess', () => { + it('should update the entity with search results', () => { + const spectator = createService(); + const response: ListResponseArgs = { + hits: 5, + skip: 0, + error: false, + take: 10, + invalidProperties: {}, + result: [{ id: 1 }], + }; + + spectator.service.beforeSearch(1); + spectator.service.handleSearchSuccess({ processId: 1, response }); + + const entity = spectator.service.getEntity(1); + expect(entity?.status).toBe(ReturnSearchStatus.Success); + expect(entity?.hits).toBe(5); + expect(entity?.items).toEqual(response.result); + }); + }); + + describe('handleSearchError', () => { + it('should update the entity with an error status', () => { + const spectator = createService(); + const error = new Error('Search failed'); + + spectator.service.beforeSearch(1); + spectator.service.handleSearchError({ processId: 1, error }); + + const entity = spectator.service.getEntity(1); + expect(entity?.status).toBe(ReturnSearchStatus.Error); + expect(entity?.error).toBe(error); + }); + }); + + describe('search', () => { + it('should call the search service and handle success', () => { + const spectator = createService(); + const mockResponse: ListResponseArgs = { + hits: 3, + skip: 0, + error: false, + take: 10, + invalidProperties: {}, + result: [{ id: 1 }], + }; + const returnSearchService = spectator.inject(ReturnSearchService); + returnSearchService.search.mockReturnValue(of(mockResponse)); + + spectator.service.search({ processId: 1, params: {} }); + + const entity = spectator.service.getEntity(1); + expect(entity?.status).toBe(ReturnSearchStatus.Success); + expect(entity?.hits).toBe(3); + expect(entity?.items).toEqual(mockResponse.result); + }); + + it('should call the search service and handle error', () => { + const spectator = createService(); + const error = new Error('Search failed'); + const returnSearchService = spectator.inject(ReturnSearchService); + returnSearchService.search.mockReturnValue(throwError(() => error)); + + spectator.service.search({ processId: 1, params: {} }); + + const entity = spectator.service.getEntity(1); + expect(entity?.status).toBe(ReturnSearchStatus.Error); + expect(entity?.error).toBe(error); + }); + }); + + describe('reload', () => { + it('should append new results to the existing items', () => { + const spectator = createService(); + const initialResponse: ListResponseArgs = { + hits: 2, + skip: 0, + error: false, + take: 10, + invalidProperties: {}, + result: [{ id: 1 }], + }; + const reloadResponse: ListResponseArgs = { + hits: 3, + skip: 0, + error: false, + take: 10, + invalidProperties: {}, + result: [{ id: 2 }], + }; + const returnSearchService = spectator.inject(ReturnSearchService); + returnSearchService.search + .mockReturnValueOnce(of(initialResponse)) + .mockReturnValueOnce(of(reloadResponse)); + + spectator.service.search({ processId: 1, params: {} }); + spectator.service.reload({ processId: 1, params: {} }); + + const entity = spectator.service.getEntity(1); + expect(entity?.items).toEqual([ + { id: '1', name: 'Item 1' }, + { id: '2', name: 'Item 2' }, + ]); + }); + }); +}); diff --git a/libs/oms/data-access/src/lib/return-search.store.ts b/libs/oms/data-access/src/lib/return-search.store.ts new file mode 100644 index 000000000..dfd6da219 --- /dev/null +++ b/libs/oms/data-access/src/lib/return-search.store.ts @@ -0,0 +1,299 @@ +import { patchState, signalStore, type, withMethods } from '@ngrx/signals'; +import { rxMethod } from '@ngrx/signals/rxjs-interop'; +import { addEntity, entityConfig, updateEntity, withEntities } from '@ngrx/signals/entities'; +import { debounceTime, distinctUntilChanged, pipe, switchMap, tap } from 'rxjs'; +import { ReturnSearchService } from './return-search.service'; +import { tapResponse } from '@ngrx/operators'; +import { inject } from '@angular/core'; +import { QueryTokenSchema } from './schemas'; +import { ListResponseArgs } from '@isa/common/result'; +import { ReceiptListItem } from './models'; +import { isEqual } from 'lodash-es'; + +/** + * Enum representing the status of a return search process. + */ +export enum ReturnSearchStatus { + Idle = 'idle', + Pending = 'pending', + Success = 'success', + Error = 'error', +} + +/** + * Type definition for a return search entity. + */ +export type ReturnSearchEntity = { + processId: number; // Unique identifier for the search process + status: ReturnSearchStatus; // Current status of the search process + params?: Record; // Search parameters + items?: ReceiptListItem[]; // List of receipt items returned by the search + hits?: number; // Total number of results + error?: string | unknown; // Error details, if any +}; + +const config = entityConfig({ + entity: type(), + selectId: (entity) => entity.processId, +}); + +/** + * Signal store for managing return search state and operations. + */ +export const ReturnSearchStore = signalStore( + { providedIn: 'root' }, + withEntities(config), + withMethods((store) => ({ + /** + * Retrieves a return search entity by its process ID. + * + * @param {number} processId - The unique identifier of the search process. + * @returns {ReturnSearchEntity | undefined} The corresponding entity or undefined if not found. + */ + getEntity(processId: number): ReturnSearchEntity | undefined { + return store.entities().find((e) => e.processId === processId); + }, + })), + withMethods((store) => ({ + /** + * Constructs a query token for the search operation. + * + * @param {Object} options - Options for constructing the query token. + * @param {Record} options.params - Search parameters. + * @param {number} [options.skip=0] - Number of items to skip for pagination. + * @returns {Object} The constructed query token. + */ + getQueryToken({ params, skip = 0 }: { params: Record; skip: number }) { + const { qs, orderBy = [], ...filter } = params; + return { + filter, + input: { + qs, + }, + orderBy, + skip, + take: 25, + }; + }, + + /** + * Prepares the store state before initiating a search operation. + * + * @param {number} processId - The unique identifier of the search process. + */ + beforeSearch(processId: number) { + const entity = store.getEntity(processId); + if (entity) { + patchState( + store, + updateEntity( + { + id: processId, + changes: { + status: ReturnSearchStatus.Pending, + items: [], + hits: 0, + }, + }, + config, + ), + ); + } else { + const entity: ReturnSearchEntity = { + processId, + status: ReturnSearchStatus.Pending, + }; + patchState(store, addEntity(entity, config)); + } + }, + + /** + * Prepares the store state before reloading search results. + * + * @param {number} processId - The unique identifier of the search process. + */ + beforeReload(processId: number) { + patchState( + store, + updateEntity( + { + id: processId, + changes: { + status: ReturnSearchStatus.Pending, + }, + }, + config, + ), + ); + }, + + /** + * Handles the success response of a search operation. + * + * @param {Object} options - Options for handling the success response. + * @param {number} options.processId - The unique identifier of the search process. + * @param {ListResponseArgs} options.response - The search response. + */ + handleSearchSuccess({ + processId, + response, + }: { + processId: number; + response: ListResponseArgs; + }) { + patchState( + store, + updateEntity( + { + id: processId, + changes: { + status: ReturnSearchStatus.Success, + hits: response.hits, + items: response.result, + }, + }, + config, + ), + ); + }, + + /** + * Handles the success response of a reload operation. + * + * @param {Object} options - Options for handling the success response. + * @param {number} options.processId - The unique identifier of the search process. + * @param {ListResponseArgs} options.response - The reload response. + */ + handleReloadSuccess({ + processId, + response, + }: { + processId: number; + response: ListResponseArgs; + }) { + const entityItems = store.getEntity(processId)?.items; + patchState( + store, + updateEntity( + { + id: processId, + changes: { + status: ReturnSearchStatus.Success, + hits: response.hits, + items: entityItems ? [...entityItems, ...response.result] : response.result, + }, + }, + config, + ), + ); + }, + + /** + * Handles errors encountered during a search operation. + * + * @param {Object} options - Options for handling the error. + * @param {number} options.processId - The unique identifier of the search process. + * @param {unknown} options.error - The error encountered. + */ + handleSearchError({ processId, error }: { processId: number; error: unknown }) { + console.error(error); + patchState( + store, + updateEntity( + { + id: processId, + changes: { + items: [], + hits: 0, + status: ReturnSearchStatus.Error, + error, + }, + }, + config, + ), + ); + }, + + /** + * Handles errors encountered during a reload operation. + * + * @param {Object} options - Options for handling the error. + * @param {number} options.processId - The unique identifier of the search process. + * @param {unknown} options.error - The error encountered. + */ + handleReloadError({ processId, error }: { processId: number; error: unknown }) { + console.error(error); + patchState( + store, + updateEntity( + { + id: processId, + changes: { + status: ReturnSearchStatus.Error, + error, + }, + }, + config, + ), + ); + }, + })), + withMethods((store, returnSearchService = inject(ReturnSearchService)) => ({ + /** + * Initiates a search operation. + * + * @param {Object} options - Options for the search operation. + * @param {number} options.processId - The unique identifier of the search process. + * @param {Record} options.params - Search parameters. + */ + search: rxMethod<{ processId: number; params: Record }>( + pipe( + debounceTime(100), + distinctUntilChanged(), + tap(({ processId }) => store.beforeSearch(processId)), + switchMap(({ processId, params }) => + returnSearchService + .search(QueryTokenSchema.parse(store.getQueryToken({ params, skip: 0 }))) + .pipe( + tapResponse( + (response) => store.handleSearchSuccess({ processId, response }), + (error) => store.handleSearchError({ processId, error }), + ), + ), + ), + ), + ), + + /** + * Initiates a reload operation to fetch additional search results. + * + * @param {Object} options - Options for the reload operation. + * @param {number} options.processId - The unique identifier of the search process. + * @param {Record} options.params - Search parameters. + */ + reload: rxMethod<{ processId: number; params: Record }>( + pipe( + debounceTime(100), + distinctUntilChanged(isEqual), + tap(({ processId }) => store.beforeReload(processId)), + switchMap(({ processId, params }) => + returnSearchService + .search( + QueryTokenSchema.parse( + store.getQueryToken({ + params, + skip: store.getEntity(processId)?.items?.length ?? 0, + }), + ), + ) + .pipe( + tapResponse( + (response) => store.handleReloadSuccess({ processId, response }), + (error) => store.handleReloadError({ processId, error }), + ), + ), + ), + ), + ), + })), +); diff --git a/libs/oms/data-access/src/lib/schemas/index.ts b/libs/oms/data-access/src/lib/schemas/index.ts index ee6e56d27..31b442477 100644 --- a/libs/oms/data-access/src/lib/schemas/index.ts +++ b/libs/oms/data-access/src/lib/schemas/index.ts @@ -1 +1,2 @@ export * from './fetch-return-details'; +export * from './query-token.schema'; diff --git a/libs/feature/return/services/src/lib/schemas/query-token.schema.ts b/libs/oms/data-access/src/lib/schemas/query-token.schema.ts similarity index 87% rename from libs/feature/return/services/src/lib/schemas/query-token.schema.ts rename to libs/oms/data-access/src/lib/schemas/query-token.schema.ts index 2611fd06e..f9532e091 100644 --- a/libs/feature/return/services/src/lib/schemas/query-token.schema.ts +++ b/libs/oms/data-access/src/lib/schemas/query-token.schema.ts @@ -15,4 +15,4 @@ export const QueryTokenSchema = z.object({ take: z.number().default(25), }); -export type QueryTokenInput = z.input; +export type QueryTokenInput = z.infer; diff --git a/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.pipe.ts b/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.pipe.ts index 1135de8ed..9a5c7492d 100644 --- a/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.pipe.ts +++ b/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.pipe.ts @@ -1,6 +1,6 @@ import { inject, Pipe, PipeTransform } from '@angular/core'; -import { ReceiptType } from '@feature/return/services'; import { ReceiptTypeTranslationService } from './receipt-type-translation.service'; +import { ReceiptType } from '@isa/oms/data-access'; @Pipe({ name: 'omsReceiptTypeTranslation', diff --git a/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.service.ts b/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.service.ts index 97bf0f1c9..79985454a 100644 --- a/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.service.ts +++ b/libs/oms/utils/translation/src/lib/receipt-type/receipt-type-translation.service.ts @@ -1,5 +1,5 @@ import { inject, Injectable, InjectionToken, Provider } from '@angular/core'; -import { ReceiptType } from '@feature/return/services'; +import { ReceiptType } from '@isa/oms/data-access'; const receiptTypeTranslations = { [ReceiptType.NotSet]: 'Nicht gesetzt', diff --git a/package-lock.json b/package-lock.json index 678805a73..6ada25016 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,9 +29,11 @@ "@ngrx/signals": "19.1.0", "@ngrx/store": "19.1.0", "@ngrx/store-devtools": "19.1.0", + "@types/lodash-es": "^4.17.12", "angular-oauth2-oidc": "^17.0.2", "angular-oauth2-oidc-jwks": "^17.0.2", "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "moment": "^2.30.1", "ng2-pdf-viewer": "^10.4.0", "ngx-matomo-client": "^7.0.1", @@ -75,7 +77,6 @@ "@swc-node/register": "~1.9.1", "@swc/core": "~1.5.7", "@swc/helpers": "~0.5.11", - "@types/jasmine": "~5.1.4", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.16", "@types/node": "18.16.9", @@ -87,20 +88,10 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.2.3", "husky": "^9.1.7", - "jasmine-core": "~5.4.0", - "jasmine-marbles": "^0.9.2", - "jasmine-spec-reporter": "~7.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-preset-angular": "~14.4.0", - "karma": "~6.4.4", - "karma-chrome-launcher": "~3.2.0", - "karma-coverage": "^2.2.1", - "karma-coverage-istanbul-reporter": "~3.0.3", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.1.0", - "karma-junit-reporter": "~2.0.1", "ng-mocks": "^14.13.4", "ng-swagger-gen": "^2.3.1", "nx": "20.4.6", @@ -3810,6 +3801,8 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.1.90" } @@ -9559,7 +9552,9 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@softarc/eslint-plugin-sheriff": { "version": "0.18.0", @@ -11478,6 +11473,8 @@ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -11623,13 +11620,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jasmine": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.7.tgz", - "integrity": "sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/jest": { "version": "29.5.14", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", @@ -11705,9 +11695,17 @@ "version": "4.17.16", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", - "dev": true, "license": "MIT" }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", @@ -13311,6 +13309,8 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^4.5.0 || >= 5.9" } @@ -14566,16 +14566,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -14724,6 +14714,8 @@ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -14750,6 +14742,8 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14760,6 +14754,8 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.8" } @@ -14770,6 +14766,8 @@ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -14788,7 +14786,9 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", @@ -14796,6 +14796,8 @@ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14809,6 +14811,8 @@ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -14966,6 +14970,8 @@ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "object-assign": "^4", "vary": "^1" @@ -15448,7 +15454,9 @@ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/cwd": { "version": "0.10.0", @@ -15943,7 +15951,9 @@ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/didyoumean": { "version": "1.2.2", @@ -16038,6 +16048,8 @@ "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", @@ -16278,6 +16290,8 @@ "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", @@ -16299,6 +16313,8 @@ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -16309,6 +16325,8 @@ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -16319,6 +16337,8 @@ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -16337,6 +16357,8 @@ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -16386,6 +16408,8 @@ "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -17174,7 +17198,9 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/external-editor": { "version": "3.1.0", @@ -19858,6 +19884,8 @@ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8.0.0" }, @@ -20073,36 +20101,6 @@ "node": "*" } }, - "node_modules/jasmine-core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.4.0.tgz", - "integrity": "sha512-T4fio3W++llLd7LGSGsioriDHgWyhoL6YTu4k37uwJLF7DzOzspz7mNxRoM3cQdLWtL/ebazQpIf/yZGJx/gzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jasmine-marbles": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/jasmine-marbles/-/jasmine-marbles-0.9.2.tgz", - "integrity": "sha512-T7RjG4fRsdiGGzbQZ6Kj39qYt6O1/KIcR4FkUNsD3DUGkd/AzpwzN+xtk0DXlLWEz5BaVdK1SzMgQDVw879c4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20" - }, - "peerDependencies": { - "rxjs": "^7.0.0" - } - }, - "node_modules/jasmine-spec-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", - "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "colors": "1.4.0" - } - }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -21714,6 +21712,8 @@ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -21747,276 +21747,6 @@ "node": ">= 10" } }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/mattlewis92" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma-coverage/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-coverage/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", - "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", - "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma-junit-reporter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-2.0.1.tgz", - "integrity": "sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-is-absolute": "^1.0.0", - "xmlbuilder": "12.0.0" - }, - "engines": { - "node": ">= 8" - }, - "peerDependencies": { - "karma": ">=0.9" - } - }, "node_modules/karma-source-map-support": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", @@ -22033,6 +21763,8 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -22044,6 +21776,8 @@ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -22069,6 +21803,8 @@ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -22080,7 +21816,9 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/karma/node_modules/glob-parent": { "version": "5.1.2", @@ -22088,6 +21826,8 @@ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -22101,6 +21841,8 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -22111,6 +21853,8 @@ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "mime": "cli.js" }, @@ -22124,6 +21868,8 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -22137,6 +21883,8 @@ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -22150,6 +21898,8 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8.6" }, @@ -22163,6 +21913,8 @@ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -22176,6 +21928,8 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -22186,6 +21940,8 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -22201,6 +21957,8 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -22219,6 +21977,8 @@ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -22238,6 +21998,8 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -22738,6 +22500,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", @@ -27006,6 +26774,8 @@ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.9" } @@ -28741,6 +28511,8 @@ "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -28760,6 +28532,8 @@ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" @@ -28771,6 +28545,8 @@ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -28789,6 +28565,8 @@ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -28811,6 +28589,8 @@ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -28825,6 +28605,8 @@ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -28843,6 +28625,8 @@ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -30827,6 +30611,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "bin": { "ua-parser-js": "script/cli.js" }, @@ -31241,6 +31027,8 @@ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -32214,16 +32002,6 @@ "node": ">=12" } }, - "node_modules/xmlbuilder": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-12.0.0.tgz", - "integrity": "sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index 2b86e007d..b428d5b5e 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "angular-oauth2-oidc": "^17.0.2", "angular-oauth2-oidc-jwks": "^17.0.2", "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "moment": "^2.30.1", "ng2-pdf-viewer": "^10.4.0", "ngx-matomo-client": "^7.0.1", @@ -88,6 +89,7 @@ "@swc/helpers": "~0.5.11", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.16", + "@types/lodash-es": "^4.17.12", "@types/node": "18.16.9", "@types/uuid": "^10.0.0", "@typescript-eslint/utils": "^8.19.0", diff --git a/tsconfig.base.json b/tsconfig.base.json index eea090744..7c89762d4 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -22,7 +22,6 @@ "libs/feature/return/containers/src/index.ts" ], "@feature/return/pages": ["libs/feature/return/pages/src/index.ts"], - "@feature/return/services": ["libs/feature/return/services/src/index.ts"], "@generated/swagger/availability-api": [ "generated/swagger/availability-api/src/index.ts" ],