@nestia/sdk 12.0.0-dev.20260601.1 → 12.0.0-dev.20260612.2

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 (209) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +93 -93
  3. package/assets/bundle/api/HttpError.ts +1 -1
  4. package/assets/bundle/api/IConnection.ts +1 -1
  5. package/assets/bundle/api/Primitive.ts +1 -1
  6. package/assets/bundle/api/Resolved.ts +1 -1
  7. package/assets/bundle/api/index.ts +4 -4
  8. package/assets/bundle/api/module.ts +6 -6
  9. package/assets/bundle/distribute/README.md +37 -37
  10. package/assets/bundle/distribute/package.json +28 -28
  11. package/assets/bundle/distribute/tsconfig.json +109 -109
  12. package/assets/bundle/e2e/index.ts +42 -42
  13. package/assets/config/nestia.config.ts +97 -97
  14. package/lib/NestiaSdkApplication.js +29 -7
  15. package/lib/NestiaSdkApplication.js.map +1 -1
  16. package/lib/NestiaSwaggerComposer.js +21 -13
  17. package/lib/NestiaSwaggerComposer.js.map +1 -1
  18. package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
  19. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  20. package/lib/analyses/ConfigAnalyzer.js +1 -1
  21. package/lib/analyses/PathAnalyzer.d.ts +18 -3
  22. package/lib/analyses/PathAnalyzer.js +32 -0
  23. package/lib/analyses/PathAnalyzer.js.map +1 -1
  24. package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
  25. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  26. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
  27. package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
  28. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  29. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
  30. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +53 -20
  31. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  32. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +14 -0
  33. package/lib/analyses/ReflectMcpOperationAnalyzer.js +79 -0
  34. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
  35. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +9 -0
  36. package/lib/analyses/TypedMcpRouteAnalyzer.js +31 -0
  37. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
  38. package/lib/executable/internal/NestiaConfigLoader.js +5 -1
  39. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  40. package/lib/executable/internal/NestiaSdkCommand.js +30 -14
  41. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  42. package/lib/executable/internal/NestiaSdkWatcher.d.ts +10 -0
  43. package/lib/executable/internal/NestiaSdkWatcher.js +322 -0
  44. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -0
  45. package/lib/executable/sdk.js +12 -12
  46. package/lib/executable/sdk.js.map +1 -1
  47. package/lib/generates/CloneGenerator.js +4 -2
  48. package/lib/generates/CloneGenerator.js.map +1 -1
  49. package/lib/generates/SdkGenerator.js +50 -1
  50. package/lib/generates/SdkGenerator.js.map +1 -1
  51. package/lib/generates/SwaggerGenerator.js +18 -2
  52. package/lib/generates/SwaggerGenerator.js.map +1 -1
  53. package/lib/generates/internal/E2eFileProgrammer.js +3 -1
  54. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  55. package/lib/generates/internal/ImportDictionary.d.ts +1 -0
  56. package/lib/generates/internal/ImportDictionary.js +9 -4
  57. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  58. package/lib/generates/internal/SdkAliasCollection.d.ts +2 -0
  59. package/lib/generates/internal/SdkAliasCollection.js +11 -2
  60. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  61. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  62. package/lib/generates/internal/SdkDistributionComposer.js +3 -0
  63. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  64. package/lib/generates/internal/SdkFileProgrammer.js +4 -1
  65. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  66. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
  67. package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
  68. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  69. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +3 -4
  70. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  71. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +2 -1
  72. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  73. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +6 -3
  74. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  75. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
  76. package/lib/generates/internal/SdkMcpRouteProgrammer.js +148 -0
  77. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  78. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  79. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  80. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
  81. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
  82. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
  83. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +11 -9
  84. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  85. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
  86. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  87. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  88. package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
  89. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  90. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
  91. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
  92. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
  93. package/lib/structures/INestiaSdkInput.d.ts +9 -2
  94. package/lib/structures/IReflectController.d.ts +2 -1
  95. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
  96. package/lib/structures/IReflectMcpOperation.d.ts +35 -0
  97. package/lib/structures/IReflectMcpOperation.js +3 -0
  98. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  99. package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
  100. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  101. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  102. package/lib/structures/ITypedApplication.d.ts +2 -1
  103. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  104. package/lib/structures/ITypedMcpRoute.d.ts +31 -0
  105. package/lib/structures/ITypedMcpRoute.js +3 -0
  106. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  107. package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
  108. package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
  109. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
  110. package/native/go.mod +52 -52
  111. package/native/go.sum +84 -54
  112. package/native/sdk/register.go +322 -165
  113. package/native/sdk/sdk.go +17 -17
  114. package/native/sdk/sdk_metadata_json.go +327 -327
  115. package/native/sdk/sdk_transform.go +1879 -1549
  116. package/package.json +11 -9
  117. package/src/INestiaConfig.ts +267 -267
  118. package/src/NestiaSdkApplication.ts +39 -8
  119. package/src/NestiaSwaggerComposer.ts +153 -142
  120. package/src/analyses/AccessorAnalyzer.ts +64 -67
  121. package/src/analyses/ConfigAnalyzer.ts +330 -330
  122. package/src/analyses/ImportAnalyzer.ts +92 -92
  123. package/src/analyses/PathAnalyzer.ts +130 -69
  124. package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
  125. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  126. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
  127. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
  128. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
  129. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  130. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  131. package/src/analyses/SecurityAnalyzer.ts +25 -25
  132. package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
  133. package/src/decorators/OperationMetadata.ts +29 -29
  134. package/src/executable/internal/CommandParser.ts +15 -15
  135. package/src/executable/internal/NestiaConfigLoader.ts +451 -446
  136. package/src/executable/internal/NestiaSdkCommand.ts +124 -106
  137. package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
  138. package/src/executable/sdk.ts +90 -88
  139. package/src/generates/CloneGenerator.ts +73 -66
  140. package/src/generates/E2eGenerator.ts +32 -32
  141. package/src/generates/SdkGenerator.ts +176 -118
  142. package/src/generates/SwaggerGenerator.ts +342 -310
  143. package/src/generates/internal/E2eFileProgrammer.ts +240 -233
  144. package/src/generates/internal/FilePrinter.ts +65 -65
  145. package/src/generates/internal/ImportDictionary.ts +209 -204
  146. package/src/generates/internal/SdkAliasCollection.ts +274 -261
  147. package/src/generates/internal/SdkDistributionComposer.ts +123 -116
  148. package/src/generates/internal/SdkFileProgrammer.ts +116 -112
  149. package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -126
  150. package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
  151. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
  152. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +520 -510
  153. package/src/generates/internal/SdkHttpParameterProgrammer.ts +165 -165
  154. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
  155. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +331 -314
  156. package/src/generates/internal/SdkImportWizard.ts +62 -62
  157. package/src/generates/internal/SdkMcpRouteProgrammer.ts +452 -0
  158. package/src/generates/internal/SdkRouteDirectory.ts +21 -18
  159. package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -114
  160. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
  161. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +389 -389
  162. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +89 -89
  163. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +331 -323
  164. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  165. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  166. package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
  167. package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
  168. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
  169. package/src/index.ts +4 -4
  170. package/src/internal/legacy.ts +492 -492
  171. package/src/module.ts +4 -4
  172. package/src/structures/INestiaProject.ts +10 -10
  173. package/src/structures/INestiaSdkInput.ts +27 -20
  174. package/src/structures/IOperationMetadata.ts +41 -41
  175. package/src/structures/IReflectController.ts +18 -15
  176. package/src/structures/IReflectHttpOperation.ts +26 -26
  177. package/src/structures/IReflectHttpOperationException.ts +18 -18
  178. package/src/structures/IReflectHttpOperationParameter.ts +79 -79
  179. package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
  180. package/src/structures/IReflectImport.ts +6 -6
  181. package/src/structures/IReflectMcpOperation.ts +38 -0
  182. package/src/structures/IReflectMcpOperationParameter.ts +27 -0
  183. package/src/structures/IReflectOperationError.ts +26 -26
  184. package/src/structures/IReflectType.ts +4 -4
  185. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  186. package/src/structures/ITypedApplication.ts +12 -11
  187. package/src/structures/ITypedHttpRoute.ts +41 -41
  188. package/src/structures/ITypedHttpRouteException.ts +15 -15
  189. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  190. package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
  191. package/src/structures/ITypedMcpRoute.ts +33 -0
  192. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  193. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  194. package/src/transform.ts +59 -59
  195. package/src/typings/get-function-location.d.ts +7 -7
  196. package/src/utils/ArrayUtil.ts +26 -26
  197. package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
  198. package/src/utils/FileRetriever.ts +22 -22
  199. package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
  200. package/src/utils/MapUtil.ts +14 -14
  201. package/src/utils/PathUtil.ts +10 -10
  202. package/src/utils/SourceFinder.ts +63 -63
  203. package/src/utils/StringUtil.ts +17 -17
  204. package/src/utils/TsConfigReader.ts +108 -108
  205. package/src/utils/TtscExecutor.ts +68 -68
  206. package/src/utils/VersioningStrategy.ts +28 -28
  207. package/src/validators/HttpHeadersValidator.ts +11 -11
  208. package/src/validators/HttpQueryValidator.ts +11 -11
  209. package/src/validators/TextPlainValidator.ts +17 -17
