@rytass/wms-module-graphql 0.1.4 → 0.2.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/docs/integration-guide.md +47 -0
- package/index.cjs.js +19 -39
- package/index.d.ts +4 -0
- package/index.js +2 -0
- package/lib/graphql.module.d.ts +1 -2
- package/lib/graphql.module.js +4 -35
- package/lib/helpers/create-wms-loaders.d.ts +4 -0
- package/lib/helpers/create-wms-loaders.js +9 -0
- package/lib/helpers/index.d.ts +1 -0
- package/package.json +2 -2
|
@@ -68,6 +68,24 @@ The reference consumer ([`wms-standalone`](#13-reference-implementation-wms-stan
|
|
|
68
68
|
|
|
69
69
|
The frontend package (`wms-module-react`) is **ESM-only** (`"type": "module"`). Bundlers that target Next.js / Vite / webpack 5 handle this transparently; classic CJS-only Node tools do not.
|
|
70
70
|
|
|
71
|
+
### 2.1 pnpm build-script approval
|
|
72
|
+
|
|
73
|
+
If you are on **pnpm 9 or newer**, the first `pnpm install` will refuse to run native build scripts for several transitive dependencies and surface `ERR_PNPM_IGNORED_BUILDS`. This is pnpm's supply-chain protection, not a WMS issue, but it is the very first error a fresh integrator hits.
|
|
74
|
+
|
|
75
|
+
Resolve it once by approving the packages WMS transitively needs to build:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pnpm approve-builds
|
|
79
|
+
# Or, in pnpm-workspace.yaml:
|
|
80
|
+
# allowBuilds:
|
|
81
|
+
# '@apollo/protobufjs': true
|
|
82
|
+
# '@nestjs/core': true
|
|
83
|
+
# '@parcel/watcher': true
|
|
84
|
+
# sharp: true
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
After approval, `pnpm install` completes cleanly. The exact list pnpm asks you to approve depends on your other dependencies; the four above are the ones triggered by WMS's NestJS + Apollo + native-image stack.
|
|
88
|
+
|
|
71
89
|
---
|
|
72
90
|
|
|
73
91
|
## 3. Quick start (60 seconds)
|
|
@@ -208,6 +226,35 @@ WmsModuleGraphqlModule.forRootAsync(
|
|
|
208
226
|
|
|
209
227
|
See [API Reference - wms-module-graphql](./api-reference.md) for the full `forRootAsync` signature.
|
|
210
228
|
|
|
229
|
+
### Adding your own resolvers alongside WMS
|
|
230
|
+
|
|
231
|
+
`WmsModuleGraphqlModule` calls `GraphQLModule.forRootAsync(...)` internally — that registration is workspace-global, so you cannot register a second `GraphQLModule` (see §13.1). What you **can** do is put your own resolvers in **sibling NestJS modules** imported in `AppModule`:
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
// apps/api/src/modules/posts/posts.module.ts
|
|
235
|
+
import { Module } from '@nestjs/common';
|
|
236
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
237
|
+
import { Post } from './post.entity';
|
|
238
|
+
import { PostResolver } from './post.resolver';
|
|
239
|
+
|
|
240
|
+
@Module({
|
|
241
|
+
imports: [TypeOrmModule.forFeature([Post])],
|
|
242
|
+
providers: [PostResolver],
|
|
243
|
+
})
|
|
244
|
+
export class PostsModule {}
|
|
245
|
+
|
|
246
|
+
// apps/api/src/app/app.module.ts
|
|
247
|
+
@Module({
|
|
248
|
+
imports: [
|
|
249
|
+
/* ... TypeOrm, Config, WmsModuleGraphqlModule ... */
|
|
250
|
+
PostsModule, // your sibling module
|
|
251
|
+
],
|
|
252
|
+
})
|
|
253
|
+
export class AppModule {}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
NestJS's GraphQL module discovers every `@Resolver()` class from every imported module via DI and merges them into the **same** schema. So your `Post`/`User` resolvers coexist in one schema with the WMS resolvers automatically — no extra wiring needed. The §13.1 "one GraphQLModule" constraint only forbids a second `GraphQLModule.forRoot(...)` registration, not additional resolvers.
|
|
257
|
+
|
|
211
258
|
### 4.3 `.env`
|
|
212
259
|
|
|
213
260
|
Keep DB credentials in `.env` (and add it to `.gitignore`).
|
package/index.cjs.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var tslib = require('tslib');
|
|
4
4
|
var common = require('@nestjs/common');
|
|
5
|
-
var graphql = require('@nestjs/graphql');
|
|
6
5
|
var wmsModuleCore = require('@rytass/wms-module-core');
|
|
7
6
|
var crypto = require('crypto');
|
|
8
7
|
var _ = require('lodash');
|
|
9
8
|
var lruCache = require('lru-cache');
|
|
10
9
|
var typeorm = require('typeorm');
|
|
11
10
|
var DataLoader = require('dataloader');
|
|
11
|
+
var graphql = require('@nestjs/graphql');
|
|
12
12
|
var wmsBaseNestjsModule = require('@rytass/wms-base-nestjs-module');
|
|
13
13
|
var warehouseMap_entity = require('@rytass/wms-base-nestjs-module/models/warehouse-map.entity');
|
|
14
14
|
|
|
@@ -17,7 +17,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
17
17
|
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
18
18
|
var DataLoader__default = /*#__PURE__*/_interopDefault(DataLoader);
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
exports.LoaderService = class LoaderService {
|
|
21
21
|
dataSource;
|
|
22
22
|
cache;
|
|
23
23
|
constructor(dataSource) {
|
|
@@ -171,18 +171,18 @@ let LoaderService = class LoaderService {
|
|
|
171
171
|
});
|
|
172
172
|
}
|
|
173
173
|
};
|
|
174
|
-
LoaderService = tslib.__decorate([
|
|
174
|
+
exports.LoaderService = tslib.__decorate([
|
|
175
175
|
common.Injectable(),
|
|
176
176
|
tslib.__metadata("design:paramtypes", [typeorm.DataSource])
|
|
177
|
-
], LoaderService);
|
|
177
|
+
], exports.LoaderService);
|
|
178
178
|
|
|
179
179
|
let HelperModule = class HelperModule {
|
|
180
180
|
};
|
|
181
181
|
HelperModule = tslib.__decorate([
|
|
182
182
|
common.Global(),
|
|
183
183
|
common.Module({
|
|
184
|
-
providers: [LoaderService],
|
|
185
|
-
exports: [LoaderService],
|
|
184
|
+
providers: [exports.LoaderService],
|
|
185
|
+
exports: [exports.LoaderService],
|
|
186
186
|
})
|
|
187
187
|
], HelperModule);
|
|
188
188
|
|
|
@@ -202,6 +202,14 @@ common.createParamDecorator((data, context) => {
|
|
|
202
202
|
return null;
|
|
203
203
|
});
|
|
204
204
|
|
|
205
|
+
function createWmsLoaders(loaderService) {
|
|
206
|
+
return {
|
|
207
|
+
batchSingle: loaderService.batchEntity(),
|
|
208
|
+
batchMany: loaderService.batchEntities(),
|
|
209
|
+
batchManyWithPagination: loaderService.batchEntitiesWithPagination(),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
205
213
|
const IdGenFunction = (input) => {
|
|
206
214
|
const hash = crypto.createHash('sha256');
|
|
207
215
|
hash.update(input);
|
|
@@ -6232,43 +6240,13 @@ const exportDependencies = [
|
|
|
6232
6240
|
MapRangeUnionResolver,
|
|
6233
6241
|
];
|
|
6234
6242
|
exports.WmsModuleGraphqlModule = WmsModuleGraphqlModule_1 = class WmsModuleGraphqlModule {
|
|
6235
|
-
static forRootAsync(options
|
|
6243
|
+
static forRootAsync(options) {
|
|
6236
6244
|
const coreModule = wmsModuleCore.WmsModuleCoreModule.forRootAsync(options);
|
|
6237
6245
|
return {
|
|
6238
6246
|
module: WmsModuleGraphqlModule_1,
|
|
6239
|
-
imports: [
|
|
6240
|
-
coreModule,
|
|
6241
|
-
HelperModule,
|
|
6242
|
-
graphql.GraphQLModule.forRootAsync({
|
|
6243
|
-
...gqlOptions,
|
|
6244
|
-
imports: [HelperModule, ...(gqlOptions.imports || [])],
|
|
6245
|
-
inject: [LoaderService, ...(gqlOptions.inject || [])],
|
|
6246
|
-
useFactory: async (loaderService, ...args) => {
|
|
6247
|
-
const loaders = {
|
|
6248
|
-
batchSingle: loaderService.batchEntity(),
|
|
6249
|
-
batchMany: loaderService.batchEntities(),
|
|
6250
|
-
batchManyWithPagination: loaderService.batchEntitiesWithPagination(),
|
|
6251
|
-
};
|
|
6252
|
-
const originalFactory = gqlOptions.useFactory
|
|
6253
|
-
? await gqlOptions.useFactory(...args)
|
|
6254
|
-
: {};
|
|
6255
|
-
return {
|
|
6256
|
-
...originalFactory,
|
|
6257
|
-
context: async (contextArg) => {
|
|
6258
|
-
const context = typeof gqlOptions.useFactory === 'function'
|
|
6259
|
-
? {
|
|
6260
|
-
loaders,
|
|
6261
|
-
...(typeof contextArg === 'object' ? contextArg : {}),
|
|
6262
|
-
}
|
|
6263
|
-
: { loaders, ...contextArg };
|
|
6264
|
-
return context;
|
|
6265
|
-
},
|
|
6266
|
-
};
|
|
6267
|
-
},
|
|
6268
|
-
}),
|
|
6269
|
-
],
|
|
6247
|
+
imports: [coreModule, HelperModule],
|
|
6270
6248
|
providers: exportDependencies,
|
|
6271
|
-
exports: [
|
|
6249
|
+
exports: [...exportDependencies, HelperModule, coreModule],
|
|
6272
6250
|
};
|
|
6273
6251
|
}
|
|
6274
6252
|
};
|
|
@@ -6277,3 +6255,5 @@ exports.WmsModuleGraphqlModule = WmsModuleGraphqlModule_1 = tslib.__decorate([
|
|
|
6277
6255
|
providers: exportDependencies,
|
|
6278
6256
|
})
|
|
6279
6257
|
], exports.WmsModuleGraphqlModule);
|
|
6258
|
+
|
|
6259
|
+
exports.createWmsLoaders = createWmsLoaders;
|
package/index.d.ts
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
1
|
export * from './lib/graphql.module';
|
|
2
|
+
export { LoaderService } from './lib/helpers/loader.service';
|
|
3
|
+
export type { LoaderOptions, LoaderOptionsWithPagination, } from './lib/helpers/loader.service';
|
|
4
|
+
export type { LoaderType } from './lib/helpers/dataloader.type';
|
|
5
|
+
export { createWmsLoaders, type WmsLoaders, } from './lib/helpers/create-wms-loaders';
|
package/index.js
CHANGED
package/lib/graphql.module.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
|
-
import { GqlModuleAsyncOptions } from '@nestjs/graphql';
|
|
3
2
|
import type { WmsModuleCoreModuleAsyncOptions } from '@rytass/wms-module-core';
|
|
4
3
|
export declare class WmsModuleGraphqlModule {
|
|
5
|
-
static forRootAsync(options: WmsModuleCoreModuleAsyncOptions
|
|
4
|
+
static forRootAsync(options: WmsModuleCoreModuleAsyncOptions): DynamicModule;
|
|
6
5
|
}
|
package/lib/graphql.module.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
2
|
import { Module } from '@nestjs/common';
|
|
3
|
-
import { GraphQLModule } from '@nestjs/graphql';
|
|
4
3
|
import { WmsModuleCoreModule } from '@rytass/wms-module-core';
|
|
5
|
-
import
|
|
4
|
+
import './helpers/loader.service.js';
|
|
6
5
|
import { HelperModule } from './helpers/helper.module.js';
|
|
7
6
|
import './helpers/query-path.js';
|
|
8
7
|
import { LoaderMutation } from './mutations/loader.mutation.js';
|
|
@@ -108,43 +107,13 @@ const exportDependencies = [
|
|
|
108
107
|
MapRangeUnionResolver,
|
|
109
108
|
];
|
|
110
109
|
let WmsModuleGraphqlModule = WmsModuleGraphqlModule_1 = class WmsModuleGraphqlModule {
|
|
111
|
-
static forRootAsync(options
|
|
110
|
+
static forRootAsync(options) {
|
|
112
111
|
const coreModule = WmsModuleCoreModule.forRootAsync(options);
|
|
113
112
|
return {
|
|
114
113
|
module: WmsModuleGraphqlModule_1,
|
|
115
|
-
imports: [
|
|
116
|
-
coreModule,
|
|
117
|
-
HelperModule,
|
|
118
|
-
GraphQLModule.forRootAsync({
|
|
119
|
-
...gqlOptions,
|
|
120
|
-
imports: [HelperModule, ...(gqlOptions.imports || [])],
|
|
121
|
-
inject: [LoaderService, ...(gqlOptions.inject || [])],
|
|
122
|
-
useFactory: async (loaderService, ...args) => {
|
|
123
|
-
const loaders = {
|
|
124
|
-
batchSingle: loaderService.batchEntity(),
|
|
125
|
-
batchMany: loaderService.batchEntities(),
|
|
126
|
-
batchManyWithPagination: loaderService.batchEntitiesWithPagination(),
|
|
127
|
-
};
|
|
128
|
-
const originalFactory = gqlOptions.useFactory
|
|
129
|
-
? await gqlOptions.useFactory(...args)
|
|
130
|
-
: {};
|
|
131
|
-
return {
|
|
132
|
-
...originalFactory,
|
|
133
|
-
context: async (contextArg) => {
|
|
134
|
-
const context = typeof gqlOptions.useFactory === 'function'
|
|
135
|
-
? {
|
|
136
|
-
loaders,
|
|
137
|
-
...(typeof contextArg === 'object' ? contextArg : {}),
|
|
138
|
-
}
|
|
139
|
-
: { loaders, ...contextArg };
|
|
140
|
-
return context;
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
},
|
|
144
|
-
}),
|
|
145
|
-
],
|
|
114
|
+
imports: [coreModule, HelperModule],
|
|
146
115
|
providers: exportDependencies,
|
|
147
|
-
exports: [
|
|
116
|
+
exports: [...exportDependencies, HelperModule, coreModule],
|
|
148
117
|
};
|
|
149
118
|
}
|
|
150
119
|
};
|
package/lib/helpers/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rytass/wms-module-graphql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Rytass WMS Module — GraphQL schema, resolvers and DTOs for warehouse management",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"rytass",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@nestjs/apollo": ">=13.0.0 <13.2.0",
|
|
50
50
|
"@nestjs/common": "^11.0.0",
|
|
51
51
|
"@nestjs/graphql": "^13.0.0",
|
|
52
|
-
"@rytass/wms-module-core": "^0.1.
|
|
52
|
+
"@rytass/wms-module-core": "^0.1.6",
|
|
53
53
|
"graphql": "^16.0.0",
|
|
54
54
|
"reflect-metadata": "^0.1.13 || ^0.2.0",
|
|
55
55
|
"rxjs": "^7.8.0"
|