Skip to content

Commit f202ebc

Browse files
committed
feat(json-api-nestjs): remove module and refactoring
take out modules and use them as dependencies from the outside BREAKING CHANGE: Change type signature, rename npm package
1 parent e3ec380 commit f202ebc

File tree

249 files changed

+3288
-16505
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

249 files changed

+3288
-16505
lines changed

libs/json-api/json-api-nestjs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "json-api-nestjs",
2+
"name": "@klerick/json-api-nestjs",
33
"version": "9.0.0",
44
"engines": {
55
"node": ">= 16.0.0"

libs/json-api/json-api-nestjs/project.json

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
44
"sourceRoot": "libs/json-api/json-api-nestjs/src",
55
"projectType": "library",
6-
"tags": [],
6+
"tags": ["type:lib", "lib:json-api-nestjs", "lib:json-api-nestjs", "type:publish"],
77
"targets": {
88
"build": {
99
"executor": "@nx/js:tsc",
@@ -63,6 +63,16 @@
6363
]
6464
}
6565
},
66+
"ts-test": {
67+
"executor": "nx:run-commands",
68+
"options": {
69+
"commands": [
70+
"tsd --files \"src/**/*.test-d.ts\" -t src/lib/types/index.ts"
71+
],
72+
"cwd": "{workspaceRoot}/{projectRoot}",
73+
"parallel": false
74+
}
75+
},
6676
"upload-badge": {
6777
"executor": "nx:run-commands",
6878
"dependsOn": [
@@ -79,5 +89,6 @@
7989
"outputPath": "{workspaceRoot}/libs/json-api/json-api-nestjs"
8090
}
8191
}
82-
}
92+
},
93+
"implicitDependencies": ["json-api-nestjs-shared"]
8394
}