@@ -1,88 +1,88 @@
1
- import fs from "fs";
2
- import path from "path";
3
-
4
- export namespace EmittedJavaScriptPatcher {
5
- export const importMetaUrl = async (root: string): Promise<void> => {
6
- const files: string[] = await collect(root);
7
- await Promise.all(files.map(patch));
8
- };
9
- }
10
-
11
- const TARGET = "import.meta.url";
12
- // TypeScript can preserve this token even in CommonJS output. Node 24 then
13
- // syntax-detects the temporary `.js` file as ESM before require() can load it.
14
- const REPLACEMENT = 'require("url").pathToFileURL(__filename).href';
15
-
16
- const collect = async (location: string): Promise<string[]> => {
17
- const entries: fs.Dirent[] = await fs.promises.readdir(location, {
18
- withFileTypes: true,
19
- });
20
- const nested: string[][] = await Promise.all(
21
- entries.map(async (entry) => {
22
- const next: string = path.join(location, entry.name);
23
- if (entry.isDirectory()) return collect(next);
24
- if (entry.isFile() && /\.(?:cjs|js)$/i.test(entry.name)) return [next];
25
- return [];
26
- }),
27
- );
28
- return nested.flat();
29
- };
30
-
31
- const patch = async (file: string): Promise<void> => {
32
- const before: string = await fs.promises.readFile(file, "utf8");
33
- if (before.includes(TARGET) === false) return;
34
-
35
- const after: string = replaceImportMetaUrl(before);
36
- if (after !== before) await fs.promises.writeFile(file, after, "utf8");
37
- };
38
-
39
- const replaceImportMetaUrl = (input: string): string => {
40
- let output: string = "";
41
- let cursor: number = 0;
42
- for (let i = 0; i < input.length; ) {
43
- if (isTarget(input, i)) {
44
- output += input.slice(cursor, i);
45
- output += REPLACEMENT;
46
- i += TARGET.length;
47
- cursor = i;
48
- continue;
49
- }
50
-
51
- const ch: string = input[i]!;
52
- const next: string | undefined = input[i + 1];
53
- if (ch === '"' || ch === "'") i = skipQuoted(input, i, ch);
54
- else if (ch === "/" && next === "/") i = skipLineComment(input, i);
55
- else if (ch === "/" && next === "*") i = skipBlockComment(input, i);
56
- else ++i;
57
- }
58
- return output + input.slice(cursor);
59
- };
60
-
61
- const isTarget = (input: string, index: number): boolean =>
62
- input.startsWith(TARGET, index) &&
63
- isBoundary(input[index - 1]) &&
64
- isBoundary(input[index + TARGET.length]);
65
-
66
- const isBoundary = (ch: string | undefined): boolean =>
67
- ch === undefined || /[^A-Za-z0-9_$]/.test(ch);
68
-
69
- const skipQuoted = (input: string, index: number, quote: string): number => {
70
- let escaped: boolean = false;
71
- for (let i = index + 1; i < input.length; ++i) {
72
- const ch: string = input[i]!;
73
- if (escaped) escaped = false;
74
- else if (ch === "\\") escaped = true;
75
- else if (ch === quote) return i + 1;
76
- }
77
- return input.length;
78
- };
79
-
80
- const skipLineComment = (input: string, index: number): number => {
81
- const found: number = input.indexOf("\n", index + 2);
82
- return found === -1 ? input.length : found + 1;
83
- };
84
-
85
- const skipBlockComment = (input: string, index: number): number => {
86
- const found: number = input.indexOf("*/", index + 2);
87
- return found === -1 ? input.length : found + 2;
88
- };
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ export namespace EmittedJavaScriptPatcher {
5
+ export const importMetaUrl = async (root: string): Promise<void> => {
6
+ const files: string[] = await collect(root);
7
+ await Promise.all(files.map(patch));
8
+ };
9
+ }
10
+
11
+ const TARGET = "import.meta.url";
12
+ // TypeScript can preserve this token even in CommonJS output. Node 24 then
13
+ // syntax-detects the temporary `.js` file as ESM before require() can load it.
14
+ const REPLACEMENT = 'require("url").pathToFileURL(__filename).href';
15
+
16
+ const collect = async (location: string): Promise<string[]> => {
17
+ const entries: fs.Dirent[] = await fs.promises.readdir(location, {
18
+ withFileTypes: true,
19
+ });
20
+ const nested: string[][] = await Promise.all(
21
+ entries.map(async (entry) => {
22
+ const next: string = path.join(location, entry.name);
23
+ if (entry.isDirectory()) return collect(next);
24
+ if (entry.isFile() && /\.(?:cjs|js)$/i.test(entry.name)) return [next];
25
+ return [];
26
+ }),
27
+ );
28
+ return nested.flat();
29
+ };
30
+
31
+ const patch = async (file: string): Promise<void> => {
32
+ const before: string = await fs.promises.readFile(file, "utf8");
33
+ if (before.includes(TARGET) === false) return;
34
+
35
+ const after: string = replaceImportMetaUrl(before);
36
+ if (after !== before) await fs.promises.writeFile(file, after, "utf8");
37
+ };
38
+
39
+ const replaceImportMetaUrl = (input: string): string => {
40
+ let output: string = "";
41
+ let cursor: number = 0;
42
+ for (let i = 0; i < input.length; ) {
43
+ if (isTarget(input, i)) {
44
+ output += input.slice(cursor, i);
45
+ output += REPLACEMENT;
46
+ i += TARGET.length;
47
+ cursor = i;
48
+ continue;
49
+ }
50
+
51
+ const ch: string = input[i]!;
52
+ const next: string | undefined = input[i + 1];
53
+ if (ch === '"' || ch === "'") i = skipQuoted(input, i, ch);
54
+ else if (ch === "/" && next === "/") i = skipLineComment(input, i);
55
+ else if (ch === "/" && next === "*") i = skipBlockComment(input, i);
56
+ else ++i;
57
+ }
58
+ return output + input.slice(cursor);
59
+ };
60
+
61
+ const isTarget = (input: string, index: number): boolean =>
62
+ input.startsWith(TARGET, index) &&
63
+ isBoundary(input[index - 1]) &&
64
+ isBoundary(input[index + TARGET.length]);
65
+
66
+ const isBoundary = (ch: string | undefined): boolean =>
67
+ ch === undefined || /[^A-Za-z0-9_$]/.test(ch);
68
+
69
+ const skipQuoted = (input: string, index: number, quote: string): number => {
70
+ let escaped: boolean = false;
71
+ for (let i = index + 1; i < input.length; ++i) {
72
+ const ch: string = input[i]!;
73
+ if (escaped) escaped = false;
74
+ else if (ch === "\\") escaped = true;
75
+ else if (ch === quote) return i + 1;
76
+ }
77
+ return input.length;
78
+ };
79
+
80
+ const skipLineComment = (input: string, index: number): number => {
81
+ const found: number = input.indexOf("\n", index + 2);
82
+ return found === -1 ? input.length : found + 1;
83
+ };
84
+
85
+ const skipBlockComment = (input: string, index: number): number => {
86
+ const found: number = input.indexOf("*/", index + 2);
87
+ return found === -1 ? input.length : found + 2;
88
+ };
@@ -1,22 +1,22 @@
1
- import fs from "fs";
2
- import path from "path";
3
-
4
- export namespace FileRetriever {
5
- export const directory =
6
- (name: string) =>
7
- (dir: string, depth: number = 0): string | null => {
8
- const location: string = path.join(dir, name);
9
- if (fs.existsSync(location)) return dir;
10
- else if (depth > 2) return null;
11
- return directory(name)(path.join(dir, ".."), depth + 1);
12
- };
13
-
14
- export const file =
15
- (name: string) =>
16
- (directory: string, depth: number = 0): string | null => {
17
- const location: string = path.join(directory, name);
18
- if (fs.existsSync(location)) return location;
19
- else if (depth > 2) return null;
20
- return file(name)(path.join(directory, ".."), depth + 1);
21
- };
22
- }
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ export namespace FileRetriever {
5
+ export const directory =
6
+ (name: string) =>
7
+ (dir: string, depth: number = 0): string | null => {
8
+ const location: string = path.join(dir, name);
9
+ if (fs.existsSync(location)) return dir;
10
+ else if (depth > 2) return null;
11
+ return directory(name)(path.join(dir, ".."), depth + 1);
12
+ };
13
+
14
+ export const file =
15
+ (name: string) =>
16
+ (directory: string, depth: number = 0): string | null => {
17
+ const location: string = path.join(directory, name);
18
+ if (fs.existsSync(location)) return location;
19
+ else if (depth > 2) return null;
20
+ return file(name)(path.join(directory, ".."), depth + 1);
21
+ };
22
+ }
@@ -0,0 +1,30 @@
1
+ export namespace HttpResponseContentTypeUtil {
2
+ export type Response =
3
+ | "application/json"
4
+ | "text/plain"
5
+ | "application/x-www-form-urlencoded"
6
+ | (string & {})
7
+ | null;
8
+
9
+ export const isSupported = (input: string | null): input is Response =>
10
+ input === null ||
11
+ input === "application/json" ||
12
+ input === "text/plain" ||
13
+ input === "application/x-www-form-urlencoded" ||
14
+ isBinary(input);
15
+
16
+ export const isBinary = (
17
+ input: string | null | undefined,
18
+ ): input is string => {
19
+ if (typeof input !== "string") return false;
20
+
21
+ const value: string = input.split(";")[0]!.trim().toLowerCase();
22
+ return (
23
+ value.startsWith("image/") ||
24
+ value.startsWith("video/") ||
25
+ value.startsWith("audio/") ||
26
+ value === "application/octet-stream" ||
27
+ value === "application/pdf"
28
+ );
29
+ };
30
+ }
@@ -1,14 +1,14 @@
1
- export namespace MapUtil {
2
- export function take<Key, T>(
3
- dict: Map<Key, T>,
4
- key: Key,
5
- generator: () => T,
6
- ): T {
7
- const oldbie: T | undefined = dict.get(key);
8
- if (oldbie) return oldbie;
9
-
10
- const value: T = generator();
11
- dict.set(key, value);
12
- return value;
13
- }
14
- }
1
+ export namespace MapUtil {
2
+ export function take<Key, T>(
3
+ dict: Map<Key, T>,
4
+ key: Key,
5
+ generator: () => T,
6
+ ): T {
7
+ const oldbie: T | undefined = dict.get(key);
8
+ if (oldbie) return oldbie;
9
+
10
+ const value: T = generator();
11
+ dict.set(key, value);
12
+ return value;
13
+ }
14
+ }
@@ -1,10 +1,10 @@
1
- export namespace PathUtil {
2
- export const accessors = (path: string) =>
3
- path
4
- .split("/")
5
- .filter((str) => str.length && str[0] !== ":")
6
- .map(normalize);
7
-
8
- const normalize = (str: string) =>
9
- str.split("-").join("_").split(".").join("_");
10
- }
1
+ export namespace PathUtil {
2
+ export const accessors = (path: string) =>
3
+ path
4
+ .split("/")
5
+ .filter((str) => str.length && str[0] !== ":")
6
+ .map(normalize);
7
+
8
+ const normalize = (str: string) =>
9
+ str.split("-").join("_").split(".").join("_");
10
+ }
@@ -1,63 +1,63 @@
1
- import fs from "fs";
2
- import { glob } from "glob";
3
- import path from "path";
4
-
5
- export namespace SourceFinder {
6
- interface IProps {
7
- exclude?: string[];
8
- include: string[];
9
- filter: (location: string) => Promise<boolean>;
10
- }
11
-
12
- export const find = async (props: IProps): Promise<string[]> => {
13
- const dict: Set<string> = new Set();
14
-
15
- await emplace(props.filter)(props.include)((str) => dict.add(str));
16
- if (props.exclude?.length)
17
- await emplace(props.filter)(props.exclude)((str) => dict.delete(str));
18
-
19
- return [...dict];
20
- };
21
-
22
- const emplace =
23
- (filter: (file: string) => Promise<boolean>) =>
24
- (input: string[]) =>
25
- async (closure: (location: string) => void): Promise<void> => {
26
- for (const pattern of input) {
27
- if (_Is_file(pattern)) {
28
- closure(path.resolve(pattern));
29
- continue;
30
- }
31
- for (const file of await _Glob(pattern)) {
32
- const stats: fs.Stats = await fs.promises.stat(file);
33
- if (stats.isDirectory() === true)
34
- await iterate(filter)(closure)(file);
35
- else if (stats.isFile() && (await filter(file))) closure(file);
36
- }
37
- }
38
- };
39
-
40
- const iterate =
41
- (filter: (location: string) => Promise<boolean>) =>
42
- (closure: (location: string) => void) =>
43
- async (location: string): Promise<void> => {
44
- const directory: string[] = await fs.promises.readdir(location);
45
- for (const file of directory) {
46
- const next: string = path.resolve(`${location}/${file}`);
47
- const stats: fs.Stats = await fs.promises.stat(next);
48
-
49
- if (stats.isDirectory() === true) await iterate(filter)(closure)(next);
50
- else if (stats.isFile() && (await filter(next))) closure(next);
51
- }
52
- };
53
-
54
- const _Glob = async (pattern: string): Promise<string[]> => {
55
- const matches = await glob(pattern);
56
- return matches.map((str) => path.resolve(str));
57
- };
58
-
59
- const _Is_file = (pattern: string): boolean =>
60
- pattern.endsWith(".ts") &&
61
- !pattern.endsWith(".d.ts") &&
62
- fs.existsSync(pattern);
63
- }
1
+ import fs from "fs";
2
+ import { glob } from "glob";
3
+ import path from "path";
4
+
5
+ export namespace SourceFinder {
6
+ interface IProps {
7
+ exclude?: string[];
8
+ include: string[];
9
+ filter: (location: string) => Promise<boolean>;
10
+ }
11
+
12
+ export const find = async (props: IProps): Promise<string[]> => {
13
+ const dict: Set<string> = new Set();
14
+
15
+ await emplace(props.filter)(props.include)((str) => dict.add(str));
16
+ if (props.exclude?.length)
17
+ await emplace(props.filter)(props.exclude)((str) => dict.delete(str));
18
+
19
+ return [...dict];
20
+ };
21
+
22
+ const emplace =
23
+ (filter: (file: string) => Promise<boolean>) =>
24
+ (input: string[]) =>
25
+ async (closure: (location: string) => void): Promise<void> => {
26
+ for (const pattern of input) {
27
+ if (_Is_file(pattern)) {
28
+ closure(path.resolve(pattern));
29
+ continue;
30
+ }
31
+ for (const file of await _Glob(pattern)) {
32
+ const stats: fs.Stats = await fs.promises.stat(file);
33
+ if (stats.isDirectory() === true)
34
+ await iterate(filter)(closure)(file);
35
+ else if (stats.isFile() && (await filter(file))) closure(file);
36
+ }
37
+ }
38
+ };
39
+
40
+ const iterate =
41
+ (filter: (location: string) => Promise<boolean>) =>
42
+ (closure: (location: string) => void) =>
43
+ async (location: string): Promise<void> => {
44
+ const directory: string[] = await fs.promises.readdir(location);
45
+ for (const file of directory) {
46
+ const next: string = path.resolve(`${location}/${file}`);
47
+ const stats: fs.Stats = await fs.promises.stat(next);
48
+
49
+ if (stats.isDirectory() === true) await iterate(filter)(closure)(next);
50
+ else if (stats.isFile() && (await filter(next))) closure(next);
51
+ }
52
+ };
53
+
54
+ const _Glob = async (pattern: string): Promise<string[]> => {
55
+ const matches = await glob(pattern);
56
+ return matches.map((str) => path.resolve(str));
57
+ };
58
+
59
+ const _Is_file = (pattern: string): boolean =>
60
+ pattern.endsWith(".ts") &&
61
+ !pattern.endsWith(".d.ts") &&
62
+ fs.existsSync(pattern);
63
+ }
@@ -1,17 +1,17 @@
1
- export namespace StringUtil {
2
- export const capitalize = (text: string): string =>
3
- text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
4
-
5
- export const escapeDuplicate =
6
- (keep: string[]) =>
7
- (change: string): string =>
8
- keep.includes(change) ? escapeDuplicate(keep)(`_${change}`) : change;
9
-
10
- export const isImplicit = (str: string) =>
11
- str === "object" ||
12
- str === "__type" ||
13
- str === "__object" ||
14
- str.startsWith("__type.") ||
15
- str.startsWith("__object.") ||
16
- str.includes("readonly [");
17
- }
1
+ export namespace StringUtil {
2
+ export const capitalize = (text: string): string =>
3
+ text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
4
+
5
+ export const escapeDuplicate =
6
+ (keep: string[]) =>
7
+ (change: string): string =>
8
+ keep.includes(change) ? escapeDuplicate(keep)(`_${change}`) : change;
9
+
10
+ export const isImplicit = (str: string) =>
11
+ str === "object" ||
12
+ str === "__type" ||
13
+ str === "__object" ||
14
+ str.startsWith("__type.") ||
15
+ str.startsWith("__object.") ||
16
+ str.includes("readonly [");
17
+ }