@xemahq/api-client-generator 0.18.0 → 0.18.2

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.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "algorithm": "sha256/len-framed-v1",
3
- "hash": "8a31663d78ba2e727cd7b24f09d36f5d9f27b0488e91efe77bb8a452e3741d34",
4
- "fileCount": 19
3
+ "hash": "6a1d80051770a73cb5c3f85097c916ad3559918ffab1439a17149acfd3b302f3",
4
+ "fileCount": 20
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-metadata.ts"],"names":[],"mappings":"AAkFA,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA+BrC;AAwCD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE;IACb,kBAAkB,EAAE,CAClB,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACvC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,GACA,OAAO,CAAC,OAAO,CAAC,CA6GlB"}
1
+ {"version":3,"file":"plugin-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-metadata.ts"],"names":[],"mappings":"AAkFA,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA+BrC;AAwGD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE;IACb,kBAAkB,EAAE,CAClB,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACvC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,GACA,OAAO,CAAC,OAAO,CAAC,CA0HlB"}
@@ -36,8 +36,9 @@ function readSwaggerPluginOptions(serviceDir) {
36
36
  return undefined;
37
37
  }
38
38
  const CHILD_SOURCE = `
39
- const { join } = require('node:path');
40
- const [serviceDir, filename, optionsJson] = process.argv.slice(2);
39
+ const { dirname, join } = require('node:path');
40
+ const [serviceDir, filename, optionsJson, patchModulePath, reportPath] =
41
+ process.argv.slice(2);
41
42
  const { PluginMetadataGenerator } = require(
42
43
  require.resolve('@nestjs/cli/lib/compiler/plugins/plugin-metadata-generator', {
43
44
  paths: [serviceDir],
@@ -46,6 +47,20 @@ const { PluginMetadataGenerator } = require(
46
47
  const { ReadonlyVisitor } = require(
47
48
  require.resolve('@nestjs/swagger/dist/plugin', { paths: [serviceDir] }),
48
49
  );
50
+
51
+ // The visitor emits two references it cannot evaluate — see
52
+ // \`swagger-plugin-patches.ts\`. Corrected BEFORE the visitor runs, so the
53
+ // \`t\` table's key and the lookup against it derive from one repaired string.
54
+ // Both the swagger copy and the compiler must be the SERVICE's own, for the
55
+ // same reason the generator reads \`nest-cli.json\` instead of hardcoding it.
56
+ const { installSwaggerPluginPatches, collectUnreferenceableHostTypes } = require(
57
+ patchModulePath,
58
+ );
59
+ const patchState = installSwaggerPluginPatches(
60
+ dirname(require.resolve('@nestjs/swagger/package.json', { paths: [serviceDir] })),
61
+ require(require.resolve('typescript', { paths: [serviceDir] })),
62
+ );
63
+
49
64
  const srcDir = join(serviceDir, 'src');
50
65
  // \`tsconfigPath\` is documented as relative to process.cwd().
51
66
  process.chdir(serviceDir);
@@ -62,7 +77,26 @@ new PluginMetadataGenerator().generate({
62
77
  : 'tsconfig.json',
63
78
  printDiagnostics: false,
64
79
  });
80
+
81
+ require('node:fs').writeFileSync(
82
+ reportPath,
83
+ JSON.stringify(collectUnreferenceableHostTypes(patchState)),
84
+ );
65
85
  `;
