zudoku 0.40.0 → 0.41.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 (157) hide show
  1. package/dist/app/main.js +7 -4
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/cli/cli.js +12 -1
  4. package/dist/cli/cli.js.map +1 -1
  5. package/dist/cli/common/machine-id/lib.js +1 -0
  6. package/dist/cli/common/machine-id/lib.js.map +1 -1
  7. package/dist/config/ZuploBuildConfig.d.ts +155 -0
  8. package/dist/config/ZuploBuildConfig.js +29 -0
  9. package/dist/config/ZuploBuildConfig.js.map +1 -0
  10. package/dist/config/loader.js +0 -3
  11. package/dist/config/loader.js.map +1 -1
  12. package/dist/config/validators/BuildSchema.d.ts +1 -0
  13. package/dist/config/validators/BuildSchema.js.map +1 -1
  14. package/dist/config/validators/common.d.ts +17 -11
  15. package/dist/config/validators/common.js +1 -1
  16. package/dist/config/validators/common.js.map +1 -1
  17. package/dist/config/validators/validate.d.ts +7 -5
  18. package/dist/lib/authentication/providers/openid.d.ts +3 -1
  19. package/dist/lib/authentication/providers/openid.js +17 -11
  20. package/dist/lib/authentication/providers/openid.js.map +1 -1
  21. package/dist/lib/components/BuildCheck.d.ts +4 -0
  22. package/dist/lib/components/BuildCheck.js +22 -0
  23. package/dist/lib/components/BuildCheck.js.map +1 -0
  24. package/dist/lib/components/Zudoku.js +1 -3
  25. package/dist/lib/components/Zudoku.js.map +1 -1
  26. package/dist/lib/components/context/ViewportAnchorContext.js +8 -9
  27. package/dist/lib/components/context/ViewportAnchorContext.js.map +1 -1
  28. package/dist/lib/components/index.d.ts +4 -0
  29. package/dist/lib/components/index.js +2 -0
  30. package/dist/lib/components/index.js.map +1 -1
  31. package/dist/lib/components/navigation/PoweredByZudoku.js +2 -1
  32. package/dist/lib/components/navigation/PoweredByZudoku.js.map +1 -1
  33. package/dist/lib/components/navigation/ZuploLogo.d.ts +3 -0
  34. package/dist/lib/components/navigation/ZuploLogo.js +4 -0
  35. package/dist/lib/components/navigation/ZuploLogo.js.map +1 -0
  36. package/dist/lib/oas/parser/index.d.ts +1 -1
  37. package/dist/lib/oas/parser/index.js +3 -2
  38. package/dist/lib/oas/parser/index.js.map +1 -1
  39. package/dist/lib/plugins/openapi/OperationList.d.ts +1 -1
  40. package/dist/lib/plugins/openapi/OperationList.js +6 -4
  41. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  42. package/dist/lib/plugins/openapi/processors/removeExtensions.d.ts +3 -2
  43. package/dist/lib/plugins/openapi/processors/removeExtensions.js +1 -1
  44. package/dist/lib/plugins/openapi/processors/removeExtensions.js.map +1 -1
  45. package/dist/lib/plugins/openapi/processors/removeExtensions.test.js +26 -6
  46. package/dist/lib/plugins/openapi/processors/removeExtensions.test.js.map +1 -1
  47. package/dist/lib/plugins/openapi/processors/removeParameters.d.ts +3 -1
  48. package/dist/lib/plugins/openapi/processors/removeParameters.js +1 -1
  49. package/dist/lib/plugins/openapi/processors/removeParameters.js.map +1 -1
  50. package/dist/lib/plugins/openapi/processors/removeParameters.test.js +53 -25
  51. package/dist/lib/plugins/openapi/processors/removeParameters.test.js.map +1 -1
  52. package/dist/lib/plugins/openapi/processors/removePaths.d.ts +3 -1
  53. package/dist/lib/plugins/openapi/processors/removePaths.js +1 -1
  54. package/dist/lib/plugins/openapi/processors/removePaths.js.map +1 -1
  55. package/dist/lib/plugins/openapi/processors/removePaths.test.js +75 -35
  56. package/dist/lib/plugins/openapi/processors/removePaths.test.js.map +1 -1
  57. package/dist/lib/plugins/openapi/util/getRoutes.js +20 -13
  58. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  59. package/dist/lib/util/ensureArray.d.ts +1 -0
  60. package/dist/lib/util/ensureArray.js +2 -0
  61. package/dist/lib/util/ensureArray.js.map +1 -0
  62. package/dist/vite/api/SchemaManager.d.ts +36 -0
  63. package/dist/vite/api/SchemaManager.js +120 -0
  64. package/dist/vite/api/SchemaManager.js.map +1 -0
  65. package/dist/vite/api/SchemaManager.test.d.ts +1 -0
  66. package/dist/vite/api/SchemaManager.test.js +106 -0
  67. package/dist/vite/api/SchemaManager.test.js.map +1 -0
  68. package/dist/vite/config.js +5 -1
  69. package/dist/vite/config.js.map +1 -1
  70. package/dist/vite/plugin-api.js +39 -117
  71. package/dist/vite/plugin-api.js.map +1 -1
  72. package/dist/vite/plugin-sidebar.d.ts +3 -1
  73. package/dist/vite/plugin-sidebar.js +8 -2
  74. package/dist/vite/plugin-sidebar.js.map +1 -1
  75. package/dist/zuplo/enrich-with-zuplo.d.ts +3 -3
  76. package/dist/zuplo/enrich-with-zuplo.js +18 -17
  77. package/dist/zuplo/enrich-with-zuplo.js.map +1 -1
  78. package/dist/zuplo/env.d.ts +26 -0
  79. package/dist/zuplo/env.js +17 -0
  80. package/dist/zuplo/env.js.map +1 -1
  81. package/dist/zuplo/with-zuplo-processors.d.ts +2 -2
  82. package/dist/zuplo/with-zuplo-processors.js +3 -3
  83. package/dist/zuplo/with-zuplo-processors.js.map +1 -1
  84. package/dist/zuplo/with-zuplo.d.ts +3 -0
  85. package/dist/zuplo/with-zuplo.js +6 -9
  86. package/dist/zuplo/with-zuplo.js.map +1 -1
  87. package/lib/{Markdown-C5h6bxbE.js → Markdown-DqDbGCj2.js} +314 -315
  88. package/lib/{Markdown-C5h6bxbE.js.map → Markdown-DqDbGCj2.js.map} +1 -1
  89. package/lib/{MdxPage-B66ht0D_.js → MdxPage-DGVqOhzg.js} +5 -5
  90. package/lib/{MdxPage-B66ht0D_.js.map → MdxPage-DGVqOhzg.js.map} +1 -1
  91. package/lib/{OasProvider-BKPF0Pbt.js → OasProvider-qeJNCq-h.js} +2 -2
  92. package/lib/{OasProvider-BKPF0Pbt.js.map → OasProvider-qeJNCq-h.js.map} +1 -1
  93. package/lib/{OperationList-0bhBU7ME.js → OperationList-CBpQALZd.js} +798 -794
  94. package/lib/{OperationList-0bhBU7ME.js.map → OperationList-CBpQALZd.js.map} +1 -1
  95. package/lib/{Pagination-Bt1czAiJ.js → Pagination-PfYTF0cF.js} +2 -2
  96. package/lib/{Pagination-Bt1czAiJ.js.map → Pagination-PfYTF0cF.js.map} +1 -1
  97. package/lib/{SchemaList-CsTIT1pi.js → SchemaList-BIzyXPnY.js} +5 -5
  98. package/lib/{SchemaList-CsTIT1pi.js.map → SchemaList-BIzyXPnY.js.map} +1 -1
  99. package/lib/{SchemaView-DCSWtnYr.js → SchemaView-DwlVvFfp.js} +2 -2
  100. package/lib/{SchemaView-DCSWtnYr.js.map → SchemaView-DwlVvFfp.js.map} +1 -1
  101. package/lib/{SlotletProvider-VUmTNmLZ.js → SlotletProvider-p4XaFFOh.js} +2 -2
  102. package/lib/{SlotletProvider-VUmTNmLZ.js.map → SlotletProvider-p4XaFFOh.js.map} +1 -1
  103. package/lib/{Toc-BK39DQvI.js → Toc-BVdRaIC0.js} +2 -2
  104. package/lib/{Toc-BK39DQvI.js.map → Toc-BVdRaIC0.js.map} +1 -1
  105. package/lib/{createServer-DLN7APz_.js → createServer-D_5UkLtY.js} +1459 -1485
  106. package/lib/createServer-D_5UkLtY.js.map +1 -0
  107. package/lib/{index-tpbiZmWp.js → index-B7lRu87v.js} +686 -648
  108. package/lib/index-B7lRu87v.js.map +1 -0
  109. package/lib/index-BpThvE5R.js +66 -0
  110. package/lib/index-BpThvE5R.js.map +1 -0
  111. package/lib/{index-Ba_X7EnR.js → index-CxdJ8TBB.js} +255 -249
  112. package/lib/{index-Ba_X7EnR.js.map → index-CxdJ8TBB.js.map} +1 -1
  113. package/lib/index-ueM1dihS.js +247 -0
  114. package/lib/index-ueM1dihS.js.map +1 -0
  115. package/lib/processors/removeExtensions.js +1 -1
  116. package/lib/processors/removeExtensions.js.map +1 -1
  117. package/lib/processors/removeParameters.js +1 -1
  118. package/lib/processors/removeParameters.js.map +1 -1
  119. package/lib/processors/removePaths.js +1 -1
  120. package/lib/processors/removePaths.js.map +1 -1
  121. package/lib/{index-DcHeSvkE.js → public-api-CrAQFYc4.js} +651 -684
  122. package/lib/public-api-CrAQFYc4.js.map +1 -0
  123. package/lib/zudoku.auth-openid.js +144 -138
  124. package/lib/zudoku.auth-openid.js.map +1 -1
  125. package/lib/zudoku.components.js +23 -22
  126. package/lib/zudoku.plugin-api-catalog.js +2 -2
  127. package/lib/zudoku.plugin-api-keys.js +1 -1
  128. package/lib/zudoku.plugin-custom-pages.js +1 -1
  129. package/lib/zudoku.plugin-markdown.js +1 -1
  130. package/lib/zudoku.plugin-openapi.js +1 -1
  131. package/package.json +3 -3
  132. package/src/app/main.tsx +12 -1
  133. package/src/lib/authentication/providers/openid.tsx +23 -12
  134. package/src/lib/components/BuildCheck.tsx +60 -0
  135. package/src/lib/components/Zudoku.tsx +1 -3
  136. package/src/lib/components/context/ViewportAnchorContext.tsx +8 -15
  137. package/src/lib/components/index.ts +2 -0
  138. package/src/lib/components/navigation/PoweredByZudoku.tsx +8 -3
  139. package/src/lib/components/navigation/ZuploLogo.tsx +14 -0
  140. package/src/lib/oas/parser/index.ts +4 -2
  141. package/src/lib/plugins/openapi/OperationList.tsx +15 -3
  142. package/src/lib/plugins/openapi/processors/removeExtensions.test.ts +29 -9
  143. package/src/lib/plugins/openapi/processors/removeExtensions.ts +5 -3
  144. package/src/lib/plugins/openapi/processors/removeParameters.test.ts +67 -33
  145. package/src/lib/plugins/openapi/processors/removeParameters.ts +5 -3
  146. package/src/lib/plugins/openapi/processors/removePaths.test.ts +85 -44
  147. package/src/lib/plugins/openapi/processors/removePaths.ts +5 -3
  148. package/src/lib/plugins/openapi/util/getRoutes.tsx +21 -13
  149. package/src/lib/util/ensureArray.ts +3 -0
  150. package/client.d.ts +0 -8
  151. package/dist/lib/oas/parser/upgrade/index.d.ts +0 -9
  152. package/dist/lib/oas/parser/upgrade/index.js +0 -90
  153. package/dist/lib/oas/parser/upgrade/index.js.map +0 -1
  154. package/lib/createServer-DLN7APz_.js.map +0 -1
  155. package/lib/index-DcHeSvkE.js.map +0 -1
  156. package/lib/index-tpbiZmWp.js.map +0 -1
  157. package/src/lib/oas/parser/upgrade/index.ts +0 -103
