@cratis/chronicle 6.3.2 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/EventStore.ts +3 -0
- package/README.md +13 -2
- package/artifacts/validateArtifactSchemas.spec.ts +61 -0
- package/artifacts/validateArtifactSchemas.ts +39 -0
- package/compliance/pii.ts +7 -6
- package/compliance/subject.ts +6 -5
- package/confidentiality/encrypted.ts +7 -6
- package/dist/EventStore.d.ts.map +1 -1
- package/dist/EventStore.js +2 -0
- package/dist/EventStore.js.map +1 -1
- package/dist/artifacts/validateArtifactSchemas.d.ts +4 -0
- package/dist/artifacts/validateArtifactSchemas.d.ts.map +1 -0
- package/dist/artifacts/validateArtifactSchemas.js +38 -0
- package/dist/artifacts/validateArtifactSchemas.js.map +1 -0
- package/dist/compliance/pii.d.ts +2 -1
- package/dist/compliance/pii.d.ts.map +1 -1
- package/dist/compliance/pii.js +6 -5
- package/dist/compliance/pii.js.map +1 -1
- package/dist/compliance/subject.d.ts +2 -1
- package/dist/compliance/subject.d.ts.map +1 -1
- package/dist/compliance/subject.js +5 -4
- package/dist/compliance/subject.js.map +1 -1
- package/dist/confidentiality/encrypted.d.ts +2 -1
- package/dist/confidentiality/encrypted.d.ts.map +1 -1
- package/dist/confidentiality/encrypted.js +6 -5
- package/dist/confidentiality/encrypted.js.map +1 -1
- package/dist/events/eventTypeDecorator.d.ts +8 -7
- package/dist/events/eventTypeDecorator.d.ts.map +1 -1
- package/dist/events/eventTypeDecorator.js +22 -5
- package/dist/events/eventTypeDecorator.js.map +1 -1
- package/dist/events/index.d.ts +1 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -0
- package/dist/events/index.js.map +1 -1
- package/dist/projections/modelBound/addFrom.d.ts +2 -1
- package/dist/projections/modelBound/addFrom.d.ts.map +1 -1
- package/dist/projections/modelBound/addFrom.js +4 -3
- package/dist/projections/modelBound/addFrom.js.map +1 -1
- package/dist/projections/modelBound/childrenFrom.d.ts +2 -1
- package/dist/projections/modelBound/childrenFrom.d.ts.map +1 -1
- package/dist/projections/modelBound/childrenFrom.js +4 -3
- package/dist/projections/modelBound/childrenFrom.js.map +1 -1
- package/dist/projections/modelBound/clearWith.d.ts +2 -1
- package/dist/projections/modelBound/clearWith.d.ts.map +1 -1
- package/dist/projections/modelBound/clearWith.js +4 -3
- package/dist/projections/modelBound/clearWith.js.map +1 -1
- package/dist/projections/modelBound/count.d.ts +2 -1
- package/dist/projections/modelBound/count.d.ts.map +1 -1
- package/dist/projections/modelBound/count.js +4 -3
- package/dist/projections/modelBound/count.js.map +1 -1
- package/dist/projections/modelBound/decrement.d.ts +2 -1
- package/dist/projections/modelBound/decrement.d.ts.map +1 -1
- package/dist/projections/modelBound/decrement.js +4 -3
- package/dist/projections/modelBound/decrement.js.map +1 -1
- package/dist/projections/modelBound/fromAll.d.ts +2 -1
- package/dist/projections/modelBound/fromAll.d.ts.map +1 -1
- package/dist/projections/modelBound/fromAll.js +4 -3
- package/dist/projections/modelBound/fromAll.js.map +1 -1
- package/dist/projections/modelBound/fromEvery.d.ts +2 -1
- package/dist/projections/modelBound/fromEvery.d.ts.map +1 -1
- package/dist/projections/modelBound/fromEvery.js +4 -3
- package/dist/projections/modelBound/fromEvery.js.map +1 -1
- package/dist/projections/modelBound/increment.d.ts +2 -1
- package/dist/projections/modelBound/increment.d.ts.map +1 -1
- package/dist/projections/modelBound/increment.js +4 -3
- package/dist/projections/modelBound/increment.js.map +1 -1
- package/dist/projections/modelBound/join.d.ts +2 -1
- package/dist/projections/modelBound/join.d.ts.map +1 -1
- package/dist/projections/modelBound/join.js +4 -3
- package/dist/projections/modelBound/join.js.map +1 -1
- package/dist/projections/modelBound/nested.d.ts +1 -6
- package/dist/projections/modelBound/nested.d.ts.map +1 -1
- package/dist/projections/modelBound/nested.js +6 -2
- package/dist/projections/modelBound/nested.js.map +1 -1
- package/dist/projections/modelBound/noAutoMap.d.ts +4 -11
- package/dist/projections/modelBound/noAutoMap.d.ts.map +1 -1
- package/dist/projections/modelBound/noAutoMap.js +6 -2
- package/dist/projections/modelBound/noAutoMap.js.map +1 -1
- package/dist/projections/modelBound/removedWith.d.ts +2 -1
- package/dist/projections/modelBound/removedWith.d.ts.map +1 -1
- package/dist/projections/modelBound/removedWith.js +4 -3
- package/dist/projections/modelBound/removedWith.js.map +1 -1
- package/dist/projections/modelBound/removedWithJoin.d.ts +2 -1
- package/dist/projections/modelBound/removedWithJoin.d.ts.map +1 -1
- package/dist/projections/modelBound/removedWithJoin.js +4 -3
- package/dist/projections/modelBound/removedWithJoin.js.map +1 -1
- package/dist/projections/modelBound/setFrom.d.ts +2 -1
- package/dist/projections/modelBound/setFrom.d.ts.map +1 -1
- package/dist/projections/modelBound/setFrom.js +4 -3
- package/dist/projections/modelBound/setFrom.js.map +1 -1
- package/dist/projections/modelBound/setFromContext.d.ts +3 -2
- package/dist/projections/modelBound/setFromContext.d.ts.map +1 -1
- package/dist/projections/modelBound/setFromContext.js +4 -3
- package/dist/projections/modelBound/setFromContext.js.map +1 -1
- package/dist/projections/modelBound/setValue.d.ts +2 -1
- package/dist/projections/modelBound/setValue.d.ts.map +1 -1
- package/dist/projections/modelBound/setValue.js +4 -3
- package/dist/projections/modelBound/setValue.js.map +1 -1
- package/dist/projections/modelBound/subtractFrom.d.ts +2 -1
- package/dist/projections/modelBound/subtractFrom.d.ts.map +1 -1
- package/dist/projections/modelBound/subtractFrom.js +4 -3
- package/dist/projections/modelBound/subtractFrom.js.map +1 -1
- package/dist/readModels/readModel.d.ts +2 -1
- package/dist/readModels/readModel.d.ts.map +1 -1
- package/dist/readModels/readModel.js +22 -5
- package/dist/readModels/readModel.js.map +1 -1
- package/dist/schemas/JsonSchemaGenerator.d.ts +6 -1
- package/dist/schemas/JsonSchemaGenerator.d.ts.map +1 -1
- package/dist/schemas/JsonSchemaGenerator.js +41 -31
- package/dist/schemas/JsonSchemaGenerator.js.map +1 -1
- package/dist/schemas/createDeferredSchema.d.ts +7 -0
- package/dist/schemas/createDeferredSchema.d.ts.map +1 -0
- package/dist/schemas/createDeferredSchema.js +19 -0
- package/dist/schemas/createDeferredSchema.js.map +1 -0
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/jsonSchemaProperty.d.ts +2 -1
- package/dist/schemas/jsonSchemaProperty.d.ts.map +1 -1
- package/dist/schemas/jsonSchemaProperty.js +3 -2
- package/dist/schemas/jsonSchemaProperty.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/TypeIntrospector.d.ts.map +1 -1
- package/dist/types/TypeIntrospector.js +9 -3
- package/dist/types/TypeIntrospector.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/propertyDecoratorMetadata.d.ts +17 -0
- package/dist/types/propertyDecoratorMetadata.d.ts.map +1 -0
- package/dist/types/propertyDecoratorMetadata.js +76 -0
- package/dist/types/propertyDecoratorMetadata.js.map +1 -0
- package/dist/types/standardDecoratorMetadata.d.ts +9 -0
- package/dist/types/standardDecoratorMetadata.d.ts.map +1 -0
- package/dist/types/standardDecoratorMetadata.js +20 -0
- package/dist/types/standardDecoratorMetadata.js.map +1 -0
- package/events/classDecorators.standard.spec.ts +77 -0
- package/events/eventTypeDecorator.ts +31 -13
- package/events/index.ts +2 -0
- package/package.json +3 -1
- package/projections/modelBound/addFrom.ts +5 -4
- package/projections/modelBound/childrenFrom.ts +5 -4
- package/projections/modelBound/clearWith.ts +5 -4
- package/projections/modelBound/count.ts +5 -4
- package/projections/modelBound/decorators.standard.spec.ts +71 -0
- package/projections/modelBound/decrement.ts +5 -4
- package/projections/modelBound/fromAll.ts +5 -4
- package/projections/modelBound/fromEvery.ts +5 -4
- package/projections/modelBound/increment.ts +5 -4
- package/projections/modelBound/join.ts +5 -4
- package/projections/modelBound/nested.ts +9 -2
- package/projections/modelBound/noAutoMap.ts +11 -2
- package/projections/modelBound/removedWith.ts +5 -4
- package/projections/modelBound/removedWithJoin.ts +5 -4
- package/projections/modelBound/setFrom.ts +5 -4
- package/projections/modelBound/setFromContext.ts +7 -6
- package/projections/modelBound/setValue.ts +5 -4
- package/projections/modelBound/subtractFrom.ts +5 -4
- package/readModels/readModel.ts +24 -6
- package/readModels/standardFallbacks.standard.spec.ts +39 -0
- package/schemas/JsonSchemaGenerator.confidentiality.spec.ts +2 -0
- package/schemas/JsonSchemaGenerator.spec.ts +28 -1
- package/schemas/JsonSchemaGenerator.ts +45 -30
- package/schemas/createDeferredSchema.ts +21 -0
- package/schemas/decorators.expected.fixture.ts +24 -0
- package/schemas/decorators.legacy.spec.ts +62 -0
- package/schemas/decorators.standard.spec.ts +235 -0
- package/schemas/index.ts +1 -0
- package/schemas/jsonSchemaProperty.ts +4 -3
- package/schemas/legacyDesignMetadata.spec.ts +39 -0
- package/types/TypeIntrospector.ts +8 -3
- package/types/index.ts +2 -0
- package/types/propertyDecoratorMetadata.ts +80 -0
- package/types/standardDecoratorMetadata.spec.ts +31 -0
- package/types/standardDecoratorMetadata.ts +26 -0
- package/vitest.config.ts +17 -0
package/EventStore.ts
CHANGED
|
@@ -30,6 +30,7 @@ import { EventSeeding } from './seeding/EventSeeding.js';
|
|
|
30
30
|
import { IEventSeeding } from './seeding/IEventSeeding.js';
|
|
31
31
|
import { ChronicleTracer } from './Tracing.js';
|
|
32
32
|
import { DefaultClientArtifactsProvider } from './artifacts/DefaultClientArtifactsProvider.js';
|
|
33
|
+
import { validateArtifactSchemas } from './artifacts/validateArtifactSchemas.js';
|
|
33
34
|
import { IUnitOfWorkManager } from './transactions/IUnitOfWorkManager.js';
|
|
34
35
|
import { UnitOfWorkManager } from './transactions/UnitOfWorkManager.js';
|
|
35
36
|
import { IJobs } from './jobs/IJobs.js';
|
|
@@ -125,6 +126,8 @@ export class EventStore implements IEventStore {
|
|
|
125
126
|
this.seeding.discover()
|
|
126
127
|
]);
|
|
127
128
|
|
|
129
|
+
validateArtifactSchemas(DefaultClientArtifactsProvider.default);
|
|
130
|
+
|
|
128
131
|
this._logger.debug('Registering discovered artifacts', {
|
|
129
132
|
eventStore: this.name.value,
|
|
130
133
|
namespace: this.namespace.value
|
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ Beyond appending and observing events, the client covers the full Chronicle surf
|
|
|
28
28
|
## Installation
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
npm install @cratis/chronicle reflect-metadata
|
|
31
|
+
npm install @cratis/chronicle @cratis/fundamentals reflect-metadata
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
You need a Chronicle Kernel available. The easiest local setup is the development Docker image:
|
|
@@ -41,11 +41,18 @@ docker run -p 35000:35000 cratis/chronicle:latest-development
|
|
|
41
41
|
|
|
42
42
|
```typescript
|
|
43
43
|
import 'reflect-metadata';
|
|
44
|
+
import { field } from '@cratis/fundamentals';
|
|
44
45
|
import { ChronicleClient, ChronicleOptions, eventType } from '@cratis/chronicle';
|
|
45
46
|
|
|
46
47
|
@eventType()
|
|
47
48
|
class EmployeeHired {
|
|
48
|
-
|
|
49
|
+
@field(String) firstName!: string;
|
|
50
|
+
@field(String) lastName!: string;
|
|
51
|
+
|
|
52
|
+
constructor(firstName: string, lastName: string) {
|
|
53
|
+
this.firstName = firstName;
|
|
54
|
+
this.lastName = lastName;
|
|
55
|
+
}
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
const client = new ChronicleClient(ChronicleOptions.development());
|
|
@@ -55,6 +62,10 @@ console.log(`Appended at sequence number ${result.sequenceNumber.value}`);
|
|
|
55
62
|
client.dispose();
|
|
56
63
|
```
|
|
57
64
|
|
|
65
|
+
## Decorators and TypeScript configuration
|
|
66
|
+
|
|
67
|
+
Chronicle decorators work with both TC39 standard decorators (TypeScript 5.2+; do not enable `experimentalDecorators`) and legacy decorators (`experimentalDecorators: true`). Keep `reflect-metadata` imported at your entry point for Chronicle's runtime metadata storage. In standard mode, TypeScript does not emit `design:type` or `design:paramtypes`; declare event and read-model fields with `@field(Type)` from `@cratis/fundamentals` so Chronicle can generate their schemas. For arrays, provide an element type with `@field(Array, { genericArguments: [ItemType] })`. For a `ConceptAs<string>` or `ConceptAs<number>`, declare `static readonly valueType = String`, `Number`, `Boolean`, `Guid`, or `Date` on the concept class. Member-less event types and read models are valid. Unresolved standard-mode types fail on first schema read or during connection before Kernel registration; property decorators support public instance fields, not standard accessors or getters.
|
|
68
|
+
|
|
58
69
|
## Documentation
|
|
59
70
|
|
|
60
71
|
See the [getting started guide](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/getting-started.md) and the rest of the [documentation](https://github.com/Cratis/Chronicle.TypeScript/tree/main/Documentation) for installation and usage instructions, or visit [cratis.io](https://www.cratis.io/chronicle/).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { field } from '@cratis/fundamentals';
|
|
5
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
6
|
+
import { eventType } from '../events/eventTypeDecorator.js';
|
|
7
|
+
import { readModel } from '../readModels/readModel.js';
|
|
8
|
+
import { IClientArtifactsProvider } from './IClientArtifactsProvider.js';
|
|
9
|
+
import { validateArtifactSchemas } from './validateArtifactSchemas.js';
|
|
10
|
+
import { EventStore } from '../EventStore.js';
|
|
11
|
+
import { EventStoreName } from '../EventStoreName.js';
|
|
12
|
+
import { EventStoreNamespaceName } from '../EventStoreNamespaceName.js';
|
|
13
|
+
import { ChronicleConnection } from '../connection/ChronicleConnection.js';
|
|
14
|
+
import { ConnectionLifecycle } from '../connection/ConnectionLifecycle.js';
|
|
15
|
+
|
|
16
|
+
@eventType('bad-event')
|
|
17
|
+
class BadEvent {
|
|
18
|
+
@field(Array) items!: string[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@readModel('bad-read-model')
|
|
22
|
+
class BadReadModel {
|
|
23
|
+
constructor(readonly name: string) {}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@eventType('good-event')
|
|
27
|
+
class GoodEvent {}
|
|
28
|
+
|
|
29
|
+
const artifacts = {
|
|
30
|
+
eventTypes: [BadEvent, GoodEvent],
|
|
31
|
+
readModels: [BadReadModel]
|
|
32
|
+
} as unknown as IClientArtifactsProvider;
|
|
33
|
+
|
|
34
|
+
describe('artifact schema preflight', () => {
|
|
35
|
+
it('blocks every Kernel registration when preflight fails', async () => {
|
|
36
|
+
const register = vi.fn();
|
|
37
|
+
const connection = new Proxy({}, {
|
|
38
|
+
get: () => new Proxy({}, { get: () => register })
|
|
39
|
+
}) as ChronicleConnection;
|
|
40
|
+
const lifecycle = { onDisconnected: vi.fn(), onConnected: vi.fn() } as unknown as ConnectionLifecycle;
|
|
41
|
+
const store = new EventStore(new EventStoreName('Test'), EventStoreNamespaceName.default, connection, lifecycle, 'sink');
|
|
42
|
+
|
|
43
|
+
await expect(store.registerArtifacts()).rejects.toBeInstanceOf(AggregateError);
|
|
44
|
+
expect(register).not.toHaveBeenCalled();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('collects all schema failures before registration', () => {
|
|
48
|
+
try {
|
|
49
|
+
validateArtifactSchemas(artifacts);
|
|
50
|
+
throw new Error('Expected schema validation to fail');
|
|
51
|
+
} catch (error) {
|
|
52
|
+
expect(error).toBeInstanceOf(AggregateError);
|
|
53
|
+
const aggregate = error as AggregateError;
|
|
54
|
+
expect(aggregate.errors).toHaveLength(2);
|
|
55
|
+
expect(aggregate.errors.map((failure: Error) => failure.message)).toEqual([
|
|
56
|
+
expect.stringContaining('Event type BadEvent:'),
|
|
57
|
+
expect.stringContaining('Read model BadReadModel:')
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { IClientArtifactsProvider } from './IClientArtifactsProvider.js';
|
|
5
|
+
import { getEventTypeMetadata } from '../events/eventTypeDecorator.js';
|
|
6
|
+
import { getReadModelMetadata } from '../readModels/readModel.js';
|
|
7
|
+
import { JsonSchemaGenerator } from '../schemas/JsonSchemaGenerator.js';
|
|
8
|
+
|
|
9
|
+
/** Resolves every discovered schema before any registration can reach the Kernel. */
|
|
10
|
+
export function validateArtifactSchemas(artifacts: IClientArtifactsProvider): void {
|
|
11
|
+
const failures: Error[] = [];
|
|
12
|
+
|
|
13
|
+
for (const type of artifacts.eventTypes) {
|
|
14
|
+
try {
|
|
15
|
+
const metadata = getEventTypeMetadata(type);
|
|
16
|
+
if (!metadata) throw new TypeError(`Missing event type metadata for ${type.name}.`);
|
|
17
|
+
void metadata.schema;
|
|
18
|
+
} catch (error) {
|
|
19
|
+
failures.push(new Error(`Event type ${type.name}: ${String(error)}`, { cause: error }));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
for (const type of artifacts.readModels) {
|
|
24
|
+
try {
|
|
25
|
+
const metadata = getReadModelMetadata(type);
|
|
26
|
+
if (metadata) {
|
|
27
|
+
void metadata.schema;
|
|
28
|
+
} else {
|
|
29
|
+
JsonSchemaGenerator.generate(type);
|
|
30
|
+
}
|
|
31
|
+
} catch (error) {
|
|
32
|
+
failures.push(new Error(`Read model ${type.name}: ${String(error)}`, { cause: error }));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (failures.length) {
|
|
37
|
+
throw new AggregateError(failures, `Cannot register artifacts: ${failures.length} schema error(s).`);
|
|
38
|
+
}
|
|
39
|
+
}
|
package/compliance/pii.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { ComplianceMetadata } from './ComplianceMetadata.js';
|
|
|
6
6
|
import { ComplianceMetadataType } from './ComplianceMetadataType.js';
|
|
7
7
|
import { PIINotSupportedOnEventSourceId } from './PIINotSupportedOnEventSourceId.js';
|
|
8
8
|
import { TypeIntrospector } from '../types/index.js';
|
|
9
|
+
import { ChronicleClassOrPropertyDecorator, decorateClassOrProperty, getPropertyMetadata, hasPropertyMetadata } from '../types/propertyDecoratorMetadata.js';
|
|
9
10
|
|
|
10
11
|
/** The property name this client uses everywhere for the event source identifier. */
|
|
11
12
|
const EVENT_SOURCE_ID_PROPERTY = 'eventSourceId';
|
|
@@ -55,8 +56,8 @@ const PII_TYPE_METADATA_KEY = 'chronicle:compliance:pii:type';
|
|
|
55
56
|
* }
|
|
56
57
|
* ```
|
|
57
58
|
*/
|
|
58
|
-
export function pii(details?: string):
|
|
59
|
-
return (target: object | Function, propertyKey?: string | symbol) => {
|
|
59
|
+
export function pii(details?: string): ChronicleClassOrPropertyDecorator {
|
|
60
|
+
return decorateClassOrProperty((target: object | Function, propertyKey?: string | symbol) => {
|
|
60
61
|
// Class decorator usage (for types like ConceptAs)
|
|
61
62
|
if (typeof target === 'function' && propertyKey === undefined) {
|
|
62
63
|
const metadata: ComplianceMetadata = {
|
|
@@ -78,7 +79,7 @@ export function pii(details?: string): PropertyDecorator & ClassDecorator {
|
|
|
78
79
|
// PIINotSupportedOnEventSourceId guard, which throws for the same reason when
|
|
79
80
|
// [PII] is applied to an EventSourceId/EventSourceId<T> type.
|
|
80
81
|
if (key === EVENT_SOURCE_ID_PROPERTY) {
|
|
81
|
-
throw new PIINotSupportedOnEventSourceId(declaringType.name);
|
|
82
|
+
throw new PIINotSupportedOnEventSourceId(declaringType.name || 'the decorated class');
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
TypeIntrospector.trackProperty(declaringType, key);
|
|
@@ -88,7 +89,7 @@ export function pii(details?: string): PropertyDecorator & ClassDecorator {
|
|
|
88
89
|
};
|
|
89
90
|
Reflect.defineMetadata(PII_PROPERTY_METADATA_KEY, metadata, target, key);
|
|
90
91
|
}
|
|
91
|
-
};
|
|
92
|
+
});
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
/**
|
|
@@ -98,7 +99,7 @@ export function pii(details?: string): PropertyDecorator & ClassDecorator {
|
|
|
98
99
|
* @returns The compliance metadata, or undefined if not decorated with @pii.
|
|
99
100
|
*/
|
|
100
101
|
export function getPIIMetadata(target: object, propertyKey: string): ComplianceMetadata | undefined {
|
|
101
|
-
return
|
|
102
|
+
return getPropertyMetadata<ComplianceMetadata>(PII_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
/**
|
|
@@ -108,7 +109,7 @@ export function getPIIMetadata(target: object, propertyKey: string): ComplianceM
|
|
|
108
109
|
* @returns True if the property has @pii decorator; false otherwise.
|
|
109
110
|
*/
|
|
110
111
|
export function hasPIIMetadata(target: object, propertyKey: string): boolean {
|
|
111
|
-
return
|
|
112
|
+
return hasPropertyMetadata(PII_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
/**
|
package/compliance/subject.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import 'reflect-metadata';
|
|
5
5
|
import { TypeIntrospector } from '../types/index.js';
|
|
6
|
+
import { ChroniclePropertyDecorator, decorateProperty, getTypeOrFieldMetadata, hasPropertyMetadata } from '../types/propertyDecoratorMetadata.js';
|
|
6
7
|
|
|
7
8
|
/** Metadata key for the subject decorator on a property. */
|
|
8
9
|
const SUBJECT_PROPERTY_METADATA_KEY = 'chronicle:compliance:subject:property';
|
|
@@ -33,15 +34,15 @@ const SUBJECT_TYPE_METADATA_KEY = 'chronicle:compliance:subject:type';
|
|
|
33
34
|
* }
|
|
34
35
|
* ```
|
|
35
36
|
*/
|
|
36
|
-
export function subject():
|
|
37
|
-
return (target: object, propertyKey: string | symbol) => {
|
|
37
|
+
export function subject(): ChroniclePropertyDecorator {
|
|
38
|
+
return decorateProperty((target: object, propertyKey: string | symbol) => {
|
|
38
39
|
const key = propertyKey.toString();
|
|
39
40
|
const declaringType = (target as { constructor: Function }).constructor;
|
|
40
41
|
|
|
41
42
|
TypeIntrospector.trackProperty(declaringType, key);
|
|
42
43
|
Reflect.defineMetadata(SUBJECT_PROPERTY_METADATA_KEY, true, target, key);
|
|
43
44
|
Reflect.defineMetadata(SUBJECT_TYPE_METADATA_KEY, key, declaringType);
|
|
44
|
-
};
|
|
45
|
+
});
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
/**
|
|
@@ -51,7 +52,7 @@ export function subject(): PropertyDecorator {
|
|
|
51
52
|
* @returns True if the property has the @subject decorator; false otherwise.
|
|
52
53
|
*/
|
|
53
54
|
export function hasSubjectMetadata(target: object, propertyKey: string): boolean {
|
|
54
|
-
return
|
|
55
|
+
return hasPropertyMetadata(SUBJECT_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
/**
|
|
@@ -60,5 +61,5 @@ export function hasSubjectMetadata(target: object, propertyKey: string): boolean
|
|
|
60
61
|
* @returns The decorated property name, or undefined when no property is decorated.
|
|
61
62
|
*/
|
|
62
63
|
export function getSubjectPropertyName(type: Function): string | undefined {
|
|
63
|
-
return
|
|
64
|
+
return getTypeOrFieldMetadata<string>(SUBJECT_TYPE_METADATA_KEY, type);
|
|
64
65
|
}
|
|
@@ -7,6 +7,7 @@ import { SecurityMetadataType } from './SecurityMetadataType.js';
|
|
|
7
7
|
import { EncryptionScope } from './EncryptionScope.js';
|
|
8
8
|
import { EncryptedNotSupportedOnEventSourceId } from './EncryptedNotSupportedOnEventSourceId.js';
|
|
9
9
|
import { TypeIntrospector } from '../types/index.js';
|
|
10
|
+
import { ChronicleClassOrPropertyDecorator, decorateClassOrProperty, getPropertyMetadata, hasPropertyMetadata } from '../types/propertyDecoratorMetadata.js';
|
|
10
11
|
|
|
11
12
|
/** The property name this client uses everywhere for the event source identifier. */
|
|
12
13
|
const EVENT_SOURCE_ID_PROPERTY = 'eventSourceId';
|
|
@@ -69,8 +70,8 @@ function metadataTypeFor(scope: EncryptionScope): SecurityMetadataType {
|
|
|
69
70
|
* }
|
|
70
71
|
* ```
|
|
71
72
|
*/
|
|
72
|
-
export function encrypted(scope: EncryptionScope = EncryptionScope.Subject, details?: string):
|
|
73
|
-
return (target: object | Function, propertyKey?: string | symbol) => {
|
|
73
|
+
export function encrypted(scope: EncryptionScope = EncryptionScope.Subject, details?: string): ChronicleClassOrPropertyDecorator {
|
|
74
|
+
return decorateClassOrProperty((target: object | Function, propertyKey?: string | symbol) => {
|
|
74
75
|
// Class decorator usage (for types like ConceptAs)
|
|
75
76
|
if (typeof target === 'function' && propertyKey === undefined) {
|
|
76
77
|
const metadata: SecurityMetadata = {
|
|
@@ -91,7 +92,7 @@ export function encrypted(scope: EncryptionScope = EncryptionScope.Subject, deta
|
|
|
91
92
|
// look up the key that protects everything else. Mirrors @pii()'s
|
|
92
93
|
// PIINotSupportedOnEventSourceId guard, for the same reason.
|
|
93
94
|
if (key === EVENT_SOURCE_ID_PROPERTY) {
|
|
94
|
-
throw new EncryptedNotSupportedOnEventSourceId(declaringType.name);
|
|
95
|
+
throw new EncryptedNotSupportedOnEventSourceId(declaringType.name || 'the decorated class');
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
TypeIntrospector.trackProperty(declaringType, key);
|
|
@@ -101,7 +102,7 @@ export function encrypted(scope: EncryptionScope = EncryptionScope.Subject, deta
|
|
|
101
102
|
};
|
|
102
103
|
Reflect.defineMetadata(ENCRYPTED_PROPERTY_METADATA_KEY, metadata, target, key);
|
|
103
104
|
}
|
|
104
|
-
};
|
|
105
|
+
});
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
/**
|
|
@@ -111,7 +112,7 @@ export function encrypted(scope: EncryptionScope = EncryptionScope.Subject, deta
|
|
|
111
112
|
* @returns The security metadata, or undefined if not decorated with @encrypted.
|
|
112
113
|
*/
|
|
113
114
|
export function getEncryptedMetadata(target: object, propertyKey: string): SecurityMetadata | undefined {
|
|
114
|
-
return
|
|
115
|
+
return getPropertyMetadata<SecurityMetadata>(ENCRYPTED_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
115
116
|
}
|
|
116
117
|
|
|
117
118
|
/**
|
|
@@ -121,7 +122,7 @@ export function getEncryptedMetadata(target: object, propertyKey: string): Secur
|
|
|
121
122
|
* @returns True if the property has @encrypted decorator; false otherwise.
|
|
122
123
|
*/
|
|
123
124
|
export function hasEncryptedMetadata(target: object, propertyKey: string): boolean {
|
|
124
|
-
return
|
|
125
|
+
return hasPropertyMetadata(ENCRYPTED_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
/**
|
package/dist/EventStore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../EventStore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAI1E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../EventStore.ts"],"names":[],"mappings":"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"}
|
package/dist/EventStore.js
CHANGED
|
@@ -16,6 +16,7 @@ import { ReadModels } from './readModels/ReadModels.js';
|
|
|
16
16
|
import { EventSeeding } from './seeding/EventSeeding.js';
|
|
17
17
|
import { ChronicleTracer } from './Tracing.js';
|
|
18
18
|
import { DefaultClientArtifactsProvider } from './artifacts/DefaultClientArtifactsProvider.js';
|
|
19
|
+
import { validateArtifactSchemas } from './artifacts/validateArtifactSchemas.js';
|
|
19
20
|
import { UnitOfWorkManager } from './transactions/UnitOfWorkManager.js';
|
|
20
21
|
import { Jobs } from './jobs/Jobs.js';
|
|
21
22
|
import { Webhooks } from './webhooks/Webhooks.js';
|
|
@@ -94,6 +95,7 @@ export class EventStore {
|
|
|
94
95
|
this.webhooks.discover(),
|
|
95
96
|
this.seeding.discover()
|
|
96
97
|
]);
|
|
98
|
+
validateArtifactSchemas(DefaultClientArtifactsProvider.default);
|
|
97
99
|
this._logger.debug('Registering discovered artifacts', {
|
|
98
100
|
eventStore: this.name.value,
|
|
99
101
|
namespace: this.namespace.value
|
package/dist/EventStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventStore.js","sourceRoot":"","sources":["../EventStore.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAErG,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAItE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"EventStore.js","sourceRoot":"","sources":["../EventStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { IClientArtifactsProvider } from './IClientArtifactsProvider.js';
|
|
2
|
+
/** Resolves every discovered schema before any registration can reach the Kernel. */
|
|
3
|
+
export declare function validateArtifactSchemas(artifacts: IClientArtifactsProvider): void;
|
|
4
|
+
//# sourceMappingURL=validateArtifactSchemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateArtifactSchemas.d.ts","sourceRoot":"","sources":["../../artifacts/validateArtifactSchemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAKzE,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI,CA6BjF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
import { getEventTypeMetadata } from '../events/eventTypeDecorator.js';
|
|
4
|
+
import { getReadModelMetadata } from '../readModels/readModel.js';
|
|
5
|
+
import { JsonSchemaGenerator } from '../schemas/JsonSchemaGenerator.js';
|
|
6
|
+
/** Resolves every discovered schema before any registration can reach the Kernel. */
|
|
7
|
+
export function validateArtifactSchemas(artifacts) {
|
|
8
|
+
const failures = [];
|
|
9
|
+
for (const type of artifacts.eventTypes) {
|
|
10
|
+
try {
|
|
11
|
+
const metadata = getEventTypeMetadata(type);
|
|
12
|
+
if (!metadata)
|
|
13
|
+
throw new TypeError(`Missing event type metadata for ${type.name}.`);
|
|
14
|
+
void metadata.schema;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
failures.push(new Error(`Event type ${type.name}: ${String(error)}`, { cause: error }));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
for (const type of artifacts.readModels) {
|
|
21
|
+
try {
|
|
22
|
+
const metadata = getReadModelMetadata(type);
|
|
23
|
+
if (metadata) {
|
|
24
|
+
void metadata.schema;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
JsonSchemaGenerator.generate(type);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
failures.push(new Error(`Read model ${type.name}: ${String(error)}`, { cause: error }));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (failures.length) {
|
|
35
|
+
throw new AggregateError(failures, `Cannot register artifacts: ${failures.length} schema error(s).`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=validateArtifactSchemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateArtifactSchemas.js","sourceRoot":"","sources":["../../artifacts/validateArtifactSchemas.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAGrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,SAAmC;IACvE,MAAM,QAAQ,GAAY,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACpF,KAAK,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,QAAQ,EAAE,CAAC;gBACX,KAAK,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,8BAA8B,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;IACzG,CAAC;AACL,CAAC"}
|
package/dist/compliance/pii.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import type { ComplianceMetadata } from './ComplianceMetadata.js';
|
|
3
|
+
import { ChronicleClassOrPropertyDecorator } from '../types/propertyDecoratorMetadata.js';
|
|
3
4
|
/**
|
|
4
5
|
* Decorator that marks a property or type as containing Personal Identifiable Information (PII)
|
|
5
6
|
* according to the GDPR definition. When applied to read model properties or ConceptAs types,
|
|
@@ -39,7 +40,7 @@ import type { ComplianceMetadata } from './ComplianceMetadata.js';
|
|
|
39
40
|
* }
|
|
40
41
|
* ```
|
|
41
42
|
*/
|
|
42
|
-
export declare function pii(details?: string):
|
|
43
|
+
export declare function pii(details?: string): ChronicleClassOrPropertyDecorator;
|
|
43
44
|
/**
|
|
44
45
|
* Gets the PII compliance metadata for a property.
|
|
45
46
|
* @param target - The class prototype.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii.d.ts","sourceRoot":"","sources":["../../compliance/pii.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"pii.d.ts","sourceRoot":"","sources":["../../compliance/pii.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,EAAE,iCAAiC,EAAqE,MAAM,uCAAuC,CAAC;AAW7J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,iCAAiC,CAkCvE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAElG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CAEjF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE7C"}
|
package/dist/compliance/pii.js
CHANGED
|
@@ -4,6 +4,7 @@ import 'reflect-metadata';
|
|
|
4
4
|
import { ComplianceMetadataType } from './ComplianceMetadataType.js';
|
|
5
5
|
import { PIINotSupportedOnEventSourceId } from './PIINotSupportedOnEventSourceId.js';
|
|
6
6
|
import { TypeIntrospector } from '../types/index.js';
|
|
7
|
+
import { decorateClassOrProperty, getPropertyMetadata, hasPropertyMetadata } from '../types/propertyDecoratorMetadata.js';
|
|
7
8
|
/** The property name this client uses everywhere for the event source identifier. */
|
|
8
9
|
const EVENT_SOURCE_ID_PROPERTY = 'eventSourceId';
|
|
9
10
|
/** Metadata key for PII decorator on properties. */
|
|
@@ -50,7 +51,7 @@ const PII_TYPE_METADATA_KEY = 'chronicle:compliance:pii:type';
|
|
|
50
51
|
* ```
|
|
51
52
|
*/
|
|
52
53
|
export function pii(details) {
|
|
53
|
-
return (target, propertyKey) => {
|
|
54
|
+
return decorateClassOrProperty((target, propertyKey) => {
|
|
54
55
|
// Class decorator usage (for types like ConceptAs)
|
|
55
56
|
if (typeof target === 'function' && propertyKey === undefined) {
|
|
56
57
|
const metadata = {
|
|
@@ -70,7 +71,7 @@ export function pii(details) {
|
|
|
70
71
|
// PIINotSupportedOnEventSourceId guard, which throws for the same reason when
|
|
71
72
|
// [PII] is applied to an EventSourceId/EventSourceId<T> type.
|
|
72
73
|
if (key === EVENT_SOURCE_ID_PROPERTY) {
|
|
73
|
-
throw new PIINotSupportedOnEventSourceId(declaringType.name);
|
|
74
|
+
throw new PIINotSupportedOnEventSourceId(declaringType.name || 'the decorated class');
|
|
74
75
|
}
|
|
75
76
|
TypeIntrospector.trackProperty(declaringType, key);
|
|
76
77
|
const metadata = {
|
|
@@ -79,7 +80,7 @@ export function pii(details) {
|
|
|
79
80
|
};
|
|
80
81
|
Reflect.defineMetadata(PII_PROPERTY_METADATA_KEY, metadata, target, key);
|
|
81
82
|
}
|
|
82
|
-
};
|
|
83
|
+
});
|
|
83
84
|
}
|
|
84
85
|
/**
|
|
85
86
|
* Gets the PII compliance metadata for a property.
|
|
@@ -88,7 +89,7 @@ export function pii(details) {
|
|
|
88
89
|
* @returns The compliance metadata, or undefined if not decorated with @pii.
|
|
89
90
|
*/
|
|
90
91
|
export function getPIIMetadata(target, propertyKey) {
|
|
91
|
-
return
|
|
92
|
+
return getPropertyMetadata(PII_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
92
93
|
}
|
|
93
94
|
/**
|
|
94
95
|
* Checks whether a property has been decorated with @pii.
|
|
@@ -97,7 +98,7 @@ export function getPIIMetadata(target, propertyKey) {
|
|
|
97
98
|
* @returns True if the property has @pii decorator; false otherwise.
|
|
98
99
|
*/
|
|
99
100
|
export function hasPIIMetadata(target, propertyKey) {
|
|
100
|
-
return
|
|
101
|
+
return hasPropertyMetadata(PII_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
101
102
|
}
|
|
102
103
|
/**
|
|
103
104
|
* Gets the PII compliance metadata for a type.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../../compliance/pii.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAErG,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../../compliance/pii.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAErG,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAqC,uBAAuB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE7J,qFAAqF;AACrF,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAEjD,oDAAoD;AACpD,MAAM,yBAAyB,GAAG,mCAAmC,CAAC;AAEtE,+CAA+C;AAC/C,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,GAAG,CAAC,OAAgB;IAChC,OAAO,uBAAuB,CAAC,CAAC,MAAyB,EAAE,WAA6B,EAAE,EAAE;QACxF,mDAAmD;QACnD,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAuB;gBACjC,YAAY,EAAE,sBAAsB,CAAC,GAAG;gBACxC,OAAO,EAAE,OAAO,IAAI,EAAE;aACzB,CAAC;YACF,OAAO,CAAC,cAAc,CAAC,qBAAqB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChE,OAAO;QACX,CAAC;QAED,2BAA2B;QAC3B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,aAAa,GAAI,MAAoC,CAAC,WAAW,CAAC;YAExE,2EAA2E;YAC3E,iFAAiF;YACjF,8DAA8D;YAC9D,8EAA8E;YAC9E,8DAA8D;YAC9D,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;gBACnC,MAAM,IAAI,8BAA8B,CAAC,aAAa,CAAC,IAAI,IAAI,qBAAqB,CAAC,CAAC;YAC1F,CAAC;YAED,gBAAgB,CAAC,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAuB;gBACjC,YAAY,EAAE,sBAAsB,CAAC,GAAG;gBACxC,OAAO,EAAE,OAAO,IAAI,EAAE;aACzB,CAAC;YACF,OAAO,CAAC,cAAc,CAAC,yBAAyB,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,WAAmB;IAC9D,OAAO,mBAAmB,CAAqB,yBAAyB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACnG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,WAAmB;IAC9D,OAAO,mBAAmB,CAAC,yBAAyB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC7C,OAAO,OAAO,CAAC,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,IAAc;IAChC,OAAO,OAAO,CAAC,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
+
import { ChroniclePropertyDecorator } from '../types/propertyDecoratorMetadata.js';
|
|
2
3
|
/**
|
|
3
4
|
* Decorator that marks a property as the compliance subject - the natural person whose Personal
|
|
4
5
|
* Identifiable Information (PII) a read model or event carries. The subject selects which
|
|
@@ -22,7 +23,7 @@ import 'reflect-metadata';
|
|
|
22
23
|
* }
|
|
23
24
|
* ```
|
|
24
25
|
*/
|
|
25
|
-
export declare function subject():
|
|
26
|
+
export declare function subject(): ChroniclePropertyDecorator;
|
|
26
27
|
/**
|
|
27
28
|
* Checks whether a property has been decorated with @subject.
|
|
28
29
|
* @param target - The class prototype.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../compliance/subject.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../compliance/subject.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,0BAA0B,EAAiE,MAAM,uCAAuC,CAAC;AAQlJ;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,OAAO,IAAI,0BAA0B,CASpD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAEzE"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
import 'reflect-metadata';
|
|
4
4
|
import { TypeIntrospector } from '../types/index.js';
|
|
5
|
+
import { decorateProperty, getTypeOrFieldMetadata, hasPropertyMetadata } from '../types/propertyDecoratorMetadata.js';
|
|
5
6
|
/** Metadata key for the subject decorator on a property. */
|
|
6
7
|
const SUBJECT_PROPERTY_METADATA_KEY = 'chronicle:compliance:subject:property';
|
|
7
8
|
/** Metadata key for the name of the subject property recorded on the declaring type. */
|
|
@@ -30,13 +31,13 @@ const SUBJECT_TYPE_METADATA_KEY = 'chronicle:compliance:subject:type';
|
|
|
30
31
|
* ```
|
|
31
32
|
*/
|
|
32
33
|
export function subject() {
|
|
33
|
-
return (target, propertyKey) => {
|
|
34
|
+
return decorateProperty((target, propertyKey) => {
|
|
34
35
|
const key = propertyKey.toString();
|
|
35
36
|
const declaringType = target.constructor;
|
|
36
37
|
TypeIntrospector.trackProperty(declaringType, key);
|
|
37
38
|
Reflect.defineMetadata(SUBJECT_PROPERTY_METADATA_KEY, true, target, key);
|
|
38
39
|
Reflect.defineMetadata(SUBJECT_TYPE_METADATA_KEY, key, declaringType);
|
|
39
|
-
};
|
|
40
|
+
});
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
42
43
|
* Checks whether a property has been decorated with @subject.
|
|
@@ -45,7 +46,7 @@ export function subject() {
|
|
|
45
46
|
* @returns True if the property has the @subject decorator; false otherwise.
|
|
46
47
|
*/
|
|
47
48
|
export function hasSubjectMetadata(target, propertyKey) {
|
|
48
|
-
return
|
|
49
|
+
return hasPropertyMetadata(SUBJECT_PROPERTY_METADATA_KEY, target, propertyKey);
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
52
|
* Gets the name of the property decorated with @subject on a type, if any.
|
|
@@ -53,6 +54,6 @@ export function hasSubjectMetadata(target, propertyKey) {
|
|
|
53
54
|
* @returns The decorated property name, or undefined when no property is decorated.
|
|
54
55
|
*/
|
|
55
56
|
export function getSubjectPropertyName(type) {
|
|
56
|
-
return
|
|
57
|
+
return getTypeOrFieldMetadata(SUBJECT_TYPE_METADATA_KEY, type);
|
|
57
58
|
}
|
|
58
59
|
//# sourceMappingURL=subject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../compliance/subject.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAErG,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../compliance/subject.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAErG,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAA8B,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAElJ,4DAA4D;AAC5D,MAAM,6BAA6B,GAAG,uCAAuC,CAAC;AAE9E,wFAAwF;AACxF,MAAM,yBAAyB,GAAG,mCAAmC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,OAAO;IACnB,OAAO,gBAAgB,CAAC,CAAC,MAAc,EAAE,WAA4B,EAAE,EAAE;QACrE,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,aAAa,GAAI,MAAoC,CAAC,WAAW,CAAC;QAExE,gBAAgB,CAAC,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,cAAc,CAAC,6BAA6B,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACzE,OAAO,CAAC,cAAc,CAAC,yBAAyB,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,WAAmB;IAClE,OAAO,mBAAmB,CAAC,6BAA6B,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACjD,OAAO,sBAAsB,CAAS,yBAAyB,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import type { SecurityMetadata } from './SecurityMetadata.js';
|
|
3
3
|
import { EncryptionScope } from './EncryptionScope.js';
|
|
4
|
+
import { ChronicleClassOrPropertyDecorator } from '../types/propertyDecoratorMetadata.js';
|
|
4
5
|
/**
|
|
5
6
|
* Decorator that marks a property or type as needing plain-confidentiality encryption at rest - a
|
|
6
7
|
* security measure, not a compliance one.
|
|
@@ -42,7 +43,7 @@ import { EncryptionScope } from './EncryptionScope.js';
|
|
|
42
43
|
* }
|
|
43
44
|
* ```
|
|
44
45
|
*/
|
|
45
|
-
export declare function encrypted(scope?: EncryptionScope, details?: string):
|
|
46
|
+
export declare function encrypted(scope?: EncryptionScope, details?: string): ChronicleClassOrPropertyDecorator;
|
|
46
47
|
/**
|
|
47
48
|
* Gets the encrypted security metadata for a property.
|
|
48
49
|
* @param target - The class prototype.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encrypted.d.ts","sourceRoot":"","sources":["../../confidentiality/encrypted.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"encrypted.d.ts","sourceRoot":"","sources":["../../confidentiality/encrypted.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,iCAAiC,EAAqE,MAAM,uCAAuC,CAAC;AAsB7J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,SAAS,CAAC,KAAK,GAAE,eAAyC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,iCAAiC,CAiC/H;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEtG;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAEjF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAErF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEnD"}
|