86
+ function reportUnreferenceableHostTypes(serviceDir, reportPath) {
87
+ if (!(0, node_fs_1.existsSync)(reportPath)) {
88
+ return;
89
+ }
90
+ const entries = JSON.parse((0, node_fs_1.readFileSync)(reportPath, 'utf8'));
91
+ if (entries.length === 0) {
92
+ return;
93
+ }
94
+ const lines = entries.map((entry) => ` ${entry.typeName} (${(0, node_path_1.relative)(serviceDir, entry.hostFilename)})`);
95
+ process.stderr.write(`[xema-openapi] ${entries.length} type(s) declared in a controller file ` +
96
+ 'are NOT exported, so the swagger plugin cannot reference them from the ' +
97
+ 'metadata module and infers nothing from them. Export them to close ' +
98
+ `it:\n${lines.join('\n')}\n`);
99
+ }
66
100
  async function applyPluginMetadata(serviceDir, swaggerModule) {
67
101
  const options = readSwaggerPluginOptions(serviceDir);
68
102
  if (options === undefined) {
@@ -72,6 +106,7 @@ async function applyPluginMetadata(serviceDir, swaggerModule) {
72
106
  const cjsPath = (0, node_path_1.join)(serviceDir, 'src', `${METADATA_BASENAME}.cjs`);
73
107
  const childDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'xema-openapi-'));
74
108
  const childPath = (0, node_path_1.join)(childDir, 'generate.cjs');
109
+ const reportPath = (0, node_path_1.join)(childDir, 'unreferenceable-host-types.json');
75
110
  const cleanUp = () => {
76
111
  (0, node_fs_1.rmSync)(tsPath, { force: true });
77
112
  (0, node_fs_1.rmSync)(cjsPath, { force: true });
@@ -94,7 +129,14 @@ async function applyPluginMetadata(serviceDir, swaggerModule) {
94
129
  (0, node_fs_1.rmSync)(tsPath, { force: true });
95
130
  (0, node_fs_1.rmSync)(cjsPath, { force: true });
96
131
  (0, node_fs_1.writeFileSync)(childPath, CHILD_SOURCE);
97
- const child = (0, node_child_process_1.spawnSync)(process.execPath, [childPath, serviceDir, `${METADATA_BASENAME}.ts`, JSON.stringify(options)], { encoding: 'utf8' });
132
+ const child = (0, node_child_process_1.spawnSync)(process.execPath, [
133
+ childPath,
134
+ serviceDir,
135
+ `${METADATA_BASENAME}.ts`,
136
+ JSON.stringify(options),
137
+ require.resolve('./swagger-plugin-patches'),
138
+ reportPath,
139
+ ], { encoding: 'utf8' });
98
140
  if (child.status !== 0 || !(0, node_fs_1.existsSync)(tsPath)) {
99
141
  throw new Error('api-client-generator: the swagger plugin metadata generator failed ' +
100
142
  `(exit ${String(child.status)}). This service DECLARES the plugin, so ` +
@@ -102,6 +144,7 @@ async function applyPluginMetadata(serviceDir, swaggerModule) {
102
144
  'silently, in the document every client is generated from. Refusing ' +
103
145
  `instead.\n${(child.stderr || child.stdout || '').slice(-1200)}`);
104
146
  }
147
+ reportUnreferenceableHostTypes(serviceDir, reportPath);
105
148
  const ts = require(require.resolve('typescript', { paths: [serviceDir] }));
106
149
  (0, node_fs_1.writeFileSync)(cjsPath, ts.transpileModule((0, node_fs_1.readFileSync)(tsPath, 'utf8'), {
107
150
  compilerOptions: {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-metadata.js","sourceRoot":"","sources":["../../src/lib/plugin-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-metadata.js","sourceRoot":"","sources":["../../src/lib/plugin-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type * as TypeScript from 'typescript';
2
+ export declare function stripImportAttributes(typeReference: string): string;
3
+ export declare function hostFileModuleSpecifier(hostFilename: string): string;
4
+ export interface HostLocalTypeReference {
5
+ readonly typeName: string;
6
+ readonly hostFilename: string;
7
+ readonly exported: boolean;
8
+ }
9
+ export interface SwaggerPluginPatchState {
10
+ readonly hostLocalTypes: HostLocalTypeReference[];
11
+ }
12
+ export declare function installSwaggerPluginPatches(swaggerRoot: string, ts: typeof TypeScript, requireModule?: (path: string) => unknown): SwaggerPluginPatchState;
13
+ export declare function collectUnreferenceableHostTypes(state: SwaggerPluginPatchState): readonly HostLocalTypeReference[];
14
+ //# sourceMappingURL=swagger-plugin-patches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger-plugin-patches.d.ts","sourceRoot":"","sources":["../../src/lib/swagger-plugin-patches.ts"],"names":[],"mappings":"AAsFA,OAAO,KAAK,KAAK,UAAU,MAAM,YAAY,CAAC;AAW9C,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAKnE;AAgBD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEpE;AAGD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAGD,MAAM,WAAW,uBAAuB;IAEtC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,EAAE,CAAC;CACnD;AAsFD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,OAAO,UAAU,EACrB,aAAa,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAiB,GACjD,uBAAuB,CA8GzB;AASD,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,uBAAuB,GAC7B,SAAS,sBAAsB,EAAE,CASnC"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripImportAttributes = stripImportAttributes;
4
+ exports.hostFileModuleSpecifier = hostFileModuleSpecifier;
5
+ exports.installSwaggerPluginPatches = installSwaggerPluginPatches;
6
+ exports.collectUnreferenceableHostTypes = collectUnreferenceableHostTypes;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ function stripImportAttributes(typeReference) {
10
+ return typeReference.replace(/(\bimport\(\s*(?:"[^"]*"|'[^']*')\s*),\s*\{\s*(?:with|assert)\s*:\s*\{[^{}]*\}\s*\}/g, '$1');
11
+ }
12
+ function hostFileModuleSpecifier(hostFilename) {
13
+ return hostFilename.replace(/\.[cm]?[jt]sx?$/, '');
14
+ }
15
+ function hostLocalDeclaration(ts, descriptor, hostFilename, sourceOfHostFile) {
16
+ if (descriptor.typeName.includes('import(')) {
17
+ return undefined;
18
+ }
19
+ const sourceFile = sourceOfHostFile(hostFilename);
20
+ if (sourceFile === undefined) {
21
+ return undefined;
22
+ }
23
+ for (const statement of sourceFile.statements) {
24
+ if (!ts.isClassDeclaration(statement) &&
25
+ !ts.isEnumDeclaration(statement) &&
26
+ !ts.isInterfaceDeclaration(statement)) {
27
+ continue;
28
+ }
29
+ if (statement.name?.text !== descriptor.typeName) {
30
+ continue;
31
+ }
32
+ return {
33
+ typeName: descriptor.typeName,
34
+ hostFilename,
35
+ exported: (ts.getCombinedModifierFlags(statement) & ts.ModifierFlags.Export) !== 0,
36
+ };
37
+ }
38
+ return undefined;
39
+ }
40
+ function installSwaggerPluginPatches(swaggerRoot, ts, requireModule = require) {
41
+ const pluginUtils = requireModule(node_path_1.posix.join(swaggerRoot, 'dist/plugin/utils/plugin-utils.js'));
42
+ const typeReferenceUtil = requireModule(node_path_1.posix.join(swaggerRoot, 'dist/plugin/utils/type-reference-to-identifier.util.js'));
43
+ for (const [name, host] of [
44
+ ['replaceImportPath', pluginUtils],
45
+ [
46
+ 'typeReferenceToIdentifier',
47
+ typeReferenceUtil,
48
+ ],
49
+ ]) {
50
+ if (typeof host[name] !== 'function') {
51
+ throw new Error(`api-client-generator: @nestjs/swagger at ${swaggerRoot} exports no ` +
52
+ `\`${name}\` to correct. The metadata emitter is patched there for ` +
53
+ 'two defects that otherwise ship as a ReferenceError and a TypeError ' +
54
+ 'from generated code; refusing rather than emitting a module that ' +
55
+ 'cannot be evaluated.');
56
+ }
57
+ }
58
+ const state = { hostLocalTypes: [] };
59
+ const parsedHosts = new Map();
60
+ const sourceOfHostFile = (path) => {
61
+ if (!parsedHosts.has(path)) {
62
+ let parsed;
63
+ try {
64
+ parsed = ts.createSourceFile(path, (0, node_fs_1.readFileSync)(path, 'utf8'), ts.ScriptTarget.Latest, true);
65
+ }
66
+ catch {
67
+ parsed = undefined;
68
+ }
69
+ parsedHosts.set(path, parsed);
70
+ }
71
+ return parsedHosts.get(path);
72
+ };
73
+ const originalReplaceImportPath = pluginUtils.replaceImportPath;
74
+ pluginUtils.replaceImportPath = (typeReference, fileName, options) => originalReplaceImportPath(stripImportAttributes(typeReference), fileName, options);
75
+ const originalTypeReferenceToIdentifier = typeReferenceUtil.typeReferenceToIdentifier;
76
+ typeReferenceUtil.typeReferenceToIdentifier = (descriptor, hostFilename, options, factory, type, typeImports) => {
77
+ const hostLocal = options.readonly === true
78
+ ? hostLocalDeclaration(ts, descriptor, hostFilename, sourceOfHostFile)
79
+ : undefined;
80
+ if (hostLocal === undefined) {
81
+ return originalTypeReferenceToIdentifier(descriptor, hostFilename, options, factory, type, typeImports);
82
+ }
83
+ state.hostLocalTypes.push(hostLocal);
84
+ return originalTypeReferenceToIdentifier({
85
+ ...descriptor,
86
+ typeName: `import("${hostFileModuleSpecifier(hostFilename)}").${descriptor.typeName}`,
87
+ }, hostFilename, options, factory, type, typeImports);
88
+ };
89
+ return state;
90
+ }
91
+ function collectUnreferenceableHostTypes(state) {
92
+ const byKey = new Map();
93
+ for (const entry of state.hostLocalTypes) {
94
+ if (entry.exported) {
95
+ continue;
96
+ }
97
+ byKey.set(`${entry.hostFilename}#${entry.typeName}`, entry);
98
+ }
99
+ return [...byKey.values()];
100
+ }
101
+ //# sourceMappingURL=swagger-plugin-patches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger-plugin-patches.js","sourceRoot":"","sources":["../../src/lib/swagger-plugin-patches.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/api-client-generator",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "description": "Layer 1 — the single, central OpenAPI + ORVAL client generator for every Xema NestJS service. Replaces the per-service orval.config.ts / scripts/extract-openapi.ts / scripts/build-client-index.js trio with two bins (xema-openapi, xema-client-generate). Extracts one OpenAPI document per ApiSurface (public/internal/operator) using the @XemaApiSurface decorator metadata, generates one ORVAL client package per non-empty surface (every surface of a service landing on ONE derived version — the highest its clients already carry, advanced a patch when the generated output changes), and stamps deterministic `xema` provenance metadata into each generated client package.json. No heuristics: a route ships in a surface only if it (or its controller) is explicitly classified, and no client version is ever typed by hand.",
5
5
  "keywords": [
6
6
  "xema",
@@ -37,7 +37,7 @@
37
37
  "@nestjs/core": "^10 || ^11",
38
38
  "@nestjs/swagger": "^7 || ^8 || ^11",
39
39
  "@nestjs/testing": "^10 || ^11",
40
- "@xemahq/xema-decorators": ">=0.7.0 <0.14.0",
40
+ "@xemahq/xema-decorators": ">=0.7.0 <0.15.0",
41
41
  "orval": "^8",
42
42
  "reflect-metadata": "^0.2",
43
43
  "ts-node": "^10",
@@ -62,8 +62,8 @@
62
62
  "prettier": "3.6.2",
63
63
  "reflect-metadata": "0.2.2",
64
64
  "typescript": "5.9.3",
65
- "@xemahq/eslint-config": "0.2.0",
66
- "@xemahq/xema-decorators": "0.13.0"
65
+ "@xemahq/xema-decorators": "0.14.0",
66
+ "@xemahq/eslint-config": "0.3.0"
67
67
  },
68
68
  "exports": {
69
69
  ".": {