@@ -1,8 +1,8 @@
1
- import { type OpenAPIV3_1 } from "openapi-types";
2
1
  import { describe, expect, it } from "vitest";
2
+ import type { OpenAPIDocument } from "../../../oas/parser/index.js";
3
3
  import { removeParameters } from "./removeParameters.js";
4
4
 
5
- const baseDoc: OpenAPIV3_1.Document = {
5
+ const baseDoc: OpenAPIDocument = {
6
6
  openapi: "3.1.0",
7
7
  info: {
8
8
  title: "Test API",
@@ -67,45 +67,67 @@ describe("removeParameters", () => {
67
67
  it("removes parameters by name", () => {
68
68
  const processed = removeParameters({
69
69
  names: ["pathParam", "opParam"],
70
- })(baseDoc);
71
-
72
- expect(processed.paths["/test"].parameters).toHaveLength(1);
73
- expect(processed.paths["/test"].parameters[0].name).toBe("pathHeader");
74
- expect(processed.paths["/test"].get.parameters).toHaveLength(1);
75
- expect(processed.paths["/test"].get.parameters[0].name).toBe("opHeader");
70
+ })({
71
+ schema: baseDoc,
72
+ file: "/file.json",
73
+ dereference: async (id) => id,
74
+ });
75
+
76
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(1);
77
+ expect(processed.paths?.["/test"]?.parameters?.[0]?.name).toBe(
78
+ "pathHeader",
79
+ );
80
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(1);
81
+ expect(processed.paths?.["/test"]?.get?.parameters?.[0]?.name).toBe(
82
+ "opHeader",
83
+ );
76
84
  });
77
85
 
78
86
  it("removes parameters by location", () => {
79
87
  const processed = removeParameters({
80
88
  in: ["header"],
81
- })(baseDoc);
82
-
83
- expect(processed.paths["/test"].parameters).toHaveLength(1);
84
- expect(processed.paths["/test"].parameters[0].in).toBe("path");
85
- expect(processed.paths["/test"].get.parameters).toHaveLength(1);
86
- expect(processed.paths["/test"].get.parameters[0].in).toBe("query");
89
+ })({
90
+ schema: baseDoc,
91
+ file: "/file.json",
92
+ dereference: async (id) => id,
93
+ });
94
+
95
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(1);
96
+ expect(processed.paths?.["/test"]?.parameters?.[0]?.in).toBe("path");
97
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(1);
98
+ expect(processed.paths?.["/test"]?.get?.parameters?.[0]?.in).toBe("query");
87
99
  });
88
100
 
89
101
  it("removes parameters using shouldRemove callback", () => {
90
102
  const processed = removeParameters({
91
103
  shouldRemove: ({ parameter }) =>
92
104
  parameter.in === "header" && parameter.name.includes("op"),
93
- })(baseDoc);
94
-
95
- expect(processed.paths["/test"].parameters).toHaveLength(2);
96
- expect(processed.paths["/test"].get.parameters).toHaveLength(1);
97
- expect(processed.paths["/test"].get.parameters[0].name).toBe("opParam");
105
+ })({
106
+ schema: baseDoc,
107
+ file: "/file.json",
108
+ dereference: async (id) => id,
109
+ });
110
+
111
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(2);
112
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(1);
113
+ expect(processed.paths?.["/test"]?.get?.parameters?.[0]?.name).toBe(
114
+ "opParam",
115
+ );
98
116
  });
