@spinajs/http-swagger 2.0.480 → 2.0.482

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 (41) hide show
  1. package/lib/cjs/cli/GenerateSwaggerCache.d.ts +1 -1
  2. package/lib/cjs/cli/GenerateSwaggerCache.d.ts.map +1 -1
  3. package/lib/cjs/cli/GenerateSwaggerCache.js +3 -2
  4. package/lib/cjs/cli/GenerateSwaggerCache.js.map +1 -1
  5. package/lib/cjs/config/http-swagger.d.ts.map +1 -1
  6. package/lib/cjs/config/http-swagger.js +6 -1
  7. package/lib/cjs/config/http-swagger.js.map +1 -1
  8. package/lib/cjs/controllers/SwaggerController.d.ts +3 -3
  9. package/lib/cjs/controllers/SwaggerController.d.ts.map +1 -1
  10. package/lib/cjs/controllers/SwaggerController.js +2 -2
  11. package/lib/cjs/controllers/SwaggerController.js.map +1 -1
  12. package/lib/cjs/openapi-builder.d.ts +13 -0
  13. package/lib/cjs/openapi-builder.d.ts.map +1 -1
  14. package/lib/cjs/openapi-builder.js +87 -25
  15. package/lib/cjs/openapi-builder.js.map +1 -1
  16. package/lib/cjs/swagger-service.d.ts +18 -0
  17. package/lib/cjs/swagger-service.d.ts.map +1 -1
  18. package/lib/cjs/swagger-service.js +37 -4
  19. package/lib/cjs/swagger-service.js.map +1 -1
  20. package/lib/mjs/cli/GenerateSwaggerCache.d.ts +1 -1
  21. package/lib/mjs/cli/GenerateSwaggerCache.d.ts.map +1 -1
  22. package/lib/mjs/cli/GenerateSwaggerCache.js +3 -2
  23. package/lib/mjs/cli/GenerateSwaggerCache.js.map +1 -1
  24. package/lib/mjs/config/http-swagger.d.ts.map +1 -1
  25. package/lib/mjs/config/http-swagger.js +6 -1
  26. package/lib/mjs/config/http-swagger.js.map +1 -1
  27. package/lib/mjs/controllers/SwaggerController.d.ts +3 -3
  28. package/lib/mjs/controllers/SwaggerController.d.ts.map +1 -1
  29. package/lib/mjs/controllers/SwaggerController.js +3 -3
  30. package/lib/mjs/controllers/SwaggerController.js.map +1 -1
  31. package/lib/mjs/openapi-builder.d.ts +13 -0
  32. package/lib/mjs/openapi-builder.d.ts.map +1 -1
  33. package/lib/mjs/openapi-builder.js +87 -25
  34. package/lib/mjs/openapi-builder.js.map +1 -1
  35. package/lib/mjs/swagger-service.d.ts +18 -0
  36. package/lib/mjs/swagger-service.d.ts.map +1 -1
  37. package/lib/mjs/swagger-service.js +37 -4
  38. package/lib/mjs/swagger-service.js.map +1 -1
  39. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  40. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  41. package/package.json +13 -11
@@ -12,9 +12,27 @@ export declare class SwaggerService extends AsyncService {
12
12
  protected ControllersService: Controllers;
13
13
  protected DocCache: SwaggerDocCache;
14
14
  protected SwaggerConfig: ISwaggerConfig;
15
+ /**
16
+ * The global route prefix the runtime prepends to every controller route
17
+ * (see BaseController route registration). Documented paths must include it
18
+ * or Swagger "Try it out" hits the wrong URL. Only used as a fallback when
19
+ * an explicit swagger.basePath isn't configured.
20
+ */
21
+ protected RoutePrefix: string;
15
22
  private _spec;
23
+ /**
24
+ * In-flight build, shared so concurrent first requests don't each kick off a
25
+ * full (expensive) rebuild. Cleared once the build settles.
26
+ */
27
+ private _buildPromise;
16
28
  get IsEnabled(): boolean;
17
29
  resolve(): Promise<void>;
30
+ /**
31
+ * Drop the cached spec so the next getSpec() rebuilds it. Call after
32
+ * registering controllers at runtime (Controllers.add) so they appear in
33
+ * the documentation.
34
+ */
35
+ invalidate(): void;
18
36
  getSpec(): Promise<IOpenApiDocument | null>;
19
37
  /**
20
38
  * Rebuild the OpenAPI specification from current controllers.
@@ -1 +1 @@
1
- {"version":3,"file":"swagger-service.d.ts","sourceRoot":"","sources":["../../src/swagger-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAU,GAAG,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,qBACa,cAAe,SAAQ,YAAY;IAE9C,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,kBAAkB,EAAG,WAAW,CAAC;IAG3C,SAAS,CAAC,QAAQ,EAAG,eAAe,CAAC;IAGrC,SAAS,CAAC,aAAa,EAAG,cAAc,CAAC;IAEzC,OAAO,CAAC,KAAK,CAAiC;IAE9C,IAAW,SAAS,IAAI,OAAO,CAE9B;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,OAAO,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAUxD;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAsBpD"}
1
+ {"version":3,"file":"swagger-service.d.ts","sourceRoot":"","sources":["../../src/swagger-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAU,GAAG,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,qBACa,cAAe,SAAQ,YAAY;IAE9C,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,kBAAkB,EAAG,WAAW,CAAC;IAG3C,SAAS,CAAC,QAAQ,EAAG,eAAe,CAAC;IAGrC,SAAS,CAAC,aAAa,EAAG,cAAc,CAAC;IAEzC;;;;;OAKG;IAEH,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC;IAE/B,OAAO,CAAC,KAAK,CAAiC;IAE9C;;;OAGG;IACH,OAAO,CAAC,aAAa,CAA0C;IAE/D,IAAW,SAAS,IAAI,OAAO,CAE9B;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACI,UAAU,IAAI,IAAI;IAIZ,OAAO,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAqBxD;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA6BpD"}
@@ -21,6 +21,11 @@ let SwaggerService = class SwaggerService extends AsyncService {
21
21
  constructor() {
22
22
  super(...arguments);
23
23
  this._spec = null;
24
+ /**
25
+ * In-flight build, shared so concurrent first requests don't each kick off a
26
+ * full (expensive) rebuild. Cleared once the build settles.
27
+ */
28
+ this._buildPromise = null;
24
29
  }
