@uipath/solution-tool 1.202.0 → 1.203.0-preview.160

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-bt0z25tw.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-8hvfmge6.js → list-dadxggxt.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-fjjh5veg.js → packager-tool-0f0wt9vh.js} +353 -1519
  12. package/dist/{packager-tool-pbmpgz04.js → packager-tool-1haahq17.js} +5 -3
  13. package/dist/{packager-tool-rbrcxjch.js → packager-tool-2syrt51a.js} +7 -4
  14. package/dist/packager-tool-3jrq7smt.js +1459 -0
  15. package/dist/packager-tool-53w8skv5.js +262 -0
  16. package/dist/packager-tool-7znqtw3f.js +244 -0
  17. package/dist/packager-tool-bkwnetqn.js +16678 -0
  18. package/dist/{packager-tool-5518wy6n.js → packager-tool-cp07fhx3.js} +9 -6
  19. package/dist/{packager-tool-w1dzcj31.js → packager-tool-cvfbzs9p.js} +359 -95
  20. package/dist/packager-tool-gdtpsdn7.js +342 -0
  21. package/dist/{packager-tool-pyygbnp2.js → packager-tool-htag6yh5.js} +4 -4
  22. package/dist/{packager-tool-3bewrpq4.js → packager-tool-jz2wbfjz.js} +4 -1
  23. package/dist/packager-tool-k4mskzww.js +125 -0
  24. package/dist/{packager-tool-vfcht7hq.js → packager-tool-mj5p341c.js} +11 -12
  25. package/dist/{packager-tool-bme8epz8.js → packager-tool-n4nfqj99.js} +15381 -2421
  26. package/dist/{packager-tool-mcpzmn0v.js → packager-tool-rc5pcf2n.js} +45 -21
  27. package/dist/packager-tool-resolver-fmjr60x8.js +19 -0
  28. package/dist/{packager-tool-pw7v82j2.js → packager-tool-vas0xg5h.js} +1 -1
  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
@@ -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
@@ -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