@salesforce/ui-bundle-features 1.117.2

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 (68) hide show
  1. package/LICENSE.txt +82 -0
  2. package/README.md +153 -0
  3. package/dist/aggregate-features.d.ts +16 -0
  4. package/dist/aggregate-features.d.ts.map +1 -0
  5. package/dist/aggregate-features.js +43 -0
  6. package/dist/aggregate-features.js.map +1 -0
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +71 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/conflict-detector.d.ts +31 -0
  12. package/dist/conflict-detector.d.ts.map +1 -0
  13. package/dist/conflict-detector.js +153 -0
  14. package/dist/conflict-detector.js.map +1 -0
  15. package/dist/dependency-resolver.d.ts +18 -0
  16. package/dist/dependency-resolver.d.ts.map +1 -0
  17. package/dist/dependency-resolver.js +96 -0
  18. package/dist/dependency-resolver.js.map +1 -0
  19. package/dist/describe-command.d.ts +10 -0
  20. package/dist/describe-command.d.ts.map +1 -0
  21. package/dist/describe-command.js +119 -0
  22. package/dist/describe-command.js.map +1 -0
  23. package/dist/feature-metadata.d.ts +30 -0
  24. package/dist/feature-metadata.d.ts.map +1 -0
  25. package/dist/feature-metadata.js +136 -0
  26. package/dist/feature-metadata.js.map +1 -0
  27. package/dist/feature-search.d.ts +16 -0
  28. package/dist/feature-search.d.ts.map +1 -0
  29. package/dist/feature-search.js +140 -0
  30. package/dist/feature-search.js.map +1 -0
  31. package/dist/features.json +137 -0
  32. package/dist/file-copier.d.ts +15 -0
  33. package/dist/file-copier.d.ts.map +1 -0
  34. package/dist/file-copier.js +105 -0
  35. package/dist/file-copier.js.map +1 -0
  36. package/dist/install-command.d.ts +15 -0
  37. package/dist/install-command.d.ts.map +1 -0
  38. package/dist/install-command.js +314 -0
  39. package/dist/install-command.js.map +1 -0
  40. package/dist/list-command.d.ts +13 -0
  41. package/dist/list-command.d.ts.map +1 -0
  42. package/dist/list-command.js +71 -0
  43. package/dist/list-command.js.map +1 -0
  44. package/dist/logger.d.ts +48 -0
  45. package/dist/logger.d.ts.map +1 -0
  46. package/dist/logger.js +82 -0
  47. package/dist/logger.js.map +1 -0
  48. package/dist/package-manager.d.ts +22 -0
  49. package/dist/package-manager.d.ts.map +1 -0
  50. package/dist/package-manager.js +172 -0
  51. package/dist/package-manager.js.map +1 -0
  52. package/dist/placeholder-resolver.d.ts +25 -0
  53. package/dist/placeholder-resolver.d.ts.map +1 -0
  54. package/dist/placeholder-resolver.js +78 -0
  55. package/dist/placeholder-resolver.js.map +1 -0
  56. package/dist/schema-loader.d.ts +17 -0
  57. package/dist/schema-loader.d.ts.map +1 -0
  58. package/dist/schema-loader.js +82 -0
  59. package/dist/schema-loader.js.map +1 -0
  60. package/dist/types.d.ts +174 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +7 -0
  63. package/dist/types.js.map +1 -0
  64. package/dist/utils.d.ts +30 -0
  65. package/dist/utils.d.ts.map +1 -0
  66. package/dist/utils.js +58 -0
  67. package/dist/utils.js.map +1 -0
  68. package/package.json +53 -0
