@salesforce/webapps-features-experimental 1.68.0

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 (52) hide show
  1. package/LICENSE.txt +82 -0
  2. package/README.md +154 -0
  3. package/dist/conflict-detector.d.ts +31 -0
  4. package/dist/conflict-detector.d.ts.map +1 -0
  5. package/dist/conflict-detector.js +153 -0
  6. package/dist/conflict-detector.js.map +1 -0
  7. package/dist/dependency-resolver.d.ts +18 -0
  8. package/dist/dependency-resolver.d.ts.map +1 -0
  9. package/dist/dependency-resolver.js +90 -0
  10. package/dist/dependency-resolver.js.map +1 -0
  11. package/dist/feature-metadata.d.ts +35 -0
  12. package/dist/feature-metadata.d.ts.map +1 -0
  13. package/dist/feature-metadata.js +140 -0
  14. package/dist/feature-metadata.js.map +1 -0
  15. package/dist/feature-search.d.ts +11 -0
  16. package/dist/feature-search.d.ts.map +1 -0
  17. package/dist/feature-search.js +121 -0
  18. package/dist/feature-search.js.map +1 -0
  19. package/dist/features.json +336 -0
  20. package/dist/file-copier.d.ts +15 -0
  21. package/dist/file-copier.d.ts.map +1 -0
  22. package/dist/file-copier.js +105 -0
  23. package/dist/file-copier.js.map +1 -0
  24. package/dist/install-feature.d.ts +8 -0
  25. package/dist/install-feature.d.ts.map +1 -0
  26. package/dist/install-feature.js +563 -0
  27. package/dist/install-feature.js.map +1 -0
  28. package/dist/logger.d.ts +48 -0
  29. package/dist/logger.d.ts.map +1 -0
  30. package/dist/logger.js +82 -0
  31. package/dist/logger.js.map +1 -0
  32. package/dist/package-manager.d.ts +22 -0
  33. package/dist/package-manager.d.ts.map +1 -0
  34. package/dist/package-manager.js +172 -0
  35. package/dist/package-manager.js.map +1 -0
  36. package/dist/placeholder-resolver.d.ts +25 -0
  37. package/dist/placeholder-resolver.d.ts.map +1 -0
  38. package/dist/placeholder-resolver.js +78 -0
  39. package/dist/placeholder-resolver.js.map +1 -0
  40. package/dist/schema-loader.d.ts +17 -0
  41. package/dist/schema-loader.d.ts.map +1 -0
  42. package/dist/schema-loader.js +82 -0
  43. package/dist/schema-loader.js.map +1 -0
  44. package/dist/types.d.ts +146 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +7 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/utils.d.ts +30 -0
  49. package/dist/utils.d.ts.map +1 -0
  50. package/dist/utils.js +58 -0
  51. package/dist/utils.js.map +1 -0
  52. package/package.json +53 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { readFileSync } from "fs";
