@boristype/bt-cli 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/build/builder/config.js +88 -0
  4. package/build/cli/commands/artifact.js +14 -0
  5. package/build/cli/commands/build.js +25 -0
  6. package/build/cli/commands/dev.js +190 -0
  7. package/build/cli/commands/index.js +18 -0
  8. package/build/cli/commands/init.js +15 -0
  9. package/build/cli/commands/link.js +18 -0
  10. package/build/cli/commands/push.js +28 -0
  11. package/build/cli/index.js +14 -0
  12. package/build/cli/types.js +2 -0
  13. package/build/core/artifacting/context.js +54 -0
  14. package/build/core/artifacting/index.js +37 -0
  15. package/build/core/artifacting/stages/index.js +10 -0
  16. package/build/core/artifacting/stages/main-archive.js +72 -0
  17. package/build/core/artifacting/stages/validate.js +70 -0
  18. package/build/core/artifacting/types.js +6 -0
  19. package/build/core/artifacting/utils/index.js +10 -0
  20. package/build/core/artifacting/utils/zip.js +94 -0
  21. package/build/core/babel.js +96 -0
  22. package/build/core/btconfig.types.js +6 -0
  23. package/build/core/build.js +280 -0
  24. package/build/core/building/compile-mode.js +146 -0
  25. package/build/core/building/compiler.js +281 -0
  26. package/build/core/building/coordinator.js +71 -0
  27. package/build/core/building/files.js +290 -0
  28. package/build/core/building/index.js +102 -0
  29. package/build/core/building/output.js +92 -0
  30. package/build/core/building/transformers.js +110 -0
  31. package/build/core/building/types.js +19 -0
  32. package/build/core/config.js +157 -0
  33. package/build/core/dependencies.js +223 -0
  34. package/build/core/linking/cache.js +260 -0
  35. package/build/core/linking/context.js +149 -0
  36. package/build/core/linking/dependencies.js +240 -0
  37. package/build/core/linking/executables.js +61 -0
  38. package/build/core/linking/generators/api-ext.js +57 -0
  39. package/build/core/linking/generators/component.js +83 -0
  40. package/build/core/linking/generators/filemap.js +53 -0
  41. package/build/core/linking/generators/index.js +21 -0
  42. package/build/core/linking/generators/init-xml.js +37 -0
  43. package/build/core/linking/generators/package-json.js +50 -0
  44. package/build/core/linking/index.js +213 -0
  45. package/build/core/linking/linkers/component.js +175 -0
  46. package/build/core/linking/linkers/index.js +69 -0
  47. package/build/core/linking/linkers/standalone.js +144 -0
  48. package/build/core/linking/linkers/system.js +86 -0
  49. package/build/core/linking/parsers.js +278 -0
  50. package/build/core/linking/types.js +6 -0
  51. package/build/core/linking/utils/copy.js +101 -0
  52. package/build/core/linking/utils/index.js +26 -0
  53. package/build/core/linking/utils/node-modules.js +226 -0
  54. package/build/core/linking/utils/package-type.js +101 -0
  55. package/build/core/linking/utils/url.js +73 -0
  56. package/build/core/linking/utils/write.js +91 -0
  57. package/build/core/logger.js +10 -0
  58. package/build/core/pushing/config.js +90 -0
  59. package/build/core/pushing/index.js +96 -0
  60. package/build/core/pushing/init-scripts.js +173 -0
  61. package/build/core/pushing/queue.js +95 -0
  62. package/build/core/pushing/reinit.js +61 -0
  63. package/build/core/pushing/session.js +167 -0
  64. package/build/core/pushing/types.js +6 -0
  65. package/build/core/pushing/upload.js +35 -0
  66. package/build/core/tsconfig.js +78 -0
  67. package/build/core/utils/index.js +17 -0
  68. package/build/core/utils/logger.js +46 -0
  69. package/build/core/utils/properties.js +81 -0
  70. package/build/core/utils/xml.js +44 -0
  71. package/build/core/utils.js +59 -0
  72. package/build/index.js +76 -0
  73. package/build/plugins/destructuring.js +83 -0
  74. package/build/plugins/forOfToForIn.js +14 -0
  75. package/build/plugins/loopHoistVariables.js +160 -0
  76. package/build/plugins/precedence.js +172 -0
  77. package/build/plugins/removeImportExport.js +42 -0
  78. package/build/plugins/replaceDollar.js +16 -0
  79. package/build/plugins/spreadArray.js +42 -0
  80. package/build/plugins/spreadObject.js +91 -0
  81. package/build/transformers/arrayFunctional.js +467 -0
  82. package/build/transformers/arrayGeneral.js +222 -0
  83. package/build/transformers/blockScoping.js +212 -0
  84. package/build/transformers/destructuring.js +133 -0
  85. package/build/transformers/dirname.js +79 -0
  86. package/build/transformers/enumsToObjects.js +25 -0
  87. package/build/transformers/execObj.js +220 -0
  88. package/build/transformers/forOfToForIn.js +45 -0
  89. package/build/transformers/funcSemantic.js +113 -0
  90. package/build/transformers/functions.js +270 -0
  91. package/build/transformers/globalCache.js +34 -0
  92. package/build/transformers/loopHoistVariables.js +352 -0
  93. package/build/transformers/math.js +39 -0
  94. package/build/transformers/namespaces.js +22 -0
  95. package/build/transformers/numericSeparator.js +46 -0
  96. package/build/transformers/objectProperties.js +54 -0
  97. package/build/transformers/precedence.js +192 -0
  98. package/build/transformers/propSemantic.js +467 -0
  99. package/build/transformers/remodule.js +620 -0
  100. package/build/transformers/removeImportExport.js +135 -0
  101. package/build/transformers/replaceDollar.js +46 -0
  102. package/build/transformers/shorthandProperties.js +34 -0
  103. package/build/transformers/spreadArray.js +68 -0
  104. package/build/transformers/spreadObject.js +134 -0
  105. package/build/transformers/string.js +138 -0
  106. package/build/transformers/templateLiterals.js +104 -0
  107. package/build/transformers/tocodelibrary.js +178 -0
  108. package/build/transformers/utils.js +202 -0
  109. package/build/wshcm/client.js +193 -0
  110. package/build/wshcm/evaluator.js +111 -0
  111. package/build/wshcm/exceptions.js +25 -0
  112. package/build/wshcm/index.js +20 -0
  113. package/build/wshcm/soap-utils.js +228 -0
  114. package/build/wshcm/types.js +2 -0
  115. package/build/wshcm/uploader.js +320 -0
  116. package/package.json +51 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enumsToObjectsTransformer = enumsToObjectsTransformer;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ function enumsToObjectsTransformer() {
9
+ return (context) => (sourceFile) => {
10
+ function visit(node) {
11
+ if (typescript_1.default.isEnumDeclaration(node)) {
12
+ const members = node.members.map((member, index) => {
13
+ const name = member.name;
14
+ const initializer = member.initializer || typescript_1.default.factory.createNumericLiteral(index);
15
+ return typescript_1.default.factory.createPropertyAssignment(name, initializer);
16
+ });
17
+ return typescript_1.default.factory.createVariableStatement([], [
18
+ typescript_1.default.factory.createVariableDeclaration(node.name, undefined, undefined, typescript_1.default.factory.createObjectLiteralExpression(members, true))
19
+ ]);
20
+ }
21
+ return typescript_1.default.visitEachChild(node, visit, context);
22
+ }
23
+ return typescript_1.default.visitNode(sourceFile, visit);
24
+ };
25
+ }
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.execObjTransformer = execObjTransformer;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ const utils_1 = require("./utils");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_fs_1 = __importDefault(require("node:fs"));
11
+ // Специальные объекты из @boristype/types
12
+ const EXECUTABLE_OBJECTS = new Set([
13
+ 'remoteAction',
14
+ 'remoteCollection',
15
+ 'systemEventHandler',
16
+ 'serverAgent',
17
+ 'codeLibrary',
18
+ 'statisticRec'
19
+ ]);
20
+ // Маппинг типов TypeScript на функции преобразования
21
+ const TYPE_CONVERTERS = {
22
+ 'string': 'String',
23
+ 'number': 'OptInt',
24
+ 'boolean': 'tools_web.is_true'
25
+ };
26
+ function getCurrentPackageFile(program) {
27
+ let projectRoot = program.getCurrentDirectory();
28
+ let packageJsonPath = node_path_1.default.join(projectRoot, 'package.json');
29
+ // Если не нашли, идем вверх по директориям
30
+ while (!node_fs_1.default.existsSync(packageJsonPath) && projectRoot !== node_path_1.default.dirname(projectRoot)) {
31
+ projectRoot = node_path_1.default.dirname(projectRoot);
32
+ packageJsonPath = node_path_1.default.join(projectRoot, 'package.json');
33
+ }
34
+ if (node_fs_1.default.existsSync(packageJsonPath)) {
35
+ const packageJson = JSON.parse(node_fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
36
+ return packageJson;
37
+ }
38
+ return null;
39
+ }
40
+ function execObjTransformer(program, executables) {
41
+ const packageJson = getCurrentPackageFile(program);
42
+ // console.log('ExecObj Transformer initialized');
43
+ // console.log(`Output directory: ${getOutputDirectory(program)}`);
44
+ // console.log(`Package: ${packageJson.name} ${packageJson.version}`);
45
+ // const executables: ExecutableObjectSourceFileInfo[] = [];
46
+ // '<package.name>+<package.version>+/src/agents/myAgent.ts':
47
+ return (context) => (sourceFile) => {
48
+ // console.log(`Processing file: ${sourceFile.fileName}`);
49
+ const factory = context.factory;
50
+ let hasExecutableObjects = false;
51
+ const importedObjects = new Set();
52
+ // Первый проход: проверяем наличие импортов executable objects
53
+ function checkImports(node) {
54
+ if (typescript_1.default.isImportDeclaration(node)) {
55
+ const moduleSpecifier = node.moduleSpecifier;
56
+ if (typescript_1.default.isStringLiteral(moduleSpecifier) && moduleSpecifier.text.startsWith('@boristype/types')) {
57
+ if (node.importClause?.namedBindings && typescript_1.default.isNamedImports(node.importClause.namedBindings)) {
58
+ for (const element of node.importClause.namedBindings.elements) {
59
+ const importName = element.name.text;
60
+ if (EXECUTABLE_OBJECTS.has(importName)) {
61
+ importedObjects.add(importName);
62
+ hasExecutableObjects = true;
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ typescript_1.default.forEachChild(node, checkImports);
69
+ }
70
+ checkImports(sourceFile);
71
+ // Если нет executable objects, пропускаем файл
72
+ if (!hasExecutableObjects) {
73
+ return sourceFile;
74
+ }
75
+ executables.push({
76
+ packageName: packageJson.name,
77
+ packageVersion: packageJson.version,
78
+ filePath: sourceFile.fileName,
79
+ });
80
+ // Помечаем sourceFile как executable
81
+ (0, utils_1.markExecutableObject)(sourceFile);
82
+ (0, utils_1.setExecutableObjectKey)(sourceFile, `${packageJson.name}+${packageJson.version}+${sourceFile.fileName}`);
83
+ // Счетчик для уникальных имен переменных
84
+ let tempVarCounter = 0;
85
+ // Второй проход: трансформируем код
86
+ function visit(node) {
87
+ // Удаляем импорты executable objects из @boristype/types
88
+ if (typescript_1.default.isImportDeclaration(node)) {
89
+ const moduleSpecifier = node.moduleSpecifier;
90
+ if (typescript_1.default.isStringLiteral(moduleSpecifier) && moduleSpecifier.text.startsWith('@boristype/types')) {
91
+ if (node.importClause?.namedBindings && typescript_1.default.isNamedImports(node.importClause.namedBindings)) {
92
+ // Фильтруем импорты, оставляя только те, которые не являются executable objects
93
+ const filteredElements = node.importClause.namedBindings.elements.filter(element => !EXECUTABLE_OBJECTS.has(element.name.text));
94
+ // Если все импорты были executable objects, удаляем весь import statement
95
+ if (filteredElements.length === 0) {
96
+ return [];
97
+ }
98
+ // Если остались другие импорты, создаем новый import statement без executable objects
99
+ if (filteredElements.length < node.importClause.namedBindings.elements.length) {
100
+ return factory.updateImportDeclaration(node, node.modifiers, factory.updateImportClause(node.importClause, node.importClause.isTypeOnly, node.importClause.name, factory.updateNamedImports(node.importClause.namedBindings, filteredElements)), node.moduleSpecifier, node.assertClause);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ // Удаляем вызовы .use() на EXECUTABLE_OBJECTS (например, serverAgent.use())
106
+ if (typescript_1.default.isExpressionStatement(node)) {
107
+ const expr = node.expression;
108
+ if (typescript_1.default.isCallExpression(expr) && typescript_1.default.isPropertyAccessExpression(expr.expression)) {
109
+ const propAccess = expr.expression;
110
+ if (typescript_1.default.isIdentifier(propAccess.expression) &&
111
+ importedObjects.has(propAccess.expression.text) &&
112
+ typescript_1.default.isIdentifier(propAccess.name) &&
113
+ propAccess.name.text === 'use') {
114
+ // Удаляем этот statement
115
+ return [];
116
+ }
117
+ }
118
+ }
119
+ // Обрабатываем variable statement с serverAgent.getVar
120
+ if (typescript_1.default.isVariableStatement(node)) {
121
+ const extraStatements = [];
122
+ const declarations = [];
123
+ for (const decl of node.declarationList.declarations) {
124
+ if (decl.initializer && typescript_1.default.isCallExpression(decl.initializer)) {
125
+ const callExpr = decl.initializer;
126
+ // Проверяем serverAgent.getVar<T>(...)
127
+ if (typescript_1.default.isPropertyAccessExpression(callExpr.expression)) {
128
+ const propAccess = callExpr.expression;
129
+ if (typescript_1.default.isIdentifier(propAccess.expression) &&
130
+ importedObjects.has(propAccess.expression.text) &&
131
+ typescript_1.default.isIdentifier(propAccess.name)) {
132
+ const objectName = propAccess.expression.text;
133
+ const methodName = propAccess.name.text;
134
+ // Обрабатываем serverAgent.getVar
135
+ if (objectName === 'serverAgent' && methodName === 'getVar') {
136
+ const transformed = transformServerAgentGetVar(decl, callExpr);
137
+ if (transformed) {
138
+ extraStatements.push(...transformed.statements);
139
+ declarations.push(transformed.declaration);
140
+ continue;
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+ // Если не трансформировали, оставляем как есть
147
+ declarations.push(decl);
148
+ }
149
+ const result = [];
150
+ // Добавляем extra statements
151
+ if (extraStatements.length > 0) {
152
+ result.push(...extraStatements);
153
+ }
154
+ // Создаем variable statement с оставшимися декларациями
155
+ if (declarations.length > 0) {
156
+ result.push(factory.createVariableStatement(node.modifiers, factory.createVariableDeclarationList(declarations, node.declarationList.flags)));
157
+ }
158
+ return result.length > 0 ? result : node;
159
+ }
160
+ return typescript_1.default.visitEachChild(node, visit, context);
161
+ }
162
+ // Трансформирует serverAgent.getVar<T>(name, errorMessage)
163
+ function transformServerAgentGetVar(originalDecl, callExpr) {
164
+ if (!typescript_1.default.isIdentifier(originalDecl.name)) {
165
+ return null;
166
+ }
167
+ const varName = originalDecl.name.text;
168
+ const args = callExpr.arguments;
169
+ if (args.length === 0 || !typescript_1.default.isStringLiteral(args[0])) {
170
+ return null;
171
+ }
172
+ const parameterName = args[0].text;
173
+ const errorMessage = args.length > 1 && typescript_1.default.isStringLiteral(args[1])
174
+ ? args[1].text
175
+ : `${parameterName} parameter is required`;
176
+ // Определяем тип из type arguments
177
+ let typeConverter = 'String'; // default
178
+ if (callExpr.typeArguments && callExpr.typeArguments.length > 0) {
179
+ const typeArg = callExpr.typeArguments[0];
180
+ if (typescript_1.default.isTypeReferenceNode(typeArg) && typescript_1.default.isIdentifier(typeArg.typeName)) {
181
+ const typeName = typeArg.typeName.text;
182
+ typeConverter = TYPE_CONVERTERS[typeName] || 'String';
183
+ }
184
+ else if (typeArg.kind === typescript_1.default.SyntaxKind.StringKeyword) {
185
+ typeConverter = 'String';
186
+ }
187
+ else if (typeArg.kind === typescript_1.default.SyntaxKind.NumberKeyword) {
188
+ typeConverter = 'OptInt';
189
+ }
190
+ else if (typeArg.kind === typescript_1.default.SyntaxKind.BooleanKeyword) {
191
+ typeConverter = 'tools_web.is_true';
192
+ }
193
+ }
194
+ const tempVarName = `serverAgentParam_${parameterName.replace(/[^a-zA-Z0-9_]/g, '_')}`;
195
+ const statements = [];
196
+ // var serverAgentParam_personId = undefined;
197
+ statements.push(factory.createVariableStatement(undefined, factory.createVariableDeclarationList([factory.createVariableDeclaration(tempVarName, undefined, undefined, factory.createIdentifier('undefined'))], typescript_1.default.NodeFlags.None)));
198
+ // serverAgentParam_personId = OptInt(Param.GetOptProperty("person_id"));
199
+ statements.push(factory.createExpressionStatement(factory.createAssignment(factory.createIdentifier(tempVarName), factory.createCallExpression(factory.createIdentifier(typeConverter), undefined, [
200
+ (0, utils_1.markUntouchable)(factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier('Param'), 'GetOptProperty'), undefined, [factory.createStringLiteral(parameterName)]))
201
+ ]))));
202
+ // if (serverAgentParam_personId === undefined) { throw "error message"; }
203
+ statements.push(factory.createIfStatement(factory.createBinaryExpression(factory.createIdentifier(tempVarName), factory.createToken(typescript_1.default.SyntaxKind.EqualsEqualsEqualsToken), factory.createIdentifier('undefined')), factory.createBlock([
204
+ factory.createThrowStatement(factory.createStringLiteral(errorMessage))
205
+ ], true)));
206
+ // const varName = tempVarName;
207
+ const newDeclaration = factory.createVariableDeclaration(originalDecl.name, originalDecl.exclamationToken, originalDecl.type, factory.createIdentifier(tempVarName));
208
+ return {
209
+ statements,
210
+ declaration: newDeclaration
211
+ };
212
+ }
213
+ const transformed = (0, utils_1.setParentNodes)(typescript_1.default.visitNode(sourceFile, visit), sourceFile);
214
+ // Если это массив statements, нужно создать новый sourceFile
215
+ if (Array.isArray(transformed)) {
216
+ return (0, utils_1.preserveSymbolsFrom)(factory.updateSourceFile(sourceFile, transformed), sourceFile);
217
+ }
218
+ return (0, utils_1.preserveSymbolsFrom)(transformed, sourceFile);
219
+ };
220
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.forOfToForInTransformer = forOfToForInTransformer;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ /**
9
+ * Трансформер для преобразования циклов for-of в for-in.
10
+ *
11
+ * В BorisScript нет for-of, но for-in работает по индексам массива,
12
+ * что эквивалентно поведению for-of для массивов.
13
+ *
14
+ * @example
15
+ * // Вход:
16
+ * for (const item of items) {
17
+ * console.log(item);
18
+ * }
19
+ *
20
+ * // Выход:
21
+ * for (const item in items) {
22
+ * console.log(item);
23
+ * }
24
+ *
25
+ * @returns TypeScript transformer factory
26
+ */
27
+ function forOfToForInTransformer() {
28
+ return (context) => {
29
+ return (sourceFile) => {
30
+ const visitor = (node) => {
31
+ // Обрабатываем for-of циклы
32
+ if (typescript_1.default.isForOfStatement(node)) {
33
+ // Рекурсивно обрабатываем дочерние узлы
34
+ const visitedInitializer = typescript_1.default.visitNode(node.initializer, visitor);
35
+ const visitedExpression = typescript_1.default.visitNode(node.expression, visitor);
36
+ const visitedStatement = typescript_1.default.visitNode(node.statement, visitor);
37
+ // Создаём for-in вместо for-of
38
+ return typescript_1.default.factory.createForInStatement(visitedInitializer, visitedExpression, visitedStatement);
39
+ }
40
+ return typescript_1.default.visitEachChild(node, visitor, context);
41
+ };
42
+ return typescript_1.default.visitNode(sourceFile, visitor);
43
+ };
44
+ };
45
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.funcSemanticTransformer = funcSemanticTransformer;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ const utils_1 = require("./utils");
9
+ // Helper function to create argument restoration statements
10
+ function createArgumentRestorationStatements(parameters) {
11
+ const statements = [];
12
+ let normalParamIndex = 0;
13
+ parameters.forEach((param, index) => {
14
+ const paramName = param.name.text;
15
+ if (param.dotDotDotToken) {
16
+ // Rest parameter: use bt.array_rest(arguments, startIndex)
17
+ const restCall = typescript_1.default.factory.createCallExpression((0, utils_1.markUntouchable)(typescript_1.default.factory.createPropertyAccessExpression(typescript_1.default.factory.createIdentifier('bt'), typescript_1.default.factory.createIdentifier('array_rest'))), undefined, [
18
+ typescript_1.default.factory.createIdentifier('__arguments'),
19
+ typescript_1.default.factory.createNumericLiteral(normalParamIndex)
20
+ ]);
21
+ statements.push(typescript_1.default.factory.createVariableStatement(undefined, typescript_1.default.factory.createVariableDeclarationList([typescript_1.default.factory.createVariableDeclaration(typescript_1.default.factory.createIdentifier(paramName), undefined, undefined, restCall)], typescript_1.default.NodeFlags.Let)));
22
+ }
23
+ else {
24
+ // Normal parameter: restore from arguments[index] or undefined
25
+ // __arguments.length > index ? __arguments[index] : undefined
26
+ statements.push(typescript_1.default.factory.createVariableStatement(undefined, typescript_1.default.factory.createVariableDeclarationList([typescript_1.default.factory.createVariableDeclaration(typescript_1.default.factory.createIdentifier(paramName), undefined, undefined, typescript_1.default.factory.createConditionalExpression(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createPropertyAccessExpression((0, utils_1.markUntouchable)(typescript_1.default.factory.createIdentifier('__arguments')), typescript_1.default.factory.createIdentifier('length')), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.GreaterThanToken), typescript_1.default.factory.createNumericLiteral(normalParamIndex)), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), typescript_1.default.factory.createElementAccessExpression(typescript_1.default.factory.createIdentifier('__arguments'), typescript_1.default.factory.createNumericLiteral(normalParamIndex)), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.ColonToken), typescript_1.default.factory.createIdentifier('undefined')))], typescript_1.default.NodeFlags.Let)));
27
+ normalParamIndex++;
28
+ }
29
+ });
30
+ return statements;
31
+ }
32
+ // Helper function to transform function body with argument restoration
33
+ function transformFunctionBody(body, parameters) {
34
+ if (!body || parameters.length === 0) {
35
+ return body;
36
+ }
37
+ const argRestoration = createArgumentRestorationStatements(parameters);
38
+ return typescript_1.default.factory.createBlock([...argRestoration, ...body.statements], true);
39
+ }
40
+ // Helper function to create function parameters (__env, __this, __arguments)
41
+ function createFunctionParameters() {
42
+ return [
43
+ typescript_1.default.factory.createParameterDeclaration(undefined, undefined, typescript_1.default.factory.createIdentifier('__env'), undefined, undefined, undefined),
44
+ typescript_1.default.factory.createParameterDeclaration(undefined, undefined, typescript_1.default.factory.createIdentifier('__this'), undefined, undefined, undefined),
45
+ typescript_1.default.factory.createParameterDeclaration(undefined, undefined, typescript_1.default.factory.createIdentifier('__arguments'), undefined, undefined, undefined)
46
+ ];
47
+ }
48
+ function funcSemanticTransformer() {
49
+ return (context) => {
50
+ return (sourceFile) => {
51
+ const visitor = (node) => {
52
+ // Transform function declarations
53
+ if (typescript_1.default.isFunctionDeclaration(node)) {
54
+ const visitedBody = typescript_1.default.visitEachChild(node.body, visitor, context);
55
+ const newBody = transformFunctionBody(visitedBody, node.parameters);
56
+ return typescript_1.default.factory.updateFunctionDeclaration(node, node.modifiers, node.asteriskToken, node.name, node.typeParameters, createFunctionParameters(), node.type, newBody);
57
+ }
58
+ // // Transform function expressions
59
+ // if (ts.isFunctionExpression(node)) {
60
+ // const newBody = transformFunctionBody(node.body, node.parameters);
61
+ // return ts.factory.updateFunctionExpression(
62
+ // node,
63
+ // node.modifiers,
64
+ // node.asteriskToken,
65
+ // node.name,
66
+ // node.typeParameters,
67
+ // createFunctionParameters(),
68
+ // node.type,
69
+ // newBody!
70
+ // );
71
+ // }
72
+ // // Transform arrow functions
73
+ // if (ts.isArrowFunction(node)) {
74
+ // let functionBody: ts.Block;
75
+ // if (ts.isBlock(node.body)) {
76
+ // functionBody = node.body;
77
+ // } else {
78
+ // functionBody = ts.factory.createBlock([
79
+ // ts.factory.createReturnStatement(node.body as ts.Expression)
80
+ // ]);
81
+ // }
82
+ // const newBody = transformFunctionBody(functionBody, node.parameters)!;
83
+ // return ts.factory.updateArrowFunction(
84
+ // node,
85
+ // node.modifiers,
86
+ // node.typeParameters,
87
+ // createFunctionParameters(),
88
+ // node.type,
89
+ // node.equalsGreaterThanToken,
90
+ // newBody
91
+ // );
92
+ // }
93
+ // // Transform method declarations
94
+ // if (ts.isMethodDeclaration(node)) {
95
+ // const newBody = transformFunctionBody(node.body, node.parameters);
96
+ // return ts.factory.updateMethodDeclaration(
97
+ // node,
98
+ // node.modifiers,
99
+ // node.asteriskToken,
100
+ // node.name,
101
+ // node.questionToken,
102
+ // node.typeParameters,
103
+ // createFunctionParameters(),
104
+ // node.type,
105
+ // newBody
106
+ // );
107
+ // }
108
+ return typescript_1.default.visitEachChild(node, visitor, context);
109
+ };
110
+ return (0, utils_1.preserveSymbolsFrom)((0, utils_1.setParentNodes)(typescript_1.default.visitNode(sourceFile, visitor), sourceFile), sourceFile);
111
+ };
112
+ };
113
+ }