99
117
 
100
118
  it("combines multiple removal criteria", () => {
101
119
  const processed = removeParameters({
102
120
  in: ["query", "header"],
103
121
  shouldRemove: ({ parameter }) => parameter.name === "pathHeader",
104
- })(baseDoc);
105
-
106
- expect(processed.paths["/test"].parameters).toHaveLength(1);
107
- expect(processed.paths["/test"].parameters[0].name).toBe("pathParam");
108
- expect(processed.paths["/test"].get.parameters).toHaveLength(0);
122
+ })({
123
+ schema: baseDoc,
124
+ file: "/file.json",
125
+ dereference: async (id) => id,
126
+ });
127
+
128
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(1);
129
+ expect(processed.paths?.["/test"]?.parameters?.[0]?.name).toBe("pathParam");
130
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(0);
109
131
  });
110
132
 
111
133
  it("handles missing parameters arrays", () => {
@@ -118,11 +140,15 @@ describe("removeParameters", () => {
118
140
  },
119
141
  },
120
142
  },
121
- };
143
+ } as any;
122
144
 
123
145
  const processed = removeParameters({
124
146
  names: ["someParam"],
125
- })(docWithoutParams);
147
+ })({
148
+ schema: docWithoutParams,
149
+ file: "/file.json",
150
+ dereference: async (id) => id,
151
+ });
126
152
 
