@uipath/solution-tool 1.202.1 → 1.203.0-preview.180

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 (46) hide show
  1. package/dist/THIRD-PARTY-NOTICES.md +23 -1
  2. package/dist/deploy.js +7 -6
  3. package/dist/{packager-tool-txs8perg.js → embedded-file-reader-xxqe8vs8.js} +98 -16584
  4. package/dist/first-party-service-sd8yaf73.js +27 -0
  5. package/dist/index-dqa169gp.js +25 -0
  6. package/dist/index.js +19 -13
  7. package/dist/init.js +8 -5
  8. package/dist/{list-ngr4950s.js → list-hmzx9798.js} +5 -4
  9. package/dist/models/pack-command-types.d.ts +33 -5
  10. package/dist/pack.js +12 -6
  11. package/dist/{packager-tool-rqvyf18m.js → packager-tool-0f0wt9vh.js} +353 -1519
  12. package/dist/{packager-tool-jmb2c7m1.js → packager-tool-1haahq17.js} +5 -3
  13. package/dist/{packager-tool-7s77bznz.js → packager-tool-2syrt51a.js} +7 -4
  14. package/dist/{packager-tool-dmr7g2d3.js → packager-tool-2t7gyz7x.js} +45 -21
  15. package/dist/packager-tool-3jrq7smt.js +1459 -0
  16. package/dist/{packager-tool-arkenm6k.js → packager-tool-40yp3re0.js} +9 -6
  17. package/dist/packager-tool-53w8skv5.js +262 -0
  18. package/dist/{packager-tool-svcjmtbs.js → packager-tool-6byq9bhj.js} +4 -4
  19. package/dist/packager-tool-7znqtw3f.js +244 -0
  20. package/dist/packager-tool-bkwnetqn.js +16678 -0
  21. package/dist/{packager-tool-f46c7htx.js → packager-tool-dqb4x0h9.js} +15382 -2422
  22. package/dist/{packager-tool-d83m85g9.js → packager-tool-f9vfa06w.js} +11 -12
  23. package/dist/packager-tool-gdtpsdn7.js +342 -0
  24. package/dist/{packager-tool-p6mgvgdk.js → packager-tool-jz2wbfjz.js} +15 -2
  25. package/dist/packager-tool-k4mskzww.js +125 -0
  26. package/dist/packager-tool-resolver-fmjr60x8.js +19 -0
  27. package/dist/{packager-tool-324gr08j.js → packager-tool-vas0xg5h.js} +1 -1
  28. package/dist/{packager-tool-7ze6x4r5.js → packager-tool-yf3jx470.js} +360 -96
  29. package/dist/packager-tool-znakt6yw.js +188 -0
  30. package/dist/packager-tool.d.ts +1 -1
  31. package/dist/packager-tool.js +1 -1
  32. package/dist/prepare-solution-resources-wds3r8bq.js +22 -0
  33. package/dist/project-contributions-cvttys34.js +27 -0
  34. package/dist/publish.js +7 -6
  35. package/dist/resource.js +7 -4
  36. package/dist/services/deployment-validation.d.ts +33 -0
  37. package/dist/services/governance-options.d.ts +61 -1
  38. package/dist/services/pack-command-service.d.ts +33 -2
  39. package/dist/services/packager-tool-resolver.d.ts +3 -0
  40. package/dist/services/prepare-solution-resources.d.ts +40 -0
  41. package/dist/services/project-contributions.d.ts +58 -0
  42. package/dist/services/project-type-tools.d.ts +6 -0
  43. package/dist/templates/AGENTS.md +78 -8
  44. package/dist/tool.js +19 -13
  45. package/package.json +3 -2
  46. package/dist/services/validate-appv2-action-schemas.d.ts +0 -10