libs/json-api/json-api-nestjs/src/index.ts

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,51 @@
11
export { JsonApiModule } from './lib/json-api.module';
2-
export { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './lib/modules';
32

3+
export { JsonBaseController } from './lib/modules/mixin/controllers/json-base.controller';
44
export { JsonApi, InjectService } from './lib/modules/mixin/decorators';
5-
export { OrmService as JsonApiService } from './lib/modules/mixin/types';
6-
export { JsonBaseController } from './lib/modules/mixin/controller/json-base.controller';
5+
export { entityForClass } from './lib/modules/mixin/helpers/utils';
6+
export {
7+
PrepareParams,
8+
NestProvider,
9+
ValidateQueryError,
10+
UnionToTuple,
11+
EntityParam,
12+
TypeField,
13+
ObjectLiteral,
14+
} from './lib/types';
15+
export {
16+
JsonApiTransformerService,
17+
ErrorFormatService,
18+
} from './lib/modules/mixin/service';
19+
export {
20+
MODULE_OPTIONS_TOKEN,
21+
CONTROLLER_OPTIONS_TOKEN,
22+
ASC,
23+
DESC,
24+
FIND_ONE_ROW_ENTITY,
25+
CHECK_RELATION_NAME,
26+
RUN_IN_TRANSACTION_FUNCTION,
27+
ORM_SERVICE,
28+
ENTITY_PARAM_MAP,
29+
DEFAULT_PAGE_SIZE,
30+
DEFAULT_QUERY_PAGE,
31+
CURRENT_ENTITY,
32+
} from './lib/constants';
33+
export {
34+
OrmService,
35+
OrmService as JsonApiService,
36+
EntityControllerParam,
37+
CheckRelationName,
38+
FindOneRowEntity,
39+
RunInTransaction,
40+
EntityParamMap,
41+
} from './lib/modules/mixin/types';
742
export {
8-
Query,
943
PatchData,
44+
PatchRelationshipData,
1045
PostData,
1146
PostRelationshipData,
12-
PatchRelationshipData,
47+
Query,
1348
QueryOne,
49+
SortQuery,
50+
Relationships,
1451
} from './lib/modules/mixin/zod';
15-
16-
export {
17-
EntityRelation,
18-
ResourceObject,
19-
ResourceObjectRelationships,
20-
QueryField,
21-
} from './lib/utils/nestjs-shared';
22-
23-
export { excludeMethod } from './lib/modules/mixin/config/bindings';
24-
export { entityForClass } from './lib/utils';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController';
2+
export const JSON_API_MODULE_POSTFIX = 'JsonApiModule';
3+
export const DEFAULT_CONNECTION_NAME = 'default';
4+
export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS');
5+
export const PARAMS_RESOURCE_ID = 'id';
6+
export const PARAMS_RELATION_NAME = 'relName';
7+
export const DESC = 'DESC';
8+
export const ASC = 'ASC';
9+
10+
export const SORT_TYPE = [DESC, ASC] as const;
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
export const DEFAULT_CONNECTION_NAME = 'default';
2-
31
export const DEFAULT_QUERY_PAGE = 1;
42
export const DEFAULT_PAGE_SIZE = 20;
Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
1-
export const CURRENT_ENTITY_MANAGER_TOKEN = Symbol(
2-
'CURRENT_ENTITY_MANAGER_TOKEN'
3-
);
4-
export const GLOBAL_MODULE_OPTIONS_TOKEN = Symbol('GLOBAL_MODULE_OPTIONS');
51
export const ORM_SERVICE = Symbol('ORM_SERVICE');
6-
export const ORM_SERVICE_PROPS = Symbol('ORM_SERVICE_PROPS');
72

8-
export const PARAMS_FOR_ZOD_SCHEMA = Symbol('PARAMS_FOR_ZOD_SCHEMA');
9-
export const FIELD_FOR_ENTITY = Symbol('FIELD_FOR_ENTITY');
10-
export const CONTROL_OPTIONS_TOKEN = Symbol('CONTROL_OPTIONS_TOKEN');
11-
export const RUN_IN_TRANSACTION_FUNCTION = Symbol(
12-
'RUN_IN_TRANSACTION_FUNCTION'
13-
);
3+
export const MODULE_OPTIONS_TOKEN = Symbol('MODULE_OPTIONS_TOKEN');
4+
export const CONTROLLER_OPTIONS_TOKEN = Symbol('CONTROLLER_OPTIONS_TOKEN');
145

156
export const CURRENT_ENTITY = Symbol('CURRENT_ENTITY');
16-
export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY');
17-
export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME');
7+
export const ENTITY_PARAM_MAP = Symbol('ENTITY_PARAM_MAP');
188

199
export const ZOD_INPUT_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA');
2010
export const ZOD_QUERY_SCHEMA = Symbol('ZOD_INPUT_QUERY_SCHEMA');
@@ -26,7 +16,9 @@ export const ZOD_POST_RELATIONSHIP_SCHEMA = Symbol(
2616
export const ZOD_PATCH_RELATIONSHIP_SCHEMA = Symbol(
2717
'ZOD_PATCH_RELATIONSHIP_SCHEMA'
2818
);
29-
export const CURRENT_DATA_SOURCE_TOKEN = Symbol('CURRENT_DATA_SOURCE_TOKEN');
30-
export const CURRENT_ENTITY_REPOSITORY = Symbol('CURRENT_ENTITY_REPOSITORY');
3119

32-
export const ENTITY_MAP_PROPS = Symbol('ENTITY_MAP_PROPS');
20+
export const FIND_ONE_ROW_ENTITY = Symbol('FIND_ONE_ROW_ENTITY');
21+
export const CHECK_RELATION_NAME = Symbol('CHECK_RELATION_NAME');
22+
export const RUN_IN_TRANSACTION_FUNCTION = Symbol(
23+
'RUN_IN_TRANSACTION_FUNCTION'
24+
);
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11
export * from './default';
2-
export * from './di';
32
export * from './reflection';
4-
5-
export const JSON_API_CONTROLLER_POSTFIX = 'JsonApiController';
6-
export const JSON_API_MODULE_POSTFIX = 'JsonApiModule';
7-
8-
export const PARAMS_RESOURCE_ID = 'id';
9-
export const PARAMS_RELATION_ID = 'relId';
10-
export const PARAMS_RELATION_NAME = 'relName';
11-
12-
export const DESC = 'DESC';
13-
export const ASC = 'ASC';
14-
export const SORT_TYPE = [DESC, ASC] as const;
3+
export * from './di';
4+
export * from './constants';
Lines changed: 46 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,60 @@
11
import { DynamicModule, Module } from '@nestjs/common';
2-
import { DiscoveryModule } from '@nestjs/core';
3-
2+
import { OrmModule, ParamsModule } from './types';
3+
import { prepareConfig, getController } from './utils';
4+
import { ENTITY_PARAM_MAP } from './constants';
5+
import { AtomicOperationModule, MixinModule } from './modules';
46
import {
5-
AnyEntity,
6-
EntityName,
7-
TypeOrmDefaultOptions,
8-
TypeOrmOptions,
9-
MicroOrmOptions,
10-
ResultModuleOptions,
11-
} from './types';
12-
import { createMixinModule, prepareConfig, createAtomicModule } from './utils';
13-
import type { TypeOrmJsonApiModule, MicroOrmJsonApiModule } from './modules';
7+
ErrorInterceptors,
8+
LogTimeInterceptors,
9+
} from './modules/mixin/interceptors';
10+
import { ErrorFormatService } from './modules/mixin/service';
1411

1512
@Module({})
1613
export class JsonApiModule {
17-
public static forRoot(
18-
module: typeof TypeOrmJsonApiModule,
19-
options: TypeOrmOptions
20-
): DynamicModule;
21-
public static forRoot(
22-
module: typeof MicroOrmJsonApiModule,
23-
options: MicroOrmOptions
24-
): DynamicModule;
25-
/**
26-
* @deprecated This type of method is deprecated and may be removed in future versions.
27-
* Consider using newer alternatives or updated patterns for module registration.
28-
*/
29-
public static forRoot(options: TypeOrmDefaultOptions): DynamicModule;
30-
public static forRoot(
31-
first:
32-
| typeof TypeOrmJsonApiModule
33-
| typeof MicroOrmJsonApiModule
34-
| TypeOrmDefaultOptions,
35-
second?: TypeOrmOptions | MicroOrmOptions
14+
public static forRoot<M extends OrmModule>(
15+
module: M,
16+
options: ParamsModule<M>
3617
): DynamicModule {
37-
let resultOption: ResultModuleOptions = {} as any;
38-
39-
if (second) {
40-
const module = first as
41-
| typeof TypeOrmJsonApiModule
42-
| typeof MicroOrmJsonApiModule;
43-
resultOption = {
44-
...prepareConfig(second, module.module),
45-
type: module,
46-
} as ResultModuleOptions;
47-
} else {
48-
const {
49-
TypeOrmJsonApiModule,
50-
} = require('./modules/type-orm/type-orm-json-api.module');
51-
resultOption = {
52-
...prepareConfig(
53-
first as TypeOrmDefaultOptions,
54-
TypeOrmJsonApiModule.module
55-
),
56-
type: TypeOrmJsonApiModule as typeof TypeOrmJsonApiModule,
57-
} as any;
58-
}
59-
60-
resultOption.imports.unshift(DiscoveryModule);
61-
62-
const commonOrmModule = resultOption.type.forRoot(resultOption);
63-
64-
const entitiesMixinModules = resultOption.entities.map(
65-
(entity: EntityName<AnyEntity>) =>
66-
createMixinModule(entity, resultOption, commonOrmModule)
18+
const prepareOptions = prepareConfig(options);
19+
prepareOptions.providers.push(
20+
ErrorInterceptors,
21+
ErrorFormatService,
22+
LogTimeInterceptors
6723
);
68-
69-
const operationModuleImport = createAtomicModule(
70-
resultOption,
71-
entitiesMixinModules,
72-
commonOrmModule
24+
const commonOrmModule = module.forRoot(prepareOptions);
25+
26+
if (
27+
!commonOrmModule.providers ||
28+
!commonOrmModule.providers.find(
29+
(i) => 'provide' in i && i.provide === ENTITY_PARAM_MAP
30+
)
31+
)
32+
throw new Error(
33+
`The module ${module.name} should be provide ${ENTITY_PARAM_MAP.description}`
34+
);
35+
36+
const entitiesModules = prepareOptions.entities.map((entityItem) =>
37+
MixinModule.forRoot({
38+
entity: entityItem,
39+
imports: [commonOrmModule, ...prepareOptions.imports],
40+
ormModule: module,
41+
controller: getController(entityItem, prepareOptions.controllers),
42+
config: prepareOptions,
43+
})
7344
);
7445

46+
const atomicOperation = prepareOptions.options.operationUrl
47+
? AtomicOperationModule.forRoot(
48+
prepareOptions.options.operationUrl,
49+
prepareOptions.entities,
50+
entitiesModules,
51+
commonOrmModule
52+
)
53+
: [];
54+
7555
return {
7656
module: JsonApiModule,
77-
imports: [...operationModuleImport, ...entitiesMixinModules],
57+
imports: [...entitiesModules, ...atomicOperation],
7858
};
7959
}
8060
}

0 commit comments

Comments
 (0)