@nestbridge/webpack 2.1.3 → 2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @nestbridge/webpack
2
2
 
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 98349c7: One client can now use controllers from several NestJS apps. `nestBridge()` accepts an array of options, one entry per app, and each entry takes its own `name`, `root`, `controllers`, `resolvers`, `baseURL`, `bootstrap`, `globalPrefix` and `versioning`. A named app writes its declarations to `<outputDir>/<name>/`, detects its own response wrapper and error body from its own bootstrap file, and tags every generated request with its `name` as the `service`. A single object still works as before.
8
+
9
+ The runtime picks each request's origin from `configureNestBridge({ services })`, then the origin the plugin registered for that app with the new `setNestBridgeServiceBaseURL(name, baseURL)`, then the global `setNestBridgeBaseURL()` value. `graphqlEndpoint` also accepts a record with one endpoint per app.
10
+
11
+ `@Controller({ path, version })` and `@Version(...)` are now read, and the global prefix (`setGlobalPrefix`, including `exclude`) and URI versioning (`enableVersioning`) are detected from the bootstrap file and composed into every request path with the new `detectGlobalPrefix`, `detectVersioning` and `applyApplicationRouting` from `@nestbridge/core`. A prefix or versioning setup that cannot be read statically is reported as an `unsupported-global-prefix` or `unsupported-versioning` diagnostic; the `globalPrefix` and `versioning` plugin options state the value explicitly, and `false` ignores it.
12
+
13
+ Upgrading: the global prefix and URI versioning are now part of every URL, so a prefix that was written into `baseURL` as a workaround would now be repeated. Keep `baseURL` to the origin, or set `globalPrefix: false` / `versioning: false`. A relative `root` now resolves against the bundler's root instead of `process.cwd()`. See `MIGRATION.md`.
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [98349c7]
18
+ - @nestbridge/unplugin@2.2.0
19
+
20
+ ## 2.1.4
21
+
22
+ ### Patch Changes
23
+
24
+ - @nestbridge/unplugin@2.1.4
25
+
3
26
  ## 2.1.3
4
27
 
5
28
  ### Patch Changes
package/README.md CHANGED
@@ -19,9 +19,14 @@ and declaration writing behave identically across both bundlers.
19
19
 
20
20
  ```bash
21
21
  yarn add -D @nestbridge/webpack
22
- yarn add @nestbridge/runtime
22
+ yarn add nestbridge
23
23
  ```
24
24
 
25
+ The generated client modules and declarations import from `nestbridge`, so it
26
+ has to be a direct dependency of your app. If you would rather have one
27
+ dependency, `yarn add nestbridge` alone is enough: import the plugin from
28
+ `nestbridge/webpack` (its default export) instead of `@nestbridge/webpack`.
29
+
25
30
  ## Setup
26
31
 
27
32
  ```js
@@ -56,7 +61,6 @@ files so the plugin can intercept them. A matching `paths` entry in
56
61
  ```json
