@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.
- package/LICENSE.txt +82 -0
- package/README.md +153 -0
- package/dist/aggregate-features.d.ts +16 -0
- package/dist/aggregate-features.d.ts.map +1 -0
- package/dist/aggregate-features.js +43 -0
- package/dist/aggregate-features.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +71 -0
- package/dist/cli.js.map +1 -0
- package/dist/conflict-detector.d.ts +31 -0
- package/dist/conflict-detector.d.ts.map +1 -0
- package/dist/conflict-detector.js +153 -0
- package/dist/conflict-detector.js.map +1 -0
- package/dist/dependency-resolver.d.ts +18 -0
- package/dist/dependency-resolver.d.ts.map +1 -0
- package/dist/dependency-resolver.js +96 -0
- package/dist/dependency-resolver.js.map +1 -0
- package/dist/describe-command.d.ts +10 -0
- package/dist/describe-command.d.ts.map +1 -0
- package/dist/describe-command.js +119 -0
- package/dist/describe-command.js.map +1 -0
- package/dist/feature-metadata.d.ts +30 -0
- package/dist/feature-metadata.d.ts.map +1 -0
- package/dist/feature-metadata.js +136 -0
- package/dist/feature-metadata.js.map +1 -0
- package/dist/feature-search.d.ts +16 -0
- package/dist/feature-search.d.ts.map +1 -0
- package/dist/feature-search.js +140 -0
- package/dist/feature-search.js.map +1 -0
- package/dist/features.json +137 -0
- package/dist/file-copier.d.ts +15 -0
- package/dist/file-copier.d.ts.map +1 -0
- package/dist/file-copier.js +105 -0
- package/dist/file-copier.js.map +1 -0
- package/dist/install-command.d.ts +15 -0
- package/dist/install-command.d.ts.map +1 -0
- package/dist/install-command.js +314 -0
- package/dist/install-command.js.map +1 -0
- package/dist/list-command.d.ts +13 -0
- package/dist/list-command.d.ts.map +1 -0
- package/dist/list-command.js +71 -0
- package/dist/list-command.js.map +1 -0
- package/dist/logger.d.ts +48 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +82 -0
- package/dist/logger.js.map +1 -0
- package/dist/package-manager.d.ts +22 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +172 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/placeholder-resolver.d.ts +25 -0
- package/dist/placeholder-resolver.d.ts.map +1 -0
- package/dist/placeholder-resolver.js +78 -0
- package/dist/placeholder-resolver.js.map +1 -0
- package/dist/schema-loader.d.ts +17 -0
- package/dist/schema-loader.d.ts.map +1 -0
- package/dist/schema-loader.js +82 -0
- package/dist/schema-loader.js.map +1 -0
- package/dist/types.d.ts +174 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +30 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +58 -0
- package/dist/utils.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|