@dismissible/nestjs-dismissible-item 0.0.2-canary.8976e84.0 → 0.0.2-canary.a611bd3.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/README.md +3 -15
- package/package.json +20 -3
- package/src/dismissible-item.d.ts +9 -0
- package/src/dismissible-item.factory.d.ts +34 -0
- package/src/dismissible-item.factory.js +62 -0
- package/src/dismissible-item.factory.js.map +1 -0
- package/src/dismissible-item.js +49 -0
- package/src/dismissible-item.js.map +1 -0
- package/src/dismissible-item.module.d.ts +2 -0
- package/src/dismissible-item.module.js +16 -0
- package/src/dismissible-item.module.js.map +1 -0
- package/src/index.js +7 -0
- package/src/index.js.map +1 -0
- package/jest.config.ts +0 -10
- package/project.json +0 -42
- package/src/dismissible-item.factory.spec.ts +0 -124
- package/src/dismissible-item.factory.ts +0 -81
- package/src/dismissible-item.module.ts +0 -8
- package/src/dismissible-item.ts +0 -55
- package/tsconfig.json +0 -13
- package/tsconfig.lib.json +0 -14
- /package/src/{index.ts → index.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -10,7 +10,6 @@ This library provides the foundational data structures for the Dismissible syste
|
|
|
10
10
|
|
|
11
11
|
- `DismissibleItemDto` - The core data transfer object representing a dismissible item
|
|
12
12
|
- `DismissibleItemFactory` - Factory for creating and manipulating dismissible items
|
|
13
|
-
- `BaseMetadata` - Type definition for item metadata
|
|
14
13
|
|
|
15
14
|
## Installation
|
|
16
15
|
|
|
@@ -28,24 +27,14 @@ The `DismissibleItemDto` class represents a dismissible item with the following
|
|
|
28
27
|
- `userId` - User identifier who owns the item
|
|
29
28
|
- `createdAt` - Timestamp when the item was created
|
|
30
29
|
- `dismissedAt` - Optional timestamp when the item was dismissed
|
|
31
|
-
- `metadata` - Optional metadata object (type-safe with generics)
|
|
32
30
|
|
|
33
31
|
```typescript
|
|
34
|
-
import { DismissibleItemDto
|
|
32
|
+
import { DismissibleItemDto } from '@dismissible/nestjs-dismissible-item';
|
|
35
33
|
|
|
36
|
-
|
|
37
|
-
version: number;
|
|
38
|
-
category: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const item: DismissibleItemDto<MyMetadata> = {
|
|
34
|
+
const item: DismissibleItemDto = {
|
|
42
35
|
id: 'welcome-banner',
|
|
43
36
|
userId: 'user-123',
|
|
44
37
|
createdAt: new Date(),
|
|
45
|
-
metadata: {
|
|
46
|
-
version: 2,
|
|
47
|
-
category: 'onboarding',
|
|
48
|
-
},
|
|
49
38
|
};
|
|
50
39
|
```
|
|
51
40
|
|
|
@@ -98,12 +87,11 @@ export class MyService {
|
|
|
98
87
|
The main data transfer object for dismissible items.
|
|
99
88
|
|
|
100
89
|
```typescript
|
|
101
|
-
class DismissibleItemDto
|
|
90
|
+
class DismissibleItemDto {
|
|
102
91
|
id: string;
|
|
103
92
|
userId: string;
|
|
104
93
|
createdAt: Date;
|
|
105
94
|
dismissedAt?: Date;
|
|
106
|
-
metadata?: TMetadata;
|
|
107
95
|
}
|
|
108
96
|
```
|
|
109
97
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dismissible/nestjs-dismissible-item",
|
|
3
|
-
"version": "0.0.2-canary.
|
|
3
|
+
"version": "0.0.2-canary.a611bd3.0",
|
|
4
4
|
"description": "Dismissible item library",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"types": "./src/index.d.ts",
|
|
@@ -11,12 +11,28 @@
|
|
|
11
11
|
"types": "./src/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"files": [
|
|
15
|
+
"src",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
14
18
|
"peerDependencies": {
|
|
15
|
-
"@nestjs/common": "^11.0.0"
|
|
19
|
+
"@nestjs/common": "10.0.0 || ^11.0.0",
|
|
20
|
+
"@nestjs/swagger": "10.0.0 || ^11.0.0",
|
|
21
|
+
"class-validator": "0.14.0",
|
|
22
|
+
"class-transformer": "0.5.0"
|
|
16
23
|
},
|
|
17
24
|
"peerDependenciesMeta": {
|
|
18
25
|
"@nestjs/common": {
|
|
19
26
|
"optional": false
|
|
27
|
+
},
|
|
28
|
+
"@nestjs/swagger": {
|
|
29
|
+
"optional": false
|
|
30
|
+
},
|
|
31
|
+
"class-validator": {
|
|
32
|
+
"optional": false
|
|
33
|
+
},
|
|
34
|
+
"class-transformer": {
|
|
35
|
+
"optional": false
|
|
20
36
|
}
|
|
21
37
|
},
|
|
22
38
|
"keywords": [
|
|
@@ -32,5 +48,6 @@
|
|
|
32
48
|
},
|
|
33
49
|
"publishConfig": {
|
|
34
50
|
"access": "public"
|
|
35
|
-
}
|
|
51
|
+
},
|
|
52
|
+
"type": "commonjs"
|
|
36
53
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DismissibleItemDto } from './dismissible-item';
|
|
2
|
+
/**
|
|
3
|
+
* Options for creating a dismissible item.
|
|
4
|
+
*/
|
|
5
|
+
export interface ICreateDismissibleItemOptions {
|
|
6
|
+
id: string;
|
|
7
|
+
createdAt: Date;
|
|
8
|
+
userId: string;
|
|
9
|
+
dismissedAt?: Date;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Factory for creating DismissibleItemDto instances.
|
|
13
|
+
* Uses class-transformer to ensure proper class instantiation.
|
|
14
|
+
*/
|
|
15
|
+
export declare class DismissibleItemFactory {
|
|
16
|
+
/**
|
|
17
|
+
* Create a new DismissibleItemDto instance from the provided options.
|
|
18
|
+
* Uses plainToInstance to ensure the result is a proper class instance.
|
|
19
|
+
*/
|
|
20
|
+
create(options: ICreateDismissibleItemOptions): DismissibleItemDto;
|
|
21
|
+
/**
|
|
22
|
+
* Create a clone of an existing DismissibleItemDto.
|
|
23
|
+
*/
|
|
24
|
+
clone(item: DismissibleItemDto): DismissibleItemDto;
|
|
25
|
+
/**
|
|
26
|
+
* Create a dismissed version of an existing item.
|
|
27
|
+
*/
|
|
28
|
+
createDismissed(item: DismissibleItemDto, dismissedAt: Date): DismissibleItemDto;
|
|
29
|
+
/**
|
|
30
|
+
* Create a restored (non-dismissed) version of an existing item.
|
|
31
|
+
* Removes the dismissedAt property.
|
|
32
|
+
*/
|
|
33
|
+
createRestored(item: DismissibleItemDto): DismissibleItemDto;
|
|
34
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DismissibleItemFactory = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const class_transformer_1 = require("class-transformer");
|
|
7
|
+
const dismissible_item_1 = require("./dismissible-item");
|
|
8
|
+
/**
|
|
9
|
+
* Factory for creating DismissibleItemDto instances.
|
|
10
|
+
* Uses class-transformer to ensure proper class instantiation.
|
|
11
|
+
*/
|
|
12
|
+
let DismissibleItemFactory = class DismissibleItemFactory {
|
|
13
|
+
/**
|
|
14
|
+
* Create a new DismissibleItemDto instance from the provided options.
|
|
15
|
+
* Uses plainToInstance to ensure the result is a proper class instance.
|
|
16
|
+
*/
|
|
17
|
+
create(options) {
|
|
18
|
+
return (0, class_transformer_1.plainToInstance)(dismissible_item_1.DismissibleItemDto, options, {
|
|
19
|
+
excludeExtraneousValues: false,
|
|
20
|
+
enableImplicitConversion: true,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a clone of an existing DismissibleItemDto.
|
|
25
|
+
*/
|
|
26
|
+
clone(item) {
|
|
27
|
+
return this.create({
|
|
28
|
+
id: item.id,
|
|
29
|
+
createdAt: item.createdAt,
|
|
30
|
+
userId: item.userId,
|
|
31
|
+
dismissedAt: item.dismissedAt,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a dismissed version of an existing item.
|
|
36
|
+
*/
|
|
37
|
+
createDismissed(item, dismissedAt) {
|
|
38
|
+
return this.create({
|
|
39
|
+
id: item.id,
|
|
40
|
+
createdAt: item.createdAt,
|
|
41
|
+
userId: item.userId,
|
|
42
|
+
dismissedAt,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create a restored (non-dismissed) version of an existing item.
|
|
47
|
+
* Removes the dismissedAt property.
|
|
48
|
+
*/
|
|
49
|
+
createRestored(item) {
|
|
50
|
+
return this.create({
|
|
51
|
+
id: item.id,
|
|
52
|
+
createdAt: item.createdAt,
|
|
53
|
+
userId: item.userId,
|
|
54
|
+
dismissedAt: undefined,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.DismissibleItemFactory = DismissibleItemFactory;
|
|
59
|
+
exports.DismissibleItemFactory = DismissibleItemFactory = tslib_1.__decorate([
|
|
60
|
+
(0, common_1.Injectable)()
|
|
61
|
+
], DismissibleItemFactory);
|
|
62
|
+
//# sourceMappingURL=dismissible-item.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissible-item.factory.js","sourceRoot":"","sources":["../../../../libs/dismissible-item/src/dismissible-item.factory.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAC5C,yDAAoD;AACpD,yDAAwD;AAYxD;;;GAGG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC;;;OAGG;IACH,MAAM,CAAC,OAAsC;QAC3C,OAAO,IAAA,mCAAe,EAAC,qCAAkB,EAAE,OAAO,EAAE;YAClD,uBAAuB,EAAE,KAAK;YAC9B,wBAAwB,EAAE,IAAI;SAC/B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAwB;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAwB,EAAE,WAAiB;QACzD,OAAO,IAAI,CAAC,MAAM,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,IAAwB;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAhDY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CAgDlC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DismissibleItemDto = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
const class_validator_1 = require("class-validator");
|
|
7
|
+
const class_transformer_1 = require("class-transformer");
|
|
8
|
+
/**
|
|
9
|
+
* Represents a dismissible item in the system.
|
|
10
|
+
*/
|
|
11
|
+
class DismissibleItemDto {
|
|
12
|
+
}
|
|
13
|
+
exports.DismissibleItemDto = DismissibleItemDto;
|
|
14
|
+
tslib_1.__decorate([
|
|
15
|
+
(0, swagger_1.ApiProperty)({
|
|
16
|
+
description: 'Unique identifier for the item',
|
|
17
|
+
example: 'welcome-banner-v2',
|
|
18
|
+
}),
|
|
19
|
+
(0, class_validator_1.IsString)(),
|
|
20
|
+
tslib_1.__metadata("design:type", String)
|
|
21
|
+
], DismissibleItemDto.prototype, "id", void 0);
|
|
22
|
+
tslib_1.__decorate([
|
|
23
|
+
(0, swagger_1.ApiProperty)({
|
|
24
|
+
description: 'User identifier who created the item',
|
|
25
|
+
example: 'user-123',
|
|
26
|
+
}),
|
|
27
|
+
(0, class_validator_1.IsString)(),
|
|
28
|
+
tslib_1.__metadata("design:type", String)
|
|
29
|
+
], DismissibleItemDto.prototype, "userId", void 0);
|
|
30
|
+
tslib_1.__decorate([
|
|
31
|
+
(0, swagger_1.ApiProperty)({
|
|
32
|
+
description: 'When the item was created',
|
|
33
|
+
example: '2024-01-15T10:30:00.000Z',
|
|
34
|
+
}),
|
|
35
|
+
(0, class_validator_1.IsDate)(),
|
|
36
|
+
(0, class_transformer_1.Type)(() => Date),
|
|
37
|
+
tslib_1.__metadata("design:type", Date)
|
|
38
|
+
], DismissibleItemDto.prototype, "createdAt", void 0);
|
|
39
|
+
tslib_1.__decorate([
|
|
40
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
41
|
+
description: 'When the item was dismissed, if applicable',
|
|
42
|
+
example: '2024-01-15T12:00:00.000Z',
|
|
43
|
+
}),
|
|
44
|
+
(0, class_validator_1.IsOptional)(),
|
|
45
|
+
(0, class_validator_1.IsDate)(),
|
|
46
|
+
(0, class_transformer_1.Type)(() => Date),
|
|
47
|
+
tslib_1.__metadata("design:type", Date)
|
|
48
|
+
], DismissibleItemDto.prototype, "dismissedAt", void 0);
|
|
49
|
+
//# sourceMappingURL=dismissible-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissible-item.js","sourceRoot":"","sources":["../../../../libs/dismissible-item/src/dismissible-item.ts"],"names":[],"mappings":";;;;AAAA,6CAAmE;AACnE,qDAA+D;AAC/D,yDAAyC;AAEzC;;GAEG;AACH,MAAa,kBAAkB;CA+B9B;AA/BD,gDA+BC;AAzBC;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,mBAAmB;KAC7B,CAAC;IACD,IAAA,0BAAQ,GAAE;;8CACC;AAOZ;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,UAAU;KACpB,CAAC;IACD,IAAA,0BAAQ,GAAE;;kDACK;AAQhB;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,0BAA0B;KACpC,CAAC;IACD,IAAA,wBAAM,GAAE;IACR,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC;sCACL,IAAI;qDAAC;AASjB;IAPC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,0BAA0B;KACpC,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,GAAE;IACR,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC;sCACH,IAAI;uDAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DismissibleItemModule = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const dismissible_item_factory_1 = require("./dismissible-item.factory");
|
|
7
|
+
let DismissibleItemModule = class DismissibleItemModule {
|
|
8
|
+
};
|
|
9
|
+
exports.DismissibleItemModule = DismissibleItemModule;
|
|
10
|
+
exports.DismissibleItemModule = DismissibleItemModule = tslib_1.__decorate([
|
|
11
|
+
(0, common_1.Module)({
|
|
12
|
+
providers: [dismissible_item_factory_1.DismissibleItemFactory],
|
|
13
|
+
exports: [dismissible_item_factory_1.DismissibleItemFactory],
|
|
14
|
+
})
|
|
15
|
+
], DismissibleItemModule);
|
|
16
|
+
//# sourceMappingURL=dismissible-item.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissible-item.module.js","sourceRoot":"","sources":["../../../../libs/dismissible-item/src/dismissible-item.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,yEAAoE;AAM7D,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAAG,CAAA;AAAxB,sDAAqB;gCAArB,qBAAqB;IAJjC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,iDAAsB,CAAC;QACnC,OAAO,EAAE,CAAC,iDAAsB,CAAC;KAClC,CAAC;GACW,qBAAqB,CAAG"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./dismissible-item"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./dismissible-item.factory"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./dismissible-item.module"), exports);
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/dismissible-item/src/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC;AACnC,qEAA2C;AAC3C,oEAA0C"}
|
package/jest.config.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
displayName: 'dismissible-item',
|
|
3
|
-
preset: '../../jest.preset.js',
|
|
4
|
-
testEnvironment: 'node',
|
|
5
|
-
transform: {
|
|
6
|
-
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.json' }],
|
|
7
|
-
},
|
|
8
|
-
moduleFileExtensions: ['ts', 'js', 'html'],
|
|
9
|
-
coverageDirectory: '../../coverage/libs/dismissible-item',
|
|
10
|
-
};
|
package/project.json
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dismissible-item",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "libs/dismissible-item/src",
|
|
5
|
-
"projectType": "library",
|
|
6
|
-
"tags": [],
|
|
7
|
-
"targets": {
|
|
8
|
-
"build": {
|
|
9
|
-
"executor": "@nx/js:tsc",
|
|
10
|
-
"outputs": ["{options.outputPath}"],
|
|
11
|
-
"options": {
|
|
12
|
-
"outputPath": "dist/libs/dismissible-item",
|
|
13
|
-
"main": "libs/dismissible-item/src/index.ts",
|
|
14
|
-
"tsConfig": "libs/dismissible-item/tsconfig.lib.json",
|
|
15
|
-
"assets": ["libs/dismissible-item/package.json", "libs/dismissible-item/README.md"],
|
|
16
|
-
"generatePackageJson": true
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"lint": {
|
|
20
|
-
"executor": "@nx/eslint:lint",
|
|
21
|
-
"outputs": ["{options.outputFile}"],
|
|
22
|
-
"options": {
|
|
23
|
-
"lintFilePatterns": ["libs/dismissible-item/**/*.ts"]
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"test": {
|
|
27
|
-
"executor": "@nx/jest:jest",
|
|
28
|
-
"outputs": ["{workspaceRoot}/coverage/libs/dismissible-item"],
|
|
29
|
-
"options": {
|
|
30
|
-
"jestConfig": "libs/dismissible-item/jest.config.ts",
|
|
31
|
-
"passWithNoTests": true
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"npm-publish": {
|
|
35
|
-
"executor": "nx:run-commands",
|
|
36
|
-
"options": {
|
|
37
|
-
"command": "npm publish --access public",
|
|
38
|
-
"cwd": "dist/libs/dismissible-item"
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { DismissibleItemFactory } from './dismissible-item.factory';
|
|
2
|
-
import { DismissibleItemDto } from './dismissible-item';
|
|
3
|
-
|
|
4
|
-
describe('DismissibleItemFactory', () => {
|
|
5
|
-
let factory: DismissibleItemFactory;
|
|
6
|
-
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
factory = new DismissibleItemFactory();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
describe('create', () => {
|
|
12
|
-
it('should create a DismissibleItemDto instance', () => {
|
|
13
|
-
const item = factory.create({
|
|
14
|
-
id: 'test-id',
|
|
15
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
expect(item).toBeInstanceOf(DismissibleItemDto);
|
|
19
|
-
expect(item.id).toBe('test-id');
|
|
20
|
-
expect(item.createdAt).toEqual(new Date('2024-01-15T10:00:00.000Z'));
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should handle optional properties when undefined', () => {
|
|
24
|
-
const item = factory.create({
|
|
25
|
-
id: 'test-id',
|
|
26
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
27
|
-
userId: undefined,
|
|
28
|
-
metadata: undefined,
|
|
29
|
-
dismissedAt: undefined,
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
expect(item.id).toBe('test-id');
|
|
33
|
-
expect(item.createdAt).toEqual(new Date('2024-01-15T10:00:00.000Z'));
|
|
34
|
-
expect(item.userId).toBeUndefined();
|
|
35
|
-
expect(item.metadata).toBeUndefined();
|
|
36
|
-
expect(item.dismissedAt).toBeUndefined();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should include optional properties when provided', () => {
|
|
40
|
-
const metadata = { version: 2, category: 'test' };
|
|
41
|
-
const item = factory.create({
|
|
42
|
-
id: 'test-id',
|
|
43
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
44
|
-
userId: 'user-123',
|
|
45
|
-
metadata,
|
|
46
|
-
dismissedAt: new Date('2024-01-15T12:00:00.000Z'),
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
expect(item.userId).toBe('user-123');
|
|
50
|
-
expect(item.metadata).toEqual(metadata);
|
|
51
|
-
expect(item.dismissedAt).toEqual(new Date('2024-01-15T12:00:00.000Z'));
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('clone', () => {
|
|
56
|
-
it('should create an identical copy of an item', () => {
|
|
57
|
-
const original = factory.create({
|
|
58
|
-
id: 'test-id',
|
|
59
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
60
|
-
userId: 'user-123',
|
|
61
|
-
metadata: { key: 'value' },
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
const cloned = factory.clone(original);
|
|
65
|
-
|
|
66
|
-
expect(cloned).toBeInstanceOf(DismissibleItemDto);
|
|
67
|
-
expect(cloned).toEqual(original);
|
|
68
|
-
expect(cloned).not.toBe(original); // Different object reference
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe('createDismissed', () => {
|
|
73
|
-
it('should create a dismissed version with dismissedAt set', () => {
|
|
74
|
-
const original = factory.create({
|
|
75
|
-
id: 'test-id',
|
|
76
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
77
|
-
userId: 'user-123',
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
const dismissed = factory.createDismissed(original, new Date('2024-01-15T12:00:00.000Z'));
|
|
81
|
-
|
|
82
|
-
expect(dismissed).toBeInstanceOf(DismissibleItemDto);
|
|
83
|
-
expect(dismissed.id).toBe(original.id);
|
|
84
|
-
expect(dismissed.createdAt).toEqual(original.createdAt);
|
|
85
|
-
expect(dismissed.userId).toBe(original.userId);
|
|
86
|
-
expect(dismissed.dismissedAt).toEqual(new Date('2024-01-15T12:00:00.000Z'));
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe('createRestored', () => {
|
|
91
|
-
it('should create a restored version without dismissedAt', () => {
|
|
92
|
-
const dismissed = factory.create({
|
|
93
|
-
id: 'test-id',
|
|
94
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
95
|
-
userId: 'user-123',
|
|
96
|
-
dismissedAt: new Date('2024-01-15T12:00:00.000Z'),
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
const restored = factory.createRestored(dismissed);
|
|
100
|
-
|
|
101
|
-
expect(restored).toBeInstanceOf(DismissibleItemDto);
|
|
102
|
-
expect(restored.id).toBe(dismissed.id);
|
|
103
|
-
expect(restored.createdAt).toEqual(dismissed.createdAt);
|
|
104
|
-
expect(restored.userId).toBe(dismissed.userId);
|
|
105
|
-
expect(restored.dismissedAt).toBeUndefined();
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should preserve metadata when restoring', () => {
|
|
109
|
-
const metadata = { key: 'value', count: 42 };
|
|
110
|
-
const dismissed = factory.create({
|
|
111
|
-
id: 'test-id',
|
|
112
|
-
createdAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
113
|
-
userId: 'user-123',
|
|
114
|
-
metadata,
|
|
115
|
-
dismissedAt: new Date('2024-01-15T12:00:00.000Z'),
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const restored = factory.createRestored(dismissed);
|
|
119
|
-
|
|
120
|
-
expect(restored.metadata).toEqual(metadata);
|
|
121
|
-
expect(restored.metadata).not.toBe(dismissed.metadata); // Different object reference
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
});
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { plainToInstance } from 'class-transformer';
|
|
3
|
-
import { BaseMetadata, DismissibleItemDto } from './dismissible-item';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Options for creating a dismissible item.
|
|
7
|
-
*/
|
|
8
|
-
export interface ICreateDismissibleItemOptions<TMetadata extends BaseMetadata> {
|
|
9
|
-
id: string;
|
|
10
|
-
createdAt: Date;
|
|
11
|
-
userId?: string;
|
|
12
|
-
metadata?: TMetadata;
|
|
13
|
-
dismissedAt?: Date;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Factory for creating DismissibleItemDto instances.
|
|
18
|
-
* Uses class-transformer to ensure proper class instantiation.
|
|
19
|
-
*/
|
|
20
|
-
@Injectable()
|
|
21
|
-
export class DismissibleItemFactory {
|
|
22
|
-
/**
|
|
23
|
-
* Create a new DismissibleItemDto instance from the provided options.
|
|
24
|
-
* Uses plainToInstance to ensure the result is a proper class instance.
|
|
25
|
-
*/
|
|
26
|
-
create<TMetadata extends BaseMetadata = BaseMetadata>(
|
|
27
|
-
options: ICreateDismissibleItemOptions<TMetadata>,
|
|
28
|
-
): DismissibleItemDto<TMetadata> {
|
|
29
|
-
return plainToInstance(DismissibleItemDto<TMetadata>, options, {
|
|
30
|
-
excludeExtraneousValues: false,
|
|
31
|
-
enableImplicitConversion: true,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Create a clone of an existing DismissibleItemDto.
|
|
37
|
-
*/
|
|
38
|
-
clone<TMetadata extends BaseMetadata = BaseMetadata>(
|
|
39
|
-
item: DismissibleItemDto<TMetadata>,
|
|
40
|
-
): DismissibleItemDto<TMetadata> {
|
|
41
|
-
return this.create({
|
|
42
|
-
id: item.id,
|
|
43
|
-
createdAt: item.createdAt,
|
|
44
|
-
userId: item.userId,
|
|
45
|
-
metadata: item.metadata,
|
|
46
|
-
dismissedAt: item.dismissedAt,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Create a dismissed version of an existing item.
|
|
52
|
-
*/
|
|
53
|
-
createDismissed<TMetadata extends BaseMetadata = BaseMetadata>(
|
|
54
|
-
item: DismissibleItemDto<TMetadata>,
|
|
55
|
-
dismissedAt: Date,
|
|
56
|
-
): DismissibleItemDto<TMetadata> {
|
|
57
|
-
return this.create({
|
|
58
|
-
id: item.id,
|
|
59
|
-
createdAt: item.createdAt,
|
|
60
|
-
userId: item.userId,
|
|
61
|
-
metadata: item.metadata,
|
|
62
|
-
dismissedAt,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Create a restored (non-dismissed) version of an existing item.
|
|
68
|
-
* Removes the dismissedAt property.
|
|
69
|
-
*/
|
|
70
|
-
createRestored<TMetadata extends BaseMetadata = BaseMetadata>(
|
|
71
|
-
item: DismissibleItemDto<TMetadata>,
|
|
72
|
-
): DismissibleItemDto<TMetadata> {
|
|
73
|
-
return this.create({
|
|
74
|
-
id: item.id,
|
|
75
|
-
createdAt: item.createdAt,
|
|
76
|
-
userId: item.userId,
|
|
77
|
-
metadata: item.metadata,
|
|
78
|
-
dismissedAt: undefined,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
package/src/dismissible-item.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
2
|
-
import { IsString, IsDate, IsOptional, IsObject } from 'class-validator';
|
|
3
|
-
import { Type } from 'class-transformer';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Base metadata type for dismissible items.
|
|
7
|
-
* Can be extended with custom metadata fields.
|
|
8
|
-
*/
|
|
9
|
-
export type BaseMetadata = Record<string, unknown>;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Represents a dismissible item in the system.
|
|
13
|
-
*/
|
|
14
|
-
export class DismissibleItemDto<TMetadata extends BaseMetadata = BaseMetadata> {
|
|
15
|
-
@ApiProperty({
|
|
16
|
-
description: 'Unique identifier for the item',
|
|
17
|
-
example: 'welcome-banner-v2',
|
|
18
|
-
})
|
|
19
|
-
@IsString()
|
|
20
|
-
id!: string;
|
|
21
|
-
|
|
22
|
-
@ApiProperty({
|
|
23
|
-
description: 'User identifier who created the item',
|
|
24
|
-
example: 'user-123',
|
|
25
|
-
})
|
|
26
|
-
@IsString()
|
|
27
|
-
userId!: string;
|
|
28
|
-
|
|
29
|
-
@ApiProperty({
|
|
30
|
-
description: 'When the item was created',
|
|
31
|
-
example: '2024-01-15T10:30:00.000Z',
|
|
32
|
-
})
|
|
33
|
-
@IsDate()
|
|
34
|
-
@Type(() => Date)
|
|
35
|
-
createdAt!: Date;
|
|
36
|
-
|
|
37
|
-
@ApiPropertyOptional({
|
|
38
|
-
description: 'When the item was dismissed, if applicable',
|
|
39
|
-
example: '2024-01-15T12:00:00.000Z',
|
|
40
|
-
})
|
|
41
|
-
@IsOptional()
|
|
42
|
-
@IsDate()
|
|
43
|
-
@Type(() => Date)
|
|
44
|
-
dismissedAt?: Date;
|
|
45
|
-
|
|
46
|
-
@ApiPropertyOptional({
|
|
47
|
-
description: 'Optional metadata associated with the item',
|
|
48
|
-
example: { version: 2, category: 'promotional' },
|
|
49
|
-
type: 'object',
|
|
50
|
-
additionalProperties: true,
|
|
51
|
-
})
|
|
52
|
-
@IsOptional()
|
|
53
|
-
@IsObject()
|
|
54
|
-
metadata?: TMetadata;
|
|
55
|
-
}
|
package/tsconfig.json
DELETED
package/tsconfig.lib.json
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"declaration": true,
|
|
6
|
-
"module": "commonjs",
|
|
7
|
-
"types": ["node"],
|
|
8
|
-
"emitDecoratorMetadata": true,
|
|
9
|
-
"experimentalDecorators": true,
|
|
10
|
-
"target": "ES2021"
|
|
11
|
-
},
|
|
12
|
-
"exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"],
|
|
13
|
-
"include": ["src/**/*.ts"]
|
|
14
|
-
}
|
|
File without changes
|