Skip to content

Commit f65ca03

Browse files
committed
feat(json-api-nestjs-sdk): New version sdk for json api
- deep refactoring BREAKING CHANGE: - add support native js
1 parent 66076a3 commit f65ca03

40 files changed

+3935
-0
lines changed

.vscode/extensions.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"recommendations": [
3+
"nrwl.angular-console",
4+
"esbenp.prettier-vscode",
5+
"firsttris.vscode-jest-runner"
6+
]
7+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"extends": ["../../../.eslintrc.json"],
3+
"ignorePatterns": ["!**/*"],
4+
"overrides": [
5+
{
6+
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
7+
"rules": {}
8+
},
9+
{
10+
"files": ["*.ts", "*.tsx"],
11+
"rules": {}
12+
},
13+
{
14+
"files": ["*.js", "*.jsx"],
15+
"rules": {}
16+
},
17+
{
18+
"files": ["*.json"],
19+
"parser": "jsonc-eslint-parser",
20+
"rules": {
21+
"@nx/dependency-checks": "error"
22+
}
23+
}
24+
]
25+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
# json-api-nestjs-sdk
2+
3+
The plugin of Angular for help work with JSON API over [json-api-nestjs](https://www.npmjs.com/package/json-api-nestjs)
4+
5+
6+
## Installation
7+
8+
```bash $
9+
npm install json-api-nestjs-sdk
10+
```
11+
12+
## Example
13+
14+
Once the installation process is complete, we can import the **JsonApiJs**.
15+
16+
```typescript
17+
import {
18+
adapterForAxios,
19+
FilterOperand,
20+
JsonApiJs,
21+
JsonSdkPromise,
22+
} from 'json-api-nestjs-sdk';
23+
import { faker } from '@faker-js/faker';
24+
import axios from 'axios';
25+
26+
import {Users} from 'database'
27+
28+
const axiosAdapter = adapterForAxios(axios);
29+
30+
const jsonConfig: JsonConfig = {
31+
adapter: axiosAdapter,
32+
apiHost: 'http://localhost:3000',
33+
apiPrefix: 'api',
34+
dateFields: ['createdAt', 'updatedAt'],
35+
operationUrl: 'operation',
36+
}
37+
38+
const jsonSdk = JsonApiJs(
39+
jsonConfig,
40+
true //by default all methods return Observable but you return promise
41+
);
42+
43+
await jsonSdk.jonApiSdkService.getAll(Users, {
44+
filter: {
45+
target: {
46+
id: { [FilterOperand.in]: usersId.map((i) => `${i}`) },
47+
},
48+
},
49+
include: ['addresses', 'comments', 'roles', 'manager'],
50+
});
51+
52+
53+
// Atomic Operation
54+
55+
const address = new Addresses();
56+
57+
address.city = faker.string.alpha(50);
58+
address.state = faker.string.alpha(50);
59+
address.country = faker.string.alpha(50);
60+
address.id = 10000;
61+
62+
const manager = getUser();
63+
manager.id = 10001;
64+
manager.addresses = address;
65+
66+
const roles = new Roles();
67+
roles.id = 10002;
68+
roles.name = faker.string.alpha(50);
69+
roles.key = faker.string.alpha(50);
70+
71+
const user = getUser();
72+
user.addresses = address;
73+
user.manager = manager;
74+
user.roles = [roles];
75+
76+
const [addressPost, managerPost, rolesPost, userPost] = await jsonSdk
77+
.atomicFactory()
78+
.postOne(address)
79+
.postOne(manager)
80+
.postOne(roles)
81+
.postOne(user)
82+
.run();
83+
84+
85+
```
86+
or you can use Angular module:
87+
```typescript
88+
import { JsonApiAngular, AtomicFactory } from 'json-api-nestjs-sdk/json-api-nestjs-sdk.module';
89+
import { JsonApiSdkService } from 'json-api-nestjs-sdk';
90+
91+
@Component({
92+
standalone: true,
93+
selector: 'nestjs-json-api-root',
94+
templateUrl: './app.component.html',
95+
styleUrl: './app.component.css',
96+
})
97+
export class AppComponent {
98+
private JsonApiSdkService = inject(JsonApiSdkService);
99+
private atomicFactory = inject(AtomicFactory);
100+
}
101+
102+
const angularConfig: JsonSdkConfig = {
103+
apiHost: 'http://localhost:4200',
104+
idKey: 'id',
105+
apiPrefix: 'api',
106+
operationUrl: 'operation',
107+
}
108+
109+
bootstrapApplication(AppComponent, {
110+
providers: [
111+
importProvidersFrom(
112+
JsonApiAngular.forRoot(angularConfig)
113+
),
114+
],
115+
}).catch((err) =>
116+
console.error(err)
117+
);
118+
119+
120+
121+
```
122+
123+
## Configuration params
124+
125+
```typescript
126+
type JsonSdkConfig = {
127+
apiHost: string; // url for api
128+
apiPrefix?: string; // prefex for api - api/v1/....
129+
idKey?: string; // name for id field
130+
idIsNumber?: boolean; // use parseInt for id field
131+
operationUrl?: string; // url for atomic operation
132+
dateFields: string[] // array of dateField for create date object - ;
133+
}
134+
135+
type JsonConfig = JsonSdkConfig & {
136+
adapter?: HttpInnerClient; // by default use fetch for http request but you can change it
137+
}
138+
```
139+
* You can see interface of [HttpInnerClient](https://github.com/klerick/nestjs-json-api/blob/master/libs/json-api/json-api-nestjs-sdk/src/lib/types/http-inner-client.ts)
140+
* More example you can see [here](https://github.com/klerick/nestjs-json-api/blob/master/apps/json-api-server-e2e/src/json-api/json-api-sdk) or [here](https://github.com/klerick/nestjs-json-api/blob/master/apps/json-api-front/src/app/app.component.ts)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/* eslint-disable */
2+
export default {
3+
displayName: 'json-api-nestjs-sdk',
4+
preset: '../../../jest.preset.js',
5+
testEnvironment: 'node',
6+
transform: {
7+
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
8+
},
9+
moduleFileExtensions: ['ts', 'js', 'html'],
10+
coverageDirectory: '../../../coverage/libs/json-api/json-api-nestjs-sdk',
11+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"name": "json-api-nestjs-sdk",
3+
"version": "0.0.1",
4+
"engines": {
5+
"node": ">= 16.0.0"
6+
},
7+
"description": "JsonAPi Plugin for NestJs",
8+
"contributors": [
9+
{
10+
"email": "[email protected]",
11+
"name": "Aleksandr Kharkovey"
12+
}
13+
],
14+
"repository": {
15+
"type": "git",
16+
"url": "https://github.com/klerick/nestjs-json-api.git"
17+
},
18+
"private": false,
19+
"license": "MIT",
20+
"files": [
21+
"cjs/**",
22+
"mjs/**"
23+
],
24+
"keywords": [
25+
"nestjs",
26+
"nest",
27+
"jsonapi",
28+
"json-api",
29+
"typeorm",
30+
"CRUD"
31+
]
32+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{
2+
"name": "json-api-nestjs-sdk",
3+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
4+
"sourceRoot": "libs/json-api/json-api-nestjs-sdk/src",
5+
"projectType": "library",
6+
"targets": {
7+
"build": {
8+
"executor": "nx:run-commands",
9+
"dependsOn": [
10+
{
11+
"target": "build-mjs"
12+
},
13+
{
14+
"target": "build-cjs"
15+
}
16+
],
17+
"options": {
18+
"outputPath": "dist/libs/json-api/json-api-nestjs-sdk",
19+
"commands": [
20+
"node tools/scripts/preparation-hybrid-npm-package.mjs json-api-nestjs-sdk",
21+
"node tools/scripts/preparation-npm-package.mjs json-api-nestjs-sdk"
22+
],
23+
"cwd": "./",
24+
"parallel": false
25+
}
26+
},
27+
"build-cjs": {
28+
"executor": "@nx/js:tsc",
29+
"outputs": ["{options.outputPath}"],
30+
"options": {
31+
"outputPath": "dist/libs/json-api/json-api-nestjs-sdk/cjs",
32+
"main": "libs/json-api/json-api-nestjs-sdk/src/index.ts",
33+
"tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig.lib.json",
34+
"assets": ["libs/json-api/json-api-nestjs-sdk/*.md"],
35+
"external": "none",
36+
"updateBuildableProjectDepsInPackageJson": true,
37+
"buildableProjectDepsInPackageJsonType": "peerDependencies",
38+
"additionalEntryPoints": ["libs/json-api/json-api-nestjs-sdk/src/json-api-nestjs-sdk.module.ts"],
39+
"generateExportsField": true
40+
}
41+
},
42+
"build-mjs": {
43+
"executor": "@nx/js:tsc",
44+
"outputs": ["{options.outputPath}"],
45+
"options": {
46+
"outputPath": "dist/libs/json-api/json-api-nestjs-sdk/mjs",
47+
"main": "libs/json-api/json-api-nestjs-sdk/src/index.ts",
48+
"tsConfig": "libs/json-api/json-api-nestjs-sdk/tsconfig-mjs.lib.json",
49+
"assets": ["libs/json-api/json-api-nestjs-sdk/*.md"],
50+
"external": "none",
51+
"updateBuildableProjectDepsInPackageJson": true,
52+
"buildableProjectDepsInPackageJsonType": "peerDependencies",
53+
"additionalEntryPoints": ["libs/json-api/json-api-nestjs-sdk/src/json-api-nestjs-sdk.module.ts"],
54+
"generateExportsField": true
55+
}
56+
},
57+
"publish": {
58+
"command": "node tools/scripts/publish.mjs json-api-nestjs-sdk {args.ver} {args.tag}",
59+
"dependsOn": ["build"]
60+
},
61+
"lint": {
62+
"executor": "@nx/eslint:lint",
63+
"outputs": ["{options.outputFile}"]
64+
},
65+
"test": {
66+
"executor": "@nx/jest:jest",
67+
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
68+
"options": {
69+
"jestConfig": "libs/json-api/json-api-nestjs/jest.config.ts"
70+
}
71+
}
72+
},
73+
"tags": []
74+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export { JsonApiUtilsService, JsonApiSdkService } from './lib/service';
2+
export * from './lib/json-api-js';
3+
export { adapterForAxios } from './lib/utils';
4+
export { FilterOperand } from './lib/types';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { JsonApiAngular, AtomicFactory } from './lib/json-api-angular';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const ID_KEY = 'id';
2+
export const KEY_MAIN_INPUT_SCHEMA = 'atomic:operations';
3+
export const KEY_MAIN_OUTPUT_SCHEMA = 'atomic:results';
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { NgModule, ModuleWithProviders, inject } from '@angular/core';
2+
import { HttpClient, HttpClientModule } from '@angular/common/http';
3+
import { HttpInnerClient, JsonSdkConfig } from './types';
4+
import { AtomicFactory, JSON_API_SDK_CONFIG } from './token';
5+
import { resultConfig } from './utils';
6+
import {
7+
JsonApiUtilsService,
8+
JsonApiSdkService,
9+
AtomicOperationsService,
10+
} from './service';
11+
12+
@NgModule({
13+
imports: [HttpClientModule],
14+
})
15+
export class JsonApiAngular {
16+
static forRoot(config: JsonSdkConfig): ModuleWithProviders<JsonApiAngular> {
17+
return {
18+
ngModule: JsonApiAngular,
19+
providers: [
20+
{
21+
provide: JSON_API_SDK_CONFIG,
22+
useValue: resultConfig(config),
23+
},
24+
{
25+
provide: JsonApiUtilsService,
26+
useFactory: () =>
27+
new JsonApiUtilsService(inject(JSON_API_SDK_CONFIG)),
28+
},
29+
{
30+
provide: JsonApiSdkService,
31+
useFactory: () =>
32+
new JsonApiSdkService(
33+
inject<HttpInnerClient>(HttpClient as any),
34+
inject(JsonApiUtilsService),
35+
inject(JSON_API_SDK_CONFIG)
36+
),
37+
},
38+
{
39+
provide: AtomicFactory,
40+
useFactory: () => {
41+
const jsonApiUtilsService = inject(JsonApiUtilsService);
42+
const config = inject(JSON_API_SDK_CONFIG);
43+
const httpClient = inject<HttpInnerClient>(HttpClient as any);
44+
45+
return () => {
46+
return new AtomicOperationsService(
47+
jsonApiUtilsService,
48+
config,
49+
httpClient
50+
);
51+
};
52+
},
53+
},
54+
],
55+
};
56+
}
57+
}
58+
59+
export { AtomicFactory } from './token';

0 commit comments

Comments
 (0)