@uipath/packager-tool-functions 0.0.7

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.
@@ -0,0 +1,9 @@
1
+ import { type IFileSystem, type IProjectToolFactory, type IToolLogger, type ProjectTool, type ProjectType } from "@uipath/solutionpackager-tool-core";
2
+ /**
3
+ * Factory for creating JS Functions project tools.
4
+ * Handles projects with projectType "Function".
5
+ */
6
+ export declare class FunctionsToolFactory implements IProjectToolFactory {
7
+ readonly supportedTypes: readonly ProjectType[];
8
+ createAsync(logger: IToolLogger, fileSystem: IFileSystem): Promise<ProjectTool>;
9
+ }
@@ -0,0 +1,18 @@
1
+ import type { IProjectBuildOptions, IProjectPackOptions, IProjectRestoreOptions, IProjectValidateOptions } from "@uipath/solutionpackager-tool-core";
2
+ import { type IFileSystem, type IToolLogger, ProjectTool, ToolResult } from "@uipath/solutionpackager-tool-core";
3
+ export declare class FunctionsTool extends ProjectTool {
4
+ private readonly _temporaryStorage;
5
+ constructor(fileSystem: IFileSystem, logger: IToolLogger);
6
+ restoreAsync(_options: IProjectRestoreOptions, _cancellationToken?: AbortSignal): Promise<ToolResult>;
7
+ validateAsync(_options: IProjectValidateOptions, _cancellationToken?: AbortSignal): Promise<ToolResult>;
8
+ buildAsync(options: IProjectBuildOptions, _cancellationToken?: AbortSignal): Promise<ToolResult>;
9
+ packAsync(options: IProjectPackOptions, cancellationToken?: AbortSignal): Promise<ToolResult>;
10
+ dispose(): Promise<void>;
11
+ private detectRuntime;
12
+ private copyFiles;
13
+ private isExcluded;
14
+ private createOperateFile;
15
+ private createOperateJsonFile;
16
+ private createPackageDescriptor;
17
+ private addFileToDescriptor;
18
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,193 @@
1
+ // src/index.ts
2
+ import { toolsFactoryRepository } from "@uipath/solutionpackager-tool-core";
3
+
4
+ // src/functions-tool-factory.ts
5
+ import {
6
+ ProjectTypes
7
+ } from "@uipath/solutionpackager-tool-core";
8
+
9
+ // src/functions-tool.ts
10
+ import {
11
+ NugetConstants,
12
+ NugetPackager,
13
+ Path,
14
+ ProjectTool,
15
+ TemporaryStorageService,
16
+ ToolErrorCodes,
17
+ ToolResult
18
+ } from "@uipath/solutionpackager-tool-core";
19
+ var EXCLUDED_NAMES = new Set([".deno", ".env"]);
20
+ var EXCLUDED_EXTENSIONS = [".nupkg"];
21
+ var EXTENSION_TO_RUNTIME = {
22
+ ".ts": "javascript",
23
+ ".js": "javascript",
24
+ ".py": "python"
25
+ };
26
+ var DEFAULT_RUNTIME = "javascript";
27
+
28
+ class FunctionsTool extends ProjectTool {
29
+ _temporaryStorage;
30
+ constructor(fileSystem, logger) {
31
+ super(fileSystem, logger);
32
+ this._temporaryStorage = new TemporaryStorageService(fileSystem);
33
+ }
34
+ async restoreAsync(_options, _cancellationToken) {
35
+ this.logger.info("Restore not required for Functions projects.");
36
+ return ToolResult.success();
37
+ }
38
+ async validateAsync(_options, _cancellationToken) {
39
+ this.logger.info("Validate not required for Functions projects.");
40
+ return ToolResult.success();
41
+ }
42
+ async buildAsync(options, _cancellationToken) {
43
+ const tempFolder = await this._temporaryStorage.getTempFolderPath();
44
+ const localBuildFolder = Path.join(tempFolder, NugetConstants.OutputFolderName);
45
+ const contentFolder = Path.join(localBuildFolder, NugetConstants.ContentFolderName);
46
+ try {
47
+ this.logger.progress("Copying project files...");
48
+ await this.copyFiles(options.projectPath, contentFolder);
49
+ this.logger.progress("Creating operate.json...");
50
+ await this.createOperateFile(options, contentFolder);
51
+ this.logger.progress("Creating package-descriptor.json...");
52
+ await this.createPackageDescriptor(localBuildFolder);
53
+ return new ToolResult(ToolErrorCodes.Success, "Build completed successfully.", [localBuildFolder]);
54
+ } catch (error) {
55
+ const errorMessage = error instanceof Error ? error.toString() : String(error);
56
+ this.logger.error(errorMessage);
57
+ return ToolResult.error(ToolErrorCodes.InternalError, "Build failed for Functions project.");
58
+ }
59
+ }
60
+ async packAsync(options, cancellationToken) {
61
+ const buildResult = await this.buildAsync(options, cancellationToken);
62
+ if (!buildResult.isSuccess) {
63
+ return buildResult;
64
+ }
65
+ const localBuildFolder = buildResult.packages[0];
66
+ try {
67
+ this.logger.progress("Creating NuGet package...");
68
+ const nupkgFileName = `${options.package.id}.${options.package.version}.nupkg`;
69
+ const nupkgPath = Path.join(options.outputPath, nupkgFileName);
70
+ const packager = new NugetPackager(this.fileSystem);
71
+ const result = await packager.packAsync(localBuildFolder, options.package, nupkgPath);
72
+ this.logger.progress("Package created successfully.");
73
+ return new ToolResult(ToolErrorCodes.Success, "Pack completed successfully.", [result.outputPath]);
74
+ } catch (error) {
75
+ const errorMessage = error instanceof Error ? error.toString() : String(error);
76
+ this.logger.error(errorMessage);
77
+ return ToolResult.error(ToolErrorCodes.InternalError, "Pack failed for Functions project.");
78
+ }
79
+ }
80
+ async dispose() {
81
+ this.logger.info("Disposing Functions Tool");
82
+ try {
83
+ await this._temporaryStorage.cleanup();
84
+ } catch {}
85
+ }
86
+ async detectRuntime(projectPath) {
87
+ const uipathJsonPath = Path.join(projectPath, "uipath.json");
88
+ const content = await this.fileSystem.readFile(uipathJsonPath);
89
+ if (content) {
90
+ try {
91
+ const uipathJson = JSON.parse(new TextDecoder().decode(content));
92
+ const functions = uipathJson?.functions;
93
+ const firstEntry = functions ? Object.values(functions)[0] : undefined;
94
+ if (firstEntry) {
95
+ const filePath = firstEntry.split(":")[0];
96
+ const ext = filePath.slice(filePath.lastIndexOf("."));
97
+ const runtime = EXTENSION_TO_RUNTIME[ext];
98
+ if (runtime) {
99
+ return runtime;
100
+ }
101
+ }
102
+ } catch {}
103
+ }
104
+ return DEFAULT_RUNTIME;
105
+ }
106
+ async copyFiles(sourcePath, destinationPath) {
107
+ await this.fileSystem.mkdir(destinationPath);
108
+ const entries = await this.fileSystem.readdir(sourcePath);
109
+ for (const entry of entries) {
110
+ if (this.isExcluded(entry)) {
111
+ continue;
112
+ }
113
+ const sourceFile = Path.join(sourcePath, entry);
114
+ const destinationFile = Path.join(destinationPath, entry);
115
+ const stat = await this.fileSystem.stat(sourceFile);
116
+ if (stat?.isFile()) {
117
+ const content = await this.fileSystem.readFile(sourceFile);
118
+ if (content) {
119
+ await this.fileSystem.writeFile(destinationFile, content);
120
+ }
121
+ } else if (stat?.isDirectory()) {
122
+ await this.copyFiles(sourceFile, destinationFile);
123
+ }
124
+ }
125
+ }
126
+ isExcluded(name) {
127
+ if (EXCLUDED_NAMES.has(name)) {
128
+ return true;
129
+ }
130
+ return EXCLUDED_EXTENSIONS.some((ext) => name.endsWith(ext));
131
+ }
132
+ async createOperateFile(options, contentFolder) {
133
+ const operateJsonFilePath = Path.join(contentFolder, NugetConstants.OperateFileName);
134
+ const exists = await this.fileSystem.exists(operateJsonFilePath);
135
+ if (!exists) {
136
+ const targetRuntime = await this.detectRuntime(options.projectPath);
137
+ await this.createOperateJsonFile(contentFolder, options.projectStorageId ?? "", operateJsonFilePath, targetRuntime);
138
+ }
139
+ }
140
+ async createOperateJsonFile(contentFolder, projectId, filePath, targetRuntime) {
141
+ const entryPointsFilePath = Path.join(contentFolder, NugetConstants.EntryPointsFileName);
142
+ let mainPath = "";
143
+ const entryPointsExists = await this.fileSystem.exists(entryPointsFilePath);
144
+ if (entryPointsExists) {
145
+ const entryPointsContent = await this.fileSystem.readFile(entryPointsFilePath);
146
+ if (entryPointsContent) {
147
+ try {
148
+ const entryPointsText = new TextDecoder().decode(entryPointsContent);
149
+ const entryPoints = JSON.parse(entryPointsText);
150
+ mainPath = entryPoints.entryPoints?.[0]?.filePath ?? "";
151
+ } catch {}
152
+ }
153
+ }
154
+ const operateFileModel = {
155
+ $schema: "https://cloud.uipath.com/draft/2024-12/operate",
156
+ contentType: "function",
157
+ projectId,
158
+ main: mainPath,
159
+ targetRuntime
160
+ };
161
+ const operateJsonString = JSON.stringify(operateFileModel, null, 2);
162
+ await this.fileSystem.writeFile(filePath, operateJsonString);
163
+ }
164
+ async createPackageDescriptor(localBuildFolder) {
165
+ const packageDescriptor = {
166
+ files: {}
167
+ };
168
+ this.addFileToDescriptor(packageDescriptor, NugetConstants.OperateFileName, NugetConstants.OperateFileName);
169
+ this.addFileToDescriptor(packageDescriptor, NugetConstants.EntryPointsFileName, NugetConstants.EntryPointsFileName);
170
+ this.addFileToDescriptor(packageDescriptor, NugetConstants.BindingsFileId, NugetConstants.BindingsV2FileName);
171
+ const packageDescriptorPath = Path.join(localBuildFolder, NugetConstants.ContentFolderName, NugetConstants.PackageDescriptorFileName);
172
+ const packageDescriptorJson = JSON.stringify({
173
+ $schema: "https://cloud.uipath.com/draft/2024-12/package-descriptor",
174
+ ...packageDescriptor
175
+ }, null, 2);
176
+ await this.fileSystem.writeFile(packageDescriptorPath, packageDescriptorJson);
177
+ }
178
+ addFileToDescriptor(packageDescriptor, key, fileName) {
179
+ const relativePath = Path.join(NugetConstants.ContentFolderName, fileName);
180
+ packageDescriptor.files[key] = relativePath;
181
+ }
182
+ }
183
+
184
+ // src/functions-tool-factory.ts
185
+ class FunctionsToolFactory {
186
+ supportedTypes = [ProjectTypes.Function];
187
+ async createAsync(logger, fileSystem) {
188
+ return new FunctionsTool(fileSystem, logger);
189
+ }
190
+ }
191
+
192
+ // src/index.ts
193
+ toolsFactoryRepository.registerProjectToolFactory(new FunctionsToolFactory);
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@uipath/packager-tool-functions",
3
+ "version": "0.0.7",
4
+ "description": "UiPath Functions tool implementation",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "source": "./src/index.ts",
9
+ "default": "./dist/index.js"
10
+ }
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/UiPath/cli.git",
15
+ "directory": "packages/packager/packager-tool-functions"
16
+ },
17
+ "publishConfig": {
18
+ "registry": "https://registry.npmjs.org/"
19
+ },
20
+ "types": "./dist/index.d.ts",
21
+ "scripts": {
22
+ "build": "bun build ./src/index.ts --outdir dist --format esm --target browser --external @uipath/solutionpackager-tool-core && tsc --emitDeclarationOnly --outDir dist",
23
+ "dev": "bun build ./src/index.ts --outdir dist --format esm --target browser --external @uipath/solutionpackager-tool-core --watch",
24
+ "test": "vitest run",
25
+ "test:coverage": "vitest run --coverage",
26
+ "prepack": "bun run build",
27
+ "publish:dry": "bun publish --dry-run",
28
+ "publish:gh": "bun publish",
29
+ "version:patch": "bun version patch --no-git-tag-version",
30
+ "version:minor": "bun version minor --no-git-tag-version",
31
+ "version:major": "bun version major --no-git-tag-version",
32
+ "lint": "biome check ."
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "!dist/**/*.map",
37
+ "src"
38
+ ],
39
+ "author": "",
40
+ "license": "ISC",
41
+ "peerDependencies": {
42
+ "@uipath/solutionpackager-tool-core": "0.0.31"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^25.5.0",
46
+ "@uipath/solutionpackager-tool-core": "0.0.31",
47
+ "@vitest/coverage-v8": "^4.0.14",
48
+ "typescript": "^5.9.3",
49
+ "vitest": "^4.0.14"
50
+ }
51
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ type IFileSystem,
3
+ type IProjectToolFactory,
4
+ type IToolLogger,
5
+ type ProjectTool,
6
+ type ProjectType,
7
+ ProjectTypes,
8
+ } from "@uipath/solutionpackager-tool-core";
9
+ import { FunctionsTool } from "./functions-tool.js";
10
+
11
+ /**
12
+ * Factory for creating JS Functions project tools.
13
+ * Handles projects with projectType "Function".
14
+ */
15
+ export class FunctionsToolFactory implements IProjectToolFactory {
16
+ readonly supportedTypes: readonly ProjectType[] = [ProjectTypes.Function];
17
+
18
+ async createAsync(
19
+ logger: IToolLogger,
20
+ fileSystem: IFileSystem,
21
+ ): Promise<ProjectTool> {
22
+ return new FunctionsTool(fileSystem, logger);
23
+ }
24
+ }
@@ -0,0 +1,333 @@
1
+ import type {
2
+ EntryPointsFileModel,
3
+ IProjectBuildOptions,
4
+ IProjectPackOptions,
5
+ IProjectRestoreOptions,
6
+ IProjectValidateOptions,
7
+ PackageDescriptorFileModel,
8
+ } from "@uipath/solutionpackager-tool-core";
9
+ import {
10
+ type IFileSystem,
11
+ type IToolLogger,
12
+ NugetConstants,
13
+ NugetPackager,
14
+ Path,
15
+ ProjectTool,
16
+ TemporaryStorageService,
17
+ ToolErrorCodes,
18
+ ToolResult,
19
+ } from "@uipath/solutionpackager-tool-core";
20
+
21
+ /** File and directory names excluded from packaging. */
22
+ const EXCLUDED_NAMES = new Set([".deno", ".env"]);
23
+
24
+ /** File extensions excluded from packaging. */
25
+ const EXCLUDED_EXTENSIONS = [".nupkg"];
26
+
27
+ /** Maps a function entry-point file extension to a target runtime. */
28
+ const EXTENSION_TO_RUNTIME: Record<string, string> = {
29
+ ".ts": "javascript",
30
+ ".js": "javascript",
31
+ ".py": "python",
32
+ };
33
+
34
+ /** Fallback runtime when uipath.json cannot be read or has no functions. */
35
+ const DEFAULT_RUNTIME = "javascript";
36
+
37
+ export class FunctionsTool extends ProjectTool {
38
+ private readonly _temporaryStorage: TemporaryStorageService;
39
+
40
+ constructor(fileSystem: IFileSystem, logger: IToolLogger) {
41
+ super(fileSystem, logger);
42
+ this._temporaryStorage = new TemporaryStorageService(fileSystem);
43
+ }
44
+
45
+ override async restoreAsync(
46
+ _options: IProjectRestoreOptions,
47
+ _cancellationToken?: AbortSignal,
48
+ ): Promise<ToolResult> {
49
+ this.logger.info("Restore not required for Functions projects.");
50
+ return ToolResult.success();
51
+ }
52
+
53
+ override async validateAsync(
54
+ _options: IProjectValidateOptions,
55
+ _cancellationToken?: AbortSignal,
56
+ ): Promise<ToolResult> {
57
+ this.logger.info("Validate not required for Functions projects.");
58
+ return ToolResult.success();
59
+ }
60
+
61
+ override async buildAsync(
62
+ options: IProjectBuildOptions,
63
+ _cancellationToken?: AbortSignal,
64
+ ): Promise<ToolResult> {
65
+ const tempFolder = await this._temporaryStorage.getTempFolderPath();
66
+ const localBuildFolder = Path.join(
67
+ tempFolder,
68
+ NugetConstants.OutputFolderName,
69
+ );
70
+ const contentFolder = Path.join(
71
+ localBuildFolder,
72
+ NugetConstants.ContentFolderName,
73
+ );
74
+
75
+ try {
76
+ this.logger.progress("Copying project files...");
77
+ await this.copyFiles(options.projectPath, contentFolder);
78
+
79
+ this.logger.progress("Creating operate.json...");
80
+ await this.createOperateFile(options, contentFolder);
81
+
82
+ this.logger.progress("Creating package-descriptor.json...");
83
+ await this.createPackageDescriptor(localBuildFolder);
84
+
85
+ return new ToolResult(
86
+ ToolErrorCodes.Success,
87
+ "Build completed successfully.",
88
+ [localBuildFolder],
89
+ );
90
+ } catch (error) {
91
+ const errorMessage =
92
+ error instanceof Error ? error.toString() : String(error);
93
+ this.logger.error(errorMessage);
94
+ return ToolResult.error(
95
+ ToolErrorCodes.InternalError,
96
+ "Build failed for Functions project.",
97
+ );
98
+ }
99
+ }
100
+
101
+ override async packAsync(
102
+ options: IProjectPackOptions,
103
+ cancellationToken?: AbortSignal,
104
+ ): Promise<ToolResult> {
105
+ const buildResult = await this.buildAsync(options, cancellationToken);
106
+ if (!buildResult.isSuccess) {
107
+ return buildResult;
108
+ }
109
+
110
+ const localBuildFolder = buildResult.packages[0];
111
+
112
+ try {
113
+ this.logger.progress("Creating NuGet package...");
114
+
115
+ const nupkgFileName = `${options.package.id}.${options.package.version}.nupkg`;
116
+ const nupkgPath = Path.join(options.outputPath, nupkgFileName);
117
+
118
+ const packager = new NugetPackager(this.fileSystem);
119
+ const result = await packager.packAsync(
120
+ localBuildFolder,
121
+ options.package,
122
+ nupkgPath,
123
+ );
124
+
125
+ this.logger.progress("Package created successfully.");
126
+ return new ToolResult(
127
+ ToolErrorCodes.Success,
128
+ "Pack completed successfully.",
129
+ [result.outputPath],
130
+ );
131
+ } catch (error) {
132
+ const errorMessage =
133
+ error instanceof Error ? error.toString() : String(error);
134
+ this.logger.error(errorMessage);
135
+ return ToolResult.error(
136
+ ToolErrorCodes.InternalError,
137
+ "Pack failed for Functions project.",
138
+ );
139
+ }
140
+ }
141
+
142
+ override async dispose(): Promise<void> {
143
+ this.logger.info("Disposing Functions Tool");
144
+ try {
145
+ await this._temporaryStorage.cleanup();
146
+ } catch {
147
+ // Ignore errors during cleanup
148
+ }
149
+ }
150
+
151
+ private async detectRuntime(projectPath: string): Promise<string> {
152
+ const uipathJsonPath = Path.join(projectPath, "uipath.json");
153
+ const content = await this.fileSystem.readFile(uipathJsonPath);
154
+ if (content) {
155
+ try {
156
+ const uipathJson = JSON.parse(
157
+ new TextDecoder().decode(content as Uint8Array),
158
+ );
159
+ const functions = uipathJson?.functions as
160
+ | Record<string, string>
161
+ | undefined;
162
+ const firstEntry = functions
163
+ ? Object.values(functions)[0]
164
+ : undefined;
165
+ if (firstEntry) {
166
+ const filePath = firstEntry.split(":")[0];
167
+ const ext = filePath.slice(filePath.lastIndexOf("."));
168
+ const runtime = EXTENSION_TO_RUNTIME[ext];
169
+ if (runtime) {
170
+ return runtime;
171
+ }
172
+ }
173
+ } catch {
174
+ // Ignore parse errors, fall through to default
175
+ }
176
+ }
177
+ return DEFAULT_RUNTIME;
178
+ }
179
+
180
+ private async copyFiles(
181
+ sourcePath: string,
182
+ destinationPath: string,
183
+ ): Promise<void> {
184
+ await this.fileSystem.mkdir(destinationPath);
185
+
186
+ const entries = await this.fileSystem.readdir(sourcePath);
187
+
188
+ for (const entry of entries) {
189
+ if (this.isExcluded(entry)) {
190
+ continue;
191
+ }
192
+
193
+ const sourceFile = Path.join(sourcePath, entry);
194
+ const destinationFile = Path.join(destinationPath, entry);
195
+
196
+ const stat = await this.fileSystem.stat(sourceFile);
197
+ if (stat?.isFile()) {
198
+ const content = await this.fileSystem.readFile(sourceFile);
199
+ if (content) {
200
+ await this.fileSystem.writeFile(destinationFile, content);
201
+ }
202
+ } else if (stat?.isDirectory()) {
203
+ await this.copyFiles(sourceFile, destinationFile);
204
+ }
205
+ }
206
+ }
207
+
208
+ private isExcluded(name: string): boolean {
209
+ if (EXCLUDED_NAMES.has(name)) {
210
+ return true;
211
+ }
212
+ return EXCLUDED_EXTENSIONS.some((ext) => name.endsWith(ext));
213
+ }
214
+
215
+ private async createOperateFile(
216
+ options: IProjectBuildOptions,
217
+ contentFolder: string,
218
+ ): Promise<void> {
219
+ const operateJsonFilePath = Path.join(
220
+ contentFolder,
221
+ NugetConstants.OperateFileName,
222
+ );
223
+
224
+ const exists = await this.fileSystem.exists(operateJsonFilePath);
225
+ if (!exists) {
226
+ const targetRuntime = await this.detectRuntime(options.projectPath);
227
+ await this.createOperateJsonFile(
228
+ contentFolder,
229
+ options.projectStorageId ?? "",
230
+ operateJsonFilePath,
231
+ targetRuntime,
232
+ );
233
+ }
234
+ }
235
+
236
+ private async createOperateJsonFile(
237
+ contentFolder: string,
238
+ projectId: string,
239
+ filePath: string,
240
+ targetRuntime: string,
241
+ ): Promise<void> {
242
+ const entryPointsFilePath = Path.join(
243
+ contentFolder,
244
+ NugetConstants.EntryPointsFileName,
245
+ );
246
+ let mainPath = "";
247
+
248
+ const entryPointsExists =
249
+ await this.fileSystem.exists(entryPointsFilePath);
250
+ if (entryPointsExists) {
251
+ const entryPointsContent =
252
+ await this.fileSystem.readFile(entryPointsFilePath);
253
+ if (entryPointsContent) {
254
+ try {
255
+ const entryPointsText = new TextDecoder().decode(
256
+ entryPointsContent,
257
+ );
258
+ const entryPoints: EntryPointsFileModel =
259
+ JSON.parse(entryPointsText);
260
+ mainPath = entryPoints.entryPoints?.[0]?.filePath ?? "";
261
+ } catch {
262
+ // Ignore parsing errors, use empty mainPath
263
+ }
264
+ }
265
+ }
266
+
267
+ const operateFileModel = {
268
+ $schema: "https://cloud.uipath.com/draft/2024-12/operate",
269
+ contentType: "function",
270
+ projectId: projectId,
271
+ main: mainPath,
272
+ targetRuntime,
273
+ };
274
+
275
+ const operateJsonString = JSON.stringify(operateFileModel, null, 2);
276
+ await this.fileSystem.writeFile(filePath, operateJsonString);
277
+ }
278
+
279
+ private async createPackageDescriptor(
280
+ localBuildFolder: string,
281
+ ): Promise<void> {
282
+ const packageDescriptor: PackageDescriptorFileModel = {
283
+ files: {},
284
+ };
285
+
286
+ this.addFileToDescriptor(
287
+ packageDescriptor,
288
+ NugetConstants.OperateFileName,
289
+ NugetConstants.OperateFileName,
290
+ );
291
+ this.addFileToDescriptor(
292
+ packageDescriptor,
293
+ NugetConstants.EntryPointsFileName,
294
+ NugetConstants.EntryPointsFileName,
295
+ );
296
+ this.addFileToDescriptor(
297
+ packageDescriptor,
298
+ NugetConstants.BindingsFileId,
299
+ NugetConstants.BindingsV2FileName,
300
+ );
301
+
302
+ const packageDescriptorPath = Path.join(
303
+ localBuildFolder,
304
+ NugetConstants.ContentFolderName,
305
+ NugetConstants.PackageDescriptorFileName,
306
+ );
307
+ const packageDescriptorJson = JSON.stringify(
308
+ {
309
+ $schema:
310
+ "https://cloud.uipath.com/draft/2024-12/package-descriptor",
311
+ ...packageDescriptor,
312
+ },
313
+ null,
314
+ 2,
315
+ );
316
+ await this.fileSystem.writeFile(
317
+ packageDescriptorPath,
318
+ packageDescriptorJson,
319
+ );
320
+ }
321
+
322
+ private addFileToDescriptor(
323
+ packageDescriptor: PackageDescriptorFileModel,
324
+ key: string,
325
+ fileName: string,
326
+ ): void {
327
+ const relativePath = Path.join(
328
+ NugetConstants.ContentFolderName,
329
+ fileName,
330
+ );
331
+ packageDescriptor.files[key] = relativePath;
332
+ }
333
+ }
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ // ============================================================================
2
+ // Self-register JS Functions tool factory with the singleton repository
3
+ // ============================================================================
4
+
5
+ import { toolsFactoryRepository } from "@uipath/solutionpackager-tool-core";
6
+ import { FunctionsToolFactory } from "./functions-tool-factory.js";
7
+
8
+ toolsFactoryRepository.registerProjectToolFactory(new FunctionsToolFactory());