diff --git a/.eslintrc.json b/.eslintrc.json index 20b1066..50e2755 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -24,7 +24,11 @@ }, { "files": ["*.ts"], - "extends": ["plugin:@nx/typescript", "plugin:sonarjs/recommended", "plugin:perfectionist/recommended-natural"], + "extends": [ + "plugin:@nx/typescript", + "plugin:sonarjs/recommended", + "plugin:perfectionist/recommended-natural" + ], "rules": { "sonarjs/no-duplicate-string": "warn", "perfectionist/sort-classes": [ @@ -44,13 +48,18 @@ "private-method" ] } - ] + ], + "@typescript-eslint/no-extra-semi": "error", + "no-extra-semi": "off" } }, { "files": ["*.js", "*.jsx"], "extends": ["plugin:@nx/javascript"], - "rules": {} + "rules": { + "@typescript-eslint/no-extra-semi": "error", + "no-extra-semi": "off" + } }, { "files": ["*.spec.ts", "*.spec.tsx", "*.spec.js", "*.spec.jsx"], diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index e343c6b..cb17eab 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [16.x] + node-version: [18.x] steps: - name: Checkout diff --git a/README.md b/README.md index 16151ee..79db9d6 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ An event is a representation of something that has happened in the past. It is i Each event serves three purposes : * It will be persisted so that it can be used to reconstruct the state of an aggregate root * It will be passed to any internal subscribers that need to react to this event (e.g. updating the read model) -* When it's time to recreate the aggregate root, the event will be processed by the correct method in the aggregate root +* When it's time to recreate the aggregate root, the event will be applied by the correct method in the aggregate root There is no specific requirement for the structure of an event, but it is recommended to keep it simple and immutable. The [class-transformer](https://github.com/typestack/class-transformer) library is utilized under the hood to save and read the events from the database. Therefore, your event classes should adhere to the rules of class-transformer to be properly serialized and deserialized. @@ -175,7 +175,7 @@ export class UserUpdatedEvent { We start this example by defining two simple events for a user: a creation event and an update event. Each one has its own data, and they are identified by a unique name which is set with the `@DomainEvent` decorator. ```typescript -import { AggregateRoot, AggregateRootName, EventProcessor, StoredEvent } from "@event-nest/core"; +import { AggregateRoot, AggregateRootName, ApplyEvent, StoredEvent } from "@event-nest/core"; @AggregateRootName("User") export class User extends AggregateRoot { @@ -189,7 +189,7 @@ export class User extends AggregateRoot { public static createNew(id: string, name: string, email: string): User { const user = new User(id); const event = new UserCreatedEvent(name, email); - user.processUserCreatedEvent(event); + user.applyUserCreatedEvent(event); user.append(event); return user; } @@ -202,18 +202,18 @@ export class User extends AggregateRoot { public update(newName: string) { const event = new UserUpdatedEvent(newName); - this.processUserUpdatedEvent(event); + this.applyUserUpdatedEvent(event); this.append(event); } - @EventProcessor(UserCreatedEvent) - private processUserCreatedEvent = (event: UserCreatedEvent) => { + @ApplyEvent(UserCreatedEvent) + private applyUserCreatedEvent = (event: UserCreatedEvent) => { this.name = event.name; this.email = event.email; }; - @EventProcessor(UserUpdatedEvent) - private processUserUpdatedEvent = (event: UserUpdatedEvent) => { + @ApplyEvent(UserUpdatedEvent) + private applyUserUpdatedEvent = (event: UserUpdatedEvent) => { this.name = event.newName; }; @@ -232,7 +232,7 @@ In our case, we have the following creation cases : The `reconstitute` method will initiate the event processing based on the events order. -To process each event, we have defined two private methods which are decorated with the `@EventProcessor` decorator. Each method will be called when the corresponding event is retrieved, and it's ready to be processed. +To apply each event, we have defined two private methods which are decorated with the `@ApplyEvent` decorator. Each method will be called when the corresponding event is retrieved, and it's ready to be processed. This is the place to update the object's internal state based on the event's data. **Make sure that these methods are defined as arrow functions, otherwise they won't be called.** diff --git a/apps/example/project.json b/apps/example/project.json index 2aaafe9..0a88c6d 100644 --- a/apps/example/project.json +++ b/apps/example/project.json @@ -3,6 +3,7 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/example/src", "projectType": "application", + "tags": [], "targets": { "build": { "executor": "@nx/webpack:webpack", @@ -38,10 +39,6 @@ } } }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] - }, "test": { "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], @@ -49,6 +46,5 @@ "jestConfig": "apps/example/jest.config.ts" } } - }, - "tags": [] + } } diff --git a/apps/example/src/app/user/user.ts b/apps/example/src/app/user/user.ts index a95950a..a31641a 100644 --- a/apps/example/src/app/user/user.ts +++ b/apps/example/src/app/user/user.ts @@ -1,4 +1,4 @@ -import { AggregateRoot, AggregateRootName, EventProcessor, StoredEvent } from "@event-nest/core"; +import { AggregateRoot, AggregateRootName, ApplyEvent, StoredEvent } from "@event-nest/core"; import { UserCreatedEvent, UserUpdatedEvent } from "./user-events"; @@ -7,13 +7,13 @@ export class User extends AggregateRoot { private _email: string; private _name: string; - @EventProcessor(UserCreatedEvent) + @ApplyEvent(UserCreatedEvent) private processUserCreatedEvent = (event: UserCreatedEvent) => { this._name = event.name; this._email = event.email; }; - @EventProcessor(UserUpdatedEvent) + @ApplyEvent(UserUpdatedEvent) private processUserUpdatedEvent = (event: UserUpdatedEvent) => { this._name = event.newName; }; diff --git a/libs/core/README.md b/libs/core/README.md index ebcfc6a..d7551c1 100644 --- a/libs/core/README.md +++ b/libs/core/README.md @@ -123,7 +123,7 @@ An event is a representation of something that has happened in the past. It is i Each event serves three purposes : * It will be persisted so that it can be used to reconstruct the state of an aggregate root * It will be passed to any internal subscribers that need to react to this event (e.g. updating the read model) -* When it's time to recreate the aggregate root, the event will be processed by the correct method in the aggregate root +* When it's time to recreate the aggregate root, the event will be applied by the correct method in the aggregate root There is no specific requirement for the structure of an event, but it is recommended to keep it simple and immutable. The [class-transformer](https://github.com/typestack/class-transformer) library is utilized under the hood to save and read the events from the database. Therefore, your event classes should adhere to the rules of class-transformer to be properly serialized and deserialized. @@ -175,7 +175,7 @@ export class UserUpdatedEvent { We start this example by defining two simple events for a user: a creation event and an update event. Each one has its own data, and they are identified by a unique name which is set with the `@DomainEvent` decorator. ```typescript -import { AggregateRoot, AggregateRootName, EventProcessor, StoredEvent } from "@event-nest/core"; +import { AggregateRoot, AggregateRootName, ApplyEvent, StoredEvent } from "@event-nest/core"; @AggregateRootName("User") export class User extends AggregateRoot { @@ -189,7 +189,7 @@ export class User extends AggregateRoot { public static createNew(id: string, name: string, email: string): User { const user = new User(id); const event = new UserCreatedEvent(name, email); - user.processUserCreatedEvent(event); + user.applyUserCreatedEvent(event); user.append(event); return user; } @@ -202,18 +202,18 @@ export class User extends AggregateRoot { public update(newName: string) { const event = new UserUpdatedEvent(newName); - this.processUserUpdatedEvent(event); + this.applyUserUpdatedEvent(event); this.append(event); } - @EventProcessor(UserCreatedEvent) - private processUserCreatedEvent = (event: UserCreatedEvent) => { + @ApplyEvent(UserCreatedEvent) + private applyUserCreatedEvent = (event: UserCreatedEvent) => { this.name = event.name; this.email = event.email; }; - @EventProcessor(UserUpdatedEvent) - private processUserUpdatedEvent = (event: UserUpdatedEvent) => { + @ApplyEvent(UserUpdatedEvent) + private applyUserUpdatedEvent = (event: UserUpdatedEvent) => { this.name = event.newName; }; @@ -232,7 +232,7 @@ In our case, we have the following creation cases : The `reconstitute` method will initiate the event processing based on the events order. -To process each event, we have defined two private methods which are decorated with the `@EventProcessor` decorator. Each method will be called when the corresponding event is retrieved, and it's ready to be processed. +To apply each event, we have defined two private methods which are decorated with the `@ApplyEvent` decorator. Each method will be called when the corresponding event is retrieved, and it's ready to be processed. This is the place to update the object's internal state based on the event's data. **Make sure that these methods are defined as arrow functions, otherwise they won't be called.** diff --git a/libs/core/project.json b/libs/core/project.json index ca15e84..39ddf9a 100644 --- a/libs/core/project.json +++ b/libs/core/project.json @@ -3,6 +3,7 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/core/src", "projectType": "library", + "tags": ["publishable"], "targets": { "build": { "executor": "@nx/js:tsc", @@ -20,10 +21,6 @@ "command": "node tools/scripts/publish.mjs core {args.ver} {args.tag}", "dependsOn": ["build"] }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] - }, "test": { "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], @@ -34,6 +31,5 @@ "codeCoverage": true } } - }, - "tags": ["publishable"] + } } diff --git a/libs/core/src/index.ts b/libs/core/src/index.ts index 7914941..70313ac 100644 --- a/libs/core/src/index.ts +++ b/libs/core/src/index.ts @@ -1,6 +1,6 @@ export * from "./lib/aggregate-root/aggregate-root"; export * from "./lib/aggregate-root/aggregate-root-name"; -export * from "./lib/aggregate-root/event-processor"; +export * from "./lib/aggregate-root/apply-event.decorator"; export * from "./lib/exceptions/event-name-conflict-exception"; export * from "./lib/exceptions/unknown-event-exception"; diff --git a/libs/core/src/lib/aggregate-root/aggregate-root.spec.ts b/libs/core/src/lib/aggregate-root/aggregate-root.spec.ts index df77ed8..4bd0c04 100644 --- a/libs/core/src/lib/aggregate-root/aggregate-root.spec.ts +++ b/libs/core/src/lib/aggregate-root/aggregate-root.spec.ts @@ -6,7 +6,7 @@ import { UnregisteredEventException } from "../exceptions/unregistered-event-exc import { StoredEvent } from "../storage/stored-event"; import { AggregateRoot } from "./aggregate-root"; import { AggregateRootEvent } from "./aggregate-root-event"; -import { EventProcessor } from "./event-processor"; +import { ApplyEvent } from "./apply-event.decorator"; @DomainEvent("test-event-1") class TestEvent1 {} @@ -20,13 +20,13 @@ class ThrowingEvent {} class UnregisteredEvent {} class SubEntity extends AggregateRoot { - @EventProcessor(TestEvent1) + @ApplyEvent(TestEvent1) processTestEvent1 = () => {}; - @EventProcessor(TestEvent2) + @ApplyEvent(TestEvent2) processTestEvent2 = () => {}; - @EventProcessor(ThrowingEvent) + @ApplyEvent(ThrowingEvent) processThrowingEvent = () => { throw new Error("ooops"); }; @@ -75,7 +75,7 @@ describe("constructor tests", () => { }); describe("reconstitute tests", () => { - test("calls mapped processors after sorting", () => { + test("calls mapped apply methods after sorting", () => { const ev1 = StoredEvent.fromStorage("ev1", "id1", "test-event-2", new Date(), 10, "ag-name", {}); const ev2 = StoredEvent.fromStorage("ev2", "id1", "test-event-1", new Date(), 2, "ag-name", {}); @@ -100,7 +100,7 @@ describe("reconstitute tests", () => { expect(last).toBe(1); }); - test("throws when an event processor throws", () => { + test("throws when an event applier throws", () => { const ev1 = StoredEvent.fromStorage("ev1", "id1", "throwing-event", new Date(), 10, "ag-name", {}); const entity = new SubEntity("id1"); expect(() => entity.reconstitute([ev1])).toThrow(); @@ -189,6 +189,24 @@ describe("commit tests", () => { expect((result as SubEntity).published).toEqual([]); }); + test("does not clear appended events if commit fails", async () => { + const entity = new SubEntity("entity-id"); + const event1 = new TestEvent2(); + const event2 = new TestEvent2(); + entity.append(event1); + entity.append(event2); + + entity.publish = () => Promise.reject("error"); + + try { + await entity.commit(); + expect(fail("Should have thrown")); + } catch (error) { + expect(entity.appendedEvents.length).toBe(2); + expect((entity as SubEntity).published).toEqual([]); + } + }); + test("publishes and clears appended events", async () => { const entity = new SubEntity("entity-id"); const event1 = new TestEvent2(); diff --git a/libs/core/src/lib/aggregate-root/aggregate-root.ts b/libs/core/src/lib/aggregate-root/aggregate-root.ts index 3b43b6e..a4b98f5 100644 --- a/libs/core/src/lib/aggregate-root/aggregate-root.ts +++ b/libs/core/src/lib/aggregate-root/aggregate-root.ts @@ -6,7 +6,7 @@ import { UnregisteredEventException } from "../exceptions/unregistered-event-exc import { StoredEvent } from "../storage/stored-event"; import { isNil } from "../utils/type-utils"; import { AggregateRootEvent } from "./aggregate-root-event"; -import { getDecoratedPropertyKey } from "./event-processor"; +import { getDecoratedPropertyKey } from "./reflection"; type KnownEvent = { payload: unknown; @@ -83,13 +83,14 @@ export abstract class AggregateRoot { * handlers will be called to take care of async updates. * Call this once all the events you want, have been appended. */ - commit(): Promise { + async commit(): Promise { const toPublish = this._appendedEvents.slice(0); - this._appendedEvents = []; if (toPublish.length > 0) { - return this.publish(toPublish).then(() => Promise.resolve(this)); + await this.publish(toPublish); + this._appendedEvents = []; + return this; } - return Promise.resolve(this); + return this; } // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/libs/core/src/lib/aggregate-root/event-processor.spec.ts b/libs/core/src/lib/aggregate-root/apply-event.decorator.spec.ts similarity index 90% rename from libs/core/src/lib/aggregate-root/event-processor.spec.ts rename to libs/core/src/lib/aggregate-root/apply-event.decorator.spec.ts index 8991bbb..29d3d32 100644 --- a/libs/core/src/lib/aggregate-root/event-processor.spec.ts +++ b/libs/core/src/lib/aggregate-root/apply-event.decorator.spec.ts @@ -1,5 +1,6 @@ import { AggregateRoot } from "./aggregate-root"; -import { EventProcessor, getDecoratedPropertyKey } from "./event-processor"; +import { ApplyEvent } from "./apply-event.decorator"; +import { getDecoratedPropertyKey } from "./reflection"; class TestEvent {} @@ -16,7 +17,7 @@ class TestEntity extends AggregateRoot { super("id"); } - @EventProcessor(TestEvent) + @ApplyEvent(TestEvent) processTestEvent() { // do something } diff --git a/libs/core/src/lib/aggregate-root/apply-event.decorator.ts b/libs/core/src/lib/aggregate-root/apply-event.decorator.ts new file mode 100644 index 0000000..07464f9 --- /dev/null +++ b/libs/core/src/lib/aggregate-root/apply-event.decorator.ts @@ -0,0 +1,23 @@ +import "reflect-metadata"; +// eslint-disable-next-line perfectionist/sort-imports +import { ClassConstructor } from "class-transformer"; + +import { APPLY_EVENT_DECORATOR_KEY } from "../metadata-keys"; + +/** + * A decorator to mark that a method is used to apply a specific event to an aggregate root. + * When an aggregate root has to be reconstituted based on persisted events, these methods + * are called to process the events. + * + * @param eventClass The class of the event to be applied. + * @constructor + */ +export function ApplyEvent(eventClass: ClassConstructor): PropertyDecorator { + return (propertyParent, propertyKey) => { + Reflect.defineMetadata( + APPLY_EVENT_DECORATOR_KEY + "-" + propertyKey.toString(), + { eventClass: eventClass, key: propertyKey }, + propertyParent + ); + }; +} diff --git a/libs/core/src/lib/aggregate-root/event-processor.ts b/libs/core/src/lib/aggregate-root/reflection.ts similarity index 53% rename from libs/core/src/lib/aggregate-root/event-processor.ts rename to libs/core/src/lib/aggregate-root/reflection.ts index 5874167..2a0f963 100644 --- a/libs/core/src/lib/aggregate-root/event-processor.ts +++ b/libs/core/src/lib/aggregate-root/reflection.ts @@ -2,7 +2,6 @@ import "reflect-metadata"; // eslint-disable-next-line perfectionist/sort-imports import { ClassConstructor } from "class-transformer"; -import { EVENT_PROCESSOR_KEY } from "../metadata-keys"; import { AggregateRoot } from "./aggregate-root"; export function getDecoratedPropertyKey( @@ -25,21 +24,3 @@ export function getDecoratedPropertyKey( return Reflect.getMetadata(matchingKey, entity).key; } - -/** - * A decorator to mark a method as an event processor. - * When an aggregate root has to be recreated based on database events, these methods - * are called to process the events. - * - * @param eventClass The event class that this method processes. - * @constructor - */ -export function EventProcessor(eventClass: ClassConstructor): PropertyDecorator { - return (propertyParent, propertyKey) => { - Reflect.defineMetadata( - EVENT_PROCESSOR_KEY + "-" + propertyKey.toString(), - { eventClass: eventClass, key: propertyKey }, - propertyParent - ); - }; -} diff --git a/libs/core/src/lib/domain-event-subscription.spec.ts b/libs/core/src/lib/domain-event-subscription.spec.ts index faa696f..81edcea 100644 --- a/libs/core/src/lib/domain-event-subscription.spec.ts +++ b/libs/core/src/lib/domain-event-subscription.spec.ts @@ -44,7 +44,7 @@ describe("DomainEventSubscription tests", () => { const eventId = Reflect.getMetadata(DOMAIN_EVENT_KEY, TheEvent); expect(eventId).toBeDefined(); - expect(eventId.eventSubscriptionId).toBe("the-id"); + expect(eventId.eventSubscriptionId).toBe("TheEvent-the-id"); }); test("adds same id if called for the same event", () => { @@ -58,7 +58,7 @@ describe("DomainEventSubscription tests", () => { randomUUID.mockReturnValueOnce("two"); DomainEventSubscription(OtherEvent)(Sub2); - expect(Reflect.getMetadata(DOMAIN_EVENT_KEY, OtherEvent).eventSubscriptionId).toBe("one"); + expect(Reflect.getMetadata(DOMAIN_EVENT_KEY, OtherEvent).eventSubscriptionId).toBe("OtherEvent-one"); }); }); @@ -82,7 +82,7 @@ describe("getEventId tests", () => { }); test("returns id based on metadata", () => { - expect(getEventId(new TheEvent().constructor)).toBe("the-id"); + expect(getEventId(new TheEvent().constructor)).toBe("TheEvent-the-id"); }); }); diff --git a/libs/core/src/lib/domain-event-subscription.ts b/libs/core/src/lib/domain-event-subscription.ts index 3541184..0c4a1bf 100644 --- a/libs/core/src/lib/domain-event-subscription.ts +++ b/libs/core/src/lib/domain-event-subscription.ts @@ -8,7 +8,11 @@ export const DomainEventSubscription = (...events: any[]): ClassDecorator => { return (target: object) => { events.forEach((event) => { if (!Reflect.hasOwnMetadata(DOMAIN_EVENT_KEY, event)) { - Reflect.defineMetadata(DOMAIN_EVENT_KEY, { eventSubscriptionId: randomUUID() }, event); + Reflect.defineMetadata( + DOMAIN_EVENT_KEY, + { eventSubscriptionId: `${event.name}-${randomUUID()}` }, + event + ); } }); diff --git a/libs/core/src/lib/exceptions/unknown-event-exception.ts b/libs/core/src/lib/exceptions/unknown-event-exception.ts index 59474a3..94bf29a 100644 --- a/libs/core/src/lib/exceptions/unknown-event-exception.ts +++ b/libs/core/src/lib/exceptions/unknown-event-exception.ts @@ -1,13 +1,9 @@ export class UnknownEventException extends Error { - constructor( - unregisteredEventNames: Array, - missingProcessorEventNames: Array, - aggregateRootId: string - ) { + constructor(unregisteredEventNames: Array, missingApplyEventNames: Array, aggregateRootId: string) { super( `Found unknown events for aggregate root ${aggregateRootId}. Unregistered : ${unregisteredEventNames.join( ", " - )}. Missing processor: ${missingProcessorEventNames.join(", ")}` + )}. Missing apply method: ${missingApplyEventNames.join(", ")}` ); } } diff --git a/libs/core/src/lib/exceptions/unregistered-event-exception.ts b/libs/core/src/lib/exceptions/unregistered-event-exception.ts index 8717228..73a3154 100644 --- a/libs/core/src/lib/exceptions/unregistered-event-exception.ts +++ b/libs/core/src/lib/exceptions/unregistered-event-exception.ts @@ -1,5 +1,5 @@ export class UnregisteredEventException extends Error { constructor(eventClassName: string) { - super(`${eventClassName} is not registered to be processed. Use @RegisteredEvent decorator to register it.`); + super(`${eventClassName} is not registered to be processed. Use the @DomainEvent decorator to register it.`); } } diff --git a/libs/core/src/lib/metadata-keys.ts b/libs/core/src/lib/metadata-keys.ts index 17a958c..edfc329 100644 --- a/libs/core/src/lib/metadata-keys.ts +++ b/libs/core/src/lib/metadata-keys.ts @@ -1,4 +1,4 @@ -export const EVENT_PROCESSOR_KEY = "event-nest-process-event-meta"; +export const APPLY_EVENT_DECORATOR_KEY = "event-nest-process-event-meta"; export const DOMAIN_EVENT_SUBSCRIPTION_KEY = "event-nest-domain-event-subscription-meta"; export const DOMAIN_EVENT_KEY = "event-nest-domain-event-meta"; export const AGGREGATE_ROOT_NAME_KEY = "event-nest-aggregate-root-name-meta"; diff --git a/libs/core/src/lib/published-domain-event.ts b/libs/core/src/lib/published-domain-event.ts index 8690317..3569128 100644 --- a/libs/core/src/lib/published-domain-event.ts +++ b/libs/core/src/lib/published-domain-event.ts @@ -1,5 +1,8 @@ import { AggregateRootEvent } from "./aggregate-root/aggregate-root-event"; +/** + * Represents an event that has passed through an aggregate root and it has been commited and published to the event store. + */ export interface PublishedDomainEvent extends AggregateRootEvent { /** * The unique id of the event diff --git a/libs/mongodb/project.json b/libs/mongodb/project.json index 976b2bb..d039d61 100644 --- a/libs/mongodb/project.json +++ b/libs/mongodb/project.json @@ -3,6 +3,7 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/mongodb/src", "projectType": "library", + "tags": ["publishable"], "targets": { "build": { "executor": "@nx/js:tsc", @@ -20,10 +21,6 @@ "command": "node tools/scripts/publish.mjs mongodb {args.ver} {args.tag}", "dependsOn": ["build"] }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] - }, "test": { "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], @@ -34,6 +31,5 @@ "codeCoverage": true } } - }, - "tags": ["publishable"] + } } diff --git a/libs/postgresql/src/lib/storage/postgresql-event-store.spec.ts b/libs/postgresql/src/lib/storage/postgresql-event-store.spec.ts index 1269fdf..a9b31b4 100644 --- a/libs/postgresql/src/lib/storage/postgresql-event-store.spec.ts +++ b/libs/postgresql/src/lib/storage/postgresql-event-store.spec.ts @@ -10,8 +10,8 @@ import { } from "@event-nest/core"; import { createMock } from "@golevelup/ts-jest"; import { PostgreSqlContainer, StartedPostgreSqlContainer } from "@testcontainers/postgresql"; +import { randomUUID } from "crypto"; import { knex } from "knex"; -import { v4 as uuidv4, validate } from "uuid"; import { AggregateRootRow } from "./aggregate-root-row"; import { EventRow } from "./event-row"; @@ -91,15 +91,15 @@ afterEach(async () => { describe("findAggregateRootVersion tests", () => { test("returns -1 when the aggregate root is not found", async () => { await knexConnection(schema + ".es-aggregates").insert({ - id: uuidv4(), + id: randomUUID(), version: 33 }); - const version = await eventStore.findAggregateRootVersion(uuidv4()); + const version = await eventStore.findAggregateRootVersion(randomUUID()); expect(version).toBe(-1); }); test("returns version when aggregate root is found", async () => { - const id = uuidv4(); + const id = randomUUID(); await knexConnection(schema + ".es-aggregates").insert({ id: id, version: 88 @@ -111,14 +111,14 @@ describe("findAggregateRootVersion tests", () => { describe("findByAggregateRootId tests", () => { test("returns empty array when no events found", async () => { - const events = await eventStore.findByAggregateRootId(DecoratedAggregateRoot, uuidv4()); + const events = await eventStore.findByAggregateRootId(DecoratedAggregateRoot, randomUUID()); expect(events).toEqual([]); }); test("returns mapped events when they are found and matched", async () => { - const aggregateRootId = uuidv4(); - const ev1Id = uuidv4(); - const ev2Id = uuidv4(); + const aggregateRootId = randomUUID(); + const ev1Id = randomUUID(); + const ev2Id = randomUUID(); const ev1Date = new Date(); const ev2Date = new Date(); @@ -169,8 +169,8 @@ describe("findByAggregateRootId tests", () => { }); test("returns empty array when events don't match the aggregate", async () => { - const aggregateRootId = uuidv4(); - const ev1Id = uuidv4(); + const aggregateRootId = randomUUID(); + const ev1Id = randomUUID(); const ev1Date = new Date(); @@ -189,14 +189,14 @@ describe("findByAggregateRootId tests", () => { payload: "{}" }); - const events = await eventStore.findByAggregateRootId(DecoratedAggregateRoot, uuidv4()); + const events = await eventStore.findByAggregateRootId(DecoratedAggregateRoot, randomUUID()); expect(events.length).toBe(0); }); test("throws when aggregate is not decorated", async () => { - const aggregateRootId = uuidv4(); - const ev1Id = uuidv4(); + const aggregateRootId = randomUUID(); + const ev1Id = randomUUID(); const ev1Date = new Date(); @@ -223,7 +223,7 @@ describe("findByAggregateRootId tests", () => { describe("save tests", () => { test("does nothing for empty events array", async () => { - const ag = new StoredAggregateRoot(uuidv4(), 5); + const ag = new StoredAggregateRoot(randomUUID(), 5); await eventStore.save([], ag); @@ -235,14 +235,14 @@ describe("save tests", () => { }); test("throws when there's a concurrency issue", async () => { - const id = uuidv4(); + const id = randomUUID(); const root = new StoredAggregateRoot(id, 5); await knexConnection(schema + ".es-aggregates").insert({ id: id, version: 6 }); await expect( eventStore.save( - [StoredEvent.fromPublishedEvent(uuidv4(), root.id, "Test", new SqlEvent1(), new Date())], + [StoredEvent.fromPublishedEvent(randomUUID(), root.id, "Test", new SqlEvent1(), new Date())], root ) ).rejects.toThrow(EventConcurrencyException); @@ -258,10 +258,10 @@ describe("save tests", () => { }); test("saves new aggregate with its event", async () => { - const rootId = uuidv4(); + const rootId = randomUUID(); const root = new StoredAggregateRoot(rootId, 1); - const events = [StoredEvent.fromPublishedEvent(uuidv4(), rootId, "Test", new SqlEvent2(), new Date())]; + const events = [StoredEvent.fromPublishedEvent(randomUUID(), rootId, "Test", new SqlEvent2(), new Date())]; const saved = await eventStore.save(events, root); @@ -287,7 +287,7 @@ describe("save tests", () => { }); test("increases version and stores events and aggregate", async () => { - const rootId = uuidv4(); + const rootId = randomUUID(); const root = new StoredAggregateRoot(rootId, 38); await knexConnection(schema + ".es-aggregates").insert({ @@ -296,8 +296,8 @@ describe("save tests", () => { }); const events = [ - StoredEvent.fromPublishedEvent(uuidv4(), rootId, "Test", new SqlEvent2(), new Date()), - StoredEvent.fromPublishedEvent(uuidv4(), rootId, "Test", new SqlEvent1(), new Date()) + StoredEvent.fromPublishedEvent(randomUUID(), rootId, "Test", new SqlEvent2(), new Date()), + StoredEvent.fromPublishedEvent(randomUUID(), rootId, "Test", new SqlEvent1(), new Date()) ]; const saved = await eventStore.save(events, root); @@ -332,5 +332,5 @@ describe("save tests", () => { test("generateEntityId - returns string with UUID format", async () => { const id = await eventStore.generateEntityId(); - expect(validate(id)).toBe(true); + expect(/^[a-z,0-9,-]{36,36}$/.test(id)).toBe(true); }); diff --git a/libs/postgresql/src/lib/storage/postgresql-event-store.ts b/libs/postgresql/src/lib/storage/postgresql-event-store.ts index 1684153..5e02857 100644 --- a/libs/postgresql/src/lib/storage/postgresql-event-store.ts +++ b/libs/postgresql/src/lib/storage/postgresql-event-store.ts @@ -11,8 +11,8 @@ import { isNil } from "@event-nest/core"; import { Logger } from "@nestjs/common"; +import { randomUUID } from "crypto"; import * as knex from "knex"; -import { v4 as uuidv4 } from "uuid"; import { AggregateRootRow } from "./aggregate-root-row"; import { EventRow } from "./event-row"; @@ -92,7 +92,7 @@ export class PostgreSQLEventStore extends AbstractEventStore { } generateEntityId(): Promise { - return Promise.resolve(uuidv4()); + return Promise.resolve(randomUUID()); } async save(events: Array, aggregate: StoredAggregateRoot): Promise> { diff --git a/package.json b/package.json index e4d849f..f486b77 100644 --- a/package.json +++ b/package.json @@ -15,20 +15,20 @@ "url": "https://github.com/NickTsitlakidis/event-nest.git" }, "engines": { - "node": ">= 16" + "node": ">= 18" }, "devDependencies": { "@golevelup/ts-jest": "0.4.0", "@nestjs/schematics": "^10.0.1", "@nestjs/testing": "^10.0.2", - "@nx/eslint": "18.2.4", - "@nx/eslint-plugin": "18.2.4", - "@nx/jest": "18.2.4", - "@nx/js": "18.2.4", - "@nx/nest": "18.2.4", - "@nx/node": "18.2.4", - "@nx/webpack": "18.2.4", - "@nx/workspace": "18.2.4", + "@nx/eslint": "19.1.2", + "@nx/eslint-plugin": "19.1.2", + "@nx/jest": "19.1.2", + "@nx/js": "19.1.2", + "@nx/nest": "19.1.2", + "@nx/node": "19.1.2", + "@nx/webpack": "19.1.2", + "@nx/workspace": "19.1.2", "@shelf/jest-mongodb": "4.2.0", "@swc-node/register": "~1.8.0", "@swc/core": "~1.3.85", @@ -36,7 +36,6 @@ "@testcontainers/postgresql": "10.8.1", "@types/jest": "^29.4.0", "@types/node": "18.19.15", - "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "7.6.0", "@typescript-eslint/parser": "7.6.0", "eslint": "8.57.0", @@ -47,7 +46,7 @@ "husky": "^8.0.3", "jest": "^29.4.1", "jest-environment-node": "^29.4.1", - "nx": "18.2.4", + "nx": "19.1.2", "prettier": "3.2.5", "ts-jest": "^29.1.0", "ts-node": "10.9.1", @@ -64,7 +63,6 @@ "pg": "^8.11.5", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", - "tslib": "^2.3.0", - "uuid": "^9.0.1" + "tslib": "^2.3.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be9200e..6ad51bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,9 +35,6 @@ dependencies: tslib: specifier: ^2.3.0 version: 2.6.2 - uuid: - specifier: ^9.0.1 - version: 9.0.1 devDependencies: '@golevelup/ts-jest': @@ -50,29 +47,29 @@ devDependencies: specifier: ^10.0.2 version: 10.2.7(@nestjs/common@10.3.7)(@nestjs/core@10.3.7)(@nestjs/platform-express@10.3.7) '@nx/eslint': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1) '@nx/eslint-plugin': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) '@nx/jest': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) '@nx/js': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) '@nx/nest': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) '@nx/node': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) '@nx/webpack': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) '@nx/workspace': - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) '@shelf/jest-mongodb': specifier: 4.2.0 version: 4.2.0(jest-environment-node@29.7.0)(mongodb@5.9.2) @@ -94,9 +91,6 @@ devDependencies: '@types/node': specifier: 18.19.15 version: 18.19.15 - '@types/uuid': - specifier: ^9.0.8 - version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: 7.6.0 version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.5) @@ -128,8 +122,8 @@ devDependencies: specifier: ^29.4.1 version: 29.7.0 nx: - specifier: 18.2.4 - version: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) + specifier: 19.1.2 + version: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) prettier: specifier: 3.2.5 version: 3.2.5 @@ -1999,18 +1993,18 @@ packages: fastq: 1.15.0 dev: true - /@nrwl/devkit@18.2.4(nx@18.2.4): - resolution: {integrity: sha512-dLK8MMb3eEFWlhtI1kNDNbWIT1Xbrgg3eAQ+Ix/N5JDbxJkJhE28WsIJgQb1NTwe/N87O5JtOpxz4/TsSLJCsQ==} + /@nrwl/devkit@19.1.2(nx@19.1.2): + resolution: {integrity: sha512-vWI+OrTICE9Yw6C/jIwxybnvavI9dnQJ7tpzFbLcSVfFAGdFtYJGCLVe40IkWcvUfELoVmzpXtKP/sPy0D7J9w==} dependencies: - '@nx/devkit': 18.2.4(nx@18.2.4) + '@nx/devkit': 19.1.2(nx@19.1.2) transitivePeerDependencies: - nx dev: true - /@nrwl/eslint-plugin-nx@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-hRHXkD9eAw9METYnlQiJUMNX04ofWN457JDhOMTvO1ympBO9pzKOT5XNX1oPcuiXpkYEIQRJxfPmoAhckbld8w==} + /@nrwl/eslint-plugin-nx@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-E8xpYsleETMmzHNmxUaM4+lroidhb8zakwlfiaGdxG4ySbOHFKaLxv3ktdlfR3hJWYacPc9nWTTPIV/BaWF2Vg==} dependencies: - '@nx/eslint-plugin': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/eslint-plugin': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -2027,10 +2021,10 @@ packages: - verdaccio dev: true - /@nrwl/jest@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-MGXmh/ZiT/C9GCMnI3hAGw9uKbR5W+ZjEUen6/2WkOglZvDaz40obI83PJTnK7XzcqUDzFAmWi3Y5eDSQxDvWQ==} + /@nrwl/jest@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-8CQotxLh93ZSx9zwa00Raat4IHR8wXzPawPUYJAi7Vbm3f9t3t444QRzMvnqBieGazfBS6YMuKuEMb0EJ8ubEA==} dependencies: - '@nx/jest': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/jest': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -2047,10 +2041,10 @@ packages: - verdaccio dev: true - /@nrwl/js@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-/NZUOoR13BdKsuuuusNXH9wUDpWuPHIvHAQiI0hF16mmQOBJb+xz5M81+AtyTfF4ITKaMn+RV12mLesfo3zwxg==} + /@nrwl/js@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-ZLEqbAqpr6n2qZADp7FsDPewJDUp3i5uJ8TaZRYFN0PVe6spzeE4PlTg/sR/ZH83N1zjrBD0hTVsquhiGPr0fg==} dependencies: - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -2064,20 +2058,21 @@ packages: - verdaccio dev: true - /@nrwl/nest@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-j2TdrbBQnq2UjGk9mXc9D0XQY+xhO5F+9UvIF3geydHugsZ+LY4n5Iuw3eWw3QCjMBSP7KLqkStkwlEulqHRBg==} + /@nrwl/nest@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-A1rIzdCPtlLOxosIllYQj6OA6KI1Kn5aZyvfhnUSo+K+wUTY2upHwvfp9fF8ZsHi8/Bt0AJ3Fy+doi6auXMTnQ==} dependencies: - '@nx/nest': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/nest': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' - '@swc/core' - '@swc/wasm' - '@types/node' + - '@zkochan/js-yaml' - babel-plugin-macros - chokidar - debug - - js-yaml + - eslint - node-notifier - nx - supports-color @@ -2086,19 +2081,20 @@ packages: - verdaccio dev: true - /@nrwl/node@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-Q54R6GFU30THgp8uQ/BZ8PKH1C+h0qQQefEb0tdCseTCuEmHAXsTMC/EF4leKqpftt8ZeeXKeKhglfbzDeR/Cg==} + /@nrwl/node@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-371oyMgHrjpSZS2U7lbrAroikpIxfHK7bEZj9dQRyvtW7yFrfj7w9XYgBm+66u317OoDIj/PlQroa3RaYWat0g==} dependencies: - '@nx/node': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/node': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' - '@swc/core' - '@swc/wasm' - '@types/node' + - '@zkochan/js-yaml' - babel-plugin-macros - debug - - js-yaml + - eslint - node-notifier - nx - supports-color @@ -2107,11 +2103,11 @@ packages: - verdaccio dev: true - /@nrwl/tao@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107): - resolution: {integrity: sha512-kgJwZ26F+AzvFXaW5eh1g4HLntPcJ6+EE7JyEvrdRzpw7KxTqWy6Ql7dYys6zGlpP4c3PbsXwdc7tGM3Df2PNg==} + /@nrwl/tao@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107): + resolution: {integrity: sha512-OseWzHXNwOmZinUjHCD+edinvNJq5ngGrn/yKO81Zm/FDxkcYjud20dMsXi8zYfgDjvQv22eDtk5v1BTlSx57A==} hasBin: true dependencies: - nx: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) + nx: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) tslib: 2.6.2 transitivePeerDependencies: - '@swc-node/register' @@ -2119,10 +2115,10 @@ packages: - debug dev: true - /@nrwl/webpack@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-1d6AABU8WeUoFGc/WMqLuFch0wm11mLSQNzsXHC7jgptwb0yZ52F7Y0ak7CtwniGLMcmU8PEGPFh9ow7uHb8Rw==} + /@nrwl/webpack@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-yxcuSAbXVETqzuJVHdkP00TdyhLfCZf5ZqnBSQdNFRD2AZee6N1vI0ayNDjlRN7r5PsAxl0i/BDw/IOSywhq0g==} dependencies: - '@nx/webpack': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/webpack': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@parcel/css' @@ -2151,10 +2147,10 @@ packages: - webpack-cli dev: true - /@nrwl/workspace@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107): - resolution: {integrity: sha512-rlKDKyqwd8IFWwGFhJ0/KW0P+ae6gQEwzpF9P91DLC1BAEJt9gOA0GLKNy7XyhoPX2EvXg/GwDRGMqGxqKnFuQ==} + /@nrwl/workspace@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107): + resolution: {integrity: sha512-vViwPcrDRsW6n9huBeQ06HLRd7m03sIJbpK3LvMwo79RZ4XHWqC1bIIbFeujPFQrCU8dtQAA9lL3CeOfAVAxAw==} dependencies: - '@nx/workspace': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) + '@nx/workspace': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) transitivePeerDependencies: - '@swc-node/register' - '@swc/core' @@ -2172,24 +2168,25 @@ packages: transitivePeerDependencies: - encoding - /@nx/devkit@18.2.4(nx@18.2.4): - resolution: {integrity: sha512-Ws3BcA/aeXuwsCQ5e7PYy2H7DswareTOEfgs7izxNyGugpydktVH9DZZTOFNDsc06yzgvyTucDbDQ+JsrJ9PcQ==} + /@nx/devkit@19.1.2(nx@19.1.2): + resolution: {integrity: sha512-oHYZzfmvogPh7z8pf1RjW7eJaS05VZ1Ts/axlWerzQauWT7aoeyCaxa0D9q3ThnUuDt1PqKjwJi5jmCihBT2Sw==} peerDependencies: - nx: '>= 16 <= 18' + nx: '>= 17 <= 20' dependencies: - '@nrwl/devkit': 18.2.4(nx@18.2.4) + '@nrwl/devkit': 19.1.2(nx@19.1.2) ejs: 3.1.9 enquirer: 2.3.6 - ignore: 5.2.4 - nx: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) - semver: 7.5.4 + ignore: 5.3.1 + minimatch: 9.0.3 + nx: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) + semver: 7.6.0 tmp: 0.2.1 tslib: 2.6.2 yargs-parser: 21.1.1 dev: true - /@nx/eslint-plugin@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-FxWu8aZITz8dBNsNyaCUAHq9X7W0782ReQD6pqHxX6q19G4PiqphE4DtivNwotBYoDsnYqWZII68tBGIIn3h6w==} + /@nx/eslint-plugin@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-jJxEF4ecMo8iObe2tkIavTpR1KEYZpObxm8tyno8EL2qNgAFDNUOuBwtZG+viyzjsrVpapvmqIY8QN1xdGR9xg==} peerDependencies: '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 eslint-config-prettier: ^9.0.0 @@ -2197,9 +2194,9 @@ packages: eslint-config-prettier: optional: true dependencies: - '@nrwl/eslint-plugin-nx': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nrwl/eslint-plugin-nx': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(@typescript-eslint/parser@7.6.0)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) '@typescript-eslint/parser': 7.6.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/type-utils': 7.6.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.5) @@ -2207,7 +2204,7 @@ packages: confusing-browser-globals: 1.0.11 eslint-config-prettier: 9.1.0(eslint@8.57.0) jsonc-eslint-parser: 2.4.0 - semver: 7.5.4 + semver: 7.6.0 tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' @@ -2223,18 +2220,20 @@ packages: - verdaccio dev: true - /@nx/eslint@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1): - resolution: {integrity: sha512-FTsy+5OlWgrbT3vtAnk5HxAsgIwvIbJhNz8zUMdiILfl7HPNIMA4rPUP7zEPPl+MnYSZVZ/fKooDje/uWiRGhg==} + /@nx/eslint@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1): + resolution: {integrity: sha512-L0qj7BU5EcaRgntzfL08P7pQfMbZQ2tmRcfgkIMbrDsVfU9Fz64edf7vv3crziB7d86iU7HxnzXhD9Q+P8gKcw==} peerDependencies: - js-yaml: 4.1.0 + '@zkochan/js-yaml': 0.0.7 + eslint: ^8.0.0 || ^9.0.0 peerDependenciesMeta: - js-yaml: + '@zkochan/js-yaml': optional: true dependencies: - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/linter': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/linter': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1) eslint: 8.57.0 + semver: 7.6.0 tslib: 2.6.2 typescript: 5.4.5 transitivePeerDependencies: @@ -2249,14 +2248,14 @@ packages: - verdaccio dev: true - /@nx/jest@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-rG3QtWOjkZnix6gu7CxUP3Wpnm7N/ynoOF1SGJAEm254m0YX7mlhyQA74TlXSvNiM5P9wT9NFvVhJDt8rePqwQ==} + /@nx/jest@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-64xe3yhW2/mcyYBXnH0VpXIt/IHb9bsKUm0L86dt3nLm0Chy/OjET462D3Oq4Wk0il+qbpCr1Tsxv6uZsytwMQ==} dependencies: '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 - '@nrwl/jest': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nrwl/jest': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.4.5) chalk: 4.1.2 identity-obj-proxy: 3.0.0 @@ -2283,8 +2282,8 @@ packages: - verdaccio dev: true - /@nx/js@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-ZZ32tSmd9ZvQ95AeFCCG4mvvbwbqTVB1qHwvpTfkTDPt41Ich+ITf3ugavtIpp/T47yP2KszJWBzTOH3UxlIqQ==} + /@nx/js@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-NRi3MsrhQxvg8OLFG+cKeXVYG0ghMYeOFgr1si6tmaQG0rNyjzcl6r9X4R9yS9JXeWxXZ86MLvRfoALlXNcORg==} peerDependencies: verdaccio: ^5.0.4 peerDependenciesMeta: @@ -2298,10 +2297,9 @@ packages: '@babel/preset-env': 7.23.2(@babel/core@7.23.2) '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@babel/runtime': 7.23.2 - '@nrwl/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/workspace': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.4.5) + '@nrwl/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/workspace': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) babel-plugin-const-enum: 1.2.0(@babel/core@7.23.2) babel-plugin-macros: 2.8.0 babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.2) @@ -2310,13 +2308,13 @@ packages: detect-port: 1.5.1 fast-glob: 3.2.7 fs-extra: 11.1.1 - ignore: 5.2.4 + ignore: 5.3.1 js-tokens: 4.0.0 minimatch: 9.0.3 npm-package-arg: 11.0.1 npm-run-path: 4.0.1 ora: 5.3.0 - semver: 7.5.4 + semver: 7.6.0 source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.3.107)(@types/node@18.19.15)(typescript@5.4.5) tsconfig-paths: 4.2.0 @@ -2334,32 +2332,33 @@ packages: - typescript dev: true - /@nx/linter@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1): - resolution: {integrity: sha512-hCwQASz2RYwhifqRU5fP7t/xM/sBHhACeY/0mJC1F+ULIgJaTS1hP2foadrPjK7ROJRDI3tfOKo+k5kDlzEWmQ==} + /@nx/linter@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1): + resolution: {integrity: sha512-clZEtXeaQzM7xmC/yuWGyp6CY4IuJpZLcrnHfj5hEhFx6zsezRDGzPQbJzXJkvG6bzuCS1oypEzfz2r3Yl5abw==} dependencies: - '@nx/eslint': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1) + '@nx/eslint': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' - '@swc/core' - '@swc/wasm' - '@types/node' + - '@zkochan/js-yaml' - debug - - js-yaml + - eslint - nx - supports-color - verdaccio dev: true - /@nx/nest@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-mXukEOfO5FkISWMx58yWCI4YlZIEGDLJgnz8n+qCaj7H6AxkwBsu83RfIbTu3rAU154SHLqiNOIch3ETq2rfVA==} + /@nx/nest@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-U9Yp/exqqzs0HyOG8PSoL8ZMVYd8GZp6NVBGqeR2I/KheBv4FHPs746xksWYWFew7oJvLrxO6HegPw5G+LF+1Q==} dependencies: '@nestjs/schematics': 9.2.0(typescript@5.4.5) - '@nrwl/nest': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/eslint': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1) - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/node': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nrwl/nest': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/eslint': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/node': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.4.5) tslib: 2.6.2 transitivePeerDependencies: @@ -2368,10 +2367,11 @@ packages: - '@swc/core' - '@swc/wasm' - '@types/node' + - '@zkochan/js-yaml' - babel-plugin-macros - chokidar - debug - - js-yaml + - eslint - node-notifier - nx - supports-color @@ -2380,14 +2380,14 @@ packages: - verdaccio dev: true - /@nx/node@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-8B/Vl4S09QDsjxRurxtjT/QiDnGeXOR0A0wjGaBecRfVwJhjMXn2yUE3eizV8ZpAHMXNbHVGR+B7zLLiLHSS9w==} + /@nx/node@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-7JVmat4JQC0yEuz2BZsheTHZSF1xn+oGSEM85+NnKUz4oWtfbONG7S46yIDMs+aD6XgAU3GxRyBklhiec7gxag==} dependencies: - '@nrwl/node': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/eslint': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(verdaccio@5.29.1) - '@nx/jest': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nrwl/node': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/eslint': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(eslint@8.57.0)(nx@19.1.2)(verdaccio@5.29.1) + '@nx/jest': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(ts-node@10.9.1)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' @@ -2395,9 +2395,10 @@ packages: - '@swc/core' - '@swc/wasm' - '@types/node' + - '@zkochan/js-yaml' - babel-plugin-macros - debug - - js-yaml + - eslint - node-notifier - nx - supports-color @@ -2406,8 +2407,8 @@ packages: - verdaccio dev: true - /@nx/nx-darwin-arm64@18.2.4: - resolution: {integrity: sha512-RYhMImghdyHmwnbNoR2CkLz4Opj9EmuHY3lMfsorg+T4wIOql/iXACrqjnreN7Hy9myJDo1EIbYZ4x8VSxFWtA==} + /@nx/nx-darwin-arm64@19.1.2: + resolution: {integrity: sha512-YeT/u+r0iZSokbVFsuiFpF/eFAZmR1p6gkpHo6cVIb0KTkH6Sd1n3s1cjfOKEZg+M0emf9Q8QQ6tw41wGrUm4Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -2415,8 +2416,8 @@ packages: dev: true optional: true - /@nx/nx-darwin-x64@18.2.4: - resolution: {integrity: sha512-2mXMslSRD/ZoI/oaX+0Mh9J/hucXtNgdwC4YFbp1u8UKquAaQ6hf4uo0s4i+AfLX0F7roMtkFPaG/+MQUJE1Rw==} + /@nx/nx-darwin-x64@19.1.2: + resolution: {integrity: sha512-nmbz/4tgvXwYmxIQptny7Cij0OTAxIdB2l+qmI4tkBnN2mT5UVqdG9t8ziSyZHJbWQjIHTkbgAbg5ar6vK/srA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -2424,8 +2425,8 @@ packages: dev: true optional: true - /@nx/nx-freebsd-x64@18.2.4: - resolution: {integrity: sha512-QUiYLvyUT0PS7D8erf49xa1Jyw4Gfev5gtYfME34Twmn/JPx/99ZkBG4wHbzLqRGwlO5K6m6P4qs30Pzfwtw7A==} + /@nx/nx-freebsd-x64@19.1.2: + resolution: {integrity: sha512-0wcBAr+IYOWBXNDdWHahjW1nCyFTP0O+dSsQa5ab5OBEo0UTvt1k/s27cUyaz2Ll070RTpzl54KD3O1i/1/X0Q==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -2433,8 +2434,8 @@ packages: dev: true optional: true - /@nx/nx-linux-arm-gnueabihf@18.2.4: - resolution: {integrity: sha512-+fjFciSUhvDV8dPa97Brwb83k3Xa4gHPI2Un8wlpp28Cv4horeGruRZrrifR1VmD2wp2UBIMl5n7YsDP8KvYhQ==} + /@nx/nx-linux-arm-gnueabihf@19.1.2: + resolution: {integrity: sha512-A1L7T/Y8nOq7tc84WuaWMEeZ2uTjhqHJDNEfgZhnwYfQ3S94B0O2EkyEp29n9E4eN9XZmvYJzDt1tBz2ziZ6iA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -2442,8 +2443,8 @@ packages: dev: true optional: true - /@nx/nx-linux-arm64-gnu@18.2.4: - resolution: {integrity: sha512-lfaTc+AvV56Uv5mXROiRwh2REiI/7IsqeRDfL+prcuuvJ5Oxi2wYVgnmqcHL+ryQnk0Qn7/d+j/BmYHX5Ve5jQ==} + /@nx/nx-linux-arm64-gnu@19.1.2: + resolution: {integrity: sha512-ze7FtI0hGMs6ap9Z8vo80nXMvuJGJP7CDcL8q2op/l9c23Qex+oG4khyZowJzq+fJPigqldAL3Fm+rHBzT4jhA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2451,8 +2452,8 @@ packages: dev: true optional: true - /@nx/nx-linux-arm64-musl@18.2.4: - resolution: {integrity: sha512-U6eoLTQmbxUWU9kZxx6hsYN4zmmOrsDDeW+i3aj5aeahfYlmyz6TsT0V3FSB70WGJC5aMVgEi4RkntQMKkm5vQ==} + /@nx/nx-linux-arm64-musl@19.1.2: + resolution: {integrity: sha512-JMiSRLe3K83GQw26jGgJYCLDww7K4z5rVDlWHpQEMyiQSukJBZ5OMYxotkDcPDAMmmrUERXjabOsCi0xnyqUlA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2460,8 +2461,8 @@ packages: dev: true optional: true - /@nx/nx-linux-x64-gnu@18.2.4: - resolution: {integrity: sha512-q8WcJhmcRNORkKjax6WcUwMJe/1mQs+RYlUkGqmi7tD7lfcLSqdLPJVjqVmQAwmy1Wh/MHPsbqRwSerUnCxB1A==} + /@nx/nx-linux-x64-gnu@19.1.2: + resolution: {integrity: sha512-0XZSz37nrbABUxw2wOMsUP2djsYRxXn1+jbh/kcOH6PnlwiTPOJ6LwDENUh9lZ4PKflED5Tj0w6wx23/AH4z3g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2469,8 +2470,8 @@ packages: dev: true optional: true - /@nx/nx-linux-x64-musl@18.2.4: - resolution: {integrity: sha512-0MDuoPgHa6kkBrjg7hwZ2qQivhJbh3lk7r3q4osDrqZcGxq5XVJqeAmYFyChQy4dbQfUm4hhYkEfzpU8M2lnvQ==} + /@nx/nx-linux-x64-musl@19.1.2: + resolution: {integrity: sha512-tID0nKIUQZ5b1woFh3dtl7XK1Mv71kkwxxppMsOb0FVTigC8Yy7Zpu/ykKidnJ+VbHGSYhZ03BZXgAk/on9LXw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2478,8 +2479,8 @@ packages: dev: true optional: true - /@nx/nx-win32-arm64-msvc@18.2.4: - resolution: {integrity: sha512-uLhSRtfnXzN000Qf27GOjEPXzd4/jBWqv2x419IMh+AEtKHuCEpQNBUAyLvBbQ79SMr+FmCXHB8AeeJ7bEUiRw==} + /@nx/nx-win32-arm64-msvc@19.1.2: + resolution: {integrity: sha512-AXEwOk0lhbWdy4OZmde0iC1sP/AAUMrw5a8Ah7S0QOXBj8X9wK1zyThviQnY1NpUzYGBbMkv3UgPDTArTdAeKA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2487,8 +2488,8 @@ packages: dev: true optional: true - /@nx/nx-win32-x64-msvc@18.2.4: - resolution: {integrity: sha512-Y52Afz02Ub1kRZXd6NUTwPMjKQqBKZ35e5dUEpl14na2fWvdgdMz4bYOBPUcmQrovlxBGhmFXtFzxkdW3zyRbQ==} + /@nx/nx-win32-x64-msvc@19.1.2: + resolution: {integrity: sha512-H8ldXwXnVff2A9tDU8AD7QE/uZV06D0gHBdbnrzbg74NOrkKvvUPXky0D6BMlooljkU9QXu7M46CWRNIoPSzQw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2496,13 +2497,13 @@ packages: dev: true optional: true - /@nx/webpack@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1): - resolution: {integrity: sha512-d/nAdGCFF/0aEQucwoDxcuMDars0q8H///QL8/N+d+X9mlZPISJV5K4spaAv/b+U7ih05K7Mt9ATtRUWFV5+5g==} + /@nx/webpack@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1): + resolution: {integrity: sha512-EN/oPZGf9ue4z+5xP0suLSYIxOThcWB54A+l+KvWnAHqtnT/TNtBf5ciOWvmChUeGsUsgk8r5g7J1UMRy4VEtA==} dependencies: '@babel/core': 7.23.2 - '@nrwl/webpack': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) - '@nx/devkit': 18.2.4(nx@18.2.4) - '@nx/js': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@18.2.4)(typescript@5.4.5)(verdaccio@5.29.1) + '@nrwl/webpack': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) + '@nx/devkit': 19.1.2(nx@19.1.2) + '@nx/js': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107)(@types/node@18.19.15)(nx@19.1.2)(typescript@5.4.5)(verdaccio@5.29.1) ajv: 8.12.0 autoprefixer: 10.4.16(postcss@8.4.31) babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) @@ -2564,14 +2565,14 @@ packages: - webpack-cli dev: true - /@nx/workspace@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107): - resolution: {integrity: sha512-c3Bca6aBwhpMegvAXAyKO8+dBBZOej8EIVo7m22IXL7APbq+hRetoc0LBCa/wTRcEZpYYPGrN1PzfFZqME21+g==} + /@nx/workspace@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107): + resolution: {integrity: sha512-PtJGRRrc+rCQFw2XHnmLlA7G5fbORhXa6uCjL3H8k6d3sSGBqJgJ8MkH7SLJ/0a49wVmn3hKlLpk3Sln+7IUlQ==} dependencies: - '@nrwl/workspace': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) - '@nx/devkit': 18.2.4(nx@18.2.4) + '@nrwl/workspace': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) + '@nx/devkit': 19.1.2(nx@19.1.2) chalk: 4.1.2 enquirer: 2.3.6 - nx: 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) + nx: 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) tslib: 2.6.2 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -2910,7 +2911,7 @@ packages: resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} dependencies: '@types/estree': 1.0.3 - '@types/json-schema': 7.0.14 + '@types/json-schema': 7.0.15 dev: true /@types/estree@1.0.3: @@ -2974,10 +2975,6 @@ packages: pretty-format: 29.7.0 dev: true - /@types/json-schema@7.0.14: - resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} - dev: true - /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -3075,10 +3072,6 @@ packages: resolution: {integrity: sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==} dev: true - /@types/uuid@9.0.8: - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - dev: true - /@types/webidl-conversions@7.0.2: resolution: {integrity: sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ==} @@ -3603,8 +3596,8 @@ packages: tslib: 2.6.2 dev: true - /@zkochan/js-yaml@0.0.6: - resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + /@zkochan/js-yaml@0.0.7: + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true dependencies: argparse: 2.0.1 @@ -4305,7 +4298,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /busboy@1.6.0: @@ -4788,7 +4781,7 @@ packages: postcss-modules-scope: 3.0.0(postcss@8.4.31) postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.89.0(@swc/core@1.3.107) dev: true @@ -5822,7 +5815,7 @@ packages: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.5.4 + semver: 7.6.0 tapable: 2.2.1 typescript: 5.4.5 webpack: 5.89.0(@swc/core@1.3.107) @@ -6011,7 +6004,7 @@ packages: array-union: 3.0.1 dir-glob: 3.0.1 fast-glob: 3.3.1 - ignore: 5.2.4 + ignore: 5.3.1 merge2: 1.4.1 slash: 4.0.0 dev: true @@ -6994,7 +6987,7 @@ packages: acorn: 8.11.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.5.4 + semver: 7.6.0 dev: true /jsonc-parser@3.2.0: @@ -7785,7 +7778,7 @@ packages: dependencies: hosted-git-info: 7.0.1 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 5.0.0 dev: true @@ -7802,8 +7795,8 @@ packages: boolbase: 1.0.0 dev: true - /nx@18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107): - resolution: {integrity: sha512-GxqJcDOhfLa9jsPmip0jG73CZKA96wCryss2DhixCiCU66I3GLYF4+585ObO8Tx7Z1GqhT92RaNGjCxjMIwaPg==} + /nx@19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107): + resolution: {integrity: sha512-hqD0HglmZCqgPLGcEfLq79El9iBUlinoncmsk6wsPHJM1IrASxHkemJZiehYilQx55QACd1MGBjC2nySZmgyLA==} hasBin: true requiresBuild: true peerDependencies: @@ -7815,12 +7808,12 @@ packages: '@swc/core': optional: true dependencies: - '@nrwl/tao': 18.2.4(@swc-node/register@1.8.0)(@swc/core@1.3.107) + '@nrwl/tao': 19.1.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) '@swc-node/register': 1.8.0(@swc/core@1.3.107)(@swc/types@0.1.6)(typescript@5.4.5) '@swc/core': 1.3.107(@swc/helpers@0.5.8) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.6 + '@zkochan/js-yaml': 0.0.7 axios: 1.6.0 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -7832,9 +7825,8 @@ packages: figures: 3.2.0 flat: 5.0.2 fs-extra: 11.1.1 - ignore: 5.2.4 + ignore: 5.3.1 jest-diff: 29.7.0 - js-yaml: 4.1.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 minimatch: 9.0.3 @@ -7842,7 +7834,7 @@ packages: npm-run-path: 4.0.1 open: 8.4.2 ora: 5.3.0 - semver: 7.5.4 + semver: 7.6.0 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 @@ -7852,16 +7844,16 @@ packages: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 18.2.4 - '@nx/nx-darwin-x64': 18.2.4 - '@nx/nx-freebsd-x64': 18.2.4 - '@nx/nx-linux-arm-gnueabihf': 18.2.4 - '@nx/nx-linux-arm64-gnu': 18.2.4 - '@nx/nx-linux-arm64-musl': 18.2.4 - '@nx/nx-linux-x64-gnu': 18.2.4 - '@nx/nx-linux-x64-musl': 18.2.4 - '@nx/nx-win32-arm64-msvc': 18.2.4 - '@nx/nx-win32-x64-msvc': 18.2.4 + '@nx/nx-darwin-arm64': 19.1.2 + '@nx/nx-darwin-x64': 19.1.2 + '@nx/nx-freebsd-x64': 19.1.2 + '@nx/nx-linux-arm-gnueabihf': 19.1.2 + '@nx/nx-linux-arm64-gnu': 19.1.2 + '@nx/nx-linux-arm64-musl': 19.1.2 + '@nx/nx-linux-x64-gnu': 19.1.2 + '@nx/nx-linux-x64-musl': 19.1.2 + '@nx/nx-win32-arm64-msvc': 19.1.2 + '@nx/nx-win32-x64-msvc': 19.1.2 transitivePeerDependencies: - debug dev: true @@ -8331,7 +8323,7 @@ packages: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.31 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.89.0(@swc/core@1.3.107) dev: true @@ -9069,7 +9061,7 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.14 + '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: true @@ -9078,7 +9070,7 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} dependencies: - '@types/json-schema': 7.0.14 + '@types/json-schema': 7.0.15 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) @@ -9829,7 +9821,7 @@ packages: chalk: 4.1.2 enhanced-resolve: 5.15.0 micromatch: 4.0.5 - semver: 7.5.4 + semver: 7.6.0 source-map: 0.7.4 typescript: 5.4.5 webpack: 5.89.0(@swc/core@1.3.107) @@ -10043,11 +10035,6 @@ packages: hasBin: true dev: true - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -10239,7 +10226,7 @@ packages: compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.18.2 + express: 4.19.2 graceful-fs: 4.2.11 html-entities: 2.4.0 http-proxy-middleware: 2.0.6(@types/express@4.17.20)