7
+ import { dirname, join } from "path";
8
+ import { fileURLToPath } from "url";
9
+ // Get the directory name for ES modules
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ let metadataCache = null;
13
+ /**
14
+ * Load the features metadata from features.json
15
+ */
16
+ function loadMetadata() {
17
+ if (metadataCache) {
18
+ return metadataCache;
19
+ }
20
+ try {
21
+ const metadataPath = join(__dirname, "features.json");
22
+ const content = readFileSync(metadataPath, "utf-8");
23
+ metadataCache = JSON.parse(content);
24
+ return metadataCache;
25
+ }
26
+ catch (error) {
27
+ throw new Error(`Failed to load features.json: ${error}`);
28
+ }
29
+ }
30
+ /**
31
+ * Get all available features
32
+ */
33
+ export function getAllFeatures() {
34
+ const metadata = loadMetadata();
35
+ return metadata.features;
36
+ }
37
+ /**
38
+ * Resolve a feature name to its canonical (registry) key, matching case-insensitively.
39
+ * Returns the canonical key or null if no match is found.
40
+ */
41
+ export function resolveFeatureName(featureName) {
42
+ const metadata = loadMetadata();
43
+ // Exact match first
44
+ if (metadata.features[featureName]) {
45
+ return featureName;
46
+ }
47
+ // Case-insensitive match
48
+ const lower = featureName.toLowerCase();
49
+ for (const key of Object.keys(metadata.features)) {
50
+ if (key.toLowerCase() === lower) {
51
+ return key;
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+ /**
57
+ * Get metadata for a specific feature (case-insensitive).
58
+ */
59
+ export function getFeatureMetadata(featureName) {
60
+ const resolved = resolveFeatureName(featureName);
61
+ if (!resolved)
62
+ return null;
63
+ const metadata = loadMetadata();
64
+ return metadata.features[resolved] || null;
65
+ }
66
+ /**
67
+ * Suggest similar feature names for a given input.
68
+ * Uses prefix matching and Levenshtein distance.
69
+ * Returns up to `max` suggestions sorted by relevance.
70
+ */
71
+ export function suggestSimilarFeatures(input, max = 3) {
72
+ const allFeatures = getAllFeatures();
73
+ const names = Object.keys(allFeatures);
74
+ const lower = input.toLowerCase();
75
+ const scored = names.map((name) => {
76
+ const nameLower = name.toLowerCase();
77
+ // Prefix match: input is a prefix of the feature name or vice versa
78
+ if (nameLower.startsWith(lower) || lower.startsWith(nameLower)) {
79
+ return { name, distance: 0 };
80
+ }
81
+ // Substring match: input appears within the feature name
82
+ if (nameLower.includes(lower)) {
83
+ return { name, distance: 1 };
84
+ }
85
+ return { name, distance: levenshtein(lower, nameLower) };
86
+ });
87
+ scored.sort((a, b) => a.distance - b.distance);
88
+ // Only suggest features within a reasonable edit distance
89
+ const maxDistance = Math.max(3, Math.floor(input.length / 2));
90
+ return scored
91
+ .filter((s) => s.distance <= maxDistance)
92
+ .slice(0, max)
93
+ .map((s) => s.name);
94
+ }
95
+ /**
96
+ * Simple Levenshtein distance between two strings.
97
+ */
98
+ function levenshtein(a, b) {
99
+ const m = a.length;
100
+ const n = b.length;
101
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
102
+ for (let i = 0; i <= m; i++)
103
+ dp[i][0] = i;
104
+ for (let j = 0; j <= n; j++)
105
+ dp[0][j] = j;
106
+ for (let i = 1; i <= m; i++) {
107
+ for (let j = 1; j <= n; j++) {
108
+ dp[i][j] =
109
+ a[i - 1] === b[j - 1]
110
+ ? dp[i - 1][j - 1]
111
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
112
+ }
113
+ }
114
+ return dp[m][n];
115
+ }
116
+ // Re-export search functionality from dedicated module
117
+ export { searchFeatures } from "./feature-search.js";
118
+ /**
119
+ * Get feature name from package name
120
+ */
121
+ export function getFeatureNameFromPackage(packageName) {
122
+ const allFeatures = getAllFeatures();
123
+ for (const [featureName, feature] of Object.entries(allFeatures)) {
124
+ if (feature.package === packageName) {
125
+ return featureName;
126
+ }
127
+ }
128
+ return null;
129
+ }
130
+ /**
131
+ * Check if a feature has complete schema information
132
+ */
133
+ export function isFeatureReady(featureName) {
134
+ const feature = getFeatureMetadata(featureName);
135
+ if (!feature)
136
+ return false;
137
+ // Feature is ready if it doesn't have 'schema-pending' status
138
+ return feature.status !== "schema-pending";
139
+ }
140
+ //# sourceMappingURL=feature-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-metadata.js","sourceRoot":"","sources":["../src/feature-metadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,wCAAwC;AACxC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,IAAI,aAAa,GAA4B,IAAI,CAAC;AAElD;;GAEG;AACH,SAAS,YAAY;IACpB,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,aAAc,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC7B,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACrD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,oBAAoB;IACpB,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC;IACpB,CAAC;IACD,yBAAyB;IACzB,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACrD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,GAAG,GAAG,CAAC;IAC5D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,oEAAoE;QACpE,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,yDAAyD;QACzD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE/C,0DAA0D;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,MAAM;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC;SACxC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACpB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAClB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;IAED,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,uDAAuD;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC5D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAClE,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACrC,OAAO,WAAW,CAAC;QACpB,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,8DAA8D;IAC9D,OAAO,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,11 @@
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 { FeatureMetadata } from "./types.js";
7
+ /**
8
+ * Search features by keyword with scoring and ranking
9
+ */
10
+ export declare function searchFeatures(query: string): FeatureMetadata[];
11
+ //# sourceMappingURL=feature-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-search.d.ts","sourceRoot":"","sources":["../src/feature-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA4GlD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CA2B/D"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { getAllFeatures } from "./feature-metadata.js";
7
+ /**
8
+ * Score a feature against search terms
9
+ * @internal
10
+ */
11
+ function scoreFeature(feature, terms, originalQuery) {
12
+ let score = 0;
13
+ const matchedFields = [];
14
+ const matchedTerms = new Set();
15
+ // Prepare searchable text fields (lowercase for case-insensitive matching)
16
+ const nameLower = feature.name.toLowerCase();
17
+ const shortDescLower = feature.shortDescription.toLowerCase();
18
+ const longDescLower = feature.longDescription.toLowerCase();
19
+ const keywordsLower = feature.keywords.map((k) => k.toLowerCase());
20
+ const featuresLower = (feature.features || []).map((f) => f.toLowerCase());
21
+ const componentsLower = (feature.components || []).map((c) => c.toLowerCase());
22
+ // Check for exact feature name match (highest priority)
23
+ if (nameLower === originalQuery) {
24
+ score += 1000;
25
+ matchedFields.push("name (exact)");
26
+ terms.forEach((t) => matchedTerms.add(t));
27
+ }
28
+ // Check each search term
29
+ for (const term of terms) {
30
+ // Name match (partial)
31
+ if (nameLower.includes(term)) {
32
+ score += 500;
33
+ matchedFields.push(`name: "${term}"`);
34
+ matchedTerms.add(term);
35
+ }
36
+ // Exact keyword match
37
+ if (keywordsLower.some((kw) => kw === term)) {
38
+ score += 400;
39
+ matchedFields.push(`keyword: "${term}"`);
40
+ matchedTerms.add(term);
41
+ }
42
+ else if (keywordsLower.some((kw) => kw.includes(term))) {
43
+ // Partial keyword match (less weight)
44
+ score += 300;
45
+ matchedFields.push(`keyword partial: "${term}"`);
46
+ matchedTerms.add(term);
47
+ }
48
+ // Short description match
49
+ if (shortDescLower.includes(term)) {
50
+ score += 300;
51
+ matchedFields.push(`short description: "${term}"`);
52
+ matchedTerms.add(term);
53
+ }
54
+ // Components match
55
+ const matchingComponent = componentsLower.find((c) => c.includes(term));
56
+ if (matchingComponent) {
57
+ score += 250;
58
+ matchedFields.push(`component: "${term}"`);
59
+ matchedTerms.add(term);
60
+ }
61
+ // Features/capabilities match
62
+ const matchingFeature = featuresLower.find((f) => f.includes(term));
63
+ if (matchingFeature) {
64
+ score += 200;
65
+ matchedFields.push(`feature: "${term}"`);
66
+ matchedTerms.add(term);
67
+ }
68
+ // Long description match
69
+ if (longDescLower.includes(term)) {
70
+ score += 100;
71
+ matchedFields.push(`long description: "${term}"`);
72
+ matchedTerms.add(term);
73
+ }
74
+ }
75
+ // Bonus: Term coverage (rewards matching more search terms)
76
+ score += matchedTerms.size * 100;
77
+ // Bonus: Phrase match (all terms appear consecutively as a phrase)
78
+ const allText = [
79
+ nameLower,
80
+ shortDescLower,
81
+ longDescLower,
82
+ ...keywordsLower,
83
+ ...featuresLower,
84
+ ...componentsLower,
85
+ ].join(" ");
86
+ if (allText.includes(originalQuery)) {
87
+ score += 200;
88
+ matchedFields.push("phrase match");
89
+ }
90
+ // Bonus: Ready status (only apply if feature actually matched some terms)
91
+ if (matchedTerms.size > 0 && feature.status !== "schema-pending") {
92
+ score += 50;
93
+ }
94
+ return { score, matchedFields };
95
+ }
96
+ /**
97
+ * Search features by keyword with scoring and ranking
98
+ */
99
+ export function searchFeatures(query) {
100
+ const allFeatures = getAllFeatures();
101
+ // Parse query into search terms (split on whitespace)
102
+ const terms = query.toLowerCase().trim().split(/\s+/);
103
+ const originalQuery = query.toLowerCase().trim();
104
+ // Score each feature
105
+ const scoredResults = [];
106
+ for (const feature of Object.values(allFeatures)) {
107
+ const result = scoreFeature(feature, terms, originalQuery);
108
+ // Only include features that have at least one match (score > 0)
109
+ if (result.score > 0) {
110
+ scoredResults.push({
111
+ feature,
112
+ score: result.score,
113
+ });
114
+ }
115
+ }
116
+ // Sort by score descending (highest score first)
117
+ scoredResults.sort((a, b) => b.score - a.score);
118
+ // Return just the features (maintains backwards compatibility)
119
+ return scoredResults.map((r) => r.feature);
120
+ }
121
+ //# sourceMappingURL=feature-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-search.js","sourceRoot":"","sources":["../src/feature-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,336 @@
1
+ {
2
+ "features": {
3
+ "authentication": {
4
+ "name": "Authentication",
5
+ "package": "@salesforce/webapp-template-feature-react-authentication-experimental",
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": ["shadcn"],
18
+ "packageDependencies": {
19
+ "@salesforce/sdk-data": "^1.56.1",
20
+ "@salesforce/webapp-experimental": "^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/webapplications/feature-react-authentication/src/auth",
32
+ "to": "<webappDir>/src/auth",
33
+ "description": "Authentication components, context, and pages"
34
+ },
35
+ {
36
+ "from": "force-app/main/default/webapplications/feature-react-authentication/src/routes.tsx",
37
+ "to": "<webappDir>/src/__example__auth-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
+ "shadcn": {
65
+ "name": "Shared UI (shadcn)",
66
+ "package": "@salesforce/webapp-template-feature-react-shadcn-experimental",
67
+ "shortDescription": "Comprehensive UI component library based on shadcn/ui design system",
68
+ "longDescription": "Comprehensive UI component library based on shadcn/ui design system. Includes commonly-used components like Button, Card, Input, Select, Table, Tabs, Dialog, and many more. Components are accessible, customizable, and follow modern React patterns. Provides a consistent design language across your application with built-in dark mode support and theming capabilities. All components use Tailwind CSS for styling and are built with accessibility in mind following ARIA guidelines.",
69
+ "keywords": [
70
+ "shadcn",
71
+ "UI components",
72
+ "Button",
73
+ "Card",
74
+ "Input",
75
+ "Select",
76
+ "Table",
77
+ "Tabs",
78
+ "design system"
79
+ ],
80
+ "packageDependencies": {
81
+ "class-variance-authority": "^0.7.1",
82
+ "clsx": "^2.1.1",
83
+ "lucide-react": "^0.562.0",
84
+ "radix-ui": "^1.4.3",
85
+ "shadcn": "^3.8.5",
86
+ "tailwind-merge": "^3.5.0",
87
+ "tw-animate-css": "^1.4.0"
88
+ },
89
+ "copy": [
90
+ {
91
+ "from": "force-app/main/default/webapplications/feature-react-shadcn/src/components/ui",
92
+ "to": "<webappDir>/src/components/ui",
93
+ "description": "shadcn-ui component library"
94
+ },
95
+ {
96
+ "from": "force-app/main/default/webapplications/feature-react-shadcn/src/lib",
97
+ "to": "<webappDir>/src/lib",
98
+ "description": "Utility functions (cn, etc.)"
99
+ },
100
+ {
101
+ "from": "force-app/main/default/webapplications/feature-react-shadcn/src/styles/global.css",
102
+ "to": "<webappDir>/src/styles/__example__shadcn-global.css",
103
+ "description": "Example showing design tokens and theming styles to add",
104
+ "integrationTarget": "src/styles/global.css"
105
+ }
106
+ ],
107
+ "features": [
108
+ "Accessible Components - All components follow ARIA guidelines",
109
+ "TypeScript - Fully typed with comprehensive type definitions",
110
+ "Tailwind CSS - Styled with utility classes",
111
+ "Customizable - Easy to customize with className props",
112
+ "Dark Mode - Built-in support for dark mode theming",
113
+ "Responsive - Components adapt to different screen sizes"
114
+ ],
115
+ "components": [
116
+ "Alert - Alert, AlertTitle, AlertDescription",
117
+ "Button - Button component with variants",
118
+ "Card - Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent",
119
+ "Field - Field, FieldLabel, FieldDescription, FieldError, FieldGroup",
120
+ "Input - Text input component",
121
+ "Label - Form label component (Radix UI based)",
122
+ "Pagination - Complete pagination component set",
123
+ "Select - Select dropdown with Radix UI",
124
+ "Skeleton - Loading skeleton for placeholder content",
125
+ "Spinner - Loading spinner component",
126
+ "Table - Complete table component set",
127
+ "Tabs - Tabbed interface components"
128
+ ]
129
+ },
130
+ "global-search": {
131
+ "name": "Global Search",
132
+ "package": "@salesforce/webapp-template-feature-react-global-search-experimental",
133
+ "shortDescription": "Powerful global search for querying Salesforce objects with filters and pagination",
134
+ "longDescription": "Global search feature for querying Salesforce objects using GraphQL-powered record list queries with cursor-based pagination. Includes a search input component with keyword search and browse-all modes, a filterable and sortable results page, and a record detail page with layout-driven field display. Supports formatted field rendering (address, email, phone, URL), configurable page sizes, object metadata introspection, and filter criteria with picklist values. Components are accessible with ARIA attributes and screen reader support.",
135
+ "keywords": [
136
+ "search",
137
+ "Salesforce objects",
138
+ "filters",
139
+ "pagination",
140
+ "GraphQL",
141
+ "keyword search",
142
+ "record detail",
143
+ "object info"
144
+ ],
145
+ "featureDependencies": ["shadcn"],
146
+ "packageDependencies": {
147
+ "@salesforce/webapp-experimental": "^1.56.1",
148
+ "@tanstack/react-form": "^1.28.3",
149
+ "zod": "^4.3.6"
150
+ },
151
+ "copy": [
152
+ {
153
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/api",
154
+ "to": "<webappDir>/src/api",
155
+ "description": "API services for object info, record detail, and GraphQL record list queries"
156
+ },
157
+ {
158
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/alerts",
159
+ "to": "<webappDir>/src/components/alerts",
160
+ "description": "Status alert components"
161
+ },
162
+ {
163
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/detail",
164
+ "to": "<webappDir>/src/components/detail",
165
+ "description": "Record detail view components with formatted field display (address, email, phone, URL)"
166
+ },
167
+ {
168
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/filters",
169
+ "to": "<webappDir>/src/components/filters",
170
+ "description": "Filter input components for narrowing search results"
171
+ },
172
+ {
173
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/forms",
174
+ "to": "<webappDir>/src/components/forms",
175
+ "description": "Form components for filter submission"
176
+ },
177
+ {
178
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/layout",
179
+ "to": "<webappDir>/src/components/layout",
180
+ "description": "Card-based layout components"
181
+ },
182
+ {
183
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/search",
184
+ "to": "<webappDir>/src/components/search",
185
+ "description": "Search results display with header, result fields, and pagination"
186
+ },
187
+ {
188
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/shared",
189
+ "to": "<webappDir>/src/components/shared",
190
+ "description": "Shared components including GlobalSearchInput"
191
+ },
192
+ {
193
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/FiltersPanel.tsx",
194
+ "to": "<webappDir>/src/components/FiltersPanel.tsx",
195
+ "description": "Filters panel container component"
196
+ },
197
+ {
198
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/LoadingFallback.tsx",
199
+ "to": "<webappDir>/src/components/LoadingFallback.tsx",
200
+ "description": "Loading fallback for Suspense boundaries"
201
+ },
202
+ {
203
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/components/SearchResultCard.tsx",
204
+ "to": "<webappDir>/src/components/SearchResultCard.tsx",
205
+ "description": "Individual search result card component"
206
+ },
207
+ {
208
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/constants.ts",
209
+ "to": "<webappDir>/src/constants.ts",
210
+ "description": "Feature constants (object API names, page size defaults)"
211
+ },
212
+ {
213
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/features/global-search",
214
+ "to": "<webappDir>/src/features/global-search",
215
+ "description": "Public API barrel exports for the global search feature"
216
+ },
217
+ {
218
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/hooks",
219
+ "to": "<webappDir>/src/hooks",
220
+ "description": "React hooks for search data, object info, record list (GraphQL), and record detail layout"
221
+ },
222
+ {
223
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/pages/GlobalSearch.tsx",
224
+ "to": "<webappDir>/src/pages/GlobalSearch.tsx",
225
+ "description": "Global search results page with filters, sorting, and cursor-based pagination"
226
+ },
227
+ {
228
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/pages/DetailPage.tsx",
229
+ "to": "<webappDir>/src/pages/DetailPage.tsx",
230
+ "description": "Record detail page with layout-driven form display"
231
+ },
232
+ {
233
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/types",
234
+ "to": "<webappDir>/src/types",
235
+ "description": "TypeScript type definitions for filters, object info, record detail, and search results"
236
+ },
237
+ {
238
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/utils",
239
+ "to": "<webappDir>/src/utils",
240
+ "description": "Utility functions for API calls, caching, filtering, pagination, field extraction, and data transforms"
241
+ },
242
+ {
243
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/pages/Home.tsx",
244
+ "to": "<webappDir>/src/pages/<desired-page-with-search-input>.tsx",
245
+ "description": "Example home page showing GlobalSearchInput integration",
246
+ "integrationTarget": "src/pages/Home.tsx"
247
+ },
248
+ {
249
+ "from": "force-app/main/default/webapplications/feature-react-global-search/src/routes.tsx",
250
+ "to": "<webappDir>/src/__example__search-routes.tsx",
251
+ "description": "Example showing how to add global search and detail routes",
252
+ "integrationTarget": "src/routes.tsx"
253
+ }
254
+ ],
255
+ "features": [
256
+ "GraphQL-powered record list queries with cursor-based pagination",
257
+ "Object metadata introspection via Salesforce APIs",
258
+ "Record detail page with layout-driven form display",
259
+ "Filterable search results with picklist-based filter criteria",
260
+ "Sortable results with configurable page sizes",
261
+ "Browse all records mode (browse__all)",
262
+ "Formatted field value display (address, email, phone, URL, text)",
263
+ "GlobalSearchInput component for keyword search and browse-all navigation",
264
+ "Accessible components with ARIA attributes and screen reader support"
265
+ ],
266
+ "components": [
267
+ "GlobalSearchInput - Search input bar with search and browse-all buttons",
268
+ "GlobalSearch - Main search results page with filters and pagination",
269
+ "DetailPage - Record detail page with layout-driven fields",
270
+ "FiltersPanel - Filter controls for narrowing search results by field values",
271
+ "SearchResultsPanel - Results display with pagination and sorting controls",
272
+ "SearchResultCard - Individual search result card with field values",
273
+ "ResultCardFields - Field display within result cards",
274
+ "SearchHeader - Header showing search query and result context",
275
+ "SearchPagination - Cursor-based pagination controls",
276
+ "UiApiDetailForm - Detail form driven by Salesforce layout metadata",
277
+ "DetailHeader - Detail page header with back navigation",
278
+ "DetailFields - Field rendering within detail layout sections",
279
+ "DetailLayoutSections - Section-based layout rendering",
280
+ "FieldValueDisplay - Formatted field value renderer with type-specific formatting",
281
+ "LoadingFallback - Suspense loading fallback component",
282
+ "FilterField - Individual filter field component",
283
+ "FilterInput - Text input for filter values",
284
+ "FilterSelect - Dropdown select for picklist filter values"
285
+ ]
286
+ },
287
+ "nav-menu": {
288
+ "name": "Navigation Menu",
289
+ "package": "@salesforce/webapp-template-feature-react-nav-menu-experimental",
290
+ "shortDescription": "Responsive application layout with collapsible navigation menu",
291
+ "longDescription": "Responsive application layout with collapsible navigation menu. Provides a consistent app shell structure with sidebar navigation that adapts to mobile, tablet, and desktop viewports. Includes navigation state management, active route highlighting, and customizable menu items with icons.",
292
+ "keywords": ["navigation", "app layout", "sidebar", "responsive", "menu", "routing"],
293
+ "status": "schema-pending"
294
+ },
295
+ "charts": {
296
+ "name": "Analytics Charts",
297
+ "package": "@salesforce/webapp-template-feature-react-chart-experimental",
298
+ "shortDescription": "Data visualization components powered by Recharts with built-in theming",
299
+ "longDescription": "Data visualization components powered by Recharts with built-in theming support. Provides AnalyticsChart and ChartContainer components for rendering line charts, bar charts, and other visualizations. Includes responsive chart sizing, customizable axes, legends, tooltips, and theme-aware colors that match your application design system.",
300
+ "keywords": [
301
+ "charts",
302
+ "analytics",
303
+ "Recharts",
304
+ "data visualization",
305
+ "line chart",
306
+ "bar chart",
307
+ "theming"
308
+ ],
309
+ "status": "schema-pending"
310
+ },
311
+ "graphql": {
312
+ "name": "GraphQL",
313
+ "package": "@salesforce/webapp-template-feature-graphql-experimental",
314
+ "shortDescription": "Complete GraphQL integration for Salesforce data access with type safety",
315
+ "longDescription": "Complete GraphQL integration for Salesforce data access. Includes executeGraphQL utility functions for running queries and mutations, code generation tooling for type-safe GraphQL operations, and example components like AccountsTable demonstrating best practices. Ideal for fetching detailed object data and relationships. Note: for list search operations, REST keyword search may be more appropriate.",
316
+ "keywords": [
317
+ "GraphQL",
318
+ "executeGraphQL",
319
+ "codegen",
320
+ "type safety",
321
+ "Salesforce data",
322
+ "queries",
323
+ "mutations"
324
+ ],
325
+ "status": "schema-pending"
326
+ },
327
+ "agentforce": {
328
+ "name": "Agentforce Conversation",
329
+ "package": "@salesforce/webapp-template-feature-react-agentforce-conversation-client-experimental",
330
+ "shortDescription": "Embedded AI-powered conversation interface using Salesforce Agentforce",
331
+ "longDescription": "Embedded AI-powered conversation interface using Salesforce Agentforce. Provides a chat-like copilot or agent UI component that integrates via Lightning Out. Enables users to interact with AI assistants directly within your web application. Requires a valid Salesforce session and proper Agentforce configuration in your Salesforce org.",
332
+ "keywords": ["Agentforce", "conversation", "copilot", "agent", "AI", "chat", "Lightning Out"],
333
+ "status": "schema-pending"
334
+ }
335
+ }
336
+ }
@@ -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: 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,aAAa,EAAE,EAC3B,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"}