@furystack/rest 8.0.42 → 8.1.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +37 -1
  3. package/esm/api-endpoint-schema.d.ts +47 -2
  4. package/esm/api-endpoint-schema.d.ts.map +1 -1
  5. package/esm/index.d.ts +4 -1
  6. package/esm/index.d.ts.map +1 -1
  7. package/esm/index.js +4 -1
  8. package/esm/index.js.map +1 -1
  9. package/esm/openapi-document.d.ts +303 -0
  10. package/esm/openapi-document.d.ts.map +1 -0
  11. package/esm/openapi-document.js +2 -0
  12. package/esm/openapi-document.js.map +1 -0
  13. package/esm/openapi-resolve-refs.d.ts +20 -0
  14. package/esm/openapi-resolve-refs.d.ts.map +1 -0
  15. package/esm/openapi-resolve-refs.js +68 -0
  16. package/esm/openapi-resolve-refs.js.map +1 -0
  17. package/esm/openapi-resolve-refs.spec.d.ts +2 -0
  18. package/esm/openapi-resolve-refs.spec.d.ts.map +1 -0
  19. package/esm/openapi-resolve-refs.spec.js +294 -0
  20. package/esm/openapi-resolve-refs.spec.js.map +1 -0
  21. package/esm/openapi-to-rest-api.d.ts +197 -0
  22. package/esm/openapi-to-rest-api.d.ts.map +1 -0
  23. package/esm/openapi-to-rest-api.js +2 -0
  24. package/esm/openapi-to-rest-api.js.map +1 -0
  25. package/esm/openapi-to-rest-api.spec.d.ts +2 -0
  26. package/esm/openapi-to-rest-api.spec.d.ts.map +1 -0
  27. package/esm/openapi-to-rest-api.spec.js +665 -0
  28. package/esm/openapi-to-rest-api.spec.js.map +1 -0
  29. package/esm/openapi-to-schema.d.ts +24 -0
  30. package/esm/openapi-to-schema.d.ts.map +1 -0
  31. package/esm/openapi-to-schema.js +145 -0
  32. package/esm/openapi-to-schema.js.map +1 -0
  33. package/esm/openapi-to-schema.spec.d.ts +2 -0
  34. package/esm/openapi-to-schema.spec.d.ts.map +1 -0
  35. package/esm/openapi-to-schema.spec.js +610 -0
  36. package/esm/openapi-to-schema.spec.js.map +1 -0
  37. package/esm/rest-api.d.ts +21 -4
  38. package/esm/rest-api.d.ts.map +1 -1
  39. package/esm/swagger-document.d.ts +2 -195
  40. package/esm/swagger-document.d.ts.map +1 -1
  41. package/esm/swagger-document.js +2 -1
  42. package/esm/swagger-document.js.map +1 -1
  43. package/package.json +3 -3
  44. package/src/api-endpoint-schema.ts +56 -3
  45. package/src/index.ts +4 -1
  46. package/src/openapi-document.ts +328 -0
  47. package/src/openapi-resolve-refs.spec.ts +324 -0
  48. package/src/openapi-resolve-refs.ts +71 -0
  49. package/src/openapi-to-rest-api.spec.ts +823 -0
  50. package/src/openapi-to-rest-api.ts +263 -0
  51. package/src/openapi-to-schema.spec.ts +707 -0
  52. package/src/openapi-to-schema.ts +163 -0
  53. package/src/rest-api.ts +26 -5
  54. package/src/swagger-document.ts +2 -220
package/esm/rest-api.d.ts CHANGED
@@ -1,6 +1,15 @@
1
1
  import type { ApiEndpointSchema } from './api-endpoint-schema.js';
2
2
  import type { Method } from './methods.js';
