@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.
- package/LICENSE +21 -21
- package/README.md +93 -93
- package/assets/bundle/api/HttpError.ts +1 -1
- package/assets/bundle/api/IConnection.ts +1 -1
- package/assets/bundle/api/Primitive.ts +1 -1
- package/assets/bundle/api/Resolved.ts +1 -1
- package/assets/bundle/api/index.ts +4 -4
- package/assets/bundle/api/module.ts +6 -6
- package/assets/bundle/distribute/README.md +37 -37
- package/assets/bundle/distribute/package.json +28 -28
- package/assets/bundle/distribute/tsconfig.json +109 -109
- package/assets/bundle/e2e/index.ts +42 -42
- package/assets/config/nestia.config.ts +97 -97
- package/lib/NestiaSdkApplication.js +29 -7
- package/lib/NestiaSdkApplication.js.map +1 -1
- package/lib/NestiaSwaggerComposer.js +21 -13
- package/lib/NestiaSwaggerComposer.js.map +1 -1
- package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
- package/lib/analyses/AccessorAnalyzer.js.map +1 -1
- package/lib/analyses/ConfigAnalyzer.js +1 -1
- package/lib/analyses/PathAnalyzer.d.ts +18 -3
- package/lib/analyses/PathAnalyzer.js +32 -0
- package/lib/analyses/PathAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
- package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +53 -20
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +14 -0
- package/lib/analyses/ReflectMcpOperationAnalyzer.js +79 -0
- package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +9 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.js +31 -0
- package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
- package/lib/executable/internal/NestiaConfigLoader.js +5 -1
- package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
- package/lib/executable/internal/NestiaSdkCommand.js +30 -14
- package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
- package/lib/executable/internal/NestiaSdkWatcher.d.ts +10 -0
- package/lib/executable/internal/NestiaSdkWatcher.js +322 -0
- package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -0
- package/lib/executable/sdk.js +12 -12
- package/lib/executable/sdk.js.map +1 -1
- package/lib/generates/CloneGenerator.js +4 -2
- package/lib/generates/CloneGenerator.js.map +1 -1
- package/lib/generates/SdkGenerator.js +50 -1
- package/lib/generates/SdkGenerator.js.map +1 -1
- package/lib/generates/SwaggerGenerator.js +18 -2
- package/lib/generates/SwaggerGenerator.js.map +1 -1
- package/lib/generates/internal/E2eFileProgrammer.js +3 -1
- package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
- package/lib/generates/internal/ImportDictionary.d.ts +1 -0
- package/lib/generates/internal/ImportDictionary.js +9 -4
- package/lib/generates/internal/ImportDictionary.js.map +1 -1
- package/lib/generates/internal/SdkAliasCollection.d.ts +2 -0
- package/lib/generates/internal/SdkAliasCollection.js +11 -2
- package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
- package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
- package/lib/generates/internal/SdkDistributionComposer.js +3 -0
- package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
- package/lib/generates/internal/SdkFileProgrammer.js +4 -1
- package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
- package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
- package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js +3 -4
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +2 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js +6 -3
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
- package/lib/generates/internal/SdkMcpRouteProgrammer.js +148 -0
- package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
- package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
- package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
- package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +11 -9
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
- package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
- package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
- package/lib/structures/INestiaSdkInput.d.ts +9 -2
- package/lib/structures/IReflectController.d.ts +2 -1
- package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
- package/lib/structures/IReflectMcpOperation.d.ts +35 -0
- package/lib/structures/IReflectMcpOperation.js +3 -0
- package/lib/structures/IReflectMcpOperation.js.map +1 -0
- package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
- package/lib/structures/IReflectMcpOperationParameter.js +3 -0
- package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
- package/lib/structures/ITypedApplication.d.ts +2 -1
- package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
- package/lib/structures/ITypedMcpRoute.d.ts +31 -0
- package/lib/structures/ITypedMcpRoute.js +3 -0
- package/lib/structures/ITypedMcpRoute.js.map +1 -0
- package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
- package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
- package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
- package/native/go.mod +52 -52
- package/native/go.sum +84 -54
- package/native/sdk/register.go +322 -165
- package/native/sdk/sdk.go +17 -17
- package/native/sdk/sdk_metadata_json.go +327 -327
- package/native/sdk/sdk_transform.go +1879 -1549
- package/package.json +11 -9
- package/src/INestiaConfig.ts +267 -267
- package/src/NestiaSdkApplication.ts +39 -8
- package/src/NestiaSwaggerComposer.ts +153 -142
- package/src/analyses/AccessorAnalyzer.ts +64 -67
- package/src/analyses/ConfigAnalyzer.ts +330 -330
- package/src/analyses/ImportAnalyzer.ts +92 -92
- package/src/analyses/PathAnalyzer.ts +130 -69
- package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
- package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
- package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
- package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
- package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
- package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
- package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
- package/src/analyses/SecurityAnalyzer.ts +25 -25
- package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
- package/src/decorators/OperationMetadata.ts +29 -29
- package/src/executable/internal/CommandParser.ts +15 -15
- package/src/executable/internal/NestiaConfigLoader.ts +451 -446
- package/src/executable/internal/NestiaSdkCommand.ts +124 -106
- package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
- package/src/executable/sdk.ts +90 -88
- package/src/generates/CloneGenerator.ts +73 -66
- package/src/generates/E2eGenerator.ts +32 -32
- package/src/generates/SdkGenerator.ts +176 -118
- package/src/generates/SwaggerGenerator.ts +342 -310
- package/src/generates/internal/E2eFileProgrammer.ts +240 -233
- package/src/generates/internal/FilePrinter.ts +65 -65
- package/src/generates/internal/ImportDictionary.ts +209 -204
- package/src/generates/internal/SdkAliasCollection.ts +274 -261
- package/src/generates/internal/SdkDistributionComposer.ts +123 -116
- package/src/generates/internal/SdkFileProgrammer.ts +116 -112
- package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -126
- package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
- package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
- package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +520 -510
- package/src/generates/internal/SdkHttpParameterProgrammer.ts +165 -165
- package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
- package/src/generates/internal/SdkHttpSimulationProgrammer.ts +331 -314
- package/src/generates/internal/SdkImportWizard.ts +62 -62
- package/src/generates/internal/SdkMcpRouteProgrammer.ts +452 -0
- package/src/generates/internal/SdkRouteDirectory.ts +21 -18
- package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -114
- package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
- package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +389 -389
- package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +89 -89
- package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +331 -323
- package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
- package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
- package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
- package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
- package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
- package/src/index.ts +4 -4
- package/src/internal/legacy.ts +492 -492
- package/src/module.ts +4 -4
- package/src/structures/INestiaProject.ts +10 -10
- package/src/structures/INestiaSdkInput.ts +27 -20
- package/src/structures/IOperationMetadata.ts +41 -41
- package/src/structures/IReflectController.ts +18 -15
- package/src/structures/IReflectHttpOperation.ts +26 -26
- package/src/structures/IReflectHttpOperationException.ts +18 -18
- package/src/structures/IReflectHttpOperationParameter.ts +79 -79
- package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
- package/src/structures/IReflectImport.ts +6 -6
- package/src/structures/IReflectMcpOperation.ts +38 -0
- package/src/structures/IReflectMcpOperationParameter.ts +27 -0
- package/src/structures/IReflectOperationError.ts +26 -26
- package/src/structures/IReflectType.ts +4 -4
- package/src/structures/IReflectWebSocketOperation.ts +17 -17
- package/src/structures/ITypedApplication.ts +12 -11
- package/src/structures/ITypedHttpRoute.ts +41 -41
- package/src/structures/ITypedHttpRouteException.ts +15 -15
- package/src/structures/ITypedHttpRouteParameter.ts +41 -41
- package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
- package/src/structures/ITypedMcpRoute.ts +33 -0
- package/src/structures/ITypedWebSocketRoute.ts +24 -24
- package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
- package/src/transform.ts +59 -59
- package/src/typings/get-function-location.d.ts +7 -7
- package/src/utils/ArrayUtil.ts +26 -26
- package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
- package/src/utils/FileRetriever.ts +22 -22
- package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
- package/src/utils/MapUtil.ts +14 -14
- package/src/utils/PathUtil.ts +10 -10
- package/src/utils/SourceFinder.ts +63 -63
- package/src/utils/StringUtil.ts +17 -17
- package/src/utils/TsConfigReader.ts +108 -108
- package/src/utils/TtscExecutor.ts +68 -68
- package/src/utils/VersioningStrategy.ts +28 -28
- package/src/validators/HttpHeadersValidator.ts +11 -11
- package/src/validators/HttpQueryValidator.ts +11 -11
- 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
|
+
}
|
package/src/utils/MapUtil.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/utils/PathUtil.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/utils/StringUtil.ts
CHANGED
|
@@ -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
|
+
}
|