Skip to content

Commit

Permalink
prettier + fix control mappingOptions
Browse files Browse the repository at this point in the history
  • Loading branch information
Ugo evola authored and ugoevola committed Sep 24, 2022
1 parent 5be632d commit 4810dfa
Show file tree
Hide file tree
Showing 53 changed files with 698 additions and 416 deletions.
8 changes: 6 additions & 2 deletions .eslintrc.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
env:
browser: true
es2021: true
extends: standard-with-typescript
extends:
- standard-with-typescript
- plugin:prettier/recommended
overrides: []
parserOptions:
ecmaVersion: latest
Expand All @@ -12,4 +14,6 @@ rules:
no-mixed-operators: off
"@typescript-eslint/strict-boolean-expressions": off
"@typescript-eslint/restrict-plus-operands": off
curly: off
curly: off
no-useless-return: off
prettier/prettier: error
7 changes: 7 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Ignore artifacts:
build
coverage
node_modules
*.md
*.json
*.yml
11 changes: 11 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"parser": "typescript",
"printWidth": 85,
"tabWidth": 2,
"singleQuote": true,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"arrowParens": "avoid",
"trailingComma": "none",
"semi": false
}
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# [3.0.1](https://github.com/ugoevola/ts-mapstruct/releases/tag/v3.0.1)