127
153
  expect(processed).toEqual(docWithoutParams);
128
154
  });
@@ -130,19 +156,27 @@ describe("removeParameters", () => {
130
156
  it("preserves non-parameter properties", () => {
131
157
  const processed = removeParameters({
132
158
  names: ["globalParam"],
133
- })(baseDoc);
159
+ })({
160
+ schema: baseDoc,
161
+ file: "/file.json",
162
+ dereference: async (id) => id,
163
+ });
134
164
 
135
165
  expect(processed.openapi).toBe("3.1.0");
136
- expect(processed.paths["/test"].get).toBeDefined();
166
+ expect(processed.paths?.["/test"]?.get).toBeDefined();
137
167
  });
138
168
 
139
169
  it("removes parameters from components", () => {
140
170
  const processed = removeParameters({
141
171
  in: ["header"],
142
- })(baseDoc);
143
-
144
- expect(Object.keys(processed.components.parameters)).toHaveLength(1);
145
- expect(processed.components.parameters.commonParam).toBeDefined();
146
- expect(processed.components.parameters.headerParam).toBeUndefined();
172
+ })({
173
+ schema: baseDoc,
174
+ file: "/file.json",
175
+ dereference: async (id) => id,
176
+ });
177
+
178
+ expect(Object.keys(processed.components?.parameters ?? {})).toHaveLength(1);
179
+ expect(processed.components?.parameters?.commonParam).toBeDefined();
180
+ expect(processed.components?.parameters?.headerParam).toBeUndefined();
147
181
  });