@@ -0,0 +1,137 @@
1
+ {
2
+ "features": {
3
+ "authentication": {
4
+ "name": "Authentication",
5
+ "package": "@salesforce/ui-bundle-template-feature-react-authentication",
6
+ "shortDescription": "Complete user authentication system with login, registration, and password management",
7
+ "longDescription": "Complete user authentication system with login, registration, and password reset flows. Includes protected route guards, session management, and authentication context providers. Handles user state across the application with secure token storage and automatic session refresh. Features include: AuthContext for managing auth state, PrivateRoute component for protecting authenticated-only pages, authentication pages (Login, Register, Profile, Forgot Password, Reset Password, Change Password), and backend Apex classes for authentication handling.",
8
+ "keywords": [
9
+ "login",
10
+ "register",
11
+ "password reset",
12
+ "protected routes",
13
+ "auth",
14
+ "session",
15
+ "user management"
16
+ ],
17
+ "featureDependencies": [],
18
+ "packageDependencies": {
19
+ "@salesforce/sdk-data": "^1.56.1",
20
+ "@salesforce/ui-bundle": "^1.56.1",
21
+ "@tanstack/react-form": "^1.28.3",
22
+ "zod": "^4.3.6"
23
+ },
24
+ "copy": [
25
+ {
26
+ "from": "force-app/main/default/classes",
27
+ "to": "<sfdxRoot>/classes",
28
+ "description": "Apex authentication handler classes"
29
+ },
30
+ {
31
+ "from": "force-app/main/default/uiBundles/feature-react-authentication/src/features/authentication",
32
+ "to": "<uiBundleDir>/src/features/authentication",
33
+ "description": "Authentication components, context, and pages"
34
+ },
35
+ {
36
+ "from": "force-app/main/default/uiBundles/feature-react-authentication/src/routes.tsx",
37
+ "to": "<uiBundleDir>/src/features/authentication/__example__authentication-routes.tsx",
38
+ "description": "Example showing how to add authentication routes",
39
+ "integrationTarget": "src/routes.tsx"
40
+ }
41
+ ],
42
+ "features": [
43
+ "Checks authentication status via Salesforce Chatter API (/chatter/users/me)",
44
+ "Protects routes with automatic redirect to login",
45
+ "Supports return URL (retUrl) query parameter for post-login navigation",
46
+ "Session timeout with configurable duration",
47
+ "Password strength validation",
48
+ "Forgot password and reset password flows",
49
+ "User profile display",
50
+ "Change password functionality"
51
+ ],
52
+ "components": [
53
+ "AuthContext - React context for managing authentication state",
54
+ "PrivateRoute - Route protection for authenticated-only pages",
55
+ "AuthenticationRoute - Route layout that redirects authenticated users",
56
+ "Login - Login page component",
57
+ "Register - Registration page component",
58
+ "Profile - User profile page",
59
+ "ForgotPassword - Password recovery flow",
60
+ "ResetPassword - Password reset page",
61
+ "ChangePassword - Password change page"
62
+ ]
63
+ },
64
+ "object-search": {
65
+ "name": "Object Search",
66
+ "package": "@salesforce/ui-bundle-template-feature-object-search",
67
+ "shortDescription": "Configurable object search and detail pages with filtering, sorting, pagination, and GraphQL-powered queries",
68
+ "longDescription": "Configurable object search feature with filtering, sorting, pagination, and detail views powered by Salesforce GraphQL APIs. Provides a generic search service layer, reusable filter components (text, picklist, multi-select, numeric range, date, date range, boolean, search), sort controls, cursor-based pagination with configurable page size, and URL-synced search parameters. Includes an Account-based example implementation demonstrating search list pages, detail pages with collapsible sections, breadcrumb navigation, and dynamic picklist option fetching via aggregate groupBy queries. The filter system is configuration-driven — adding a new filterable field requires only a config entry, no component changes.",
69
+ "keywords": [
70
+ "search",
71
+ "filter",
72
+ "sort",
73
+ "object detail",
74
+ "GraphQL",
75
+ "pagination",
76
+ "account",
77
+ "picklist",
78
+ "date filter",
79
+ "numeric filter"
80
+ ],
81
+ "featureDependencies": [],
82
+ "packageDependencies": {
83
+ "@salesforce/sdk-data": "^1.56.1",
84
+ "@salesforce/ui-bundle": "^1.56.1",
85
+ "react-day-picker": "^9.14.0"
86
+ },
87
+ "copy": [
88
+ {
89
+ "from": "force-app/main/default/uiBundles/feature-object-search/src/features/object-search",
90
+ "to": "<uiBundleDir>/src/features/object-search",
91
+ "description": "Generic object search components, hooks, filter panel, sort controls, and utilities"
92
+ },
93
+ {
94
+ "from": "force-app/main/default/uiBundles/feature-object-search/src/routes.tsx",
95
+ "to": "<uiBundleDir>/src/features/object-search/__examples__/object-search-routes.tsx",
96
+ "description": "Example showing how to add object search and detail routes",
97
+ "integrationTarget": "src/routes.tsx"
98
+ }
99
+ ],
100
+ "features": [
101
+ "GraphQL-powered object search with configurable filters and sorting",
102
+ "Configuration-driven filter system — add fields via config, no component changes needed",
103
+ "Filter types: text, picklist, multi-select, numeric range, date, date range, boolean, search",
104
+ "Dynamic picklist options via aggregate groupBy queries",
105
+ "URL-synced search parameters for bookmarkable/shareable searches",
106
+ "Cursor-based pagination with configurable page size",
107
+ "Reusable search service layer for any Salesforce object",
108
+ "Record detail page with collapsible field sections",
109
+ "Breadcrumb navigation between list and detail views",
110
+ "Debounced text search input",
111
+ "Active filter chips with individual removal"
112
+ ],
113
+ "components": [
114
+ "ObjectSearchBar - Search input bar for quick keyword search with navigation",
115
+ "PaginationControls - Pagination with page navigation and configurable page size",
116
+ "FilterPanel - Sidebar panel rendering filter controls from config",
117
+ "ActiveFilters - Chip display of active filters with removal buttons",
118
+ "SortControl - Dropdown for selecting sort field and direction",
119
+ "TextFilter - Text input filter with debounced updates",
120
+ "SelectFilter - Single-select picklist filter",
121
+ "MultiSelectFilter - Multi-select picklist filter with checkboxes",
122
+ "NumericRangeFilter - Min/max numeric range filter",
123
+ "DateFilter - Single date filter with calendar picker",
124
+ "DateRangeFilter - Date range filter with start/end pickers",
125
+ "BooleanFilter - Boolean toggle filter",
126
+ "SearchFilter - Multi-field keyword search filter",
127
+ "ObjectBreadcrumb - Breadcrumb navigation for list/detail pages",
128
+ "useObjectSearchParams - Hook for URL-synced filter, sort, and pagination state",
129
+ "useAsyncData - Hook for async data fetching with loading/error states",
130
+ "objectSearchService - Generic GraphQL search and distinct value fetching",
131
+ "fieldUtils - Field value extraction, address formatting, and date/time formatting",
132
+ "filterUtils - URL serialization and GraphQL filter building for all filter types",
133
+ "sortUtils - GraphQL sort order building"
134
+ ]
135
+ }
136
+ }
137
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import type { CopyOperation, InstallationContext } from "./types.js";
7
+ /**
8
+ * Execute all copy operations
9
+ */
10
+ export declare function executeCopyOperations(operations: readonly CopyOperation[], packageName: string, context: InstallationContext): Promise<void>;
11
+ /**
12
+ * Check if source path exists (for validation)
13
+ */
14
+ export declare function validateSourcePath(sourcePath: string): boolean;
15
+ //# sourceMappingURL=file-copier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-copier.d.ts","sourceRoot":"","sources":["../src/file-copier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE;;GAEG;AACH,wBAAsB,qBAAqB,CAC1C,UAAU,EAAE,SAAS,aAAa,EAAE,EACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAuED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { cpSync, existsSync, mkdirSync } from "fs";
7
+ import { dirname, join } from "path";
8
+ import { collectConflicts, hasConflict, outputConflictError, resolveConflict, } from "./conflict-detector.js";
9
+ import { resolvePath, resolveSourcePath } from "./placeholder-resolver.js";
10
+ /**
11
+ * Execute all copy operations
12
+ */
13
+ export async function executeCopyOperations(operations, packageName, context) {
14
+ const packagePath = join(context.uiBundleDir, "node_modules", packageName);
15
+ // Resolve all destination paths and source paths first
16
+ const logger = context.logger;
17
+ const resolvedOps = operations.map((op) => {
18
+ const destPath = resolvePath(op.to, context);
19
+ let sourcePath;
20
+ try {
21
+ sourcePath = resolveSourcePath(packagePath, op.from);
22
+ }
23
+ catch (error) {
24
+ logger.error(`Failed to resolve source path for: ${op.to}`);
25
+ throw error;
26
+ }
27
+ return {
28
+ from: op.from,
29
+ to: destPath,
30
+ sourcePath,
31
+ originalTo: op.to,
32
+ integrationTarget: op.integrationTarget,
33
+ };
34
+ });
35
+ // In error mode, collect all conflicts first before doing anything
36
+ if (context.conflictMode === "error") {
37
+ const conflicts = collectConflicts(resolvedOps);
38
+ if (conflicts.length > 0) {
39
+ outputConflictError(conflicts);
40
+ throw new Error("Installation stopped due to conflicts");
41
+ }
42
+ }
43
+ // Execute each copy operation
44
+ for (const op of resolvedOps) {
45
+ await executeCopyOperation(op, context);
46
+ }
47
+ }
48
+ /**
49
+ * Execute a single copy operation
50
+ */
51
+ async function executeCopyOperation(op, context) {
52
+ const logger = context.logger;
53
+ const sourcePath = op.sourcePath;
54
+ const destPath = op.to;
55
+ logger.plain(`${context.dryRun ? "[DRY RUN] Would copy" : "Copying"}: ${op.originalTo}`);
56
+ logger.debug(` From: ${sourcePath}`);
57
+ logger.debug(` To: ${destPath}`);
58
+ // Check for conflicts
59
+ if (hasConflict(destPath)) {
60
+ const resolution = await resolveConflict(destPath, context);
61
+ if (resolution === "skip") {
62
+ logger.plain(`Skipping: ${op.originalTo} (resolution: skip)`);
63
+ return;
64
+ }
65
+ if (resolution === "cancel") {
66
+ throw new Error("Installation cancelled by user");
67
+ }
68
+ if (resolution === "overwrite") {
69
+ logger.plain(`Overwriting: ${op.originalTo}`);
70
+ }
71
+ }
72
+ if (context.dryRun) {
73
+ return;
74
+ }
75
+ // Ensure destination directory exists
76
+ const destDir = dirname(destPath);
77
+ mkdirSync(destDir, { recursive: true });
78
+ // Copy files using Node.js fs.cpSync (safe, no shell injection risk)
79
+ try {
80
+ cpSync(sourcePath, destPath, { recursive: true, force: true });
81
+ // Track example files for summary
82
+ if (destPath.includes("__example__") && op.integrationTarget) {
83
+ context.copiedExampleFiles.push({
84
+ file: destPath,
85
+ integrationTarget: op.integrationTarget,
86
+ });
87
+ }
88
+ }
89
+ catch (error) {
90
+ logger.error(`Failed to copy: ${op.originalTo}`);
91
+ logger.error(` Source: ${sourcePath}`);
92
+ logger.error(` Destination: ${destPath}`);
93
+ if (error instanceof Error) {
94
+ logger.error(` Error: ${error.message}`);
95
+ }
96
+ throw new Error(`Copy operation failed for ${op.originalTo}`);
97
+ }
98
+ }
99
+ /**
100
+ * Check if source path exists (for validation)
101
+ */
102
+ export function validateSourcePath(sourcePath) {
103
+ return existsSync(sourcePath);
104
+ }
105
+ //# sourceMappingURL=file-copier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-copier.js","sourceRoot":"","sources":["../src/file-copier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import type { CliOptions } from "./types.js";
7
+ /**
8
+ * Main installation function
9
+ */
10
+ export declare function install(featureName: string, options: CliOptions): Promise<void>;
11
+ /**
12
+ * Get comprehensive help text for install command
13
+ */
14
+ export declare function getInstallHelpText(): string;
15
+ //# sourceMappingURL=install-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-command.d.ts","sourceRoot":"","sources":["../src/install-command.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EACX,UAAU,EAIV,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqHrF;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAwJ3C"}
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { existsSync, readFileSync } from "fs";
7
+ import { join, resolve } from "path";
8
+ import { processFeatureOwnOperations, resolveFeatureDependencies } from "./dependency-resolver.js";
9
+ import { getFeatureMetadataOrThrow } from "./feature-search.js";
10
+ import { Logger } from "./logger.js";
11
+ import { installPackage, isPackageInstalled } from "./package-manager.js";
12
+ import { loadSchemaFromNodeModules } from "./schema-loader.js";
13
+ /**
14
+ * Main installation function
15
+ */
16
+ export async function install(featureName, options) {
17
+ // Create logger and installation context
18
+ const logger = new Logger(options.verbose || false);
19
+ const context = createContext(options, logger);
20
+ // Validate directories
21
+ if (!existsSync(context.sfdxSource)) {
22
+ throw new Error(`SFDX source directory not found: ${context.sfdxSource}`);
23
+ }
24
+ if (!existsSync(context.uiBundleDir)) {
25
+ throw new Error(`UI bundle directory not found: ${context.uiBundleDir}`);
26
+ }
27
+ // Log configuration
28
+ logger.info(`SFDX Source: ${context.sfdxSource}`);
29
+ logger.info(`UI Bundle Dir: ${context.uiBundleDir}`);
30
+ logger.info(`UI Bundle Name: ${context.uiBundleName}`);
31
+ if (context.dryRun) {
32
+ logger.info("DRY RUN MODE: No changes will be made");
33
+ }
34
+ if (Object.keys(context.conflictResolutions).length > 0) {
35
+ logger.info(`Loaded ${Object.keys(context.conflictResolutions).length} conflict resolutions`);
36
+ }
37
+ // Resolve feature name to package name (throws with suggestions if not found)
38
+ const feature = getFeatureMetadataOrThrow(featureName);
39
+ const packageName = feature.package;
40
+ const displayName = featureName;
41
+ // Install the main feature package (silently — logged inside feature section later)
42
+ if (!isPackageInstalled(packageName, context.uiBundleDir)) {
43
+ await installPackage(packageName, true, context.uiBundleDir, context.dryRun, context.verbose);
44
+ }
45
+ else {
46
+ logger.debug("Feature package already installed, skipping...");
47
+ }
48
+ // Mark as installed
49
+ context.installedFeatures.add(packageName);
50
+ if (context.dryRun) {
51
+ logger.info("[DRY RUN] Would load and process feature schema");
52
+ }
53
+ // Load the feature schema
54
+ const schema = loadSchemaFromNodeModules(packageName, context.uiBundleDir, context.logger);
55
+ if (!schema) {
56
+ logger.warn("No features.json found. Refer to README for manual instructions.");
57
+ logger.info(`Try: cat node_modules/${packageName}/README.md`);
58
+ return;
59
+ }
60
+ logger.debug("Feature schema:", JSON.stringify(schema, null, 2));
61
+ // Determine dependencies for summary
62
+ const deps = schema.featureDependencies ?? [];
63
+ // Log installation summary
64
+ logger.info(`Installing feature: ${displayName}`);
65
+ if (deps.length > 0) {
66
+ logger.info(`Dependencies: ${deps.join(", ")}`);
67
+ }
68
+ // Install feature dependencies (each gets its own section)
69
+ if (deps.length > 0) {
70
+ await resolveFeatureDependencies(deps, context);
71
+ }
72
+ // Open main feature section
73
+ logger.section(`Installing feature: ${displayName}`);
74
+ logger.plain(`Installing package: ${packageName}`);
75
+ // Process this feature's own package deps and copy operations
76
+ await processFeatureOwnOperations(schema, packageName, context);
77
+ logger.sectionEnd(`Feature installed: ${displayName}`);
78
+ // Success message
79
+ console.log();
80
+ if (deps.length === 1) {
81
+ logger.success(`Installed feature: ${displayName} (with dependency: ${deps[0]})`);
82
+ }
83
+ else if (deps.length > 1) {
84
+ logger.success(`Installed feature: ${displayName} (with dependencies: ${deps.join(", ")})`);
85
+ }
86
+ else {
87
+ logger.success(`Installed feature: ${displayName}`);
88
+ }
89
+ if (!context.dryRun) {
90
+ // Show example files that need integration
91
+ if (context.copiedExampleFiles.length > 0) {
92
+ console.log();
93
+ console.log("Example files copied (require manual integration):");
94
+ for (const exampleFile of context.copiedExampleFiles) {
95
+ const relativePath = exampleFile.file.replace(context.uiBundleDir + "/", "");
96
+ console.log(` - ${relativePath}`);
97
+ if (exampleFile.integrationTarget) {
98
+ console.log(` → Integrate into: ${exampleFile.integrationTarget}`);
99
+ }
100
+ }
101
+ }
102
+ console.log();
103
+ console.log("Next steps:");
104
+ console.log(" 1. Review copied files (including __example__ files)");
105
+ if (context.copiedExampleFiles.length > 0) {
106
+ console.log(" 2. Integrate patterns from __example__ files into target files");
107
+ console.log(" 3. Delete __example__ files after integration");
108
+ console.log(" 4. Run: npm run build && npm run dev");
109
+ console.log(" 5. Test the feature");
110
+ }
111
+ else {
112
+ console.log(" 2. Run: npm run build && npm run dev");
113
+ console.log(" 3. Test the feature");
114
+ }
115
+ }
116
+ }
117
+ /**
118
+ * Create installation context from CLI options
119
+ */
120
+ function createContext(options, loggerInstance) {
121
+ const sfdxSource = resolve(options.sfdxSource || "force-app/main/default");
122
+ const uiBundleName = options.uiBundleDir;
123
+ const uiBundleDir = join(sfdxSource, "uiBundles", uiBundleName);
124
+ // Determine conflict mode
125
+ let conflictMode = options.onConflict || "prompt";
126
+ if (options.yes) {
127
+ conflictMode = "skip";
128
+ }
129
+ // Load conflict resolutions if provided
130
+ let conflictResolutions = {};
131
+ if (options.conflictResolution) {
132
+ const resolutionPath = resolve(options.conflictResolution);
133
+ if (!existsSync(resolutionPath)) {
134
+ throw new Error(`Conflict resolution file not found: ${resolutionPath}`);
135
+ }
136
+ try {
137
+ const content = readFileSync(resolutionPath, "utf-8");
138
+ conflictResolutions = JSON.parse(content);
139
+ loggerInstance.debug(`Loaded conflict resolutions from: ${resolutionPath}`);
140
+ }
141
+ catch (_error) {
142
+ throw new Error(`Failed to parse conflict resolution file: ${resolutionPath}`);
143
+ }
144
+ }
145
+ return {
146
+ sfdxSource,
147
+ uiBundleDir,
148
+ uiBundleName,
149
+ verbose: options.verbose || false,
150
+ dryRun: options.dryRun || false,
151
+ conflictMode: conflictMode,
152
+ conflictResolutions,
153
+ installedFeatures: new Set(),
154
+ copiedExampleFiles: [],
155
+ logger: loggerInstance,
156
+ };
157
+ }
158
+ /**
159
+ * Get comprehensive help text for install command
160
+ */
161
+ export function getInstallHelpText() {
162
+ return `
163
+
164
+ DESCRIPTION
165
+ Install a Salesforce UI bundle feature package with automatic dependency resolution,
166
+ file copying, and conflict management.
167
+
168
+ DISCOVERING FEATURES
169
+ Before installing, discover what features are available:
170
+
171
+ List all features:
172
+ $ npx @salesforce/ui-bundle-features list
173
+
174
+ Search for features:
175
+ $ npx @salesforce/ui-bundle-features list --search "auth"
176
+
177
+ Get detailed information:
178
+ $ npx @salesforce/ui-bundle-features describe authentication
179
+
180
+ This tool automates the feature installation workflow by:
181
+ 1. Resolving feature names to npm packages
182
+ 2. Installing npm packages as dev dependencies
183
+ 3. Recursively processing feature dependencies
184
+ 4. Installing package dependencies
185
+ 5. Copying files from the feature package to your project
186
+ 6. Handling conflicts interactively or via configuration
187
+
188
+ PREREQUISITES
189
+ - Run from within your UI bundle directory, or provide explicit paths
190
+ - Ensure package.json exists in the UI bundle directory
191
+ - Ensure feature packages include a features.json file
192
+
193
+ WORKFLOW EXAMPLES
194
+
195
+ Basic installation (interactive):
196
+ $ npx @salesforce/ui-bundle-features install authentication \\
197
+ --ui-bundle-dir my-ui-bundle
198
+
199
+ The CLI will:
200
+ - Install the authentication feature package
201
+ - Process its dependencies (e.g., shadcn)
202
+ - Prompt for any file conflicts
203
+ - Copy all files including __example__ files
204
+
205
+ Installation with custom SFDX source:
206
+ $ npx @salesforce/ui-bundle-features install authentication \\
207
+ --ui-bundle-dir my-ui-bundle \\
208
+ --sfdx-source custom/sfdx/path
209
+
210
+ LLM-assisted workflow (RECOMMENDED for AI assistants):
211
+ 1. Run with error mode to detect conflicts:
212
+ $ npx @salesforce/ui-bundle-features install authentication \\
213
+ --ui-bundle-dir my-ui-bundle \\
214
+ --on-conflict error
215
+
216
+ 2. CLI outputs conflict list with instructions
217
+
218
+ 3. Create conflict-resolution.json based on user preferences
219
+
220
+ 4. Rerun with resolution file:
221
+ $ npx @salesforce/ui-bundle-features install authentication \\
222
+ --ui-bundle-dir my-ui-bundle \\
223
+ --conflict-resolution conflict-resolution.json
224
+
225
+ Dry run to preview changes:
226
+ $ npx @salesforce/ui-bundle-features install authentication \\
227
+ --ui-bundle-dir my-ui-bundle \\
228
+ --dry-run
229
+
230
+ Non-interactive installation (skip conflicts):
231
+ $ npx @salesforce/ui-bundle-features install authentication \\
232
+ --ui-bundle-dir my-ui-bundle \\
233
+ --yes
234
+
235
+ FEATURE SCHEMA
236
+ Features must include a features.json file that defines:
237
+
238
+ - featureDependencies: Other features to install first
239
+ - packageDependencies: npm packages to add to dependencies
240
+ - packageDevDependencies: npm packages to add to devDependencies
241
+ - copy: Files/directories to copy from the package
242
+
243
+ Example:
244
+ {
245
+ "featureDependencies": ["shadcn"],
246
+ "packageDependencies": {
247
+ "@tanstack/react-form": "^1.28.3"
248
+ },
249
+ "copy": [
250
+ {
251
+ "from": "force-app/main/default/classes",
252
+ "to": "<sfdxSource>/classes",
253
+ "description": "Apex classes"
254
+ },
255
+ {
256
+ "from": "force-app/main/default/uiBundles/feature-auth/src/auth",
257
+ "to": "<uiBundleDir>/src/auth",
258
+ "description": "Auth components"
259
+ },
260
+ {
261
+ "from": "force-app/main/default/uiBundles/feature-auth/src/__example__app.tsx",
262
+ "to": "<uiBundleDir>/src/__example__app.tsx",
263
+ "description": "Integration example",
264
+ "integrationTarget": "src/app.tsx"
265
+ }
266
+ ]
267
+ }
268
+
269
+ EXAMPLE FILES
270
+ Feature packages may include __example__ files (e.g., __example__routes.tsx)
271
+ that show how to integrate the feature into your existing code.
272
+
273
+ After installation:
274
+ 1. Review the __example__ files
275
+ 2. Manually integrate patterns into your actual files
276
+ 3. Delete the __example__ files once integrated
277
+
278
+ PATH RESOLUTION
279
+ Schema paths support these placeholders:
280
+
281
+ - <sfdxSource>/path → Resolves to <sfdx-source>/path
282
+ Example: <sfdxSource>/classes → force-app/main/default/classes
283
+
284
+ - <uiBundleDir>/path → Resolves to <sfdx-source>/uiBundles/<ui-bundle-dir>/path
285
+ Example: <uiBundleDir>/src/auth → force-app/main/default/uiBundles/my-ui-bundle/src/auth
286
+
287
+ Hint placeholders (for user/LLM guidance):
288
+ - Some "to" paths contain descriptive segments like <desired-page-with-search-input>
289
+ that are NOT resolved by the CLI. These are hints indicating the user or LLM
290
+ should choose an appropriate destination. The file will be copied with the
291
+ literal placeholder name; rename or relocate it to the intended target.
292
+
293
+ Legacy formats are also supported:
294
+ - force-app/main/default/classes → Treated as SFDX metadata
295
+ - <uiBundle> placeholder → Replaced with UI bundle name
296
+
297
+ AFTER INSTALLATION
298
+ 1. Review copied files, especially __example__ files
299
+ 2. Integrate __example__ patterns into your code
300
+ 3. Run: npm run build && npm run dev
301
+ 4. Test the new feature
302
+ 5. Delete __example__ files after integration
303
+
304
+ TROUBLESHOOTING
305
+ - "SFDX source directory not found": Check --sfdx-source path
306
+ - "UI bundle directory not found": Check --ui-bundle-dir name and --sfdx-source path
307
+ - "No features.json found": Feature package doesn't support this tool
308
+ - Conflicts in error mode: Follow instructions to create conflict-resolution.json
309
+ - npm install failures: Check network and package availability
310
+
311
+ For more information, see: .a4drules/uiBundles.md
312
+ `;
313
+ }
314
+ //# sourceMappingURL=install-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-command.js","sourceRoot":"","sources":["../src/install-command.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAQ/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,WAAmB,EAAE,OAAmB;IACrE,yCAAyC;IACzC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE/C,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,oBAAoB;IACpB,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,MAAM,uBAAuB,CAAC,CAAC;IAC/F,CAAC;IAED,8EAA8E;IAC9E,MAAM,OAAO,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,MAAM,WAAW,GAAG,WAAW,CAAC;IAEhC,oFAAoF;IACpF,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3D,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/F,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,oBAAoB;IACpB,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAChE,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAG,yBAAyB,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3F,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,yBAAyB,WAAW,YAAY,CAAC,CAAC;QAC9D,OAAO;IACR,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,qCAAqC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAE9C,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,4BAA4B;IAC5B,MAAM,CAAC,OAAO,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;IAEnD,8DAA8D;IAC9D,MAAM,2BAA2B,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,CAAC,UAAU,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;IAEvD,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,sBAAsB,WAAW,sBAAsB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,sBAAsB,WAAW,wBAAwB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7F,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,OAAO,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrB,2CAA2C;QAC3C,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBACtD,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,OAAO,YAAY,EAAE,CAAC,CAAC;gBACnC,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACvE,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,OAAmB,EAAE,cAAsB;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,wBAAwB,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,WAAY,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAEhE,0BAA0B;IAC1B,IAAI,YAAY,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC;IAClD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,YAAY,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,wCAAwC;IACxC,IAAI,mBAAmB,GAA0B,EAAE,CAAC;IACpD,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,uCAAuC,cAAc,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACtD,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,cAAc,CAAC,KAAK,CAAC,qCAAqC,cAAc,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,6CAA6C,cAAc,EAAE,CAAC,CAAC;QAChF,CAAC;IACF,CAAC;IAED,OAAO;QACN,UAAU;QACV,WAAW;QACX,YAAY;QACZ,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,YAAY,EAAE,YAA4B;QAC1C,mBAAmB;QACnB,iBAAiB,EAAE,IAAI,GAAG,EAAU;QACpC,kBAAkB,EAAE,EAAE;QACtB,MAAM,EAAE,cAAc;KACtB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsJP,CAAC;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ /**
7
+ * List all available features
8
+ */
9
+ export declare function listFeatures(options: {
10
+ verbose?: boolean;
11
+ search?: string;
12
+ }): void;
13
+ //# sourceMappingURL=list-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-command.d.ts","sourceRoot":"","sources":["../src/list-command.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyElF"}