### Added
- Prettier
### Fixed
- Controls on MappingOptions
# [3.0.0](https://github.com/ugoevola/ts-mapstruct/releases/tag/v3.0.0)
### Breaking Changed
- The **@Mappings** decorator doesn't work without **@Mapper** on the parent class
Expand Down
36 changes: 19 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,11 @@ In the previous example, the friends and bestFriends properties will remain Frie
The library allows you to define the targeted type for each property:
```ts
@Mappings(
{ target: 'fullName', expression: 'getConcatProperties(userDto.fname, userDto.lname)' },
{ target: 'cn', source: 'userDto.fname' },
{ target: 'sn', source: 'userDto.lname' },
{ target: 'lastConnexionTime', value: Date.now() },
// changed
{ target: 'bestFriend', expression: 'getBestFriend(userDto.friends)', type: FriendEntity },
{
target: 'bestFriend',
expression: 'getBestFriend(userDto.friends)',
type: FriendEntity
},
{ target: 'friends', type: FriendEntity }
)
entityFromDto(_userDto: UserDto): UserEntity {
Expand All @@ -157,13 +156,12 @@ The library allows you to define the targeted type for each property:
If you have multiple depths in your object, you can target the right property with the right type like this:
```ts
@Mappings(
{ target: 'fullName', expression: 'getConcatProperties(userDto.fname, userDto.lname)' },
{ target: 'cn', source: 'userDto.fname' },
{ target: 'sn', source: 'userDto.lname' },
{ target: 'lastConnexionTime', value: Date.now() },
{ target: 'bestFriend', expression: 'getBestFriend(userDto.friends)', type: FriendEntity },
{
target: 'bestFriend',
expression: 'getBestFriend(userDto.friends)',
type: FriendEntity
},
{ target: 'friends', type: FriendEntity },
// changed
{ target: 'friends.bdate', type: Date },
{ target: 'bestFriend.bdate', type: Date }
)
Expand All @@ -186,7 +184,11 @@ Below are examples of options that may exist:
{ target: 'prop', type: 'date' }
// used to convert Date to string with a specific format
// cf. Intl.DateTimeFormat for more informations
{ target: 'prop', type: String, dateFormat: ['Fr-fr', { dateStyle: 'full', timeStyle: 'long' }] }
{
target: 'prop',
type: String,
dateFormat: ['Fr-fr', { dateStyle: 'full', timeStyle: 'long' }]
}
```
### @BeforeMapping / @AfterMapping
These decorators are to be placed on internal methods of the mapper. They allow to execute them before or after the mapping.<br>
Expand Down Expand Up @@ -376,7 +378,7 @@ export class UserMapper {

// this will throw a BadExpressionExceptionMapper because the expression for fullName can't be evaluated (unknownMethod does not exist)
@Mappings(
{ target: 'fullName', expression: 'unknownMethod()' },
{ target: 'fullName', expression: 'unknownMethod()' }
)
entityFromDto(_userDto: UserDto): UserEntity {
return new UserEntity;
Expand Down Expand Up @@ -411,7 +413,7 @@ export class UserMapper {

// this will throw an InvalidMappingOptionsExceptionMapper because you provide multiple sources (value and source) for cn in one MappingOption
@Mappings(
{ target: 'cn', value: 'Ugo', source: 'userDto.fname' },
{ target: 'cn', value: 'Ugo', source: 'userDto.fname' }
)
entityFromDto(_userDto: UserDto): UserEntity {
return new UserEntity;
Expand Down Expand Up @@ -442,7 +444,7 @@ export class UserMapper {

// this will throw an InvalidSourceExceptionMapper because userDto.unknownProperty does not exist
@Mappings(
{ target: 'cn', source: 'userDto.unknownProperty' },
{ target: 'cn', source: 'userDto.unknownProperty' }
)
entityFromDto(_userDto: UserDto): UserEntity {
return new UserEntity;
Expand All @@ -458,7 +460,7 @@ export class UserMapper {

// this will throw an InvalidTargetExceptionMapper because unknown does not exist on UserEntity
@Mappings(
{ target: 'unknown', source: 'userDto.fname' },
{ target: 'unknown', source: 'userDto.fname' }
)
entityFromDto(_userDto: UserDto): UserEntity {
return new UserEntity;
Expand Down
61 changes: 41 additions & 20 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 9 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ts-mapstruct",
"version": "3.0.0",
"version": "3.0.1",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
Expand All @@ -21,23 +21,25 @@
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
"lodash": "^4.17.21",
"reflect-metadata": "^0.1.13"
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.6"
},
"devDependencies": {
"@types/express": "^4.17.13",
"@types/jest": "^29.0.2",
"@types/lodash": "^4.14.182",
"@types/sanitizer": "0.0.28",
"@typescript-eslint/eslint-plugin": "^5.37.0",
"eslint": "^8.23.1",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard-with-typescript": "^23.0.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-n": "^15.2.5",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-promise": "^6.0.1",
"jest": "^29.0.3",
"rxjs": "^6.5.4",
"typescript": "^4.8.3",
"ts-jest": "^29.0.1"
"prettier": "2.7.1",
"ts-jest": "^29.0.1",
"typescript": "^4.8.3"
},
"jest": {
"moduleFileExtensions": [
Expand All @@ -56,7 +58,7 @@
"testEnvironment": "node",
"coverageThreshold": {
"global": {
"lines": 90
"lines": 100
}
}
},
Expand Down
29 changes: 22 additions & 7 deletions src/core/get-after-suppliers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,33 @@ export const getAfterSuppliers = <T>(
targetedObject: T
): SupplierDescriptor[] => {
return (Reflect.getOwnMetadata(AFTER_MAPPING, mapperClass) || [])
?.map((fnName: string) => new SupplierDescriptor(fnName, Reflect.getOwnMetadata(VALUE, mapperClass, fnName), mapperClass))
?.filter((supplier: SupplierDescriptor) => checkForInvocationForAfter(supplier.args, sourceArgs, targetedObject))
?.map(
(fnName: string) =>
new SupplierDescriptor(
fnName,
Reflect.getOwnMetadata(VALUE, mapperClass, fnName),
mapperClass
)
)
?.filter((supplier: SupplierDescriptor) =>
checkForInvocationForAfter(supplier.args, sourceArgs, targetedObject)
)
}

const checkForInvocationForAfter = <T> (
const checkForInvocationForAfter = <T>(
supplierArgs: ArgumentDescriptor[],
sourceArgs: ArgumentDescriptor[],
targetedObject: T
): boolean => {
const result = supplierArgs.filter((supplierArg: ArgumentDescriptor) => !(
!supplierArg.isMappingTarget && sourceArgs.some(arg => arg.sameNameAs(supplierArg)) ||
supplierArg.isMappingTarget && sameType(supplierArg.type.prototype, targetedObject)))
.length === 0
const result =
supplierArgs.filter(
(supplierArg: ArgumentDescriptor) =>
!(
(!supplierArg.isMappingTarget &&
sourceArgs.some(arg => arg.sameNameAs(supplierArg))) ||
(supplierArg.isMappingTarget &&
sameType(supplierArg.type.prototype, targetedObject))
)
).length === 0
return result
}
28 changes: 22 additions & 6 deletions src/core/get-before-suppliers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,32 @@ export const getBeforeSuppliers = (
sourceArgs: ArgumentDescriptor[]
): SupplierDescriptor[] => {
return (Reflect.getOwnMetadata(BEFORE_MAPPING, mapperClass) || [])
?.map((fnName: string) => new SupplierDescriptor(fnName, Reflect.getOwnMetadata(VALUE, mapperClass, fnName), mapperClass))
?.filter((supplier: SupplierDescriptor) => checkForInvocationForBefore(supplier.args, sourceArgs))
?.map(
(fnName: string) =>
new SupplierDescriptor(
fnName,
Reflect.getOwnMetadata(VALUE, mapperClass, fnName),
mapperClass
)
)
?.filter((supplier: SupplierDescriptor) =>
checkForInvocationForBefore(supplier.args, sourceArgs)
)
}

const checkForInvocationForBefore = (
supplierArgs: ArgumentDescriptor[],
sourceArgs: ArgumentDescriptor[]
): boolean => {
return supplierArgs.filter((supplierArg: ArgumentDescriptor) => !(
!supplierArg.isMappingTarget && sourceArgs.some(sourceArg => sourceArg.sameNameAs(supplierArg)) ||
sourceArgs.find(sourceArg => sourceArg.sameNameAs(supplierArg))?.isMappingTarget))
.length === 0
return (
supplierArgs.filter(
(supplierArg: ArgumentDescriptor) =>
!(
(!supplierArg.isMappingTarget &&
sourceArgs.some(sourceArg => sourceArg.sameNameAs(supplierArg))) ||
sourceArgs.find(sourceArg => sourceArg.sameNameAs(supplierArg))
?.isMappingTarget
)
).length === 0
)
}
Loading

0 comments on commit 4810dfa

Please sign in to comment.