148
182
  });
@@ -1,3 +1,5 @@
1
+ import type { ProcessorArg } from "../../../../config/validators/BuildSchema.js";
2
+ import type { OpenAPIDocument } from "../../../oas/parser/index.js";
1
3
  import { type RecordAny, traverse } from "./traverse.js";
2
4
 
3
5
  interface RemoveParametersOptions {
@@ -11,8 +13,8 @@ interface RemoveParametersOptions {
11
13
 
12
14
  export const removeParameters =
13
15
  ({ names, in: locations, shouldRemove }: RemoveParametersOptions = {}) =>
14
- (doc: RecordAny): RecordAny =>
15
- traverse(doc, (spec) => {
16
+ ({ schema }: ProcessorArg) =>
17
+ traverse(schema, (spec) => {
16
18
  // Helper function to filter parameters
17
19
  const filterParameters = (parameters: RecordAny[]) =>
18
20
  parameters.filter((p) => {
@@ -98,4 +100,4 @@ export const removeParameters =
98
100
  }
99
101
 
100
102
  return spec;
101
- });
103
+ }) as OpenAPIDocument;
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
+ import type { OpenAPIDocument } from "../../../oas/parser/index.js";
2
3
  import { removePaths } from "./removePaths.js";
3
4
 
4
5
  const baseDoc = {
@@ -15,7 +16,7 @@ const baseDoc = {
15
16
  get: { summary: "Another example" },
16
17
  },
17
18
  },
18
- };
19
+ } as unknown as OpenAPIDocument;
19
20
 
20
21
  describe("removePaths", () => {
21
22
  it("removes paths specified in the paths option", () => {
@@ -23,11 +24,15 @@ describe("removePaths", () => {
23
24
  paths: {
24
25
  "/remove-me": true,
25
26
  },
26
- })(baseDoc);
27
-
28
- expect(processed.paths["/remove-me"]).toBeUndefined();
29
- expect(processed.paths["/example"]).toBeDefined();
30
- expect(processed.paths["/another"]).toBeDefined();
27
+ })({
28
+ schema: baseDoc,
29
+ file: "/file.json",
30
+ dereference: async (id) => id,
31
+ });
32
+
33
+ expect(processed.paths?.["/remove-me"]).toBeUndefined();
34
+ expect(processed.paths?.["/example"]).toBeDefined();
35
+ expect(processed.paths?.["/another"]).toBeDefined();
31
36
  });
32
37
 
33
38
  it("removes specific methods in the paths option", () => {
@@ -35,11 +40,15 @@ describe("removePaths", () => {
35
40
  paths: {
36
41
  "/example": ["get"],
37
42
  },
38
- })(baseDoc);
39
-
40
- expect(processed.paths["/example"].get).toBeUndefined();
41
- expect(processed.paths["/example"].post).toBeDefined();
42
- expect(processed.paths["/remove-me"]).toBeDefined();
43
+ })({
44
+ schema: baseDoc,
45
+ file: "/file.json",
46
+ dereference: async (id) => id,
47
+ });
48
+
49
+ expect(processed.paths?.["/example"]?.get).toBeUndefined();
50
+ expect(processed.paths?.["/example"]?.post).toBeDefined();
51
+ expect(processed.paths?.["/remove-me"]).toBeDefined();
43
52
  });
44
53
 
45
54
  it("removes paths and methods using paths and shouldRemove together", () => {
@@ -48,50 +57,70 @@ describe("removePaths", () => {
48
57
  "/example": ["post"],
49
58
  },
50
59
  shouldRemove: ({ path }) => path.startsWith("/remove"),
51
- })(baseDoc);
52
-
53
- expect(processed.paths["/remove-me"]).toBeUndefined();
54
- expect(processed.paths["/example"].get).toBeDefined();
55
- expect(processed.paths["/example"].post).toBeUndefined();
56
- expect(processed.paths["/another"]).toBeDefined();
60
+ })({
61
+ schema: baseDoc,
62
+ file: "/file.json",
63
+ dereference: async (id) => id,
64
+ });
65
+
66
+ expect(processed.paths?.["/remove-me"]).toBeUndefined();
67
+ expect(processed.paths?.["/example"]?.get).toBeDefined();
68
+ expect(processed.paths?.["/example"]?.post).toBeUndefined();
69
+ expect(processed.paths?.["/another"]).toBeDefined();
57
70
  });
58
71
 
59
72
  it("removes paths based on shouldRemove callback", () => {
60
73
  const processed = removePaths({
61
74
  shouldRemove: ({ path }) => path.startsWith("/remove"),
62
- })(baseDoc);
63
-
64
- expect(processed.paths["/remove-me"]).toBeUndefined();
65
- expect(processed.paths["/example"]).toBeDefined();
66
- expect(processed.paths["/another"]).toBeDefined();
75
+ })({
76
+ schema: baseDoc,
77
+ file: "/file.json",
78
+ dereference: async (id) => id,
79
+ });
80
+
81
+ expect(processed.paths?.["/remove-me"]).toBeUndefined();
82
+ expect(processed.paths?.["/example"]).toBeDefined();
83
+ expect(processed.paths?.["/another"]).toBeDefined();
67
84
  });
68
85
 
69
86
  it("removes methods based on shouldRemove callback", () => {
70
87
  const processed = removePaths({
71
88
  shouldRemove: ({ method }) => method === "post",
72
- })(baseDoc);
73
-
74
- expect(processed.paths["/example"].post).toBeUndefined();
75
- expect(processed.paths["/example"].get).toBeDefined();
76
- expect(processed.paths["/remove-me"]).toBeDefined();
89
+ })({
90
+ schema: baseDoc,
91
+ file: "/file.json",
92
+ dereference: async (id) => id,
93
+ });
94
+
95
+ expect(processed.paths?.["/example"]?.post).toBeUndefined();
96
+ expect(processed.paths?.["/example"]?.get).toBeDefined();
97
+ expect(processed.paths?.["/remove-me"]).toBeDefined();
77
98
  });
78
99
 
79
100
  it("removes both paths and methods based on shouldRemove callback", () => {
80
101
  const processed = removePaths({
81
102
  shouldRemove: ({ path, method }) =>
82
103
  path.startsWith("/remove") || method === "post",
83
- })(baseDoc);
84
-
85
- expect(processed.paths["/remove-me"]).toBeUndefined();
86
- expect(processed.paths["/example"].post).toBeUndefined();
87
- expect(processed.paths["/example"].get).toBeDefined();
88
- expect(processed.paths["/another"]).toBeDefined();
104
+ })({
105
+ schema: baseDoc,
106
+ file: "/file.json",
107
+ dereference: async (id) => id,
108
+ });
109
+
110
+ expect(processed.paths?.["/remove-me"]).toBeUndefined();
111
+ expect(processed.paths?.["/example"]?.post).toBeUndefined();
112
+ expect(processed.paths?.["/example"]?.get).toBeDefined();
113
+ expect(processed.paths?.["/another"]).toBeDefined();
89
114
  });
90
115
 
91
116
  it("does nothing if shouldRemove always returns false", () => {
92
117
  const processed = removePaths({
93
118
  shouldRemove: () => false,
94
- })(baseDoc);
119
+ })({
120
+ schema: baseDoc,
121
+ file: "/file.json",
122
+ dereference: async (id) => id,
123
+ });
95
124
 
96
125
  expect(processed).toEqual(baseDoc);
97
126
  });
@@ -99,7 +128,11 @@ describe("removePaths", () => {
99
128
  it("removes everything if shouldRemove always returns true", () => {
100
129
  const processed = removePaths({
101
130
  shouldRemove: () => true,
102
- })(baseDoc);
131
+ })({
132
+ schema: baseDoc,
133
+ file: "/file.json",
134
+ dereference: async (id) => id,
135
+ });
103
136
 
104
137
  expect(processed.paths).toEqual({});
105
138
  });
@@ -108,19 +141,27 @@ describe("removePaths", () => {
108
141
  const processed = removePaths({
109
142
  shouldRemove: ({ path, method }) =>
110
143
  method === true && path === "/remove-me",
111
- })(baseDoc);
112
-
113
- expect(processed.paths["/remove-me"]).toBeUndefined();
114
- expect(processed.paths["/example"]).toBeDefined();
115
- expect(processed.paths["/another"]).toBeDefined();
144
+ })({
145
+ schema: baseDoc,
146
+ file: "/file.json",
147
+ dereference: async (id) => id,
148
+ });
149
+
150
+ expect(processed.paths?.["/remove-me"]).toBeUndefined();
151
+ expect(processed.paths?.["/example"]).toBeDefined();
152
+ expect(processed.paths?.["/another"]).toBeDefined();
116
153
  });
117
154
 
118
155
  it("removes specific methods while keeping paths", () => {
119
156
  const processed = removePaths({
120
157
  shouldRemove: ({ method }) => method === "delete",
121
- })(baseDoc);
122
-
123
- expect(processed.paths["/remove-me"]).toBeDefined();
124
- expect(processed.paths["/remove-me"].delete).toBeUndefined();
158
+ })({
159
+ schema: baseDoc,
160
+ file: "/file.json",
161
+ dereference: async (id) => id,
162
+ });
163
+
164
+ expect(processed.paths?.["/remove-me"]).toBeDefined();
165
+ expect(processed.paths?.["/remove-me"]?.delete).toBeUndefined();
125
166
  });
126
167
  });
@@ -1,3 +1,5 @@
1
+ import type { ProcessorArg } from "../../../../config/validators/BuildSchema.js";
2
+ import type { OpenAPIDocument } from "../../../oas/parser/index.js";
1
3
  import { type RecordAny, traverse } from "./traverse.js";
2
4
 
3
5
  interface RemovePathsOptions {
@@ -12,8 +14,8 @@ interface RemovePathsOptions {
12
14
 
13
15
  export const removePaths =
14
16
  ({ paths = {}, shouldRemove }: RemovePathsOptions) =>
15
- (doc: RecordAny): RecordAny =>
16
- traverse(doc, (spec) => {
17
+ ({ schema }: ProcessorArg) =>
18
+ traverse(schema, (spec) => {
17
19
  if (!spec.paths) return spec;
18
20
 
19
21
  const updatedPaths: RecordAny = {};
@@ -52,4 +54,4 @@ export const removePaths =
52
54
  }
53
55
 
54
56
  return { ...spec, paths: updatedPaths };
55
- });
57
+ }) as OpenAPIDocument;
@@ -47,6 +47,22 @@ const createRoute = ({
47
47
  },
48
48
  });
49
49
 
50
+ const createAdditionalRoutes = (basePath: string) => [
51
+ // Category without tagged operations
52
+ createRoute({
53
+ path: joinUrl(basePath, UNTAGGED_PATH),
54
+ untagged: true,
55
+ }),
56
+ // Schema list route
57
+ {
58
+ path: joinUrl(basePath, "~schemas"),
59
+ lazy: async () => {
60
+ const { SchemaList } = await import("../SchemaList.js");
61
+ return { element: <SchemaList /> };
62
+ },
63
+ },
64
+ ];
65
+
50
66
  // Creates routes for a specific version, including tag-based routes and the untagged operations route.
51
67
  const createVersionRoutes = (
52
68
  versionPath: string,
@@ -64,18 +80,7 @@ const createVersionRoutes = (
64
80
  tag,
65
81
  }),
66
82
  ),
67
- // Category without tagged operations
68
- createRoute({
69
- path: joinUrl(versionPath, UNTAGGED_PATH),
70
- untagged: true,
71
- }),
72
- {
73
- path: joinUrl(versionPath, "~schemas"),
74
- lazy: async () => {
75
- const { SchemaList } = await import("../SchemaList.js");
76
- return { element: <SchemaList /> };
77
- },
78
- },
83
+ ...createAdditionalRoutes(versionPath),
79
84
  ];
80
85
  };
81
86
 
@@ -100,7 +105,10 @@ export const getRoutes = ({
100
105
  createOasProvider({
101
106
  basePath,
102
107
  routePath: basePath,
103
- routes: [createRoute({ path: basePath + "/:tag?" })],
108
+ routes: [
109
+ createRoute({ path: basePath + "/:tag?" }),
110
+ ...createAdditionalRoutes(basePath),
111
+ ],
104
112
  client,
105
113
  config,
106
114
  }),
@@ -0,0 +1,3 @@
1
+ export const ensureArray = <T extends NonNullable<unknown>>(
2
+ value: T | T[],
3
+ ): T[] => (Array.isArray(value) ? value : [value]);
package/client.d.ts DELETED
@@ -1,8 +0,0 @@
1
- /* eslint-disable no-var */
2
- /// <reference types="vite/client" />
3
-
4
- declare var process: {
5
- env: {
6
- [key: string]: string | undefined;
7
- };
8
- };
@@ -1,9 +0,0 @@
1
- import { type RecordAny } from "../../../util/traverse.js";
2
- import type { OpenAPIDocument } from "../index.js";
3
- /**
4
- * Upgrade from OpenAPI 3.0.x to 3.1.0
5
- *
6
- * Taken from https://github.com/scalar/openapi-parser/blob/main/packages/openapi-parser/src/utils/upgradeFromThreeToThreeOne.ts
7
- * https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0
8
- */
9
- export declare const upgradeSchema: (schema: RecordAny) => OpenAPIDocument;
@@ -1,90 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { traverse } from "../../../util/traverse.js";
3
- /**
4
- * Upgrade from OpenAPI 3.0.x to 3.1.0
5
- *
6
- * Taken from https://github.com/scalar/openapi-parser/blob/main/packages/openapi-parser/src/utils/upgradeFromThreeToThreeOne.ts
7
- * https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0
8
- */
9
- export const upgradeSchema = (schema) => {
10
- if (schema.openapi?.startsWith("3.0")) {
11
- schema.openapi = "3.1.0";
12
- }
13
- schema = traverse(schema, (sub) => {
14
- if (sub.type !== "undefined" && sub.nullable === true) {
15
- sub.type = ["null", sub.type];
16
- delete sub.nullable;
17
- }
18
- return sub;
19
- });
20
- schema = traverse(schema, (sub) => {
21
- if (sub.exclusiveMinimum === true) {
22
- sub.exclusiveMinimum = sub.minimum;
23
- delete sub.minimum;
24
- }
25
- else if (sub.exclusiveMinimum === false) {
26
- delete sub.exclusiveMinimum;
27
- }
28
- if (sub.exclusiveMaximum === true) {
29
- sub.exclusiveMaximum = sub.maximum;
30
- delete sub.maximum;
31
- }
32
- else if (sub.exclusiveMaximum === false) {
33
- delete sub.exclusiveMaximum;
34
- }
35
- return sub;
36
- });
37
- schema = traverse(schema, (sub) => {
38
- // may be null or undefined
39
- if (sub.example) {
40
- const isExampleObject = typeof sub.example === "object" &&
41
- (sub.example.summary !== undefined ||
42
- sub.example.description !== undefined ||
43
- sub.example.value !== undefined ||
44
- sub.example.externalValue !== undefined);
45
- const exampleValue = isExampleObject
46
- ? sub.example
47
- : { value: sub.example };
48
- if (!sub.examples) {
49
- sub.examples = { default: exampleValue };
50
- }
51
- else {
52
- sub.examples = {
53
- default: exampleValue,
54
- ...sub.examples,
55
- };
56
- }
57
- delete sub.example;
58
- }
59
- return sub;
60
- });
61
- schema = traverse(schema, (sub) => {
62
- if (sub.type === "object" && sub.properties !== undefined) {
63
- for (const [, value] of Object.entries(sub.properties)) {
64
- const v = (value ?? {});
65
- if (v.type === "string" && v.format === "binary") {
66
- v.contentEncoding = "application/octet-stream";
67
- delete v.format;
68
- }
69
- }
70
- }
71
- return sub;
72
- });
73
- schema = traverse(schema, (sub) => {
74
- if (sub.type === "string" && sub.format === "binary") {
75
- return undefined;
76
- }
77
- return sub;
78
- });
79
- schema = traverse(schema, (sub) => {
80
- if (sub.type === "string" && sub.format === "base64") {
81
- return {
82
- type: "string",
83
- contentEncoding: "base64",
84
- };
85
- }
86
- return sub;
87
- });
88
- return schema;
89
- };
90
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/oas/parser/upgrade/index.ts"],"names":[],"mappings":"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"}