3
- import type { SwaggerDocument } from './swagger-document.js';
3
+ import type { OpenApiDocument } from './openapi-document.js';
4
+ /**
5
+ * Defines the shape of a REST API as a mapping of HTTP methods to path-endpoint pairs.
6
+ * Each endpoint describes its result type and optionally its URL parameters, query parameters,
7
+ * request body, headers, and metadata like tags/deprecated/summary/description.
8
+ *
9
+ * This type is the shared contract between `@furystack/rest-service` (server) and
10
+ * `@furystack/rest-client-fetch` (client). It can also be derived from an OpenAPI document
11
+ * using `OpenApiToRestApi<T>`.
12
+ */
4
13
  export type RestApi = {
5
14
  [TMethod in Method]?: {
6
15
  [TUrl: string]: {
@@ -9,12 +18,16 @@ export type RestApi = {
9
18
  query?: unknown;
10
19
  body?: unknown;
11
20
  headers?: unknown;
21
+ tags?: string[];
22
+ deprecated?: boolean;
23
+ summary?: string;
24
+ description?: string;
12
25
  };
13
26
  };
14
27
  };
15
28
  /**
16
- * Represents an API with a GET action to retrieve its schema.
17
- * This type extends the base RestApi type to include a specific GET endpoint for schema retrieval.
29
+ * Represents an API with a GET action to retrieve its schema and OpenAPI document.
30
+ * This type extends the base RestApi type to include specific GET endpoints for schema and OpenAPI retrieval.
18
31
  */
19
32
  export type WithSchemaAction<T extends RestApi> = T & {
20
33
  GET: {
@@ -24,8 +37,12 @@ export type WithSchemaAction<T extends RestApi> = T & {
24
37
  accept: 'application/schema+json';
25
38
  };
26
39
  };
40
+ '/openapi.json': {
41
+ result: OpenApiDocument;
42
+ };
43
+ /** @deprecated Use `/openapi.json` instead. This endpoint will be removed in a future major version. */
27
44
  '/swagger.json': {
28
- result: SwaggerDocument;
45
+ result: OpenApiDocument;
29
46
  };
30
47
  };
31
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rest-api.d.ts","sourceRoot":"","sources":["../src/rest-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,MAAM,OAAO,GAAG;KACnB,OAAO,IAAI,MAAM,CAAC,CAAC,EAAE;QACpB,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,OAAO,CAAC;YAAC,GAAG,CAAC,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,OAAO,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAC;YAAC,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KACvG;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IACpD,GAAG,EAAE;QACH,SAAS,EAAE;YAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,EAAE;gBAAE,MAAM,EAAE,yBAAyB,CAAA;aAAE,CAAA;SAAE,CAAA;QAC3F,eAAe,EAAE;YAAE,MAAM,EAAE,eAAe,CAAA;SAAE,CAAA;KAC7C,CAAA;CACF,CAAA"}
1
+ {"version":3,"file":"rest-api.d.ts","sourceRoot":"","sources":["../src/rest-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D;;;;;;;;GAQG;AACH,MAAM,MAAM,OAAO,GAAG;KACnB,OAAO,IAAI,MAAM,CAAC,CAAC,EAAE;QACpB,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,MAAM,EAAE,OAAO,CAAA;YACf,GAAG,CAAC,EAAE,OAAO,CAAA;YACb,KAAK,CAAC,EAAE,OAAO,CAAA;YACf,IAAI,CAAC,EAAE,OAAO,CAAA;YACd,OAAO,CAAC,EAAE,OAAO,CAAA;YACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;YACf,UAAU,CAAC,EAAE,OAAO,CAAA;YACpB,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,WAAW,CAAC,EAAE,MAAM,CAAA;SACrB,CAAA;KACF;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IACpD,GAAG,EAAE;QACH,SAAS,EAAE;YAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,EAAE;gBAAE,MAAM,EAAE,yBAAyB,CAAA;aAAE,CAAA;SAAE,CAAA;QAC3F,eAAe,EAAE;YAAE,MAAM,EAAE,eAAe,CAAA;SAAE,CAAA;QAC5C,wGAAwG;QACxG,eAAe,EAAE;YAAE,MAAM,EAAE,eAAe,CAAA;SAAE,CAAA;KAC7C,CAAA;CACF,CAAA"}
@@ -1,196 +1,3 @@
1
- export type SwaggerDocument = {
2
- openapi: string;
3
- info: InfoObject;
4
- jsonSchemaDialect?: string;
5
- externalDocs?: ExternalDocumentationObject;
6
- servers?: ServerObject[];
7
- tags?: TagObject[];
8
- security?: SecurityRequirementObject[];
9
- paths?: Record<string, PathItem>;
10
- webhooks?: Record<string, PathItem>;
11
- components?: ComponentsObject;
12
- [key: `x-${string}`]: unknown;
13
- };
14
- export type InfoObject = {
15
- title: string;
16
- version: string;
17
- description?: string;
18
- summary?: string;
19
- termsOfService?: string;
20
- contact?: ContactObject;
21
- license?: LicenseObject;
22
- [key: `x-${string}`]: unknown;
23
- };
24
- export type ContactObject = {
25
- name?: string;
26
- url?: string;
27
- email?: string;
28
- [key: `x-${string}`]: unknown;
29
- };
30
- export type LicenseObject = {
31
- name: string;
32
- identifier?: string;
33
- url?: string;
34
- [key: `x-${string}`]: unknown;
35
- };
36
- export type ExternalDocumentationObject = {
37
- url: string;
38
- description?: string;
39
- [key: `x-${string}`]: unknown;
40
- };
41
- export type ServerObject = {
42
- url: string;
43
- description?: string;
44
- variables?: Record<string, ServerVariableObject>;
45
- [key: `x-${string}`]: unknown;
46
- };
47
- export type ServerVariableObject = {
48
- default: string;
49
- description?: string;
50
- enum?: string[];
51
- [key: `x-${string}`]: unknown;
52
- };
53
- export type TagObject = {
54
- name: string;
55
- description?: string;
56
- externalDocs?: ExternalDocumentationObject;
57
- [key: `x-${string}`]: unknown;
58
- };
59
- export type SecurityRequirementObject = Record<string, string[]>;
60
- export type ComponentsObject = {
61
- schemas?: Record<string, object | boolean>;
62
- responses?: Record<string, ResponseObject | ReferenceObject>;
63
- parameters?: Record<string, ParameterObject | ReferenceObject>;
64
- examples?: Record<string, ExampleObject | ReferenceObject>;
65
- requestBodies?: Record<string, RequestBodyObject | ReferenceObject>;
66
- headers?: Record<string, HeaderObject | ReferenceObject>;
67
- securitySchemes?: Record<string, SecuritySchemeObject | ReferenceObject>;
68
- links?: Record<string, LinkObject | ReferenceObject>;
69
- callbacks?: Record<string, CallbackObject | ReferenceObject>;
70
- pathItems?: Record<string, PathItem | ReferenceObject>;
71
- [key: `x-${string}`]: unknown;
72
- };
73
- export type ReferenceObject = {
74
- $ref: string;
75
- description?: string;
76
- summary?: string;
77
- };
78
- export type PathItem = {
79
- summary?: string;
80
- description?: string;
81
- get?: Operation;
82
- put?: Operation;
83
- post?: Operation;
84
- delete?: Operation;
85
- options?: Operation;
86
- head?: Operation;
87
- patch?: Operation;
88
- trace?: Operation;
89
- servers?: ServerObject[];
90
- parameters?: Array<ParameterObject | ReferenceObject>;
91
- [key: `x-${string}`]: unknown;
92
- };
93
- export type Operation = {
94
- tags?: string[];
95
- summary?: string;
96
- description?: string;
97
- externalDocs?: ExternalDocumentationObject;
98
- operationId?: string;
99
- parameters?: Array<ParameterObject | ReferenceObject>;
100
- requestBody?: RequestBodyObject | ReferenceObject;
101
- responses: ResponsesObject;
102
- callbacks?: Record<string, CallbackObject | ReferenceObject>;
103
- deprecated?: boolean;
104
- security?: SecurityRequirementObject[];
105
- servers?: ServerObject[];
106
- [key: `x-${string}`]: unknown;
107
- };
108
- export type ParameterObject = {
109
- name: string;
110
- in: 'query' | 'header' | 'path' | 'cookie';
111
- description?: string;
112
- required?: boolean;
113
- deprecated?: boolean;
114
- allowEmptyValue?: boolean;
115
- style?: string;
116
- explode?: boolean;
117
- allowReserved?: boolean;
118
- schema?: object | boolean;
119
- example?: unknown;
120
- examples?: Record<string, ExampleObject | ReferenceObject>;
121
- content?: Record<string, MediaTypeObject>;
122
- [key: `x-${string}`]: unknown;
123
- };
124
- export type RequestBodyObject = {
125
- description?: string;
126
- content: Record<string, MediaTypeObject>;
127
- required?: boolean;
128
- [key: `x-${string}`]: unknown;
129
- };
130
- export type MediaTypeObject = {
131
- schema?: object | boolean;
132
- example?: unknown;
133
- examples?: Record<string, ExampleObject | ReferenceObject>;
134
- encoding?: Record<string, EncodingObject>;
135
- [key: `x-${string}`]: unknown;
136
- };
137
- export type EncodingObject = {
138
- contentType?: string;
139
- headers?: Record<string, HeaderObject | ReferenceObject>;
140
- style?: string;
141
- explode?: boolean;
142
- allowReserved?: boolean;
143
- [key: `x-${string}`]: unknown;
144
- };
145
- export type ResponsesObject = Record<string, ResponseObject | ReferenceObject>;
146
- export type ResponseObject = {
147
- description: string;
148
- headers?: Record<string, HeaderObject | ReferenceObject>;
149
- content?: Record<string, MediaTypeObject>;
150
- links?: Record<string, LinkObject | ReferenceObject>;
151
- [key: `x-${string}`]: unknown;
152
- };
153
- export type HeaderObject = Omit<ParameterObject, 'name' | 'in'>;
154
- export type ExampleObject = {
155
- summary?: string;
156
- description?: string;
157
- value?: unknown;
158
- externalValue?: string;
159
- [key: `x-${string}`]: unknown;
160
- };
161
- export type LinkObject = {
162
- operationRef?: string;
163
- operationId?: string;
164
- parameters?: Record<string, unknown>;
165
- requestBody?: unknown;
166
- description?: string;
167
- server?: ServerObject;
168
- [key: `x-${string}`]: unknown;
169
- };
170
- export type CallbackObject = Record<string, PathItem>;
171
- export type SecuritySchemeObject = {
172
- type: 'apiKey' | 'http' | 'mutualTLS' | 'oauth2' | 'openIdConnect';
173
- description?: string;
174
- name?: string;
175
- in?: 'query' | 'header' | 'cookie';
176
- scheme?: string;
177
- bearerFormat?: string;
178
- flows?: OAuthFlowsObject;
179
- openIdConnectUrl?: string;
180
- [key: `x-${string}`]: unknown;
181
- };
182
- export type OAuthFlowsObject = {
183
- implicit?: OAuthFlowObject;
184
- password?: OAuthFlowObject;
185
- clientCredentials?: OAuthFlowObject;
186
- authorizationCode?: OAuthFlowObject;
187
- [key: `x-${string}`]: unknown;
188
- };
189
- export type OAuthFlowObject = {
190
- authorizationUrl?: string;
191
- tokenUrl?: string;
192
- refreshUrl?: string;
193
- scopes: Record<string, string>;
194
- [key: `x-${string}`]: unknown;
195
- };
1
+ /** @deprecated Use imports from './openapi-document.js' instead */
2
+ export * from './openapi-document.js';
196
3
  //# sourceMappingURL=swagger-document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"swagger-document.d.ts","sourceRoot":"","sources":["../src/swagger-document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swagger-document.d.ts","sourceRoot":"","sources":["../src/swagger-document.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,cAAc,uBAAuB,CAAA"}
@@ -1,2 +1,3 @@
1
- export {};
1
+ /** @deprecated Use imports from './openapi-document.js' instead */
2
+ export * from './openapi-document.js';
2
3
  //# sourceMappingURL=swagger-document.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"swagger-document.js","sourceRoot":"","sources":["../src/swagger-document.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"swagger-document.js","sourceRoot":"","sources":["../src/swagger-document.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,cAAc,uBAAuB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/rest",
3
- "version": "8.0.42",
3
+ "version": "8.1.0",
4
4
  "description": "Generic REST package",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -38,11 +38,11 @@
38
38
  },
39
39
  "homepage": "https://github.com/furystack/furystack",
40
40
  "dependencies": {
41
- "@furystack/core": "^15.2.4",
41
+ "@furystack/core": "^15.2.5",
42
42
  "@furystack/inject": "^12.0.32"
43
43
  },
44
44
  "devDependencies": {
45
- "@types/node": "^25.3.1",
45
+ "@types/node": "^25.3.5",
46
46
  "typescript": "^5.9.3",
47
47
  "vitest": "^4.0.18"
48
48
  },
@@ -1,10 +1,24 @@
1
1
  import type { Method } from './methods.js'
2
+ import type {
3
+ ContactObject,
4
+ ExternalDocumentationObject,
5
+ LicenseObject,
6
+ SecuritySchemeObject,
7
+ ServerObject,
8
+ TagObject,
9
+ } from './openapi-document.js'
2
10
  import type { RestApi } from './rest-api.js'
3
11
 
4
12
  /**
5
- * The JSON schema type used for API endpoint definitions.
13
+ * The JSON Schema type used for API endpoint definitions.
14
+ *
15
+ * This is intentionally `unknown` because the exact schema shape depends on
16
+ * the generator used (e.g. `ts-json-schema-generator` produces Draft 7-style
17
+ * objects with `definitions`, while consumed OpenAPI documents use 3.1-style
18
+ * objects). Narrowing to `object | boolean` would break runtime usages where
19
+ * the schema is `null` or omitted.
6
20
  */
7
- export type Schema = unknown // TODO: Fix me
21
+ export type Schema = unknown
8
22
 
9
23
  /**
10
24
  * Represents the definition of an API endpoint, including its path, schema, and schema name.
@@ -27,9 +41,47 @@ export type ApiEndpointDefinition = {
27
41
  schemaName: string
28
42
  /**
29
43
  * Indicates whether the endpoint requires authentication.
30
- * To include the flag, wrap your endpoint with an Authenticat() call during the implementation.
44
+ * To include the flag, wrap your endpoint with an Authenticate() call during the implementation.
31
45
  */
32
46
  isAuthenticated: boolean
47
+ /**
48
+ * Tags for API documentation grouping.
49
+ */
50
+ tags?: string[]
51
+ /**
52
+ * Marks the endpoint as deprecated.
53
+ */
54
+ deprecated?: boolean
55
+ /**
56
+ * A short summary of the endpoint.
57
+ */
58
+ summary?: string
59
+ /**
60
+ * A longer description of the endpoint.
61
+ */
62
+ description?: string
63
+ /**
64
+ * The OpenAPI security scheme names required for this endpoint.
65
+ * When present, used by `generateOpenApiDocument` to emit accurate per-operation `security`.
66
+ * When absent, falls back to the `isAuthenticated` boolean behavior.
67
+ */
68
+ securitySchemes?: string[]
69
+ }
70
+
71
+ /**
72
+ * Document-level metadata preserved from/to OpenAPI documents.
73
+ * Carries info fields (contact, license, servers, tags, etc.) through the
74
+ * `openApiToSchema()` -> `generateOpenApiDocument()` round-trip.
75
+ */
76
+ export type ApiDocumentMetadata = {
77
+ summary?: string
78
+ termsOfService?: string
79
+ contact?: ContactObject
80
+ license?: LicenseObject
81
+ servers?: ServerObject[]
82
+ tags?: TagObject[]
83
+ externalDocs?: ExternalDocumentationObject
84
+ securitySchemes?: Record<string, SecuritySchemeObject>
33
85
  }
34
86
 
35
87
  /**
@@ -54,6 +106,7 @@ export type ApiEndpointSchema<TApi extends RestApi = RestApi> = {
54
106
  name: string
55
107
  description: string
56
108
  version: string
109
+ metadata?: ApiDocumentMetadata
57
110
  endpoints: {
58
111
  [TMethod in Method]?: TMethod extends keyof TApi
59
112
  ? TApi[TMethod] extends Record<string, unknown>
package/src/index.ts CHANGED
@@ -2,7 +2,10 @@ export * from './api-endpoint-schema.js'
2
2
  export * from './deserialize-query-string.js'
3
3
  export * from './endpoint-models/index.js'
4
4
  export * from './methods.js'
5
+ export * from './openapi-document.js'
6
+ export * from './openapi-resolve-refs.js'
7
+ export * from './openapi-to-rest-api.js'
8
+ export * from './openapi-to-schema.js'
5
9
  export * from './request-error.js'
6
10
  export * from './rest-api.js'
7
11
  export * from './serialize-to-query-string.js'
8
- export * from './swagger-document.js'