@sebspark/openapi-typegen 1.5.0 → 1.6.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.
- package/dist/index.js +154 -13
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -188,10 +188,21 @@ var generateProperty = (property) => {
|
|
|
188
188
|
};
|
|
189
189
|
var preamble = (type) => type.name ? `${document(type)}export type ${typeName(type.name)} = ` : "";
|
|
190
190
|
var rxProperVariable = /^[a-zA-Z_<>$][a-zA-Z0-9_<>$]*$/;
|
|
191
|
-
var
|
|
192
|
-
const namingConventionRegex = /^([a-z_]\w*)(<([a-z_]\w*(,\s*)?)+>)?$/;
|
|
191
|
+
var isValidName = (name) => {
|
|
192
|
+
const namingConventionRegex = /^([A-Z_]\w*)([a-z_]\w*)(<([a-z_]\w*(,\s*)?)+>)?$/;
|
|
193
193
|
const hasCapitalLetterRegex = /[A-Z]/;
|
|
194
|
-
if (namingConventionRegex.test(name)
|
|
194
|
+
if (!namingConventionRegex.test(name))
|
|
195
|
+
return false;
|
|
196
|
+
if (!hasCapitalLetterRegex.test(name)) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
if (name[0] !== name[0].toUpperCase() && !name.includes("_")) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
};
|
|
204
|
+
var typeName = (name) => {
|
|
205
|
+
if (isValidName(name)) {
|
|
195
206
|
return name;
|
|
196
207
|
}
|
|
197
208
|
if (name.includes("<")) {
|
|
@@ -325,7 +336,7 @@ var serializeValue = (value) => {
|
|
|
325
336
|
var generateClientArgs = (args) => generateArgs(args, false);
|
|
326
337
|
var generateServerArgs = (args) => args ? generateArgs(args, true) : "args: Req";
|
|
327
338
|
var parts = ["body", "header", "path", "query"];
|
|
328
|
-
var generateArgs = (args,
|
|
339
|
+
var generateArgs = (args, isServer) => {
|
|
329
340
|
if (args) {
|
|
330
341
|
const tokens = [];
|
|
331
342
|
for (const part of parts) {
|
|
@@ -333,17 +344,25 @@ var generateArgs = (args, extendsReq) => {
|
|
|
333
344
|
if (arg) {
|
|
334
345
|
const partName = part === "path" ? "params" : part === "header" ? "headers" : part;
|
|
335
346
|
tokens.push(
|
|
336
|
-
`${partName}${arg.optional ? "?" : ""}: ${
|
|
347
|
+
`${partName}${arg.optional ? "?" : ""}: ${wrapArgs(
|
|
348
|
+
generateType(arg),
|
|
349
|
+
isServer && part === "header"
|
|
350
|
+
)}`
|
|
337
351
|
);
|
|
338
352
|
}
|
|
339
353
|
}
|
|
340
354
|
if (!tokens.length)
|
|
341
355
|
return "";
|
|
342
356
|
const optional = argsOptional(args);
|
|
343
|
-
return `args${optional ? "?" : ""}: ${
|
|
357
|
+
return `args${optional ? "?" : ""}: ${isServer ? "Req & " : ""}{ ${tokens.join(", ")} }, `;
|
|
344
358
|
}
|
|
345
359
|
return "";
|
|
346
360
|
};
|
|
361
|
+
var wrapArgs = (args, wrap) => {
|
|
362
|
+
if (!wrap)
|
|
363
|
+
return args;
|
|
364
|
+
return `LowerCaseHeaders<${args}>`;
|
|
365
|
+
};
|
|
347
366
|
var argsOptional = (args) => (
|
|
348
367
|
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
349
368
|
parts.reduce((o, p) => o && (!args[p] || args[p].optional), true)
|
|
@@ -424,6 +443,7 @@ var generate = (name, doc) => `
|
|
|
424
443
|
APIServerDefinition,
|
|
425
444
|
BaseClient,
|
|
426
445
|
GenericRouteHandler,
|
|
446
|
+
LowerCaseHeaders,
|
|
427
447
|
PartiallySerialized,
|
|
428
448
|
RequestOptions,
|
|
429
449
|
Serialized,
|
|
@@ -471,6 +491,21 @@ var generateComponents = (components) => {
|
|
|
471
491
|
for (const res of components.responseBodies) {
|
|
472
492
|
tokens.push(generateResponseBody(res));
|
|
473
493
|
}
|
|
494
|
+
for (const param2 of components.securitySchemes) {
|
|
495
|
+
tokens.push(
|
|
496
|
+
generateType({
|
|
497
|
+
type: "object",
|
|
498
|
+
name: param2.name,
|
|
499
|
+
properties: [
|
|
500
|
+
{
|
|
501
|
+
name: param2.parameterName,
|
|
502
|
+
type: [param2.type],
|
|
503
|
+
optional: param2.optional
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
})
|
|
507
|
+
);
|
|
508
|
+
}
|
|
474
509
|
return tokens.join("\n\n");
|
|
475
510
|
};
|
|
476
511
|
|
|
@@ -659,13 +694,14 @@ var parseParameter = (name, schema) => {
|
|
|
659
694
|
|
|
660
695
|
// src/parser/args.ts
|
|
661
696
|
var parseArgs = (path, components) => {
|
|
662
|
-
var _a;
|
|
663
|
-
if (!((_a = path.parameters) == null ? void 0 : _a.length) && !path.requestBody)
|
|
697
|
+
var _a, _b;
|
|
698
|
+
if (!((_a = path.parameters) == null ? void 0 : _a.length) && !((_b = path.security) == null ? void 0 : _b.length) && !path.requestBody)
|
|
664
699
|
return void 0;
|
|
665
|
-
const args =
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
700
|
+
const args = joinArgs([
|
|
701
|
+
parseParameters2(path.parameters, components),
|
|
702
|
+
parseSecurity(path.security, components),
|
|
703
|
+
parseRequestBody(path.requestBody, components)
|
|
704
|
+
]);
|
|
669
705
|
return args;
|
|
670
706
|
};
|
|
671
707
|
var createArgs = (initializer = {}) => ({
|
|
@@ -674,6 +710,56 @@ var createArgs = (initializer = {}) => ({
|
|
|
674
710
|
optional: true,
|
|
675
711
|
...initializer
|
|
676
712
|
});
|
|
713
|
+
var joinArgs = (args) => {
|
|
714
|
+
const reqArg = {};
|
|
715
|
+
for (const arg of args) {
|
|
716
|
+
for (const [prop, val] of Object.entries(arg)) {
|
|
717
|
+
const key = prop;
|
|
718
|
+
if (reqArg[key]) {
|
|
719
|
+
reqArg[key] = joinArg(reqArg[key], val);
|
|
720
|
+
} else {
|
|
721
|
+
reqArg[key] = val;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
return reqArg;
|
|
726
|
+
};
|
|
727
|
+
var joinArg = (arg1, arg2) => {
|
|
728
|
+
const arg = {
|
|
729
|
+
type: "object",
|
|
730
|
+
optional: arg1.optional && arg2.optional,
|
|
731
|
+
properties: arg1.properties.concat(arg2.properties)
|
|
732
|
+
};
|
|
733
|
+
if (arg1.allOf || arg2.allOf)
|
|
734
|
+
arg.allOf = (arg1.allOf || []).concat(arg2.allOf || []);
|
|
735
|
+
if (arg1.anyOf || arg2.anyOf)
|
|
736
|
+
arg.anyOf = (arg1.anyOf || []).concat(arg2.anyOf || []);
|
|
737
|
+
if (arg1.oneOf || arg2.oneOf)
|
|
738
|
+
arg.oneOf = (arg1.oneOf || []).concat(arg2.oneOf || []);
|
|
739
|
+
if (arg1.description || arg2.description)
|
|
740
|
+
arg.description = arg1.description || arg2.description;
|
|
741
|
+
if (arg1.title || arg2.title)
|
|
742
|
+
arg.title = arg1.title || arg2.title;
|
|
743
|
+
return arg;
|
|
744
|
+
};
|
|
745
|
+
var parseSecurity = (security = [], components = {}) => {
|
|
746
|
+
const args = {};
|
|
747
|
+
for (const secReq of security) {
|
|
748
|
+
for (const [name, claims] of Object.entries(secReq)) {
|
|
749
|
+
const param2 = findRef(
|
|
750
|
+
components,
|
|
751
|
+
`#/components/securitySchemes/${name}`
|
|
752
|
+
);
|
|
753
|
+
const arg = args.header || createArgs({ ...parseDocumentation(param2) });
|
|
754
|
+
arg.optional = false;
|
|
755
|
+
if (!arg.allOf)
|
|
756
|
+
arg.allOf = [];
|
|
757
|
+
arg.allOf.push({ type: parseRef(name) });
|
|
758
|
+
args.header = arg;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
return args;
|
|
762
|
+
};
|
|
677
763
|
var parseParameters2 = (parameters = [], components = {}) => {
|
|
678
764
|
const args = {};
|
|
679
765
|
for (const p of parameters) {
|
|
@@ -852,6 +938,60 @@ var parseRequestBodies = (requestBodies = {}) => {
|
|
|
852
938
|
return definitions;
|
|
853
939
|
};
|
|
854
940
|
|
|
941
|
+
// src/parser/securitySchemes.ts
|
|
942
|
+
var parseSecuritySchemes = (schemes = {}) => {
|
|
943
|
+
const parameters = [];
|
|
944
|
+
for (const [name, scheme] of Object.entries(schemes)) {
|
|
945
|
+
parameters.push(parseSecurityScheme(name, scheme));
|
|
946
|
+
}
|
|
947
|
+
return parameters;
|
|
948
|
+
};
|
|
949
|
+
var parseSecurityScheme = (name, scheme) => {
|
|
950
|
+
switch (scheme.type) {
|
|
951
|
+
case "apiKey":
|
|
952
|
+
return parseApiKey(name, scheme);
|
|
953
|
+
case "http":
|
|
954
|
+
return parseHttpSecurity(name, scheme);
|
|
955
|
+
case "oauth2":
|
|
956
|
+
return parseOAuth(name, scheme);
|
|
957
|
+
case "openIdConnect":
|
|
958
|
+
return parseOpenIdConnect(name, scheme);
|
|
959
|
+
}
|
|
960
|
+
throw new Error(`Unknown security scheme '${scheme.type}'`);
|
|
961
|
+
};
|
|
962
|
+
var parseApiKey = (name, scheme) => {
|
|
963
|
+
const _in = scheme.in || "header";
|
|
964
|
+
const parameterName = scheme.name;
|
|
965
|
+
return {
|
|
966
|
+
name,
|
|
967
|
+
parameterName,
|
|
968
|
+
in: _in,
|
|
969
|
+
optional: false,
|
|
970
|
+
type: { type: "string" }
|
|
971
|
+
};
|
|
972
|
+
};
|
|
973
|
+
var parseHttpSecurity = (name, _scheme) => ({
|
|
974
|
+
name,
|
|
975
|
+
in: "header",
|
|
976
|
+
parameterName: "Authorization",
|
|
977
|
+
optional: false,
|
|
978
|
+
type: { type: "string" }
|
|
979
|
+
});
|
|
980
|
+
var parseOAuth = (name, _scheme) => ({
|
|
981
|
+
name,
|
|
982
|
+
in: "header",
|
|
983
|
+
parameterName: "Authorization",
|
|
984
|
+
optional: false,
|
|
985
|
+
type: { type: "string" }
|
|
986
|
+
});
|
|
987
|
+
var parseOpenIdConnect = (name, _scheme) => ({
|
|
988
|
+
name,
|
|
989
|
+
in: "header",
|
|
990
|
+
parameterName: "Authorization",
|
|
991
|
+
optional: false,
|
|
992
|
+
type: { type: "string" }
|
|
993
|
+
});
|
|
994
|
+
|
|
855
995
|
// src/parser/index.ts
|
|
856
996
|
var parseDocument = (schema) => ({
|
|
857
997
|
paths: parsePaths(schema),
|
|
@@ -862,7 +1002,8 @@ var parseComponents = (components = {}) => ({
|
|
|
862
1002
|
headers: parseHeaders(components.headers),
|
|
863
1003
|
parameters: parseParameters(components.parameters),
|
|
864
1004
|
requestBodies: parseRequestBodies(components.requestBodies),
|
|
865
|
-
responseBodies: parseResponseBodies(components.responses)
|
|
1005
|
+
responseBodies: parseResponseBodies(components.responses),
|
|
1006
|
+
securitySchemes: parseSecuritySchemes(components.securitySchemes)
|
|
866
1007
|
});
|
|
867
1008
|
|
|
868
1009
|
// src/index.ts
|