@salesforce/webapp-template-feature-react-global-search-experimental 1.110.0 → 1.111.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.
package/dist/CHANGELOG.md CHANGED
@@ -3,6 +3,25 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.111.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.110.1...v1.111.0) (2026-03-19)
7
+
8
+ **Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.110.1](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.110.0...v1.110.1) (2026-03-19)
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * misc cleanup — CSP trusted sites, permset auto-discovery, dependency and data fixes ([#327](https://github.com/salesforce-experience-platform-emu/webapps/issues/327)) ([3cd4009](https://github.com/salesforce-experience-platform-emu/webapps/commit/3cd40094f46b2780b47fcb136f633798273016b4))
20
+
21
+
22
+
23
+
24
+
6
25
  # [1.110.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.109.9...v1.110.0) (2026-03-19)
7
26
 
8
27
  **Note:** Version bump only for package @salesforce/webapp-template-base-sfdx-project-experimental
@@ -15,8 +15,8 @@
15
15
  "graphql:schema": "node scripts/get-graphql-schema.mjs"
16
16
  },
17
17
  "dependencies": {
18
- "@salesforce/sdk-data": "^1.110.0",
19
- "@salesforce/webapp-experimental": "^1.110.0",
18
+ "@salesforce/sdk-data": "^1.111.0",
19
+ "@salesforce/webapp-experimental": "^1.111.0",
20
20
  "@tailwindcss/vite": "^4.1.17",
21
21
  "class-variance-authority": "^0.7.1",
22
22
  "clsx": "^2.1.1",
@@ -43,7 +43,7 @@
43
43
  "@graphql-eslint/eslint-plugin": "^4.1.0",
44
44
  "@graphql-tools/utils": "^11.0.0",
45
45
  "@playwright/test": "^1.49.0",
46
- "@salesforce/vite-plugin-webapp-experimental": "^1.110.0",
46
+ "@salesforce/vite-plugin-webapp-experimental": "^1.111.0",
47
47
  "@testing-library/jest-dom": "^6.6.3",
48
48
  "@testing-library/react": "^16.1.0",
49
49
  "@testing-library/user-event": "^14.5.2",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@salesforce/webapp-template-base-sfdx-project-experimental",
3
- "version": "1.110.0",
3
+ "version": "1.111.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@salesforce/webapp-template-base-sfdx-project-experimental",
9
- "version": "1.110.0",
9
+ "version": "1.111.0",
10
10
  "license": "SEE LICENSE IN LICENSE.txt",
11
11
  "devDependencies": {
12
12
  "@lwc/eslint-plugin-lwc": "^3.3.0",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/webapp-template-base-sfdx-project-experimental",
3
- "version": "1.110.0",
3
+ "version": "1.111.0",
4
4
  "description": "Base SFDX project template",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "publishConfig": {
@@ -14,7 +14,7 @@
14
14
  * 1. login — sf org login web only if org not already connected (skip with --skip-login)
15
15
  * 2. webapp — (all web apps) npm install && npm run build so dist exists for deploy (skip with --skip-webapp-build)
16
16
  * 3. deploy — sf project deploy start --target-org <alias> (requires dist for entity deployment)
17
- * 4. permset — sf org assign permset (skip with --skip-permset; name via --permset-name)
17
+ * 4. permset — sf org assign permset for each *.permissionset-meta.xml (skip with --skip-permset; override via --permset-name)
18
18
  * 5. data — prepare unique fields + sf data import tree (skipped if no data dir/plan)
19
19
  * 6. graphql — (in webapp) npm run graphql:schema then npm run graphql:codegen
20
20
  * 7. dev — (in webapp) npm run dev — launch dev server (skip with --skip-dev)
@@ -52,7 +52,8 @@ function parseArgs() {
52
52
  const args = process.argv.slice(2);
53
53
  let targetOrg = null;
54
54
  let webappName = null;
55
- let permsetName = 'Property_Management_Access';
55
+ /** If non-empty, only these names are assigned; otherwise all discovered from the project. */
56
+ const permsetNamesExplicit = [];
56
57
  let yes = false;
57
58
  const flags = {
58
59
  skipLogin: false,
@@ -69,7 +70,7 @@ function parseArgs() {
69
70
  } else if (args[i] === '--webapp-name' && args[i + 1]) {
70
71
  webappName = args[++i];
71
72
  } else if (args[i] === '--permset-name' && args[i + 1]) {
72
- permsetName = args[++i];
73
+ permsetNamesExplicit.push(args[++i]);
73
74
  } else if (args[i] === '--skip-login') flags.skipLogin = true;
74
75
  else if (args[i] === '--skip-deploy') flags.skipDeploy = true;
75
76
  else if (args[i] === '--skip-permset') flags.skipPermset = true;
@@ -90,7 +91,7 @@ Required:
90
91
 
91
92
  Options:
92
93
  --webapp-name <name> Web app folder name under webapplications/ (default: auto-detect)
93
- --permset-name <name> Permission set to assign (default: Property_Management_Access)
94
+ --permset-name <name> Assign only this permission set (repeatable). Default: all sets under permissionsets/
94
95
  --skip-login Skip login step (login is auto-skipped if org is already connected)
95
96
  --skip-deploy Do not deploy metadata
96
97
  --skip-permset Do not assign permission set
@@ -108,7 +109,7 @@ Options:
108
109
  console.error('Error: --target-org <alias> is required.');
109
110
  process.exit(1);
110
111
  }
111
- return { targetOrg, webappName, permsetName, yes, ...flags };
112
+ return { targetOrg, webappName, permsetNamesExplicit, yes, ...flags };
112
113
  }
113
114
 
114
115
  function discoverAllWebappDirs(webappName) {
@@ -141,6 +142,19 @@ function discoverWebappDir(webappName) {
141
142
  return all[0];
142
143
  }
143
144
 
145
+ /** API names from permissionsets/*.permissionset-meta.xml in the first package directory. */
146
+ function discoverPermissionSetNames() {
147
+ const dir = resolve(SFDX_SOURCE, 'permissionsets');
148
+ if (!existsSync(dir)) return [];
149
+ const names = [];
150
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
151
+ if (!entry.isFile()) continue;
152
+ const m = entry.name.match(/^(.+)\.permissionset-meta\.xml$/);
153
+ if (m) names.push(m[1]);
154
+ }
155
+ return names.sort();
156
+ }
157
+
144
158
  function isOrgConnected(targetOrg) {
145
159
  const result = spawnSync('sf', ['org', 'display', '--target-org', targetOrg, '--json'], {
146
160
  cwd: ROOT,
@@ -281,7 +295,7 @@ async function main() {
281
295
  const {
282
296
  targetOrg,
283
297
  webappName,
284
- permsetName,
298
+ permsetNamesExplicit,
285
299
  yes,
286
300
  skipLogin: argSkipLogin,
287
301
  skipDeploy: argSkipDeploy,
@@ -292,13 +306,22 @@ async function main() {
292
306
  skipDev: argSkipDev,
293
307
  } = parseArgs();
294
308
 
309
+ const permsetNames =
310
+ permsetNamesExplicit.length > 0 ? permsetNamesExplicit : discoverPermissionSetNames();
311
+ const permsetStepLabel =
312
+ permsetNames.length === 0
313
+ ? 'Permset — (none under permissionsets/)'
314
+ : permsetNames.length <= 3
315
+ ? `Permset — assign ${permsetNames.join(', ')}`
316
+ : `Permset — assign ${permsetNames.length} permission sets`;
317
+
295
318
  const hasDataPlan = existsSync(DATA_PLAN) && existsSync(DATA_DIR);
296
319
 
297
320
  const stepDefs = [
298
321
  { key: 'login', label: 'Login — org authentication', enabled: !argSkipLogin, available: true },
299
322
  { key: 'webappBuild', label: 'Webapp Build — npm install + build (pre-deploy)', enabled: !argSkipWebappBuild, available: true },
300
323
  { key: 'deploy', label: 'Deploy — sf project deploy start', enabled: !argSkipDeploy, available: true },
301
- { key: 'permset', label: `Permset — assign ${permsetName}`, enabled: !argSkipPermset, available: true },
324
+ { key: 'permset', label: permsetStepLabel, enabled: !argSkipPermset, available: true },
302
325
  { key: 'data', label: 'Data — delete + import records via Apex', enabled: !argSkipData && hasDataPlan, available: hasDataPlan },
303
326
  { key: 'graphql', label: 'GraphQL — schema introspect + codegen', enabled: !argSkipGraphql, available: true },
304
327
  { key: 'dev', label: 'Dev — launch dev server', enabled: !argSkipDev, available: true },
@@ -359,31 +382,38 @@ async function main() {
359
382
  });
360
383
  }
361
384
 
362
- if (!skipPermset && permsetName) {
363
- console.log('\n--- Assign permission set ---');
364
- const permsetResult = spawnSync(
365
- 'sf',
366
- ['org', 'assign', 'permset', '--name', permsetName, '--target-org', targetOrg],
367
- {
368
- cwd: ROOT,
369
- stdio: 'pipe',
370
- shell: true,
371
- }
372
- );
373
- if (permsetResult.status === 0) {
374
- console.log('Permission set assigned.');
385
+ if (!skipPermset) {
386
+ if (permsetNames.length === 0) {
387
+ console.log('\n--- Assign permission sets ---');
388
+ console.log('No permission sets found under permissionsets/ and none passed via --permset-name; skipping.');
375
389
  } else {
376
- const out =
377
- (permsetResult.stderr?.toString() || '') + (permsetResult.stdout?.toString() || '');
378
- if (out.includes('Duplicate') && out.includes('PermissionSet')) {
379
- console.log('Permission set already assigned; skipping.');
380
- } else if (out.includes('not found') && out.includes('target org')) {
381
- console.log(`Permission set "${permsetName}" not in org; skipping.`);
382
- } else {
383
- process.stdout.write(permsetResult.stdout?.toString() || '');
384
- process.stderr.write(permsetResult.stderr?.toString() || '');
385
- console.error('\nSetup failed at step: Assign permission set');
386
- process.exit(permsetResult.status ?? 1);
390
+ console.log('\n--- Assign permission sets ---');
391
+ for (const permsetName of permsetNames) {
392
+ const permsetResult = spawnSync(
393
+ 'sf',
394
+ ['org', 'assign', 'permset', '--name', permsetName, '--target-org', targetOrg],
395
+ {
396
+ cwd: ROOT,
397
+ stdio: 'pipe',
398
+ shell: true,
399
+ }
400
+ );
401
+ if (permsetResult.status === 0) {
402
+ console.log(`Permission set "${permsetName}" assigned.`);
403
+ } else {
404
+ const out =
405
+ (permsetResult.stderr?.toString() || '') + (permsetResult.stdout?.toString() || '');
406
+ if (out.includes('Duplicate') && out.includes('PermissionSet')) {
407
+ console.log(`Permission set "${permsetName}" already assigned; skipping.`);
408
+ } else if (out.includes('not found') && out.includes('target org')) {
409
+ console.log(`Permission set "${permsetName}" not in org; skipping.`);
410
+ } else {
411
+ process.stdout.write(permsetResult.stdout?.toString() || '');
412
+ process.stderr.write(permsetResult.stderr?.toString() || '');
413
+ console.error(`\nSetup failed at step: Assign permission set (${permsetName})`);
414
+ process.exit(permsetResult.status ?? 1);
415
+ }
416
+ }
387
417
  }
388
418
  }
389
419
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/webapp-template-feature-react-global-search-experimental",
3
- "version": "1.110.0",
3
+ "version": "1.111.0",
4
4
  "description": "Global search feature for Salesforce objects with filtering and pagination",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "",