@xemahq/api-client-generator 0.1.1

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.
Files changed (62) hide show
  1. package/README.md +73 -0
  2. package/dist/bin/xema-client-generate.d.ts +3 -0
  3. package/dist/bin/xema-client-generate.d.ts.map +1 -0
  4. package/dist/bin/xema-client-generate.js +6 -0
  5. package/dist/bin/xema-client-generate.js.map +1 -0
  6. package/dist/bin/xema-openapi.d.ts +3 -0
  7. package/dist/bin/xema-openapi.d.ts.map +1 -0
  8. package/dist/bin/xema-openapi.js +28 -0
  9. package/dist/bin/xema-openapi.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +26 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/client-package.d.ts +17 -0
  15. package/dist/lib/client-package.d.ts.map +1 -0
  16. package/dist/lib/client-package.js +114 -0
  17. package/dist/lib/client-package.js.map +1 -0
  18. package/dist/lib/client-readme.d.ts +9 -0
  19. package/dist/lib/client-readme.d.ts.map +1 -0
  20. package/dist/lib/client-readme.js +100 -0
  21. package/dist/lib/client-readme.js.map +1 -0
  22. package/dist/lib/custom-fetch-template.d.ts +2 -0
  23. package/dist/lib/custom-fetch-template.d.ts.map +1 -0
  24. package/dist/lib/custom-fetch-template.js +166 -0
  25. package/dist/lib/custom-fetch-template.js.map +1 -0
  26. package/dist/lib/default-stubs.d.ts +3 -0
  27. package/dist/lib/default-stubs.d.ts.map +1 -0
  28. package/dist/lib/default-stubs.js +107 -0
  29. package/dist/lib/default-stubs.js.map +1 -0
  30. package/dist/lib/extract-openapi.d.ts +4 -0
  31. package/dist/lib/extract-openapi.d.ts.map +1 -0
  32. package/dist/lib/extract-openapi.js +134 -0
  33. package/dist/lib/extract-openapi.js.map +1 -0
  34. package/dist/lib/generate-clients.d.ts +4 -0
  35. package/dist/lib/generate-clients.d.ts.map +1 -0
  36. package/dist/lib/generate-clients.js +84 -0
  37. package/dist/lib/generate-clients.js.map +1 -0
  38. package/dist/lib/overrides.d.ts +7 -0
  39. package/dist/lib/overrides.d.ts.map +1 -0
  40. package/dist/lib/overrides.js +26 -0
  41. package/dist/lib/overrides.js.map +1 -0
  42. package/dist/lib/prune-spec.d.ts +16 -0
  43. package/dist/lib/prune-spec.d.ts.map +1 -0
  44. package/dist/lib/prune-spec.js +100 -0
  45. package/dist/lib/prune-spec.js.map +1 -0
  46. package/dist/lib/repo-post-process.d.ts +9 -0
  47. package/dist/lib/repo-post-process.d.ts.map +1 -0
  48. package/dist/lib/repo-post-process.js +56 -0
  49. package/dist/lib/repo-post-process.js.map +1 -0
  50. package/dist/lib/seed-openapi-env.d.ts +2 -0
  51. package/dist/lib/seed-openapi-env.d.ts.map +1 -0
  52. package/dist/lib/seed-openapi-env.js +77 -0
  53. package/dist/lib/seed-openapi-env.js.map +1 -0
  54. package/dist/lib/service-config.d.ts +20 -0
  55. package/dist/lib/service-config.d.ts.map +1 -0
  56. package/dist/lib/service-config.js +80 -0
  57. package/dist/lib/service-config.js.map +1 -0
  58. package/dist/lib/service-nest.d.ts +15 -0
  59. package/dist/lib/service-nest.d.ts.map +1 -0
  60. package/dist/lib/service-nest.js +21 -0
  61. package/dist/lib/service-nest.js.map +1 -0
  62. package/package.json +72 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.seedOpenApiEnv = seedOpenApiEnv;
4
+ const DUMMY_ENCRYPTION_KEY_HEX = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
5
+ const DUMMY_BASE64_KEY = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
6
+ function seed(vars) {
7
+ for (const [key, value] of Object.entries(vars)) {
8
+ if (process.env[key] === undefined) {
9
+ process.env[key] = value;
10
+ }
11
+ }
12
+ }
13
+ function seedOpenApiEnv() {
14
+ seed({
15
+ NODE_ENV: 'development',
16
+ DATABASE_URL: 'postgresql://dummy:dummy@localhost:5432/dummy_openapi',
17
+ DB_HOST: 'localhost',
18
+ DB_PORT: '5432',
19
+ DB_NAME: 'dummy_openapi',
20
+ DB_USER: 'dummy',
21
+ DB_PASSWORD: 'dummy',
22
+ REDIS_URL: 'redis://localhost:6379',
23
+ OPENSEARCH_URL: 'http://localhost:9200',
24
+ IDENTITY_API_URL: 'http://localhost:3053',
25
+ IDENTITY_API_INTERNAL_TOKEN: 'dummy-token',
26
+ JWT_PUBLIC_KEY_URL: 'http://localhost:8180/realms/dummy/protocol/openid-connect/certs',
27
+ JWT_ISSUER: 'http://localhost:8180/realms/dummy',
28
+ GATEWAY_JWT_SECRET: 'dummy-gateway-jwt-secret-for-openapi-extraction',
29
+ SHARE_TOKEN_SECRET: 'dummy-share-token-secret',
30
+ OPENCODE_WORKER_PASSWORD: 'dummy-worker-password',
31
+ EVENT_HUB_URL: 'http://localhost:3128',
32
+ USER_API_URL: 'http://localhost:3050',
33
+ BACKLOG_API_URL: 'http://localhost:3100',
34
+ MEMORY_API_URL: 'http://localhost:3060',
35
+ LLM_REGISTRY_API_URL: 'http://localhost:3112',
36
+ LLM_GATEWAY_API_URL: 'http://localhost:3110',
37
+ POOL_API_URL: 'http://localhost:3145',
38
+ ARTIFACT_STORE_API_URL: 'http://localhost:3130',
39
+ KNOWLEDGE_BASE_API_URL: 'http://localhost:3200',
40
+ PROJECT_REGISTRY_API_URL: 'http://localhost:3300',
41
+ INTEGRATION_ADAPTERS_API_URL: 'http://localhost:3900',
42
+ DESIGN_SYSTEM_BUILDER_API_URL: 'http://localhost:3210',
43
+ SEARCH_API_URL: 'http://localhost:3220',
44
+ BILLING_API_URL: 'http://localhost:3140',
45
+ CAPABILITY_REGISTRY_API_URL: 'http://localhost:3700',
46
+ MCP_KNOWLEDGE_BASE_URL: 'http://localhost:3201/mcp',
47
+ MCP_BACKLOG_URL: 'http://localhost:3101/mcp',
48
+ MCP_DOC_TEMPLATE_URL: 'http://localhost:3231/mcp',
49
+ MCP_PROJECT_REGISTRY_URL: 'http://localhost:3301/mcp',
50
+ MCP_SEARCH_URL: 'http://localhost:3221/mcp',
51
+ KNOWLEDGE_BASE_MCP_URL: 'http://localhost:3201/mcp',
52
+ BACKLOG_MCP_URL: 'http://localhost:3101/mcp',
53
+ ARTIFACT_STORE_MCP_URL: 'http://localhost:3131/mcp',
54
+ MEMORY_MCP_URL: 'http://localhost:3061/mcp',
55
+ CATALOG_MCP_URL: 'http://localhost:3111/mcp',
56
+ REVIEW_GATE_MCP_URL: 'http://localhost:3501/mcp',
57
+ AUDIT_LOG_MCP_URL: 'http://localhost:3601/mcp',
58
+ PROJECT_REGISTRY_MCP_URL: 'http://localhost:3301/mcp',
59
+ DOC_TEMPLATE_MCP_URL: 'http://localhost:3231/mcp',
60
+ PHASE_GATE_MCP_URL: 'http://localhost:3801/mcp',
61
+ UI_TEMPLATES_MCP_URL: 'http://localhost:3901/mcp',
62
+ SEARCH_MCP_URL: 'http://localhost:3221/mcp',
63
+ DESIGN_SYSTEM_BUILDER_MCP_URL: 'http://localhost:3211/mcp',
64
+ SCM_WEBHOOK_SECRET: 'dummy-webhook-secret',
65
+ SCM_WEBHOOK_BASE_URL: 'http://localhost:3500/webhooks',
66
+ GITEA_URL: 'http://localhost:3000',
67
+ GITEA_ADMIN_USER: 'gitea_admin',
68
+ GITEA_ADMIN_PASS: 'gitea_admin_pass',
69
+ MASTER_ENCRYPTION_KEY: DUMMY_ENCRYPTION_KEY_HEX,
70
+ ENCRYPTION_MASTER_KEY: DUMMY_BASE64_KEY,
71
+ LLM_REGISTRY_ENCRYPTION_KEY: 'abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789',
72
+ VARIABLE_ENCRYPTION_KEY: 'fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210',
73
+ PLATFORM_METRICS_ENDPOINT: 'http://localhost:9090/metrics',
74
+ PLATFORM_AUDIT_ENDPOINT: 'http://localhost:3601/audit',
75
+ });
76
+ }
77
+ //# sourceMappingURL=seed-openapi-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-openapi-env.js","sourceRoot":"","sources":["../../src/lib/seed-openapi-env.ts"],"names":[],"mappings":";;AA6BA,wCAkFC;AA/FD,MAAM,wBAAwB,GAC5B,kEAAkE,CAAC;AACrE,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AAGxE,SAAS,IAAI,CAAC,IAA4B;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,cAAc;IAC5B,IAAI,CAAC;QACH,QAAQ,EAAE,aAAa;QAGvB,YAAY,EAAE,uDAAuD;QACrE,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,wBAAwB;QACnC,cAAc,EAAE,uBAAuB;QAGvC,gBAAgB,EAAE,uBAAuB;QACzC,2BAA2B,EAAE,aAAa;QAC1C,kBAAkB,EAChB,kEAAkE;QACpE,UAAU,EAAE,oCAAoC;QAChD,kBAAkB,EAAE,iDAAiD;QACrE,kBAAkB,EAAE,0BAA0B;QAC9C,wBAAwB,EAAE,uBAAuB;QAGjD,aAAa,EAAE,uBAAuB;QAGtC,YAAY,EAAE,uBAAuB;QACrC,eAAe,EAAE,uBAAuB;QACxC,cAAc,EAAE,uBAAuB;QACvC,oBAAoB,EAAE,uBAAuB;QAC7C,mBAAmB,EAAE,uBAAuB;QAC5C,YAAY,EAAE,uBAAuB;QACrC,sBAAsB,EAAE,uBAAuB;QAC/C,sBAAsB,EAAE,uBAAuB;QAC/C,wBAAwB,EAAE,uBAAuB;QACjD,4BAA4B,EAAE,uBAAuB;QACrD,6BAA6B,EAAE,uBAAuB;QACtD,cAAc,EAAE,uBAAuB;QACvC,eAAe,EAAE,uBAAuB;QACxC,2BAA2B,EAAE,uBAAuB;QAGpD,sBAAsB,EAAE,2BAA2B;QACnD,eAAe,EAAE,2BAA2B;QAC5C,oBAAoB,EAAE,2BAA2B;QACjD,wBAAwB,EAAE,2BAA2B;QACrD,cAAc,EAAE,2BAA2B;QAC3C,sBAAsB,EAAE,2BAA2B;QACnD,eAAe,EAAE,2BAA2B;QAC5C,sBAAsB,EAAE,2BAA2B;QACnD,cAAc,EAAE,2BAA2B;QAC3C,eAAe,EAAE,2BAA2B;QAC5C,mBAAmB,EAAE,2BAA2B;QAChD,iBAAiB,EAAE,2BAA2B;QAC9C,wBAAwB,EAAE,2BAA2B;QACrD,oBAAoB,EAAE,2BAA2B;QACjD,kBAAkB,EAAE,2BAA2B;QAC/C,oBAAoB,EAAE,2BAA2B;QACjD,cAAc,EAAE,2BAA2B;QAC3C,6BAA6B,EAAE,2BAA2B;QAG1D,kBAAkB,EAAE,sBAAsB;QAC1C,oBAAoB,EAAE,gCAAgC;QACtD,SAAS,EAAE,uBAAuB;QAClC,gBAAgB,EAAE,aAAa;QAC/B,gBAAgB,EAAE,kBAAkB;QAGpC,qBAAqB,EAAE,wBAAwB;QAC/C,qBAAqB,EAAE,gBAAgB;QACvC,2BAA2B,EACzB,kEAAkE;QACpE,uBAAuB,EACrB,kEAAkE;QAGpE,yBAAyB,EAAE,+BAA+B;QAC1D,uBAAuB,EAAE,6BAA6B;KACvD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { ApiSurface } from '@xemahq/xema-decorators';
2
+ export interface XemaApiConfig {
3
+ readonly serviceId: string;
4
+ readonly biomeId: string;
5
+ readonly title: string;
6
+ readonly description?: string;
7
+ }
8
+ export interface ResolvedServiceContext {
9
+ readonly serviceDir: string;
10
+ readonly repoRoot: string;
11
+ readonly api: XemaApiConfig;
12
+ readonly version: string;
13
+ }
14
+ export declare function findRepoRoot(start: string): string;
15
+ export declare function resolveServiceContext(serviceDir: string): ResolvedServiceContext;
16
+ export declare function surfaceClientShortName(serviceId: string, surface: ApiSurface): string;
17
+ export declare function surfaceClientPackageName(serviceId: string, surface: ApiSurface): string;
18
+ export declare function surfaceClientDir(ctx: ResolvedServiceContext, surface: ApiSurface): string;
19
+ export declare function surfaceSpecPath(ctx: ResolvedServiceContext, surface: ApiSurface): string;
20
+ //# sourceMappingURL=service-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-config.d.ts","sourceRoot":"","sources":["../../src/lib/service-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAerD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAE5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAOD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CA8ChF;AAeD,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,GAClB,MAAM,CAUR;AAGD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,GAClB,MAAM,CAER;AAGD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,sBAAsB,EAC3B,OAAO,EAAE,UAAU,GAClB,MAAM,CAMR;AAGD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,sBAAsB,EAC3B,OAAO,EAAE,UAAU,GAClB,MAAM,CAER"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findRepoRoot = findRepoRoot;
4
+ exports.resolveServiceContext = resolveServiceContext;
5
+ exports.surfaceClientShortName = surfaceClientShortName;
6
+ exports.surfaceClientPackageName = surfaceClientPackageName;
7
+ exports.surfaceClientDir = surfaceClientDir;
8
+ exports.surfaceSpecPath = surfaceSpecPath;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = require("node:path");
11
+ const xema_decorators_1 = require("@xemahq/xema-decorators");
12
+ function findRepoRoot(start) {
13
+ let dir = (0, node_path_1.resolve)(start);
14
+ while (dir !== (0, node_path_1.dirname)(dir)) {
15
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(dir, 'pnpm-workspace.yaml'))) {
16
+ return dir;
17
+ }
18
+ dir = (0, node_path_1.dirname)(dir);
19
+ }
20
+ throw new Error(`api-client-generator: could not locate a repo root (pnpm-workspace.yaml) ` +
21
+ `walking up from ${start}.`);
22
+ }
23
+ function resolveServiceContext(serviceDir) {
24
+ const pkgPath = (0, node_path_1.join)(serviceDir, 'package.json');
25
+ if (!(0, node_fs_1.existsSync)(pkgPath)) {
26
+ throw new Error(`api-client-generator: no package.json found at ${pkgPath}. Run the ` +
27
+ `generator from a service directory.`);
28
+ }
29
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, 'utf8'));
30
+ const api = pkg.xema?.api;
31
+ if (!api || typeof api !== 'object') {
32
+ throw new Error(`api-client-generator: ${pkgPath} is missing the required \`xema.api\` ` +
33
+ `block. Add: { "xema": { "api": { "serviceId": "<id>", "biomeId": ` +
34
+ `"<biome>", "title": "<title>" } } }.`);
35
+ }
36
+ const { serviceId, biomeId, title, description } = api;
37
+ for (const [field, value] of Object.entries({ serviceId, biomeId, title })) {
38
+ if (typeof value !== 'string' || value.trim() === '') {
39
+ throw new Error(`api-client-generator: \`xema.api.${field}\` is required and must be a ` +
40
+ `non-empty string in ${pkgPath}.`);
41
+ }
42
+ }
43
+ if (typeof pkg.version !== 'string' || pkg.version.trim() === '') {
44
+ throw new Error(`api-client-generator: ${pkgPath} is missing a \`version\` — every ` +
45
+ `generated surface client shares the service version.`);
46
+ }
47
+ return {
48
+ serviceDir: (0, node_path_1.resolve)(serviceDir),
49
+ repoRoot: findRepoRoot(serviceDir),
50
+ api: {
51
+ serviceId: serviceId,
52
+ biomeId: biomeId,
53
+ title: title,
54
+ ...(typeof description === 'string' ? { description } : {}),
55
+ },
56
+ version: pkg.version,
57
+ };
58
+ }
59
+ function surfaceClientShortName(serviceId, surface) {
60
+ if (surface === xema_decorators_1.ApiSurface.Public) {
61
+ return `${serviceId}-client`;
62
+ }
63
+ const segment = surface;
64
+ if (serviceId.endsWith('-api')) {
65
+ const base = serviceId.slice(0, -'-api'.length);
66
+ return `${base}-${segment}-api-client`;
67
+ }
68
+ return `${serviceId}-${segment}-client`;
69
+ }
70
+ function surfaceClientPackageName(serviceId, surface) {
71
+ return `@xemahq/${surfaceClientShortName(serviceId, surface)}`;
72
+ }
73
+ function surfaceClientDir(ctx, surface) {
74
+ const dirName = surfaceClientShortName(ctx.api.serviceId, surface).replace(/-client$/, '');
75
+ return (0, node_path_1.join)(ctx.repoRoot, 'packages', 'clients', dirName);
76
+ }
77
+ function surfaceSpecPath(ctx, surface) {
78
+ return (0, node_path_1.join)(ctx.serviceDir, `openapi.${surface}.json`);
79
+ }
80
+ //# sourceMappingURL=service-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-config.js","sourceRoot":"","sources":["../../src/lib/service-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { INestApplication, Type } from '@nestjs/common';
2
+ import type { DiscoveryService, MetadataScanner, ModulesContainer } from '@nestjs/core';
3
+ import type { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
4
+ import type { Test } from '@nestjs/testing';
5
+ export interface ServiceNest {
6
+ readonly Test: typeof Test;
7
+ readonly DocumentBuilder: typeof DocumentBuilder;
8
+ readonly SwaggerModule: typeof SwaggerModule;
9
+ readonly DiscoveryService: Type<DiscoveryService>;
10
+ readonly MetadataScanner: Type<MetadataScanner>;
11
+ readonly ModulesContainer: Type<ModulesContainer>;
12
+ }
13
+ export declare function loadServiceNest(serviceDir: string): ServiceNest;
14
+ export type { INestApplication };
15
+ //# sourceMappingURL=service-nest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-nest.d.ts","sourceRoot":"","sources":["../../src/lib/service-nest.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,OAAO,eAAe,CAAC;IACjD,QAAQ,CAAC,aAAa,EAAE,OAAO,aAAa,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;CACnD;AAQD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAY/D;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadServiceNest = loadServiceNest;
4
+ function requireFrom(serviceDir, request) {
5
+ const resolved = require.resolve(request, { paths: [serviceDir] });
6
+ return require(resolved);
7
+ }
8
+ function loadServiceNest(serviceDir) {
9
+ const core = requireFrom(serviceDir, '@nestjs/core');
10
+ const testing = requireFrom(serviceDir, '@nestjs/testing');
11
+ const swagger = requireFrom(serviceDir, '@nestjs/swagger');
12
+ return {
13
+ Test: testing.Test,
14
+ DocumentBuilder: swagger.DocumentBuilder,
15
+ SwaggerModule: swagger.SwaggerModule,
16
+ DiscoveryService: core.DiscoveryService,
17
+ MetadataScanner: core.MetadataScanner,
18
+ ModulesContainer: core.ModulesContainer,
19
+ };
20
+ }
21
+ //# sourceMappingURL=service-nest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-nest.js","sourceRoot":"","sources":["../../src/lib/service-nest.ts"],"names":[],"mappings":";;AAwCA,0CAYC;AAlBD,SAAS,WAAW,CAAC,UAAkB,EAAE,OAAe;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAEnE,OAAO,OAAO,CAAC,QAAQ,CAA4B,CAAC;AACtD,CAAC;AAED,SAAgB,eAAe,CAAC,UAAkB;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC3D,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAmB;QACjC,eAAe,EAAE,OAAO,CAAC,eAAyC;QAClE,aAAa,EAAE,OAAO,CAAC,aAAqC;QAC5D,gBAAgB,EAAE,IAAI,CAAC,gBAA0C;QACjE,eAAe,EAAE,IAAI,CAAC,eAAwC;QAC9D,gBAAgB,EAAE,IAAI,CAAC,gBAA0C;KAClE,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@xemahq/api-client-generator",
3
+ "version": "0.1.1",
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 (all sharing the owning service's version), 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.",
5
+ "keywords": [
6
+ "xema",
7
+ "openapi",
8
+ "orval",
9
+ "nestjs",
10
+ "api-client",
11
+ "codegen"
12
+ ],
13
+ "license": "Apache-2.0",
14
+ "publishConfig": {
15
+ "access": "public",
16
+ "registry": "https://registry.npmjs.org/"
17
+ },
18
+ "main": "dist/index.js",
19
+ "types": "dist/index.d.ts",
20
+ "bin": {
21
+ "xema-openapi": "dist/bin/xema-openapi.js",
22
+ "xema-client-generate": "dist/bin/xema-client-generate.js"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "scripts": {
28
+ "clean": "rm -rf dist",
29
+ "build": "tsc -p tsconfig.build.json",
30
+ "format": "prettier --write \"src/**/*.ts\"",
31
+ "typecheck": "tsc -p tsconfig.json --noEmit"
32
+ },
33
+ "peerDependencies": {
34
+ "@nestjs/common": "^10 || ^11",
35
+ "@nestjs/core": "^10 || ^11",
36
+ "@nestjs/swagger": "^7 || ^8 || ^11",
37
+ "@nestjs/testing": "^10 || ^11",
38
+ "@xemahq/xema-decorators": "^0.1.1",
39
+ "orval": "^8",
40
+ "reflect-metadata": "^0.2",
41
+ "ts-node": ">=10",
42
+ "tsconfig-paths": ">=4",
43
+ "typescript": "^5"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "ts-node": {
47
+ "optional": true
48
+ },
49
+ "tsconfig-paths": {
50
+ "optional": true
51
+ }
52
+ },
53
+ "devDependencies": {
54
+ "@nestjs/common": "catalog:",
55
+ "@nestjs/core": "catalog:",
56
+ "@nestjs/swagger": "catalog:",
57
+ "@nestjs/testing": "catalog:",
58
+ "@types/node": "catalog:",
59
+ "@xemahq/xema-decorators": "workspace:*",
60
+ "orval": "catalog:",
61
+ "prettier": "catalog:",
62
+ "reflect-metadata": "catalog:",
63
+ "typescript": "catalog:"
64
+ },
65
+ "exports": {
66
+ ".": {
67
+ "types": "./dist/index.d.ts",
68
+ "xema-source": "./src/index.ts",
69
+ "default": "./dist/index.js"
70
+ }
71
+ }
72
+ }