@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,108 +1,108 @@
1
- import fs from "fs";
2
- import path from "path";
3
-
4
- export namespace TsConfigReader {
5
- export interface ITsConfig {
6
- extends?: string | string[];
7
- compilerOptions?: Record<string, any>;
8
- }
9
-
10
- export const read = async (file: string): Promise<ITsConfig> =>
11
- merge(file, new Set());
12
-
13
- const merge = async (file: string, visited: Set<string>): Promise<ITsConfig> => {
14
- const location: string = path.resolve(file);
15
- if (visited.has(location)) return {};
16
- visited.add(location);
17
-
18
- const current: ITsConfig = parse(
19
- await fs.promises.readFile(location, "utf8"),
20
- );
21
- const bases: ITsConfig[] = [];
22
- for (const parent of asArray(current.extends)) {
23
- const next: string | null = resolveExtends(parent, path.dirname(location));
24
- if (next !== null) bases.push(await merge(next, visited));
25
- }
26
- return [...bases, current].reduce<ITsConfig>(
27
- (acc, elem) => ({
28
- ...acc,
29
- ...elem,
30
- compilerOptions: {
31
- ...(acc.compilerOptions ?? {}),
32
- ...(elem.compilerOptions ?? {}),
33
- },
34
- }),
35
- {},
36
- );
37
- };
38
-
39
- const parse = (text: string): ITsConfig =>
40
- JSON.parse(stripTrailingCommas(stripJsonComments(text))) as ITsConfig;
41
-
42
- const asArray = <T>(value: T | T[] | undefined): T[] =>
43
- value === undefined ? [] : Array.isArray(value) ? value : [value];
44
-
45
- const resolveExtends = (specifier: string, cwd: string): string | null => {
46
- const candidates = (base: string): string[] => {
47
- const ext: string = path.extname(base);
48
- return ext === ".json" || ext === ".jsonc" ? [base] : [base, `${base}.json`];
49
- };
50
-
51
- if (path.isAbsolute(specifier) || specifier.startsWith(".")) {
52
- for (const candidate of candidates(path.resolve(cwd, specifier)))
53
- if (fs.existsSync(candidate)) return candidate;
54
- return null;
55
- }
56
-
57
- for (const candidate of [
58
- specifier,
59
- ...candidates(specifier),
60
- path.join(specifier, "tsconfig.json"),
61
- ])
62
- try {
63
- return require.resolve(candidate, { paths: [cwd] });
64
- } catch {
65
- continue;
66
- }
67
- return null;
68
- };
69
-
70
- const stripJsonComments = (input: string): string => {
71
- let output = "";
72
- let string: false | '"' | "'" = false;
73
- let escaped = false;
74
- for (let i = 0; i < input.length; ++i) {
75
- const ch = input[i]!;
76
- const next = input[i + 1];
77
- if (string !== false) {
78
- output += ch;
79
- if (escaped) escaped = false;
80
- else if (ch === "\\") escaped = true;
81
- else if (ch === string) string = false;
82
- continue;
83
- }
84
- if (ch === '"' || ch === "'") {
85
- string = ch;
86
- output += ch;
87
- continue;
88
- }
89
- if (ch === "/" && next === "/") {
90
- while (i < input.length && input[i] !== "\n") ++i;
91
- output += "\n";
92
- continue;
93
- }
94
- if (ch === "/" && next === "*") {
95
- i += 2;
96
- while (i < input.length && !(input[i] === "*" && input[i + 1] === "/"))
97
- ++i;
98
- ++i;
99
- continue;
100
- }
101
- output += ch;
102
- }
103
- return output;
104
- };
105
-
106
- const stripTrailingCommas = (input: string): string =>
107
- input.replace(/,\s*([}\]])/g, "$1");
108
- }
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ export namespace TsConfigReader {
5
+ export interface ITsConfig {
6
+ extends?: string | string[];
7
+ compilerOptions?: Record<string, any>;
8
+ }
9
+
10
+ export const read = async (file: string): Promise<ITsConfig> =>
11
+ merge(file, new Set());
12
+
13
+ const merge = async (file: string, visited: Set<string>): Promise<ITsConfig> => {
14
+ const location: string = path.resolve(file);
15
+ if (visited.has(location)) return {};
16
+ visited.add(location);
17
+
18
+ const current: ITsConfig = parse(
19
+ await fs.promises.readFile(location, "utf8"),
20
+ );
21
+ const bases: ITsConfig[] = [];
22
+ for (const parent of asArray(current.extends)) {
23
+ const next: string | null = resolveExtends(parent, path.dirname(location));
24
+ if (next !== null) bases.push(await merge(next, visited));
25
+ }
26
+ return [...bases, current].reduce<ITsConfig>(
27
+ (acc, elem) => ({
28
+ ...acc,
29
+ ...elem,
30
+ compilerOptions: {
31
+ ...(acc.compilerOptions ?? {}),
32
+ ...(elem.compilerOptions ?? {}),
33
+ },
34
+ }),
35
+ {},
36
+ );
37
+ };
38
+
39
+ const parse = (text: string): ITsConfig =>
40
+ JSON.parse(stripTrailingCommas(stripJsonComments(text))) as ITsConfig;
41
+
42
+ const asArray = <T>(value: T | T[] | undefined): T[] =>
43
+ value === undefined ? [] : Array.isArray(value) ? value : [value];
44
+
45
+ const resolveExtends = (specifier: string, cwd: string): string | null => {
46
+ const candidates = (base: string): string[] => {
47
+ const ext: string = path.extname(base);
48
+ return ext === ".json" || ext === ".jsonc" ? [base] : [base, `${base}.json`];
49
+ };
50
+
51
+ if (path.isAbsolute(specifier) || specifier.startsWith(".")) {
52
+ for (const candidate of candidates(path.resolve(cwd, specifier)))
53
+ if (fs.existsSync(candidate)) return candidate;
54
+ return null;
55
+ }
56
+
57
+ for (const candidate of [
58
+ specifier,
59
+ ...candidates(specifier),
60
+ path.join(specifier, "tsconfig.json"),
61
+ ])
62
+ try {
63
+ return require.resolve(candidate, { paths: [cwd] });
64
+ } catch {
65
+ continue;
66
+ }
67
+ return null;
68
+ };
69
+
70
+ const stripJsonComments = (input: string): string => {
71
+ let output = "";
72
+ let string: false | '"' | "'" = false;
73
+ let escaped = false;
74
+ for (let i = 0; i < input.length; ++i) {
75
+ const ch = input[i]!;
76
+ const next = input[i + 1];
77
+ if (string !== false) {
78
+ output += ch;
79
+ if (escaped) escaped = false;
80
+ else if (ch === "\\") escaped = true;
81
+ else if (ch === string) string = false;
82
+ continue;
83
+ }
84
+ if (ch === '"' || ch === "'") {
85
+ string = ch;
86
+ output += ch;
87
+ continue;
88
+ }
89
+ if (ch === "/" && next === "/") {
90
+ while (i < input.length && input[i] !== "\n") ++i;
91
+ output += "\n";
92
+ continue;
93
+ }
94
+ if (ch === "/" && next === "*") {
95
+ i += 2;
96
+ while (i < input.length && !(input[i] === "*" && input[i + 1] === "/"))
97
+ ++i;
98
+ ++i;
99
+ continue;
100
+ }
101
+ output += ch;
102
+ }
103
+ return output;
104
+ };
105
+
106
+ const stripTrailingCommas = (input: string): string =>
107
+ input.replace(/,\s*([}\]])/g, "$1");
108
+ }
@@ -1,68 +1,68 @@
1
- import cp from "child_process";
2
- import fs from "fs";
3
- import path from "path";
4
-
5
- export namespace TtscExecutor {
6
- export const run = (props: {
7
- cwd: string;
8
- env?: NodeJS.ProcessEnv;
9
- project: string;
10
- stdio?: cp.StdioOptions;
11
- }): Buffer => {
12
- const args: string[] = [bin(props.cwd), "-p", props.project];
13
- if (process.env.TTSC_CACHE_DIR !== undefined)
14
- args.push("--cache-dir", process.env.TTSC_CACHE_DIR);
15
- return cp.execFileSync(process.execPath, args, {
16
- cwd: props.cwd,
17
- env: {
18
- ...process.env,
19
- ...props.env,
20
- },
21
- stdio: props.stdio ?? "pipe",
22
- maxBuffer: 64 * 1024 * 1024,
23
- });
24
- };
25
-
26
- const bin_: Map<string, string> = new Map();
27
-
28
- const bin = (cwd: string): string => {
29
- const cached: string | undefined = bin_.get(cwd);
30
- if (cached !== undefined) return cached;
31
-
32
- // Prefer the user's project-local ttsc; fall back to the module's own
33
- // lookup path so a programmatic caller without an installed ttsc in
34
- // `cwd` still resolves the bundled dep.
35
- let manifest: string;
36
- try {
37
- manifest = require.resolve("ttsc/package.json", { paths: [cwd] });
38
- } catch {
39
- manifest = require.resolve("ttsc/package.json");
40
- }
41
- const directory: string = path.dirname(manifest);
42
- const pack: { bin?: string | Record<string, string> } = JSON.parse(
43
- fs.readFileSync(manifest, "utf8"),
44
- );
45
- const location: string | undefined =
46
- typeof pack.bin === "string" ? pack.bin : pack.bin?.ttsc;
47
- if (location === undefined) {
48
- const keys =
49
- typeof pack.bin === "object" && pack.bin !== null
50
- ? Object.keys(pack.bin).join(", ")
51
- : "<none>";
52
- throw new Error(
53
- `Unable to find "ttsc" binary from package metadata. ` +
54
- `Available bin entries: ${keys}. ` +
55
- `Reinstall with: npm install --save-dev ttsc`,
56
- );
57
- }
58
-
59
- const resolved: string = path.join(directory, location);
60
- if (!fs.existsSync(resolved))
61
- throw new Error(
62
- `"ttsc" binary not found at "${resolved}". ` +
63
- `Reinstall with: npm install --save-dev ttsc`,
64
- );
65
- bin_.set(cwd, resolved);
66
- return resolved;
67
- };
68
- }
1
+ import cp from "child_process";
2
+ import fs from "fs";
3
+ import path from "path";
4
+
5
+ export namespace TtscExecutor {
6
+ export const run = (props: {
7
+ cwd: string;
8
+ env?: NodeJS.ProcessEnv;
9
+ project: string;
10
+ stdio?: cp.StdioOptions;
11
+ }): Buffer => {
12
+ const args: string[] = [bin(props.cwd), "-p", props.project];
13
+ if (process.env.TTSC_CACHE_DIR !== undefined)
14
+ args.push("--cache-dir", process.env.TTSC_CACHE_DIR);
15
+ return cp.execFileSync(process.execPath, args, {
16
+ cwd: props.cwd,
17
+ env: {
18
+ ...process.env,
19
+ ...props.env,
20
+ },
21
+ stdio: props.stdio ?? "pipe",
22
+ maxBuffer: 64 * 1024 * 1024,
23
+ });
24
+ };
25
+
26
+ const bin_: Map<string, string> = new Map();
27
+
28
+ const bin = (cwd: string): string => {
29
+ const cached: string | undefined = bin_.get(cwd);
30
+ if (cached !== undefined) return cached;
31
+
32
+ // Prefer the user's project-local ttsc; fall back to the module's own
33
+ // lookup path so a programmatic caller without an installed ttsc in
34
+ // `cwd` still resolves the bundled dep.
35
+ let manifest: string;
36
+ try {
37
+ manifest = require.resolve("ttsc/package.json", { paths: [cwd] });
38
+ } catch {
39
+ manifest = require.resolve("ttsc/package.json");
40
+ }
41
+ const directory: string = path.dirname(manifest);
42
+ const pack: { bin?: string | Record<string, string> } = JSON.parse(
43
+ fs.readFileSync(manifest, "utf8"),
44
+ );
45
+ const location: string | undefined =
46
+ typeof pack.bin === "string" ? pack.bin : pack.bin?.ttsc;
47
+ if (location === undefined) {
48
+ const keys =
49
+ typeof pack.bin === "object" && pack.bin !== null
50
+ ? Object.keys(pack.bin).join(", ")
51
+ : "<none>";
52
+ throw new Error(
53
+ `Unable to find "ttsc" binary from package metadata. ` +
54
+ `Available bin entries: ${keys}. ` +
55
+ `Reinstall with: npm install --save-dev ttsc`,
56
+ );
57
+ }
58
+
59
+ const resolved: string = path.join(directory, location);
60
+ if (!fs.existsSync(resolved))
61
+ throw new Error(
62
+ `"ttsc" binary not found at "${resolved}". ` +
63
+ `Reinstall with: npm install --save-dev ttsc`,
64
+ );
65
+ bin_.set(cwd, resolved);
66
+ return resolved;
67
+ };
68
+ }
@@ -1,28 +1,28 @@
1
- import { VERSION_NEUTRAL, VersionValue } from "@nestjs/common/interfaces";
2
-
3
- import { INestiaProject } from "../structures/INestiaProject";
4
-
5
- export namespace VersioningStrategy {
6
- export const cast = (
7
- value: VersionValue | undefined,
8
- ): Array<string | typeof VERSION_NEUTRAL> =>
9
- value === undefined ? [] : Array.isArray(value) ? value : [value];
10
-
11
- export const merge =
12
- (project: Omit<INestiaProject, "config">) =>
13
- (values: Array<string | typeof VERSION_NEUTRAL>): string[] => {
14
- if (project.input.versioning === undefined) return [""];
15
- const set: Set<string | typeof VERSION_NEUTRAL> = new Set(values);
16
- const array: Array<string | typeof VERSION_NEUTRAL> =
17
- set.size === 0
18
- ? cast(project.input.versioning?.defaultVersion)
19
- : Array.from(set);
20
- return !!array?.length
21
- ? array.map((x) =>
22
- typeof x === "symbol"
23
- ? ""
24
- : `${project.input.versioning!.prefix}${x}`,
25
- )
26
- : [];
27
- };
28
- }
1
+ import { VERSION_NEUTRAL, VersionValue } from "@nestjs/common/interfaces";
2
+
3
+ import { INestiaProject } from "../structures/INestiaProject";
4
+
5
+ export namespace VersioningStrategy {
6
+ export const cast = (
7
+ value: VersionValue | undefined,
8
+ ): Array<string | typeof VERSION_NEUTRAL> =>
9
+ value === undefined ? [] : Array.isArray(value) ? value : [value];
10
+
11
+ export const merge =
12
+ (project: Omit<INestiaProject, "config">) =>
13
+ (values: Array<string | typeof VERSION_NEUTRAL>): string[] => {
14
+ if (project.input.versioning === undefined) return [""];
15
+ const set: Set<string | typeof VERSION_NEUTRAL> = new Set(values);
16
+ const array: Array<string | typeof VERSION_NEUTRAL> =
17
+ set.size === 0
18
+ ? cast(project.input.versioning?.defaultVersion)
19
+ : Array.from(set);
20
+ return !!array?.length
21
+ ? array.map((x) =>
22
+ typeof x === "symbol"
23
+ ? ""
24
+ : `${project.input.versioning!.prefix}${x}`,
25
+ )
26
+ : [];
27
+ };
28
+ }
@@ -1,11 +1,11 @@
1
- import { MetadataFactory } from "../internal/legacy";
2
-
3
- /**
4
- * Validator slot reserved for `@TypedHeaders` per-field SDK-side checks.
5
- * Returns `[]` because the typia native transform already enforces the
6
- * "atomic-or-array-of-atomic" constraint at compile time, and `MetadataFactory.validate`
7
- * — the only call site — is itself a passthrough on the v13 runtime.
8
- */
9
- export namespace HttpHeadersValidator {
10
- export const validate: MetadataFactory.Validator = () => [];
11
- }
1
+ import { MetadataFactory } from "../internal/legacy";
2
+
3
+ /**
4
+ * Validator slot reserved for `@TypedHeaders` per-field SDK-side checks.
5
+ * Returns `[]` because the typia native transform already enforces the
6
+ * "atomic-or-array-of-atomic" constraint at compile time, and `MetadataFactory.validate`
7
+ * — the only call site — is itself a passthrough on the v13 runtime.
8
+ */
9
+ export namespace HttpHeadersValidator {
10
+ export const validate: MetadataFactory.Validator = () => [];
11
+ }
@@ -1,11 +1,11 @@
1
- import { MetadataFactory } from "../internal/legacy";
2
-
3
- /**
4
- * Validator slot reserved for `@TypedQuery` per-field SDK-side checks.
5
- * Returns `[]` because the typia native transform already enforces the
6
- * atomic-only constraint at compile time, and `MetadataFactory.validate` —
7
- * the only call site — is itself a passthrough on the v13 runtime.
8
- */
9
- export namespace HttpQueryValidator {
10
- export const validate: MetadataFactory.Validator = () => [];
11
- }
1
+ import { MetadataFactory } from "../internal/legacy";
2
+
3
+ /**
4
+ * Validator slot reserved for `@TypedQuery` per-field SDK-side checks.
5
+ * Returns `[]` because the typia native transform already enforces the
6
+ * atomic-only constraint at compile time, and `MetadataFactory.validate` —
7
+ * the only call site — is itself a passthrough on the v13 runtime.
8
+ */
9
+ export namespace HttpQueryValidator {
10
+ export const validate: MetadataFactory.Validator = () => [];
11
+ }
@@ -1,17 +1,17 @@
1
- import { MetadataSchema, sizeOf } from "../internal/legacy";
2
-
3
- export namespace TextPlainValidator {
4
- export const validate = (props: { metadata: MetadataSchema }): string[] => {
5
- const expected: number =
6
- props.metadata.atomics.filter((a) => a.type === "string").length +
7
- props.metadata.constants
8
- .filter((c) => c.type === "string")
9
- .map((c) => c.values.length)
10
- .reduce((a, b) => a + b, 0) +
11
- props.metadata.templates.length +
12
- props.metadata.natives.filter((n) => n.name === "String").length;
13
- if (sizeOf(props.metadata) === 0 || sizeOf(props.metadata) !== expected)
14
- return [`Only string type is allowed in the "text/plain" content type.`];
15
- return [];
16
- };
17
- }
1
+ import { MetadataSchema, sizeOf } from "../internal/legacy";
2
+
3
+ export namespace TextPlainValidator {
4
+ export const validate = (props: { metadata: MetadataSchema }): string[] => {
5
+ const expected: number =
6
+ props.metadata.atomics.filter((a) => a.type === "string").length +
7
+ props.metadata.constants
8
+ .filter((c) => c.type === "string")
9
+ .map((c) => c.values.length)
10
+ .reduce((a, b) => a + b, 0) +
11
+ props.metadata.templates.length +
12
+ props.metadata.natives.filter((n) => n.name === "String").length;
13
+ if (sizeOf(props.metadata) === 0 || sizeOf(props.metadata) !== expected)
14
+ return [`Only string type is allowed in the "text/plain" content type.`];
15
+ return [];
16
+ };
17
+ }