57
62
  {
58
63
  "compilerOptions": {
59
- "baseUrl": ".",
60
64
  "paths": {
61
65
  "@server/*": ["./.nestbridge/server/src/*"]
62
66
  }
@@ -64,6 +68,9 @@ files so the plugin can intercept them. A matching `paths` entry in
64
68
  }
65
69
  ```
66
70
 
71
+ `paths` entries resolve relative to the `tsconfig.json` that declares them, so
72
+ no `baseUrl` is needed (TypeScript 7 removed that option).
73
+
67
74
  Add `.nestbridge/` (or your configured `outputDir`) to `.gitignore` — it's
68
75
  regenerated on every build and on every dev-server start.
69
76
 
@@ -72,22 +79,75 @@ the project root automatically, so it defaults to `process.cwd()`. Pass an
72
79
  explicit `root` if `webpack.config.js` runs from somewhere other than the
73
80
  directory your `controllers`/`resolvers` globs are relative to.
74
81
 
82
+ ## Several server apps
83
+
84
+ To use controllers from more than one NestJS app, pass an array — one entry per
85
+ app. Each entry needs a `name`, and its `root` should be that app's folder:
86
+
87
+ ```js
88
+ nestBridge([
89
+ {
90
+ name: 'identity',
91
+ root: '../identity',
92
+ controllers: 'src/**/*.controller.ts',
93
+ baseURL: 'https://identity.example.com',
94
+ },
95
+ {
96
+ name: 'store',
97
+ root: '../store',
98
+ controllers: 'src/**/*.controller.ts',
99
+ baseURL: 'https://store.example.com',
100
+ },
101
+ ]);
102
+ ```
103
+
104
+ A relative `root` resolves against `process.cwd()`. Declarations land in
105
+ `<outputDir>/<name>/`, so add one `resolve.alias` and one `paths` entry per app
106
+ (`"@identity/*": ["./.nestbridge/identity/src/*"]`), and each app keeps its own
107
+ `baseURL`, bootstrap file, global prefix and versioning. See
108
+ [Several server apps](../../README.md#several-server-apps) in the repository
109
+ README, and [`MIGRATION.md`](../../MIGRATION.md) when upgrading from 2.1.
110
+
75
111
  ## `NestBridgeOptions`
76
112
 
77
113
  ```ts
78
114
  interface NestBridgeOptions {
79
- controllers: string | string[]; // glob(s), resolved relative to `root`
80
- resolvers?: string | string[]; // glob(s) for GraphQL resolvers; defaults to none
81
- baseURL?: string; // informational; call configureNestBridge for the runtime effect
82
- debug?: boolean; // logs discovery/analysis/HMR activity
83
- outputDir?: string; // defaults to ".nestbridge"
84
- root?: string; // defaults to process.cwd()
115
+ name?: string; // names the server app; required, and unique, when you pass several apps
116
+ controllers: string | string[]; // glob(s), resolved relative to `root`
117
+ resolvers?: string | string[]; // glob(s) for GraphQL resolvers; defaults to none
118
+ baseURL?: string; // origin (or mount path) for this app's REST requests and its default GraphQL endpoint; applied to the runtime automatically
119
+ bootstrap?: string; // the app's bootstrap file, relative to `root`; skips the `main.ts` search
120
+ globalPrefix?: string | GlobalPrefixOption | false; // replaces the prefix read from `setGlobalPrefix()`; `false` ignores it
121
+ versioning?: VersioningOption | false; // replaces the versioning read from `enableVersioning()`; `false` ignores it
122
+ debug?: boolean; // logs discovery/analysis/watch activity
123
+ outputDir?: string; // defaults to ".nestbridge", resolved from webpack's `context` — independent of `root`
124
+ root?: string; // base for discovering controllers/resolvers and the bootstrap file; relative paths resolve against process.cwd(), which is also the default
125
+ }
126
+
127
+ interface GlobalPrefixOption {
128
+ prefix: string;
129
+ exclude?: (string | { path: string; httpMethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' })[];
130
+ }
131
+
132
+ interface VersioningOption {
133
+ prefix?: string; // defaults to "v"; use "" for none
134
+ defaultVersion?: string; // version of routes that state none
85
135
  }
86
136
  ```
87
137
 
88
- Don't forget to call `configureNestBridge` from `@nestbridge/runtime` — this
89
- option only affects generated path text, not the runtime `fetch()`/GraphQL
90
- config (`baseURL`/`graphqlEndpoint`).
138
+ `nestBridge()` takes a `NestBridgeOptions` object, or an array of them
139
+ (`NestBridgePluginOptions`). All of these types are exported.
140
+
141
+ `baseURL` needs no extra runtime code: the plugin generates a module that
142
+ calls `setNestBridgeBaseURL(baseURL)` from `nestbridge` (or
143
+ `setNestBridgeServiceBaseURL(name, baseURL)` for a named app), and every
144
+ generated controller and resolver module imports it. Use `configureNestBridge`
145
+ from `nestbridge` only for headers, a custom `fetch`, an explicit
146
+ `graphqlEndpoint`, or per-environment `services` origins.
147
+
148
+ The global prefix and URI versioning that the app's bootstrap file sets are
149
+ read statically and added to every request path, so keep `baseURL` to the
150
+ origin — see [Global prefix and URI versioning](../../README.md#global-prefix-and-uri-versioning).
91
151
 
92
152
  ## License
93
153
 
@@ -1,10 +1,10 @@
1
- import { NestBridgeOptions, NestBridgeOptions as NestBridgeOptions$1 } from "@nestbridge/unplugin";
1
+ import { GlobalPrefixOption, NestBridgeOptions, NestBridgePluginOptions, NestBridgePluginOptions as NestBridgePluginOptions$1, VersioningOption } from "@nestbridge/unplugin";
2
2
  import { WebpackPluginInstance } from "webpack";
3
3
  //#region src/version.d.ts
4
4
  export declare const VERSION: string;
5
5
  //#endregion
6
6
  //#region src/main.d.ts
7
- export declare const nestBridge: (options: NestBridgeOptions$1) => WebpackPluginInstance;
7
+ export declare const nestBridge: (options: NestBridgePluginOptions$1) => WebpackPluginInstance;
8
8
  //#endregion
9
- export type { NestBridgeOptions };
9
+ export type { GlobalPrefixOption, NestBridgeOptions, NestBridgePluginOptions, VersioningOption };
10
10
  //# sourceMappingURL=nestbridge.webpack.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { nestBridgeUnplugin } from "@nestbridge/unplugin";
2
2
  //#endregion
3
3
  //#region src/version.ts
4
- var VERSION = "2.1.3";
4
+ var VERSION = "2.2.0";
5
5
  //#endregion
6
6
  //#region src/main.ts
7
7
  var nestBridge = nestBridgeUnplugin.webpack;
@@ -1 +1 @@
1
- {"version":3,"file":"nestbridge.webpack.js","names":[],"sources":["../package.json","../src/version.ts","../src/main.ts"],"sourcesContent":["{\n \"name\": \"@nestbridge/webpack\",\n \"version\": \"2.1.3\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/MDReal32/nestbridge.git\",\n \"directory\": \"packages/webpack\"\n },\n \"main\": \"./build/nestbridge.webpack.js\",\n \"types\": \"./build/nestbridge.webpack.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./build/nestbridge.webpack.d.ts\",\n \"import\": \"./build/nestbridge.webpack.js\"\n }\n },\n \"files\": [\n \"build\"\n ],\n \"scripts\": {\n \"build\": \"vite build\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"lint\": \"biome check .\"\n },\n \"dependencies\": {\n \"@nestbridge/unplugin\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.4.1\",\n \"esbuild-loader\": \"^4.5.0\",\n \"rolldown-plugin-dts\": \"^0.28.5\",\n \"typescript\": \"^7.0.2\",\n \"vite\": \"^8.2.2\",\n \"vitest\": \"^5.0.0\",\n \"webpack\": \"^5.110.3\"\n },\n \"peerDependencies\": {\n \"webpack\": \"^5.110.3\"\n }\n}\n","import { version } from '../package.json';\n\nexport const VERSION: string = version;\n","import { type NestBridgeOptions, nestBridgeUnplugin } from '@nestbridge/unplugin';\nimport type { WebpackPluginInstance } from 'webpack';\n\nexport type { NestBridgeOptions } from '@nestbridge/unplugin';\nexport const nestBridge: (options: NestBridgeOptions) => WebpackPluginInstance =\n nestBridgeUnplugin.webpack;\nexport { VERSION } from './version';\n"],"mappings":";;;ACEA,IAAa,UAAkB;;;ACE/B,IAAa,aACX,mBAAmB"}
1
+ {"version":3,"file":"nestbridge.webpack.js","names":[],"sources":["../package.json","../src/version.ts","../src/main.ts"],"sourcesContent":["{\n \"name\": \"@nestbridge/webpack\",\n \"version\": \"2.2.0\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/MDReal32/nestbridge.git\",\n \"directory\": \"packages/webpack\"\n },\n \"main\": \"./build/nestbridge.webpack.js\",\n \"types\": \"./build/nestbridge.webpack.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./build/nestbridge.webpack.d.ts\",\n \"import\": \"./build/nestbridge.webpack.js\"\n }\n },\n \"files\": [\n \"build\"\n ],\n \"scripts\": {\n \"build\": \"vite build\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"lint\": \"biome check .\"\n },\n \"dependencies\": {\n \"@nestbridge/unplugin\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.4.1\",\n \"esbuild-loader\": \"^4.5.0\",\n \"rolldown-plugin-dts\": \"^0.28.5\",\n \"typescript\": \"^7.0.2\",\n \"vite\": \"^8.2.2\",\n \"vitest\": \"^5.0.0\",\n \"webpack\": \"^5.110.3\"\n },\n \"peerDependencies\": {\n \"webpack\": \"^5.110.3\"\n }\n}\n","import { version } from '../package.json';\n\nexport const VERSION: string = version;\n","import { type NestBridgePluginOptions, nestBridgeUnplugin } from '@nestbridge/unplugin';\nimport type { WebpackPluginInstance } from 'webpack';\n\nexport type {\n GlobalPrefixOption,\n NestBridgeOptions,\n NestBridgePluginOptions,\n VersioningOption,\n} from '@nestbridge/unplugin';\nexport const nestBridge: (options: NestBridgePluginOptions) => WebpackPluginInstance =\n nestBridgeUnplugin.webpack;\nexport { VERSION } from './version';\n"],"mappings":";;;ACEA,IAAa,UAAkB;;;ACO/B,IAAa,aACX,mBAAmB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestbridge/webpack",
3
- "version": "2.1.3",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  "lint": "biome check ."
27
27
  },
28
28
  "dependencies": {
29
- "@nestbridge/unplugin": "2.1.3"
29
+ "@nestbridge/unplugin": "2.2.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^26.4.1",