@constantant/openapi-resource-gen 1.3.1 → 1.4.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,3 +1,31 @@
|
|
|
1
|
+
## 1.4.0 (2026-06-08)
|
|
2
|
+
|
|
3
|
+
### 📖 Documentation
|
|
4
|
+
|
|
5
|
+
- **openapi-resource-gen:** document caching boundary and multipart/form-data mutation pattern ([88211a4](https://github.com/constantant/angular-openapi-gen/commit/88211a4))
|
|
6
|
+
|
|
7
|
+
### ❤️ Thank You
|
|
8
|
+
|
|
9
|
+
- Claude Sonnet 4.6
|
|
10
|
+
- kk
|
|
11
|
+
|
|
12
|
+
## 1.3.2 (2026-06-08)
|
|
13
|
+
|
|
14
|
+
### 🩹 Fixes
|
|
15
|
+
|
|
16
|
+
- **openapi-resource-gen:** track api-base-url.token.ts in writtenFiles to prevent stale cleanup deletion ([4b63f2c](https://github.com/constantant/angular-openapi-gen/commit/4b63f2c))
|
|
17
|
+
- **openapi-resource-gen:** pass file URL to openapiTS for v7 compat ([27baeab](https://github.com/constantant/angular-openapi-gen/commit/27baeab))
|
|
18
|
+
- **openapi-resource-gen:** handle openapi-typescript v7 export shape change ([d5fb642](https://github.com/constantant/angular-openapi-gen/commit/d5fb642))
|
|
19
|
+
|
|
20
|
+
### 🏡 Chore
|
|
21
|
+
|
|
22
|
+
- bump openapi-typescript from 6.7.6 to 7.13.0 ([89926d0](https://github.com/constantant/angular-openapi-gen/commit/89926d0))
|
|
23
|
+
|
|
24
|
+
### ❤️ Thank You
|
|
25
|
+
|
|
26
|
+
- Claude Sonnet 4.6
|
|
27
|
+
- kk
|
|
28
|
+
|
|
1
29
|
## 1.3.1 (2026-06-07)
|
|
2
30
|
|
|
3
31
|
### 🩹 Fixes
|
package/README.md
CHANGED
|
@@ -191,6 +191,80 @@ headers: {
|
|
|
191
191
|
The factory returns `(body: BodyType | Signal<BodyType>) => httpResource(...)`.
|
|
192
192
|
The resource config receives `method: 'POST'` (etc.) and `body` automatically.
|
|
193
193
|
|
|
194
|
+
#### JSON body
|
|
195
|
+
|
|
196
|
+
The common case. Pass a plain object or a signal — `HttpClient` serialises it automatically:
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
const addPet = inject(ADD_PET);
|
|
200
|
+
|
|
201
|
+
readonly newPet = signal<AddPetBody>({ name: 'Rex', status: 'available' });
|
|
202
|
+
readonly result = addPet(this.newPet); // re-posts whenever newPet() changes
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
#### `multipart/form-data` body
|
|
206
|
+
|
|
207
|
+
The generated `${pascal}Body` type is derived from the OpenAPI schema, which
|
|
208
|
+
describes the *shape* of the form fields. At runtime the actual value must be a
|
|
209
|
+
`FormData` object — Angular's `HttpClient` does not encode plain objects as
|
|
210
|
+
multipart. Cast is required at the call site:
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
// Generated (example from Petstore's POST /pet/{petId}/uploadImage):
|
|
214
|
+
//
|
|
215
|
+
// export type UploadFileBody =
|
|
216
|
+
// NonNullable<paths['/pet/{petId}/uploadImage']['post']['requestBody']>
|
|
217
|
+
// ['content']['multipart/form-data'];
|
|
218
|
+
// // → { additionalMetadata?: string; file?: Blob }
|
|
219
|
+
//
|
|
220
|
+
// export const UPLOAD_FILE = new InjectionToken<
|
|
221
|
+
// (petId: string, body: UploadFileBody | Signal<UploadFileBody>)
|
|
222
|
+
// => ReturnType<typeof httpResource<UploadFileResponse>>
|
|
223
|
+
// >('UPLOAD_FILE');
|
|
224
|
+
|
|
225
|
+
@Component({ ... })
|
|
226
|
+
export class UploadComponent {
|
|
227
|
+
private uploadFile = inject(UPLOAD_FILE);
|
|
228
|
+
|
|
229
|
+
readonly selectedFile = signal<File | null>(null);
|
|
230
|
+
readonly notes = signal('');
|
|
231
|
+
|
|
232
|
+
// Build FormData reactively; cast to the spec type so the token accepts it.
|
|
233
|
+
// FormData is the required runtime representation for multipart/form-data —
|
|
234
|
+
// the spec type only describes the field names and shapes, not the encoding.
|
|
235
|
+
private readonly formData = computed(() => {
|
|
236
|
+
const file = this.selectedFile();
|
|
237
|
+
if (!file) return null;
|
|
238
|
+
const fd = new FormData();
|
|
239
|
+
fd.append('file', file);
|
|
240
|
+
fd.append('additionalMetadata', this.notes());
|
|
241
|
+
return fd as unknown as UploadFileBody;
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
readonly upload = this.uploadFile(
|
|
245
|
+
'42', // petId (path param)
|
|
246
|
+
() => this.formData(), // thunk: resource stays idle when formData() is null
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
> **Why the cast?** The OpenAPI schema types `multipart/form-data` bodies as a
|
|
252
|
+
> plain object (e.g. `{ file?: Blob; additionalMetadata?: string }`). This is
|
|
253
|
+
> accurate for type-checking field names and shapes, but `HttpClient` requires
|
|
254
|
+
> an actual `FormData` instance for multipart encoding. The `as unknown as
|
|
255
|
+
> UploadFileBody` cast bridges that gap without losing the field-name safety you
|
|
256
|
+
> get from the spec type.
|
|
257
|
+
|
|
258
|
+
#### `application/x-www-form-urlencoded` body
|
|
259
|
+
|
|
260
|
+
Pass a plain object. Angular's `HttpClient` URL-encodes it automatically — no
|
|
261
|
+
`URLSearchParams` wrapping needed:
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
const submitForm = inject(SUBMIT_FORM);
|
|
265
|
+
readonly result = submitForm({ username: 'alice', password: 's3cr3t' });
|
|
266
|
+
```
|
|
267
|
+
|
|
194
268
|
### Security schemes
|
|
195
269
|
|
|
196
270
|
The generator emits one file per security scheme. Two patterns are used depending on the
|
|
@@ -384,6 +458,53 @@ type PetStatus = FindPetsByStatusParams['status']; // 'available' | 'pending' |
|
|
|
384
458
|
|
|
385
459
|
---
|
|
386
460
|
|
|
461
|
+
## Sharing a resource across components
|
|
462
|
+
|
|
463
|
+
Each call to the injected factory function creates an **independent `httpResource` instance**.
|
|
464
|
+
Two components that both call `this.findPetsByStatus(...)` will fire two separate HTTP requests.
|
|
465
|
+
|
|
466
|
+
This is intentional — resources are reactive computations tied to a component's lifetime, and
|
|
467
|
+
`httpResource` does not have a built-in shared cache. For data that should be fetched once and
|
|
468
|
+
shared, hoist the resource call to a root-scoped service:
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
// pets.store.ts (not generated — write this yourself)
|
|
472
|
+
@Service() // Angular 22 shorthand for @Injectable({ providedIn: 'root' })
|
|
473
|
+
export class PetsStore {
|
|
474
|
+
private findPetsByStatus = inject(FIND_PETS_BY_STATUS);
|
|
475
|
+
|
|
476
|
+
readonly status = signal<'available' | 'pending' | 'sold'>('available');
|
|
477
|
+
|
|
478
|
+
// One httpResource instance, shared across any component that injects PetsStore
|
|
479
|
+
readonly pets = this.findPetsByStatus(() => ({ status: this.status() }));
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
// Component A and Component B both inject the same PetsStore singleton —
|
|
485
|
+
// only one HTTP request fires.
|
|
486
|
+
@Component({ ... })
|
|
487
|
+
export class PetsPageComponent {
|
|
488
|
+
readonly store = inject(PetsStore);
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
For per-route isolation, create the resource inside a route-level provider instead:
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
// In the route definition
|
|
496
|
+
{
|
|
497
|
+
path: 'pets',
|
|
498
|
+
component: PetsShellComponent,
|
|
499
|
+
providers: [PetsStore, provideFindPetsByStatus()],
|
|
500
|
+
}
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
This scopes the resource to the route's injector — a new instance is created on
|
|
504
|
+
navigation in and destroyed on navigation out, with no cross-route state leakage.
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
387
508
|
## Adding a new data-access lib
|
|
388
509
|
|
|
389
510
|
1. Run the generator (pass a URL directly — no curl step needed):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@constantant/openapi-resource-gen",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Nx generator: one InjectionToken per OpenAPI endpoint — tree-shakeable Angular data-access libs via httpResource",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@apidevtools/swagger-parser": "^12.1.0",
|
|
29
29
|
"js-yaml": "^4.2.0",
|
|
30
|
-
"openapi-typescript": "^
|
|
30
|
+
"openapi-typescript": "^7.13.0",
|
|
31
31
|
"openapi-types": "^12.1.3",
|
|
32
32
|
"tslib": "^2.3.0"
|
|
33
33
|
},
|
|
@@ -44,8 +44,13 @@ const http = __importStar(require("http"));
|
|
|
44
44
|
const jsYaml = __importStar(require("js-yaml"));
|
|
45
45
|
// openapi-typescript ships as ESM-only; use the bundled CJS build so this
|
|
46
46
|
// CommonJS generator can call it without a dynamic import().
|
|
47
|
-
|
|
47
|
+
// v6: module.exports = fn (returns string); v7: exports.default = fn (returns ts.Node[])
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
const _openapiTSMod = require('openapi-typescript/dist/index.cjs');
|
|
50
|
+
const _openapiTS = typeof _openapiTSMod === 'function' ? _openapiTSMod : _openapiTSMod.default;
|
|
51
|
+
const _astToString = typeof _openapiTSMod === 'function' ? undefined : _openapiTSMod.astToString;
|
|
48
52
|
const path = __importStar(require("path"));
|
|
53
|
+
const url_1 = require("url");
|
|
49
54
|
const swagger_parser_1 = __importDefault(require("@apidevtools/swagger-parser"));
|
|
50
55
|
const parse_spec_1 = require("./parse-spec");
|
|
51
56
|
const render_token_1 = require("./render-token");
|
|
@@ -162,9 +167,9 @@ async function apiResourceGenerator(tree, options) {
|
|
|
162
167
|
throw new Error(`No "paths" object found in spec. Is "${specPath}" a valid OpenAPI 3.x file?`);
|
|
163
168
|
}
|
|
164
169
|
const cleanedParsed = stripNonSchemaRefs(rawParsed);
|
|
165
|
-
const tmpClean = path
|
|
166
|
-
|
|
167
|
-
|
|
170
|
+
const tmpClean = path.join(path.dirname(absoluteSpecPath), `_tmp_oas_${Date.now()}.json`);
|
|
171
|
+
// v7 requires a URL object (plain paths are treated as document content by Redocly's parser)
|
|
172
|
+
const tmpCleanUrl = (0, url_1.pathToFileURL)(tmpClean);
|
|
168
173
|
// Track every file path written in this run to detect stale files.
|
|
169
174
|
const writtenFiles = new Set();
|
|
170
175
|
try {
|
|
@@ -174,7 +179,8 @@ async function apiResourceGenerator(tree, options) {
|
|
|
174
179
|
// circular refs; openapi-typescript resolves $refs itself).
|
|
175
180
|
let schemaDts;
|
|
176
181
|
try {
|
|
177
|
-
|
|
182
|
+
const result = await _openapiTS(tmpCleanUrl);
|
|
183
|
+
schemaDts = typeof result === 'string' ? result : _astToString(result);
|
|
178
184
|
}
|
|
179
185
|
catch (e) {
|
|
180
186
|
throw new Error(`Failed to generate TypeScript types from spec: ${e.message}`, { cause: e });
|
|
@@ -194,6 +200,7 @@ async function apiResourceGenerator(tree, options) {
|
|
|
194
200
|
baseUrlToken,
|
|
195
201
|
tmpl: '',
|
|
196
202
|
});
|
|
203
|
+
writtenFiles.add((0, devkit_1.joinPathFragments)(outputDir, 'api-base-url.token.ts'));
|
|
197
204
|
// 5. Parse security schemes and build EndpointModels
|
|
198
205
|
const securitySchemes = (0, parse_spec_1.parseSecuritySchemes)(api);
|
|
199
206
|
const schemesByName = new Map(securitySchemes.map((s) => [s.schemeName, s]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../tools/openapi-resource-gen/src/generators/api-resource/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../tools/openapi-resource-gen/src/generators/api-resource/generator.ts"],"names":[],"mappings":"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"}
|