@uipath/solution-sdk 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 (32) hide show
  1. package/dist/THIRD-PARTY-NOTICES.md +12 -1
  2. package/dist/embedded-file-reader-xxqe8vs8.js +114 -0
  3. package/dist/first-party-service-sd8yaf73.js +27 -0
  4. package/dist/index-1de529jm.js +39 -0
  5. package/dist/index-4zqv4bn2.js +6922 -0
  6. package/dist/index-53w8skv5.js +262 -0
  7. package/dist/index-dqa169gp.js +25 -0
  8. package/dist/index-g0hcxnae.js +237 -0
  9. package/dist/index-gdtpsdn7.js +342 -0
  10. package/dist/index-sby22td6.js +634 -0
  11. package/dist/index-y8tgscfm.js +1381 -0
  12. package/dist/index.js +3660 -15829
  13. package/dist/jmespath-231m3hyn.js +1485 -0
  14. package/dist/js-yaml-88tdqrtd.js +3153 -0
  15. package/dist/resources/index.js +14311 -27794
  16. package/dist/solution-auth.js +6 -2320
  17. package/dist/src/index.d.ts +1 -1
  18. package/dist/src/resources/commands/project-utils.d.ts +5 -0
  19. package/dist/src/resources/index.d.ts +3 -0
  20. package/dist/src/resources/providers/artefact-pair-binding-provider.d.ts +21 -0
  21. package/dist/src/resources/providers/file-storage-provider.d.ts +2 -1
  22. package/dist/src/resources/providers/resource-builder-init.d.ts +12 -12
  23. package/dist/src/resources/providers/solution-access-provider.d.ts +2 -1
  24. package/dist/src/resources/services/entry-point-spec-enhancer.d.ts +21 -2
  25. package/dist/src/resources/services/local-resource-matcher.d.ts +1 -1
  26. package/dist/src/resources/services/project-template-types.d.ts +35 -0
  27. package/dist/src/resources/services/resource-casing.d.ts +24 -0
  28. package/dist/src/resources/services/resource-refresh-service.d.ts +7 -0
  29. package/dist/src/resources/services/resource-remote-sync.d.ts +67 -0
  30. package/dist/src/resources/services/solution-manifest.d.ts +20 -6
  31. package/dist/src/resources/services/sync-resources-from-bindings.d.ts +4 -3
  32. package/package.json +3 -2