25
30
  get IsEnabled() {
26
31
  return this.SwaggerConfig?.enabled !== false;
@@ -28,25 +33,49 @@ let SwaggerService = class SwaggerService extends AsyncService {
28
33
  async resolve() {
29
34
  await super.resolve();
30
35
  }
36
+ /**
37
+ * Drop the cached spec so the next getSpec() rebuilds it. Call after
38
+ * registering controllers at runtime (Controllers.add) so they appear in
39
+ * the documentation.
40
+ */
41
+ invalidate() {
42
+ this._spec = null;
43
+ }
31
44
  async getSpec() {
32
45
  if (!this.IsEnabled)
33
46
  return null;
34
- if (!this._spec) {
47
+ if (this._spec)
48
+ return this._spec;
49
+ // Coalesce concurrent builds onto a single in-flight promise.
50
+ if (!this._buildPromise) {
35
51
  this.Log.info('Building Swagger/OpenAPI documentation...');
36
- const spec = await this.buildSpec();
37
- this.Log.info(`Swagger documentation ready. ${Object.keys(spec.paths ?? {}).length} paths documented.`);
52
+ this._buildPromise = this.buildSpec()
53
+ .then((spec) => {
54
+ this.Log.info(`Swagger documentation ready. ${Object.keys(spec.paths ?? {}).length} paths documented.`);
55
+ return spec;
56
+ })
57
+ .finally(() => {
58
+ this._buildPromise = null;
59
+ });
38
60
  }
61
+ await this._buildPromise;
39
62
  return this._spec;
40
63
  }
41
64
  /**
42
65
  * Rebuild the OpenAPI specification from current controllers.
43
66
  */
44
67
  async buildSpec() {
45
- const config = this.SwaggerConfig || {
68
+ const baseConfig = this.SwaggerConfig || {
46
69
  enabled: true,
47
70
  title: 'API Documentation',
48
71
  version: '1.0.0',
49
72
  };
73
+ // Fall back to the runtime route prefix so documented paths match the
74
+ // actual mounted URLs when no explicit swagger.basePath is set.
75
+ const config = {
76
+ ...baseConfig,
77
+ basePath: baseConfig.basePath || this.RoutePrefix || '',
78
+ };
50
79
  const builder = await DI.resolve(OpenApiBuilder, [config]);
51
80
  const controllers = await this.ControllersService.Controllers;
52
81
  for (const controller of controllers) {
@@ -78,6 +107,10 @@ __decorate([
78
107
  Config('http.swagger'),
79
108
  __metadata("design:type", Object)
80
109
  ], SwaggerService.prototype, "SwaggerConfig", void 0);
110
+ __decorate([
111
+ Config('http.controllers.route.prefix', { defaultValue: '' }),
112
+ __metadata("design:type", String)
113
+ ], SwaggerService.prototype, "RoutePrefix", void 0);
81
114
  SwaggerService = __decorate([
82
115
  Singleton()
83
116
  ], SwaggerService);
@@ -1 +1 @@
1
- {"version":3,"file":"swagger-service.js","sourceRoot":"","sources":["../../src/swagger-service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;GAGG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,YAAY;IAAzC;;QAaG,UAAK,GAA4B,IAAI,CAAC;IA6ChD,CAAC;IA3CC,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,aAAa,EAAE,OAAO,KAAK,KAAK,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,oBAAoB,CAAC,CAAC;QAC1G,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI;YACnC,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,OAAO;SACjB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;QAE9D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC1D,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,UAAU,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF,CAAA;AAxDW;IADT,MAAM,CAAC,cAAc,CAAC;8BACP,GAAG;2CAAC;AAGV;IADT,UAAU,EAAE;8BACkB,WAAW;0DAAC;AAGjC;IADT,UAAU,EAAE;8BACQ,eAAe;gDAAC;AAG3B;IADT,MAAM,CAAC,cAAc,CAAC;;qDACkB;AAX9B,cAAc;IAD1B,SAAS,EAAE;GACC,cAAc,CA0D1B"}
1
+ {"version":3,"file":"swagger-service.js","sourceRoot":"","sources":["../../src/swagger-service.ts"],"names":[],"mappings":"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"}