@@ -1,15 +1,17 @@
1
1
  import {
2
2
  getAvailablePublishLocationsV2
3
- } from "./packager-tool-d83m85g9.js";
3
+ } from "./packager-tool-f9vfa06w.js";
4
4
  import {
5
5
  PersonalWorkspacesApi,
6
6
  createOrchestratorConfig
7
- } from "./packager-tool-7s77bznz.js";
7
+ } from "./packager-tool-2syrt51a.js";
8
+ import {
9
+ getLoginStatusAsync
10
+ } from "./packager-tool-3jrq7smt.js";
8
11
  import {
9
- getLoginStatusAsync,
10
12
  getSdkUserAgentToken,
11
13
  installSdkUserAgentHeader
12
- } from "./packager-tool-rqvyf18m.js";
14
+ } from "./packager-tool-0f0wt9vh.js";
13
15
 
14
16
  // ../pipelines-sdk/generated/src/runtime.ts
15
17
  var BASE_PATH = "https://alpha.uipath.com/uipattycyrhx/abizon_1/automationsolutions_".replace(/\/+$/, "");
@@ -1297,8 +1299,9 @@ class PipelinesApi extends BaseAPI {
1297
1299
  // ../pipelines-sdk/package.json
1298
1300
  var package_default = {
1299
1301
  name: "@uipath/pipelines-sdk",
1302
+ author: "UiPath",
1300
1303
  license: "SEE LICENSE IN LICENSE.txt",
1301
- version: "1.202.0",
1304
+ version: "1.203.0",
1302
1305
  description: "Generated TypeScript client for UiPath Pipelines API (CI/CD deployment lifecycle)",
1303
1306
  repository: {
1304
1307
  type: "git",
@@ -1474,4 +1477,4 @@ function matchFeed(feed, locations) {
1474
1477
 
1475
1478
  export { Configuration, PipelinesApi, resolvePersonalWorkspace, listSelectablePublishLocations, folderKeyInitOverride, feedScopeInitOverride, feedResolutionFailureInstructions, resolveFeedScope };
1476
1479
 
1477
- //# debugId=80324A817368E68564756E2164756E21
1480
+ //# debugId=97ECE629FDAB1F6864756E2164756E21
@@ -0,0 +1,262 @@
1
+ // ../../node_modules/@uipath/resource-builder-sdk/dist/clients/generated/first-party-service.js
2
+ var first_party_service_DeploymentAction = /* @__PURE__ */ function(DeploymentAction) {
3
+ DeploymentAction["Install"] = "Install";
4
+ DeploymentAction["Link"] = "Link";
5
+ DeploymentAction["Uninstall"] = "Uninstall";
6
+ DeploymentAction["Unlink"] = "Unlink";
7
+ DeploymentAction["Merge"] = "Merge";
8
+ DeploymentAction["UseExisting"] = "UseExisting";
9
+ DeploymentAction["Activate"] = "Activate";
10
+ return DeploymentAction;
11
+ }({});
12
+ var first_party_service_SolutionDeploymentAction = /* @__PURE__ */ function(SolutionDeploymentAction) {
13
+ SolutionDeploymentAction["Install"] = "Install";
14
+ SolutionDeploymentAction["Uninstall"] = "Uninstall";
15
+ SolutionDeploymentAction["Upgrade"] = "Upgrade";
16
+ SolutionDeploymentAction["Rollback"] = "Rollback";
17
+ SolutionDeploymentAction["Activate"] = "Activate";
18
+ return SolutionDeploymentAction;
19
+ }({});
20
+ var first_party_service_SolutionStatus = /* @__PURE__ */ function(SolutionStatus) {
21
+ SolutionStatus["Installed"] = "Installed";
22
+ SolutionStatus["Uninstalled"] = "Uninstalled";
23
+ SolutionStatus["Installing"] = "Installing";
24
+ SolutionStatus["Uninstalling"] = "Uninstalling";
25
+ SolutionStatus["InstallError"] = "InstallError";
26
+ SolutionStatus["UninstallError"] = "UninstallError";
27
+ SolutionStatus["Unknown"] = "Unknown";
28
+ return SolutionStatus;
29
+ }({});
30
+ var first_party_service_QueryOptions = /* @__PURE__ */ function(QueryOptions) {
31
+ QueryOptions["Contains"] = "Contains";
32
+ QueryOptions["Equals"] = "Equals";
33
+ return QueryOptions;
34
+ }({});
35
+ var first_party_service_DeploymentResourceValidationErrorLevel = /* @__PURE__ */ function(DeploymentResourceValidationErrorLevel) {
36
+ DeploymentResourceValidationErrorLevel["Error"] = "Error";
37
+ DeploymentResourceValidationErrorLevel["Warning"] = "Warning";
38
+ DeploymentResourceValidationErrorLevel["Info"] = "Info";
39
+ return DeploymentResourceValidationErrorLevel;
40
+ }({});
41
+ var first_party_service_DeploymentResourceValidationErrorKind = /* @__PURE__ */ function(DeploymentResourceValidationErrorKind) {
42
+ DeploymentResourceValidationErrorKind["Conflict"] = "Conflict";
43
+ DeploymentResourceValidationErrorKind["ConfigurationError"] = "ConfigurationError";
44
+ return DeploymentResourceValidationErrorKind;
45
+ }({});
46
+ var first_party_service_DeploymentResourceValidationAction = /* @__PURE__ */ function(DeploymentResourceValidationAction) {
47
+ DeploymentResourceValidationAction["RenameExisting"] = "RenameExisting";
48
+ DeploymentResourceValidationAction["RenameInSolution"] = "RenameInSolution";
49
+ DeploymentResourceValidationAction["UseExisting"] = "UseExisting";
50
+ DeploymentResourceValidationAction["FixConfiguration"] = "FixConfiguration";
51
+ DeploymentResourceValidationAction["Delete"] = "Delete";
52
+ DeploymentResourceValidationAction["SkipDelete"] = "SkipDelete";
53
+ DeploymentResourceValidationAction["MergeConfiguration"] = "MergeConfiguration";
54
+ DeploymentResourceValidationAction["Replace"] = "Replace";
55
+ return DeploymentResourceValidationAction;
56
+ }({});
57
+ var first_party_service_ContentType = /* @__PURE__ */ function(ContentType) {
58
+ ContentType["Json"] = "application/json";
59
+ ContentType["JsonApi"] = "application/vnd.api+json";
60
+ ContentType["FormData"] = "multipart/form-data";
61
+ ContentType["UrlEncoded"] = "application/x-www-form-urlencoded";
62
+ ContentType["Text"] = "text/plain";
63
+ return ContentType;
64
+ }({});
65
+
66
+ class HttpClient {
67
+ encodeQueryParam(key, value) {
68
+ const encodedKey = encodeURIComponent(key);
69
+ return `${encodedKey}=${encodeURIComponent(typeof value == "number" ? value : `${value}`)}`;
70
+ }
71
+ addQueryParam(query, key) {
72
+ return this.encodeQueryParam(key, query[key]);
73
+ }
74
+ addArrayQueryParam(query, key) {
75
+ const value = query[key];
76
+ return value.map((v) => this.encodeQueryParam(key, v)).join("&");
77
+ }
78
+ toQueryString(rawQuery) {
79
+ const query = rawQuery || {};
80
+ const keys = Object.keys(query).filter((key) => query[key] !== undefined);
81
+ return keys.map((key) => Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key)).join("&");
82
+ }
83
+ addQueryParams(rawQuery) {
84
+ const queryString = this.toQueryString(rawQuery);
85
+ return queryString ? `?${queryString}` : "";
86
+ }
87
+ mergeRequestParams(params1, params2) {
88
+ return {
89
+ ...this.baseApiParams,
90
+ ...params1,
91
+ ...params2 || {},
92
+ headers: {
93
+ ...this.baseApiParams.headers || {},
94
+ ...params1.headers || {},
95
+ ...params2 && params2.headers || {}
96
+ }
97
+ };
98
+ }
99
+ constructor(apiConfig = {}) {
100
+ this.baseUrl = "https://localhost:7008";
101
+ this.securityData = null;
102
+ this.abortControllers = new Map;
103
+ this.customFetch = (...fetchParams) => fetch(...fetchParams);
104
+ this.baseApiParams = {
105
+ credentials: "same-origin",
106
+ headers: {},
107
+ redirect: "follow",
108
+ referrerPolicy: "no-referrer"
109
+ };
110
+ this.setSecurityData = (data) => {
111
+ this.securityData = data;
112
+ };
113
+ this.contentFormatters = {
114
+ ["application/json"]: (input) => input !== null && (typeof input == "object" || typeof input == "string") ? JSON.stringify(input) : input,
115
+ ["application/vnd.api+json"]: (input) => input !== null && (typeof input == "object" || typeof input == "string") ? JSON.stringify(input) : input,
116
+ ["text/plain"]: (input) => input !== null && typeof input != "string" ? JSON.stringify(input) : input,
117
+ ["multipart/form-data"]: (input) => {
118
+ if (input instanceof FormData)
119
+ return input;
120
+ return Object.keys(input || {}).reduce((formData, key) => {
121
+ const property = input[key];
122
+ formData.append(key, property instanceof Blob ? property : typeof property == "object" && property !== null ? JSON.stringify(property) : `${property}`);
123
+ return formData;
124
+ }, new FormData);
125
+ },
126
+ ["application/x-www-form-urlencoded"]: (input) => this.toQueryString(input)
127
+ };
128
+ this.createAbortSignal = (cancelToken) => {
129
+ if (this.abortControllers.has(cancelToken)) {
130
+ const abortController2 = this.abortControllers.get(cancelToken);
131
+ if (abortController2)
132
+ return abortController2.signal;
133
+ return;
134
+ }
135
+ const abortController = new AbortController;
136
+ this.abortControllers.set(cancelToken, abortController);
137
+ return abortController.signal;
138
+ };
139
+ this.abortRequest = (cancelToken) => {
140
+ const abortController = this.abortControllers.get(cancelToken);
141
+ if (abortController) {
142
+ abortController.abort();
143
+ this.abortControllers.delete(cancelToken);
144
+ }
145
+ };
146
+ this.request = async ({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }) => {
147
+ const secureParams = (typeof secure == "boolean" ? secure : this.baseApiParams.secure) && this.securityWorker && await this.securityWorker(this.securityData) || {};
148
+ const requestParams = this.mergeRequestParams(params, secureParams);
149
+ const queryString = query && this.toQueryString(query);
150
+ const payloadFormatter = this.contentFormatters[type || "application/json"];
151
+ const responseFormat = format || requestParams.format;
152
+ return this.customFetch(`${baseUrl || this.baseUrl || ""}${path}${queryString ? `?${queryString}` : ""}`, {
153
+ ...requestParams,
154
+ headers: {
155
+ ...requestParams.headers || {},
156
+ ...type && type !== "multipart/form-data" ? {
157
+ "Content-Type": type
158
+ } : {}
159
+ },
160
+ signal: (cancelToken ? this.createAbortSignal(cancelToken) : requestParams.signal) || null,
161
+ body: body == null ? null : payloadFormatter(body)
162
+ }).then(async (response) => {
163
+ const r = response;
164
+ r.data = null;
165
+ r.error = null;
166
+ const responseToParse = responseFormat ? response.clone() : response;
167
+ const data = responseFormat ? await responseToParse[responseFormat]().then((data2) => {
168
+ if (r.ok)
169
+ r.data = data2;
170
+ else
171
+ r.error = data2;
172
+ return r;
173
+ }).catch((e) => {
174
+ r.error = e;
175
+ return r;
176
+ }) : r;
177
+ if (cancelToken)
178
+ this.abortControllers.delete(cancelToken);
179
+ if (!response.ok)
180
+ throw data;
181
+ return data.data;
182
+ });
183
+ };
184
+ Object.assign(this, apiConfig);
185
+ }
186
+ }
187
+
188
+ class FirstPartyServiceApi extends HttpClient {
189
+ constructor(...args) {
190
+ super(...args), this.v2 = {
191
+ automationSolutionsGetMetadata: (params = {}) => this.request({
192
+ path: "/v2/automationsolutions/metadata",
193
+ method: "GET",
194
+ ...params
195
+ }),
196
+ automationSolutionsHeadMetadata: (params = {}) => this.request({
197
+ path: "/v2/automationsolutions/metadata",
198
+ method: "HEAD",
199
+ ...params
200
+ }),
201
+ automationSolutionsSetState: (data, query, params = {}) => this.request({
202
+ path: "/v2/automationsolutions",
203
+ method: "PATCH",
204
+ query,
205
+ body: data,
206
+ type: "application/json",
207
+ ...params
208
+ }),
209
+ automationSolutionsInstall: (data, query, params = {}) => this.request({
210
+ path: "/v2/automationsolutions",
211
+ method: "PUT",
212
+ query,
213
+ body: data,
214
+ format: "json",
215
+ ...params
216
+ }),
217
+ automationSolutionsUninstall: (data, query, params = {}) => this.request({
218
+ path: "/v2/automationsolutions",
219
+ method: "DELETE",
220
+ query,
221
+ body: data,
222
+ type: "application/json",
223
+ format: "json",
224
+ ...params
225
+ }),
226
+ automationSolutionsExport: (data, params = {}) => this.request({
227
+ path: "/v2/automationsolutions/export",
228
+ method: "POST",
229
+ body: data,
230
+ type: "application/json",
231
+ format: "json",
232
+ ...params
233
+ }),
234
+ automationSolutionsGetTranslations: (query, params = {}) => this.request({
235
+ path: "/v2/automationsolutions/translations",
236
+ method: "GET",
237
+ query,
238
+ format: "json",
239
+ ...params
240
+ }),
241
+ automationSolutionsValidate: (data, query, params = {}) => this.request({
242
+ path: "/v2/automationsolutions/validate",
243
+ method: "POST",
244
+ query,
245
+ body: data,
246
+ type: "application/json",
247
+ format: "json",
248
+ ...params
249
+ }),
250
+ automationSolutionsLookup: (query, params = {}) => this.request({
251
+ path: "/v2/automationsolutions/lookup",
252
+ method: "GET",
253
+ query,
254
+ format: "json",
255
+ ...params
256
+ })
257
+ };
258
+ }
259
+ }
260
+ export { first_party_service_DeploymentAction, first_party_service_SolutionDeploymentAction, first_party_service_SolutionStatus, first_party_service_QueryOptions, first_party_service_DeploymentResourceValidationErrorLevel, first_party_service_DeploymentResourceValidationErrorKind, first_party_service_DeploymentResourceValidationAction, first_party_service_ContentType, HttpClient, FirstPartyServiceApi };
261
+
262
+ //# debugId=AC88CC622210E15664756E2164756E21
@@ -3,14 +3,14 @@ import {
3
3
  PipelinesApi,
4
4
  feedScopeInitOverride,
5
5
  resolveFeedScope
6
- } from "./packager-tool-arkenm6k.js";
6
+ } from "./packager-tool-40yp3re0.js";
7
7
  import {
8
8
  Configuration as Configuration2,
9
9
  PackagesApi
10
- } from "./packager-tool-d83m85g9.js";
10
+ } from "./packager-tool-f9vfa06w.js";
11
11
  import {
12
12
  getSolutionAuthContext
13
- } from "./packager-tool-7s77bznz.js";
13
+ } from "./packager-tool-2syrt51a.js";
14
14
  import {
15
15
  PollOutcome,
16
16
  catchError,
@@ -19,7 +19,7 @@ import {
19
19
  logger,
20
20
  mapPollFailure,
21
21
  pollUntil
22
- } from "./packager-tool-rqvyf18m.js";
22
+ } from "./packager-tool-0f0wt9vh.js";
23
23
  import {
24
24
  strFromU8,
25
25
  strToU8,
@@ -0,0 +1,244 @@
1
+ import {
2
+ applyProjectContributions,
3
+ assertNoContributionErrors,
4
+ collectProjectContributions,
5
+ contributionErrorMessages
6
+ } from "./packager-tool-znakt6yw.js";
7
+ import {
8
+ ensurePackagerTools
9
+ } from "./packager-tool-k4mskzww.js";
10
+ import {
11
+ Tokens,
12
+ createResourceBuilderServices,
13
+ findResourceInRcs,
14
+ getFolderPathProperty,
15
+ getResourceKindForBinding,
16
+ getResourceName,
17
+ models_BindingsResourceType,
18
+ readUipxProjects,
19
+ syncAndLog
20
+ } from "./packager-tool-bkwnetqn.js";
21
+ import {
22
+ catchError,
23
+ getFileSystem,
24
+ logger
25
+ } from "./packager-tool-0f0wt9vh.js";
26
+
27
+ // src/services/emit-runtime-dependencies.ts
28
+ import { createHash } from "node:crypto";
29
+ function csharpGuidFromString(input) {
30
+ const b = createHash("sha256").update(input, "utf8").digest().subarray(0, 16);
31
+ const h = (n) => n.toString(16).padStart(2, "0");
32
+ return [
33
+ h(b[3]) + h(b[2]) + h(b[1]) + h(b[0]),
34
+ h(b[5]) + h(b[4]),
35
+ h(b[7]) + h(b[6]),
36
+ h(b[8]) + h(b[9]),
37
+ h(b[10]) + h(b[11]) + h(b[12]) + h(b[13]) + h(b[14]) + h(b[15])
38
+ ].join("-");
39
+ }
40
+ var solutionFolderKeyCache;
41
+ function solutionFolderKey() {
42
+ solutionFolderKeyCache ??= csharpGuidFromString("solution_folder");
43
+ return solutionFolderKeyCache;
44
+ }
45
+ async function emitRuntimeDependenciesForProcesses(solutionDir) {
46
+ const result = {
47
+ processed: 0,
48
+ warnings: []
49
+ };
50
+ const [servicesError, services] = await catchError(createResourceBuilderServices());
51
+ if (servicesError) {
52
+ result.warnings.push(`Failed to create resource builder services: ${servicesError.message}`);
53
+ return result;
54
+ }
55
+ const [builderError, builder] = await catchError(services.getSolutionBuilder(solutionDir));
56
+ if (builderError) {
57
+ result.warnings.push(`Failed to get solution builder: ${builderError.message}`);
58
+ return result;
59
+ }
60
+ try {
61
+ const [loadError, solution] = await catchError(builder.context.loadAsync());
62
+ if (loadError || !solution) {
63
+ result.warnings.push(`Failed to load solution: ${loadError?.message ?? "unknown"}`);
64
+ return result;
65
+ }
66
+ const processes = (solution.resources ?? []).filter((r) => r.kind?.toLowerCase() === "process" && typeof r.projectKey === "string" && r.projectKey.length > 0);
67
+ if (processes.length === 0) {
68
+ return result;
69
+ }
70
+ const overwritesService = services.container.resolve(Tokens.IResourceOverwritesService);
71
+ const [owErr, tenantOverwrites] = await catchError(overwritesService.getTenantResourceOverwritesAsync(builder.context));
72
+ if (owErr) {
73
+ result.warnings.push(`Failed to read tenant resource overwrites: ${owErr.message}`);
74
+ }
75
+ const overwrites = tenantOverwrites ?? [];
76
+ const projects = await readUipxProjects(solutionDir);
77
+ const projectsById = new Map(projects.map((p) => [p.id, p]));
78
+ const serializer = services.container.resolve(Tokens.IBindingsMetadataSerializer);
79
+ const fs = getFileSystem();
80
+ for (const proc of processes) {
81
+ const project = projectsById.get(proc.projectKey ?? "");
82
+ if (!project) {
83
+ result.warnings.push(`Process resource "${proc.name}" has projectKey "${proc.projectKey}" but no matching project in .uipx; skipping`);
84
+ continue;
85
+ }
86
+ const bindings = await readBindings(project.path, serializer, fs, result.warnings);
87
+ proc.runtimeDependencies = await buildRuntimeDeps(bindings, solution.resources ?? [], overwrites, builder, result.warnings);
88
+ result.processed += 1;
89
+ logger.info(`Emitted ${proc.runtimeDependencies.length} runtime dependencies for process "${proc.name}" (project "${project.name}")`);
90
+ }
91
+ for (const r of solution.resources ?? []) {
92
+ if (r.isOverridable === undefined || r.isOverridable === null) {
93
+ r.isOverridable = true;
94
+ }
95
+ }
96
+ const [saveErr] = await catchError(builder.context.saveAsync(solution));
97
+ if (saveErr) {
98
+ result.warnings.push(`Failed to persist runtime dependencies: ${saveErr.message}`);
99
+ }
100
+ return result;
101
+ } finally {
102
+ const dispose = builder.disposeAsync;
103
+ if (typeof dispose === "function") {
104
+ const [disposeErr] = await catchError(dispose.call(builder));
105
+ if (disposeErr) {
106
+ logger.warn(`Failed to dispose solution builder after emitting runtime dependencies: ${disposeErr.message}`);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ async function readBindings(projectDir, serializer, fs, warnings) {
112
+ const bindingsPath = fs.path.join(projectDir, "bindings_v2.json");
113
+ if (!await fs.exists(bindingsPath))
114
+ return [];
115
+ const [readErr, raw] = await catchError(fs.readFile(bindingsPath));
116
+ if (readErr || !raw) {
117
+ warnings.push(`Failed to read ${bindingsPath}: ${readErr?.message ?? "empty"}`);
118
+ return [];
119
+ }
120
+ const parsed = serializer.tryDeserialize(new TextDecoder().decode(raw));
121
+ if (!parsed.success || !parsed.metadata) {
122
+ warnings.push(`Failed to parse ${bindingsPath}`);
123
+ return [];
124
+ }
125
+ return parsed.metadata.resources ?? [];
126
+ }
127
+ async function buildRuntimeDeps(bindings, allResources, overwrites, builder, warnings) {
128
+ const resourcesByKey = new Map(allResources.filter((r) => !!r.key).map((r) => [r.key.toLowerCase(), r]));
129
+ const overwritesBySolutionKey = new Map(overwrites.filter((o) => !!o.solutionResourceKey).map((o) => [o.solutionResourceKey.toLowerCase(), o]));
130
+ const out = [];
131
+ for (const binding of bindings ?? []) {
132
+ const dep = mapBindingToRuntimeDependency(binding);
133
+ const matchedKey = await findSolutionResourceKeyForBinding(binding, overwrites, builder, warnings);
134
+ if (matchedKey) {
135
+ const matched = resourcesByKey.get(matchedKey.toLowerCase());
136
+ if (matched) {
137
+ dep.resourceKey = matched.key;
138
+ dep.resourceName = matched.name;
139
+ const ow = overwritesBySolutionKey.get(matchedKey.toLowerCase());
140
+ dep.folderKey = ow?.overwrite?.folderKey ?? solutionFolderKey();
141
+ }
142
+ }
143
+ out.push(dep);
144
+ }
145
+ return out;
146
+ }
147
+ async function findSolutionResourceKeyForBinding(binding, overwrites, builder, warnings) {
148
+ const bindingKind = getResourceKindForBinding(binding.resourceType);
149
+ const bindingKindLower = bindingKind.toLowerCase();
150
+ const bindingName = getResourceName(binding);
151
+ const bindingFolder = getFolderPathProperty(binding).defaultValue;
152
+ if (binding.bindingKey && !bindingName) {
153
+ return binding.bindingKey;
154
+ }
155
+ if (!bindingName)
156
+ return;
157
+ const lname = bindingName.toLowerCase();
158
+ const candidates = overwrites.filter((o) => o.overwrite?.resourceName?.toLowerCase() === lname && (!o.overwrite?.kind || o.overwrite.kind.toLowerCase() === bindingKindLower));
159
+ if (candidates.length === 0)
160
+ return;
161
+ if (candidates.length === 1)
162
+ return candidates[0].solutionResourceKey;
163
+ if (!bindingFolder) {
164
+ warnings.push(`Ambiguous solution resource match for binding "${bindingName}" (kind ${bindingKind}) — ${candidates.length} candidates and no binding folderPath to disambiguate`);
165
+ return;
166
+ }
167
+ const [rcsErr, rcsMatch] = await catchError(findResourceInRcs(builder, bindingKind, bindingName, bindingFolder));
168
+ if (rcsErr) {
169
+ warnings.push(`RCS folder disambiguation failed for "${bindingName}" (folder "${bindingFolder}"): ${rcsErr.message}`);
170
+ return;
171
+ }
172
+ if (!rcsMatch) {
173
+ warnings.push(`RCS could not resolve "${bindingName}" in folder "${bindingFolder}" — ${candidates.length} same-name overwrites still ambiguous`);
174
+ return;
175
+ }
176
+ const rcsKeyLower = rcsMatch.key.toLowerCase();
177
+ const matched = candidates.find((o) => o.solutionResourceKey?.toLowerCase() === rcsKeyLower);
178
+ if (!matched) {
179
+ warnings.push(`Binding "${bindingName}" resolved to cloud key ${rcsMatch.key} but no overwrite carries that solutionResourceKey`);
180
+ return;
181
+ }
182
+ return matched.solutionResourceKey;
183
+ }
184
+ function mapBindingToRuntimeDependency(binding) {
185
+ return {
186
+ bindingType: binding.originalResourceType,
187
+ bindingKey: binding.bindingKey,
188
+ bindingValues: binding.dynamicValues,
189
+ bindingMetadata: binding.metadata,
190
+ resourceKind: getResourceKindForBinding(binding.resourceType),
191
+ resourceType: resolveResourceType(binding)
192
+ };
193
+ }
194
+ function resolveResourceType(binding) {
195
+ if (binding.resourceType === models_BindingsResourceType.QueueTrigger) {
196
+ return;
197
+ }
198
+ if (binding.resourceType === models_BindingsResourceType.EventTrigger) {
199
+ return binding.metadata?.connector;
200
+ }
201
+ if (binding.resourceType === models_BindingsResourceType.Connection) {
202
+ return binding.metadata?.connector;
203
+ }
204
+ return binding.metadata?.subType;
205
+ }
206
+
207
+ // src/services/prepare-solution-resources.ts
208
+ function projectSubTypesFrom(contributions) {
209
+ const subTypes = new Map;
210
+ for (const [projectKey, contribution] of contributions.byProject) {
211
+ if (contribution.projectSubType) {
212
+ subTypes.set(projectKey, contribution.projectSubType);
213
+ }
214
+ }
215
+ return subTypes;
216
+ }
217
+ async function prepareSolutionResources(solutionDir, fs, options) {
218
+ const gate = options?.gate ?? true;
219
+ const warnings = [];
220
+ await ensurePackagerTools(solutionDir, fs);
221
+ const contributions = await collectProjectContributions(solutionDir, fs);
222
+ if (gate) {
223
+ assertNoContributionErrors(contributions);
224
+ } else {
225
+ warnings.push(...contributionErrorMessages(contributions));
226
+ }
227
+ await syncAndLog(solutionDir, projectSubTypesFrom(contributions));
228
+ const applied = await applyProjectContributions(solutionDir, contributions, { failOnUnmatchedPatch: gate }, fs);
229
+ warnings.push(...applied.warnings);
230
+ for (const warning of applied.warnings)
231
+ logger.warn(warning);
232
+ if (applied.updated > 0) {
233
+ logger.info(`Applied project resource contributions to ${applied.updated} resource(s)`);
234
+ }
235
+ const rtd = await emitRuntimeDependenciesForProcesses(solutionDir);
236
+ warnings.push(...rtd.warnings);
237
+ for (const warning of rtd.warnings)
238
+ logger.warn(warning);
239
+ return { warnings, updated: applied.updated };
240
+ }
241
+
242
+ export { projectSubTypesFrom, prepareSolutionResources };
243
+
244
+ //# debugId=66D4CB702D8B08F964756E2164756E21