@@ -13,4 +13,4 @@ export type { BundleResult, SolutionImportResponse, StudioWebConfig, StudioWebSo
13
13
  export type { SolutionUploadOperation } from "./upload-service";
14
14
  export { buildSolutionUploadFailureOutput, importSolution, isSolutionUploadHttpError, overwriteSolution, SolutionUploadHttpError, solutionExistsOnStudioWeb, uploadOrOverwriteSolution, } from "./upload-service";
15
15
  export { SDK_USER_AGENT } from "./user-agent.js";
16
- export { collectFiles, createZipFromDir } from "./zip-utils";
16
+ export { collectFiles, createZipFromDir, finalizeZip64 } from "./zip-utils";
@@ -89,5 +89,10 @@ export declare function restoreSolutionFile(filePath: string, rawContent: string
89
89
  * `subType` is forwarded to the SDK's project template picker. For AppV2
90
90
  * projects: pass `"Coded"` for a regular coded app or `"CodedAction"` for a
91
91
  * coded action app; leave undefined for other project types.
92
+ *
93
+ * Spec-level patches to the emitted artefact resources (App→Package wire,
94
+ * `isOverridable: true` round-trip default) live in the registered
95
+ * `ArtefactPairBindingProvider` and fire at write time — this function
96
+ * stays as thin as before that concern existed.
92
97
  */
93
98
  export declare function createProjectInSolutionBuilder(solutionDir: string, projectId: string, projectName: string, projectType: string, subType?: string): Promise<Error | null>;
@@ -17,6 +17,9 @@ export * from "./providers/resource-builder-init";
17
17
  export * from "./services/entry-point-spec-enhancer";
18
18
  export * from "./services/local-resource-matcher";
19
19
  export * from "./services/project-artifacts-service";
20
+ export * from "./services/project-template-types";
21
+ export { normalizeResourceCasing, normalizeResourceFileCasing, saveCasingNormalized, } from "./services/resource-casing";
20
22
  export * from "./services/resource-refresh-service";
23
+ export * from "./services/resource-remote-sync";
21
24
  export * from "./services/solution-manifest";
22
25
  export * from "./services/sync-resources-from-bindings";
@@ -0,0 +1,21 @@
1
+ import type { ISolutionContext } from "@uipath/resource-builder-sdk/models";
2
+ import { MultiFileSolutionDefinitionFactory, MultiFileSolutionDefinitionProvider, type SolutionDefinition } from "@uipath/resource-builder-sdk/solution";
3
+ /**
4
+ * Runs on every `writeAsync` to backfill artefact-pair wiring the TS SDK's
5
+ * `bindArtefactResources` doesn't yet port from the C# `BindAppResources`
6
+ * else-branch + `EnsureSolutionResourceFields`. Two idempotent patches:
7
+ * app→package linkage (spec.package.key + dependency) and isOverridable=true
8
+ * on the paired app+package. Timing matters — before the serializer strips
9
+ * `undefined`-valued metadata-declared spec keys.
10
+ */
11
+ export declare class ArtefactPairBindingProvider extends MultiFileSolutionDefinitionProvider {
12
+ writeAsync(context: ISolutionContext, solution: SolutionDefinition, cancellationToken?: AbortSignal): Promise<void>;
13
+ }
14
+ /**
15
+ * The SDK's DI resolves `ISolutionDefinitionFactory` at request time
16
+ * (`saveChangesAsync` → `saveAsync`), so registering the provider alone
17
+ * isn't enough — the factory has to produce it too.
18
+ */
19
+ export declare class ArtefactPairBindingSolutionDefinitionFactory extends MultiFileSolutionDefinitionFactory {
20
+ getProviderAsync(): Promise<ArtefactPairBindingProvider>;
21
+ }
@@ -1,4 +1,5 @@
1
- import type { IFileStorageProvider, IFileStorageProviderFactory, ISolutionContext } from "@uipath/resource-builder-sdk";
1
+ import type { ISolutionContext } from "@uipath/resource-builder-sdk/models";
2
+ import type { IFileStorageProvider, IFileStorageProviderFactory } from "@uipath/resource-builder-sdk/providers";
2
3
  /**
3
4
  * Factory for creating FileSystemFileStorageProvider instances.
4
5
  */
@@ -1,16 +1,16 @@
1
- import { type IResourceBuilderServices } from "@uipath/resource-builder-sdk";
1
+ import type { IResourceBuilderServices } from "@uipath/resource-builder-sdk";
2
2
  /**
3
- * Creates a configured ResourceBuilderServices instance for CLI usage.
4
- * Uses SolutionAccessProvider which maps SDK service scopes to full
5
- * tenant-scoped gateway URLs, enabling server-side SDK operations
6
- * (updateConfigurationAsync, addOrUpdateResourceToSolutionAsync, etc.).
3
+ * CLI entry for ResourceBuilderServices. Adds three providers on top of the SDK
4
+ * defaults: `ArtefactPairBindingSolutionDefinitionFactory` (fills the
5
+ * app+package linkage gap in `bindArtefactResources`), `EntryPointSpecEnhancer`
6
+ * (overlays the on-disk entry points at GET), and
7
+ * `CliResourceBuilderLoggerFactory`, which replaces the SDK's default logger —
8
+ * that one prints its message templates unfilled (`{solutionKey}`, `%s`) and
9
+ * bypasses `--log-level` / `--log-file`; see that file for why both matter.
7
10
  *
8
- * `EntryPointSpecEnhancer` is registered so artefact resources (resources
9
- * with a `projectKey`) reflect the latest `entry-points.json` from disk at
10
- * read time, instead of the snapshot captured at `solution projects add`.
11
- *
12
- * `CliResourceBuilderLoggerFactory` replaces the SDK's default logger, which
13
- * prints its message templates unfilled (`{solutionKey}`, `%s`) and bypasses
14
- * `--log-level` / `--log-file` — see that file for why both matter.
11
+ * There is no caller-supplied enhancer hook: a project type's knowledge
12
+ * reaches the resources through the contribution contract at pack / refresh
13
+ * time (`solution-tool/src/services/project-contributions.ts`), not through a
14
+ * read-time enhancer that would make every read load a tool bundle.
15
15
  */
16
16
  export declare function createResourceBuilderServices(): Promise<IResourceBuilderServices>;
@@ -1,4 +1,5 @@
1
- import type { AuthenticationInfo, IAccessProvider } from "@uipath/resource-builder-sdk";
1
+ import type { AuthenticationInfo } from "@uipath/resource-builder-sdk/models";
2
+ import type { IAccessProvider } from "@uipath/resource-builder-sdk/providers";
2
3
  /**
3
4
  * IAccessProvider that maps SDK service scopes to full tenant-scoped URLs.
4
5
  * Unlike CliAccessProvider (which returns bare baseUrl), this builds the correct
@@ -1,5 +1,7 @@
1
1
  import { type IFileSystem } from "@uipath/filesystem";
2
- import type { IArtifactResourceSpecEnhancer, ISolutionContext, ResourceDefinition, ResourcePropertyMetadata } from "@uipath/resource-builder-sdk";
2
+ import type { ISolutionContext } from "@uipath/resource-builder-sdk/models";
3
+ import type { IArtifactResourceSpecEnhancer, ResourcePropertyMetadata } from "@uipath/resource-builder-sdk/services";
4
+ import type { ResourceDefinition } from "@uipath/resource-builder-sdk/solution";
3
5
  /**
4
6
  * Reads the project's `entry-points.json` at GET time and projects the primary
5
7
  * entry points onto the resource spec, so consumers see the current on-disk
@@ -20,8 +22,25 @@ export declare class EntryPointSpecEnhancer implements IArtifactResourceSpecEnha
20
22
  constructor(fs?: IFileSystem);
21
23
  enhanceSpecAsync(context: ISolutionContext, resource: ResourceDefinition, _propertiesMetadata: Map<string, ResourcePropertyMetadata>, spec: Map<string, unknown>, _cancellationToken?: AbortSignal): Promise<void>;
22
24
  private applyEntryPointAsync;
23
- private findSolutionFileAsync;
24
25
  }
26
+ /**
27
+ * The entry-point spec keys for one project, read fresh off disk.
28
+ *
29
+ * One implementation, two consumers: `EntryPointSpecEnhancer` overlays them at
30
+ * GET time, and solution-tool's contribution driver writes the same keys onto
31
+ * the resource JSON so they survive into the packed solution. Keeping the
32
+ * parsing here is what stops the two paths disagreeing on the shape.
33
+ *
34
+ * `entryPoints` carries the raw `entry-points.json` text (with `$schema`,
35
+ * `$id`, indentation) — matches what Studio Web returns on the process
36
+ * resource spec. `entryPointName` / `entryPointUniqueId` name the single
37
+ * primary entry, and are `null` whenever the project has zero or several.
38
+ *
39
+ * Returns `undefined` when there is nothing to say (project not in the
40
+ * manifest, no `entry-points.json`, empty file). Throws on malformed JSON —
41
+ * both callers catch and warn.
42
+ */
43
+ export declare function computeEntryPointSpec(fs: IFileSystem, solutionDir: string, projectKey: string): Promise<Record<string, unknown> | undefined>;
25
44
  /**
26
45
  * Applies `EntryPointSpecEnhancer` against a plain-object spec returned by the
27
46
  * SDK's `getConfigurationAsync` path. Used by `resource get` until the SDK
@@ -1,4 +1,4 @@
1
- import type { ResourceDefinition } from "@uipath/resource-builder-sdk";
1
+ import type { ResourceDefinition } from "@uipath/resource-builder-sdk/solution";
2
2
  /**
3
3
  * Pure, dependency-free matching primitives for local solution resources.
4
4
  * A leaf module on purpose: `sync-resources-from-bindings` and
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Whether the resource-builder resolves this project type's artefact resources
3
+ * from its bare `type` row, rather than only from a `<type>_<subType>` one.
4
+ *
5
+ * Callers use it to decide who generates a project's resources. A type with a
6
+ * bare row can be registered from the host at `projects add` time. A type
7
+ * without one cannot: the variant that picks its row lives in a file format the
8
+ * project's own tool owns, so its resources arrive later — at `<tool> init`
9
+ * inside a solution, or at pack / upload / `resources refresh`, where the tool
10
+ * is loaded and reports its `projectSubType` through the project resource
11
+ * contribution and `reconcileProjectsAsync` generates them.
12
+ *
13
+ * Reading the answer off the table keeps the list of such types out of every
14
+ * caller (AGENTS.md Hard Rule #19): the table is the resource-builder's own,
15
+ * and a type added to it needs no edit here or in the CLI.
16
+ *
17
+ * Registering with no subType is not a harmless no-op, which is why the
18
+ * distinction matters. Measured against resource-builder-sdk
19
+ * 2025.11.0-alpha5891-4020, on a fresh solution:
20
+ *
21
+ * - `createProjectAsync` with a type that has no bare row and no subType
22
+ * writes `process/process/<name>.json` — the SDK's Process fallback, i.e.
23
+ * the wrong resource, which then has to be repaired.
24
+ * - `reconcileProjectsAsync` with the right subType repairs it in full,
25
+ * including deleting that stale `process/` artefact, and corrects an app
26
+ * resource generated under the wrong variant.
27
+ * - `reconcileProjectsAsync` with no subType is inert, never destructive.
28
+ */
29
+ export declare function hasBareTemplateRow(projectType: string): boolean;
30
+ /**
31
+ * Whether the table has any row for this type — bare or `<type>_<subType>`.
32
+ * A type with none declares no template-generated resources at all, so
33
+ * nothing is left for a later tool run to generate.
34
+ */
35
+ export declare function hasAnyTemplateRow(projectType: string): boolean;
@@ -0,0 +1,24 @@
1
+ import type { ISolutionBuilder, SolutionDefinition } from "@uipath/resource-builder-sdk";
2
+ export declare function lowerFirstChar(value: string): string;
3
+ export declare function normalizeResourceCasing(solution: Pick<SolutionDefinition, "resources"> | null | undefined): number;
4
+ /**
5
+ * Normalize in-memory casing then dispose. Callers run
6
+ * `normalizeResourceFileCasing(dir)` separately when this returns null
7
+ * because the file-level repair needs the resolved solution dir and
8
+ * should only run when dispose succeeded.
9
+ */
10
+ export declare function saveCasingNormalized(builder: Pick<ISolutionBuilder, "disposeAsync"> & {
11
+ context: {
12
+ loadAsync(): Promise<Pick<SolutionDefinition, "resources">>;
13
+ };
14
+ }): Promise<Error | null>;
15
+ /**
16
+ * The SDK reads `kind`/`type` through `toLowerFirstChar` but writes them back
17
+ * verbatim, and its stale-path check compares paths case-insensitively. A
18
+ * server-cased file therefore gains a lower-cased twin on the next save, both
19
+ * carrying the same resource key, and the load after that throws "Node already
20
+ * added to the graph" on a case-sensitive filesystem. Move every resource file
21
+ * to the path the next save targets, and drop the twins a corrupted tree
22
+ * already carries.
23
+ */
24
+ export declare function normalizeResourceFileCasing(solutionDir: string): Promise<string[]>;
@@ -5,6 +5,13 @@ export interface ResourceRefreshOptions {
5
5
  loginValidity?: number;
6
6
  /** Pin auth to this exact `.uipath/.auth` path. */
7
7
  envFilePath?: string;
8
+ /**
9
+ * Resolves each project's contributed subType, keyed by the `.uipx`
10
+ * project `Id`. Called after the folder and auth checks pass and before
11
+ * the sync, so a caller that has to load tool bundles to answer only pays
12
+ * for them on a run that is otherwise going to proceed.
13
+ */
14
+ resolveProjectSubTypesAsync?: () => Promise<ReadonlyMap<string, string>>;
8
15
  }
9
16
  export interface ResourceRefreshSuccess {
10
17
  ok: true;
@@ -0,0 +1,67 @@
1
+ /** Discriminator for {@link ResourceRemoteSyncFailure}; library callers can ignore the tag and read `.message` / `.ok`. */
2
+ export type ResourceRemoteSyncFailureReason = "solution_not_found" | "not_a_solution" | "auth_failed" | "resource_not_found" | "no_remote_reference" | "comparison_unavailable" | "sync_failed" | "save_failed";
3
+ export interface ResourceRemoteSyncOptions {
4
+ /** Write the cloud definition over the local one. When `false` (default) nothing is written and the result only reports the drift. */
5
+ force?: boolean;
6
+ /** Minimum minutes before token expiration to trigger a refresh. Default `10` (matches the CLI's `--login-validity`). */
7
+ loginValidity?: number;
8
+ /** Pin auth to this exact `.uipath/.auth` path. */
9
+ envFilePath?: string;
10
+ }
11
+ export interface ResourceRemoteSyncSuccess {
12
+ ok: true;
13
+ /** `true` when the cloud definition was written to disk; `false` for a drift-only (no `--force`) run. */
14
+ applied: boolean;
15
+ key: string;
16
+ /** Spec property names that differ between the local and the cloud definition, sorted. Empty when the two already agree. */
17
+ changed: string[];
18
+ /** Properties that still differ from the cloud after a write, because the SDK declined to set them (reference, read-only or unknown to the kind metadata). Empty on a clean sync. */
19
+ skipped: string[];
20
+ /** The resulting local spec — post-write when `applied`, unchanged otherwise. */
21
+ spec: Record<string, unknown>;
22
+ }
23
+ export interface ResourceRemoteSyncFailure {
24
+ ok: false;
25
+ reason: ResourceRemoteSyncFailureReason;
26
+ /** Human-readable summary suitable for top-level surfacing. */
27
+ message: string;
28
+ }
29
+ export type ResourceRemoteSyncResult = ResourceRemoteSyncSuccess | ResourceRemoteSyncFailure;
30
+ /**
31
+ * Programmatic core of `uip solution resources edit --source remote`: replaces a
32
+ * solution resource's spec with the current cloud definition it was imported from.
33
+ *
34
+ * This is the one path that overwrites an already-imported resource. `refresh` is
35
+ * deliberately import-only (see `sync-resources-from-bindings`), so a field added
36
+ * to a cloud entity after the initial import never reaches the solution without
37
+ * this command.
38
+ *
39
+ * Mechanism: read the cloud side with `getResourceConfigurationsComparisonAsync`
40
+ * (which returns the solution config and the FPS export side by side and writes
41
+ * nothing), then hand that spec to `updateConfigurationAsync` — the same writer
42
+ * `resources edit --patch` uses. It mutates the existing resource in place, so
43
+ * the file keeps its path and the resource keeps its key and name.
44
+ *
45
+ * **Two richer-looking SDK calls were tried first and both are wrong here.**
46
+ *
47
+ * `syncConfigurationFromReferenceAsync` looks the resource's cloud source up via
48
+ * `getDebugOverwrites`, which calls the *server* rather than reading the local
49
+ * `debug_overwrites.json`. For a solution never uploaded to Studio Web the server
50
+ * has nothing, so it returns the resource untouched and reports success — every
51
+ * `--force` was a silent no-op. Confirmed live: `getDebugOverwrites size: 0`
52
+ * while the file on disk held the row.
53
+ *
54
+ * `addOrUpdateResourceToSolutionAsync` (and the command behind it) re-imports the
55
+ * FPS export, which carries the *server* casing of `kind` — `Queue`, not `queue`.
56
+ * The re-add therefore writes a second file at `resources/.../Queue/<name>.json`
57
+ * beside the original `queue/<name>.json`. On a case-sensitive filesystem those
58
+ * are two files for one resource key: the load throws "Node already added to the
59
+ * graph", and once `normalizeResourceFileCasing` folds them it keeps the one
60
+ * already at the target path — the stale one — silently discarding the write.
61
+ * Reproduced on a case-sensitive volume; it is why only the Linux e2e leg failed.
62
+ *
63
+ * What survives from that: never trust a write to have happened. The spec is read
64
+ * back and diffed, and anything the writer declined to set is reported in
65
+ * `skipped` rather than folded into a success.
66
+ */
67
+ export declare function resourceRemoteSyncAsync(solutionPath: string | undefined, resourceKey: string, options?: ResourceRemoteSyncOptions): Promise<ResourceRemoteSyncResult>;
@@ -1,9 +1,23 @@
1
+ import { type IFileSystem } from "@uipath/filesystem";
2
+ export interface SolutionManifestProject {
3
+ Id?: unknown;
4
+ Type?: unknown;
5
+ ProjectRelativePath?: unknown;
6
+ }
7
+ export interface SolutionManifest {
8
+ Projects?: SolutionManifestProject[];
9
+ }
1
10
  /**
2
- * Throw if `dir` doesn't directly contain a `.uipx` manifest. Stricter than
3
- * `findSolutionFile` (which walks up to find one) — write commands should not
4
- * silently mutate the wrong folder when run from an arbitrary cwd.
5
- *
6
- * Lives in `services/` (not `commands/project.ts`) so callers can mock the
7
- * check without pulling in the full project-commands module.
11
+ * Stricter than `findSolutionFile` (which walks up to find one) — write
12
+ * commands must not silently mutate the wrong folder when run from an
13
+ * arbitrary cwd.
8
14
  */
9
15
  export declare function assertSolutionManifest(dir: string): Promise<void>;
16
+ /**
17
+ * Soft-fails to `undefined` on missing / unreadable / invalid `.uipx`.
18
+ * Consumers (read-time enhancers, design-time reconcilers) need
19
+ * tolerance — pack's own fail-fast policy lives elsewhere
20
+ * (`assertSolutionManifest`, and each project tool's own contribution errors).
21
+ */
22
+ export declare function readSolutionManifest(fs: IFileSystem, solutionDir: string): Promise<SolutionManifest | undefined>;
23
+ export declare function resolveProjectDirFromManifest(fs: IFileSystem, solutionDir: string, projectKey: string): Promise<string | undefined>;
@@ -1,4 +1,5 @@
1
- import { type IResourceBuilderServices, type ISolutionBuilder, type ResourceDefinition } from "@uipath/resource-builder-sdk";
1
+ import type { IResourceBuilderServices } from "@uipath/resource-builder-sdk";
2
+ import type { ISolutionBuilder, ResourceDefinition } from "@uipath/resource-builder-sdk/solution";
2
3
  interface RequiredPropertyDefault {
3
4
  property: string;
4
5
  /** Empty placeholder value matching the property's declared type. */
@@ -42,7 +43,7 @@ interface SyncResult {
42
43
  * @param solutionDir - Path to the solution directory
43
44
  * @param projectPaths - Specific project paths to scan (if omitted, scans all projects in .uipx)
44
45
  */
45
- export declare function syncResourcesFromBindings(solutionDir: string, projectPaths?: string[]): Promise<SyncResult>;
46
+ export declare function syncResourcesFromBindings(solutionDir: string, projectPaths?: string[], projectSubTypes?: ReadonlyMap<string, string>): Promise<SyncResult>;
46
47
  /**
47
48
  * Mirror of SDK's private `addResourceWithUniqueName`
48
49
  * (resource-builder-sdk index.js:673): if any other resource of the same
@@ -148,4 +149,4 @@ export declare function readUipxProjects(solutionDir: string): Promise<UipxProje
148
149
  * Sync resources from bindings with logging. Non-fatal — logs warnings
149
150
  * on failure and continues. Used by pack and upload before packaging.
150
151
  */
151
- export declare function syncAndLog(solutionDir: string): Promise<void>;
152
+ export declare function syncAndLog(solutionDir: string, projectSubTypes?: ReadonlyMap<string, string>): Promise<void>;
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@uipath/solution-sdk",
3
+ "author": "UiPath",
3
4
  "license": "SEE LICENSE IN LICENSE.txt",
4
- "version": "1.202.0",
5
+ "version": "1.203.0-preview.160",
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/UiPath/cli.git",
@@ -39,5 +40,5 @@
39
40
  "dist"
40
41
  ],
41
42
  "private": false,
42
- "gitHead": "23b5a7038ead7264439af18f8b807c7cc99a29d5"
43
+ "gitHead": "3a42062ba731afca4595ba9aa8a80afc9667528d"
43
44
  }