@salesforce/templates 66.17.3 → 66.17.4

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 (21) hide show
  1. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +3 -3
  2. package/lib/templates/project/angularintapp/CHANGELOG.md +169 -0
  3. package/lib/templates/project/angularintapp/README.md +82 -44
  4. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +1 -1
  5. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +7 -7
  6. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +4 -4
  7. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/_f_/_os_/api/object-search.service.ts +3 -6
  8. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/graphql-operations-types.ts +1 -2
  9. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +1 -8
  10. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +1 -1
  11. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/icon/icon.ts +6 -0
  12. package/lib/templates/project/angularintapp/package.json +1 -1
  13. package/lib/templates/project/angularintapp/scripts/network-senders.mjs +84 -0
  14. package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +11 -6
  15. package/lib/templates/project/angularintapp/scripts/org-setup.mjs +13 -5
  16. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +3 -3
  17. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +3 -3
  18. package/lib/templates/uiBundles/angularbasic/package-lock.json +3 -3
  19. package/lib/templates/uiBundles/reactbasic/package-lock.json +3 -3
  20. package/lib/templates/uiBundles/vuebasic/package-lock.json +3 -3
  21. package/package.json +3 -3
@@ -14118,9 +14118,9 @@
14118
14118
  }
14119
14119
  },
14120
14120
  "node_modules/ip-address": {
14121
- "version": "10.7.4",
14122
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
14123
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
14121
+ "version": "10.7.5",
14122
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
14123
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
14124
14124
  "dev": true,
14125
14125
  "license": "MIT",
14126
14126
  "engines": {
@@ -3,6 +3,175 @@
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
+ ## [12.12.1](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.12.0...v12.12.1) (2026-10-20)
7
+
8
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
9
+
10
+
11
+
12
+
13
+
14
+ ## [12.12.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.11.0...v12.12.0) (2026-10-14)
15
+
16
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
17
+
18
+
19
+
20
+
21
+
22
+ ## [12.11.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.10.0...v12.11.0) (2026-10-07)
23
+
24
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
25
+
26
+
27
+
28
+
29
+
30
+ ## [12.10.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.9.0...v12.10.0) (2026-10-06)
31
+
32
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
33
+
34
+
35
+
36
+
37
+
38
+ ## [12.9.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.8.0...v12.9.0) (2026-09-29)
39
+
40
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
41
+
42
+
43
+
44
+
45
+
46
+ ## [12.8.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.7.0...v12.8.0) (2026-09-23)
47
+
48
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
49
+
50
+
51
+
52
+
53
+
54
+ ## [12.7.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.6.3...v12.7.0) (2026-09-22)
55
+
56
+
57
+ ### Bug Fixes
58
+
59
+ * **template-sfdx-project:** preserve target network sender addresses @W-24209513@ ([#993](https://github.com/salesforce-experience-platform-emu/webapps/issues/993)) ([fddbfdd](https://github.com/salesforce-experience-platform-emu/webapps/commit/fddbfddcb41270720372b0fd4c486f043d9ba8c5))
60
+
61
+
62
+
63
+ ## [12.6.3](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.6.2...v12.6.3) (2026-09-14)
64
+
65
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
66
+
67
+
68
+
69
+
70
+
71
+ ## [12.6.2](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.6.1...v12.6.2) (2026-09-14)
72
+
73
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
74
+
75
+
76
+
77
+
78
+
79
+ ## [12.6.1](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.6.0...v12.6.1) (2026-09-11)
80
+
81
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
82
+
83
+
84
+
85
+
86
+
87
+ ## [12.6.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.8...v12.6.0) (2026-09-11)
88
+
89
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
90
+
91
+
92
+
93
+
94
+
95
+ ## [12.5.8](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.7...v12.5.8) (2026-09-11)
96
+
97
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
98
+
99
+
100
+
101
+
102
+
103
+ ## [12.5.7](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.6...v12.5.7) (2026-09-11)
104
+
105
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
106
+
107
+
108
+
109
+
110
+
111
+ ## [12.5.6](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.5...v12.5.6) (2026-09-11)
112
+
113
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
114
+
115
+
116
+
117
+
118
+
119
+ ## [12.5.5](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.4...v12.5.5) (2026-09-10)
120
+
121
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
122
+
123
+
124
+
125
+
126
+
127
+ ## [12.5.4](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.3...v12.5.4) (2026-09-09)
128
+
129
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
130
+
131
+
132
+
133
+
134
+
135
+ ## [12.5.3](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.2...v12.5.3) (2026-09-08)
136
+
137
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
138
+
139
+
140
+
141
+
142
+
143
+ ## [12.5.2](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.1...v12.5.2) (2026-09-08)
144
+
145
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
146
+
147
+
148
+
149
+
150
+
151
+ ## [12.5.1](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.5.0...v12.5.1) (2026-09-07)
152
+
153
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
154
+
155
+
156
+
157
+
158
+
159
+ ## [12.5.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.4.5...v12.5.0) (2026-09-04)
160
+
161
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
162
+
163
+
164
+
165
+
166
+
167
+ ## [12.4.5](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.4.4...v12.4.5) (2026-09-03)
168
+
169
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
170
+
171
+
172
+
173
+
174
+
6
175
  ## [12.4.4](https://github.com/salesforce-experience-platform-emu/webapps/compare/v12.4.3...v12.4.4) (2026-09-03)
7
176
 
8
177
  **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
@@ -1,69 +1,107 @@
1
- # Salesforce DX Project: Next Steps
1
+ # Angular Internal App
2
2
 
3
- Now that you’ve created a Salesforce DX project, what’s next? Here are some documentation resources to get you started.
3
+ An internal Angular starter template for the Salesforce platform. Includes an Agentforce conversation client and object search across Salesforce records; intended for internal (non-Experience Cloud) deployment via a CustomApplication in the Lightning Experience App Launcher. Built with Angular (standalone components), Spartan NG (`@spartan-ng/brain` primitives with helm UI components copied into `src/app/shared/`), Tailwind CSS, Lucide icons (`@ng-icons/lucide`), and TypeScript.
4
4
 
5
- ## Web app: install, build, and dev server
5
+ ## What's included
6
6
 
7
- From the **SFDX project root** (this directory), run:
7
+ This project ships the UI Bundle plus a CustomApplication that surfaces it in the Lightning Experience App Launcher. No additional data-model metadata (objects, Apex, etc.) is included — bring your own data model.
8
+
9
+ ```
10
+ force-app/main/default/
11
+ ├── applications/ # CustomApplication (App Launcher entry)
12
+ ├── permissionsets/ # Permission sets
13
+ └── uiBundles/
14
+ └── angularintapp/ # Angular UI Bundle (source, config, tests)
15
+ ```
16
+
17
+ ## Getting started
18
+
19
+ Install project dependencies and start the local dev server:
8
20
 
9
21
  ```bash
22
+ npm install
10
23
  npm run sf-project-setup
11
24
  ```
12
25
 
13
- This installs dependencies in the UI Bundle, builds it, and starts the Vite dev server. Use this after cloning or extracting the project.
26
+ This installs the UI Bundle dependencies, builds the app, and starts the Salesforce Angular dev server (`sf-angular-serve`). For manual build and test instructions, see the [UI Bundle README](force-app/main/default/uiBundles/angularintapp/README.md).
27
+
28
+ ## Add features
29
+
30
+ Use the features CLI to install additional UI features into the UI Bundle.
31
+
32
+ List all available features:
33
+
34
+ ```bash
35
+ npx @salesforce/ui-bundle-features-experimental list
36
+ ```
37
+
38
+ Get details about a specific feature (description, dependencies, files, and integration examples):
39
+
40
+ ```bash
41
+ npx @salesforce/ui-bundle-features-experimental describe <feature-name>
42
+ ```
43
+
44
+ Install a feature:
14
45
 
15
- ## Set up the org
46
+ ```bash
47
+ npx @salesforce/ui-bundle-features-experimental install <feature-name> --ui-bundle-dir angularintapp
48
+ ```
49
+
50
+ After installation, the CLI will list any `__example__` files that need manual integration. Read each example file to see the integration pattern, apply it to the target file, then delete the example file.
51
+
52
+ ## Deploy
53
+
54
+ ### Deploy everything (CustomApplication + UI Bundle)
55
+
56
+ ```bash
57
+ cd force-app/main/default/uiBundles/angularintapp && npm install && npm run build && cd -
58
+ sf project deploy start --source-dir force-app --target-org <alias>
59
+ ```
16
60
 
17
- `npm run setup` configures a target org from this project in one command: it logs in
18
- (a required precondition — auto-skipped if the org is already connected), deploys
19
- metadata, assigns permission sets, imports sample data, refreshes the GraphQL
20
- schema/types, and builds the UI Bundle. When `--target-org` is omitted it uses your
21
- default org or, in an interactive terminal, prompts you to pick one.
61
+ ### Deploy the UI Bundle only
22
62
 
23
63
  ```bash
24
- npm run setup -- --target-org <alias> # or omit --target-org to use the default / pick
64
+ cd force-app/main/default/uiBundles/angularintapp && npm install && npm run build && cd -
65
+ sf project deploy start --source-dir force-app/main/default/uiBundles --target-org <alias>
25
66
  ```
26
67
 
27
- Setup does **not** start the dev server. Once the org is set up, use `dev:preview` to
28
- refresh the GraphQL types against the org and launch the Vite dev server on its own:
68
+ Replace `<alias>` with your target org alias.
69
+
70
+ ## Setup scripts
71
+
72
+ Two npm scripts at the project root streamline getting started and deployment.
73
+
74
+ **`npm run sf-project-setup`** — installs the UI Bundle dependencies, builds the app, and starts the dev server (see [Getting started](#getting-started)).
75
+
76
+ **`npm run setup`** — runs the full deployment setup in one command: org login (a required precondition, auto-skipped if already connected), UI Bundle build, deploy metadata, fetch GraphQL schema, and run codegen. It no longer starts the dev server — run `npm run dev:preview` for that:
29
77
 
30
78
  ```bash
31
- npm run dev:preview
79
+ # Install project dependencies first (required before running setup)
80
+ npm install
81
+
82
+ npm run setup -- --target-org <alias>
32
83
  ```
33
84
 
34
- ### Setup configuration (`scripts/org-setup.config.json`)
35
-
36
- `org-setup.config.json` controls which steps run and how. Every top-level section is
37
- optional; an absent section hides its step. It is validated against a shared schema
38
- at build/CI time and again at the start of every `npm run setup`, so a malformed
39
- config fails fast rather than misbehaving.
40
-
41
- ```jsonc
42
- {
43
- "permsetAssignments": {
44
- "assignments": {
45
- "My_Access": { "assignee": "currentUser" }
46
- }
47
- },
48
- "role": { "assignee": "currentUser", "roleName": "Admin" },
49
- "selfRegistration": {
50
- "selfRegProfile": "My Prospect Profile",
51
- "accountName": "My Self-Registration"
52
- }
53
- }
85
+ Running without flags presents an interactive step picker. Pass `--yes` to skip it and run all steps immediately:
86
+
87
+ ```bash
88
+ npm run setup -- --target-org <alias> --yes
54
89
  ```
55
90
 
56
- When a `selfRegistration` section is present, setup runs a **license pre-check**
57
- before configuring self-registration: it derives the required `UserLicense` from the
58
- configured `selfRegProfile` (matched on the stable `LicenseDefinitionKey`, not the
59
- display name) and, if the org lacks that license or has no available seats, **warns
60
- and skips** self-registration instead of reporting success — so prospect login can't
61
- silently fail on an under-provisioned org. No separate license field is configured;
62
- the requirement always follows the profile the flow assigns.
91
+ Common options:
92
+
93
+ | Option | Description |
94
+ | ------------------------- | ----------------------------------------------- |
95
+ | `--target-org <alias>` | Target org. If omitted, uses default org/prompt |
96
+ | `--skip-deploy` | Do not deploy metadata |
97
+ | `--skip-graphql` | Skip GraphQL schema fetch and codegen |
98
+ | `--skip-ui-bundle-build` | Skip `npm install` and UI Bundle build |
99
+ | `--ui-bundle-name <name>` | UI Bundle folder name when multiple exist |
100
+ | `-y, --yes` | Skip interactive step picker; run all steps |
63
101
 
64
- ## How Do You Plan to Deploy Your Changes?
102
+ > Login is a required precondition (no `--skip-login`), and the dev server is no longer part of setup (no `--skip-dev`); both flags are accepted but ignored. To start the dev server after setup, run `npm run dev:preview`.
65
103
 
66
- Do you want to deploy a set of changes, or create a self-contained application? Choose a [development model](https://developer.salesforce.com/tools/vscode/en/user-guide/development-models).
104
+ For all options: `npm run setup -- --help`.
67
105
 
68
106
  ## Configure Your Salesforce DX Project
69
107
 
@@ -1,6 +1,6 @@
1
1
  # Base Angular App
2
2
 
3
- Base Angular App is a template application that demonstrates how to build an Angular UI Bundle on the Salesforce platform with the Angular CLI, TypeScript, Tailwind, and the Salesforce UI Bundle SDK. It provides a minimal shell (home, 404), routing with standalone components and signals, so feature apps can extend it via the patches pipeline.
3
+ Base Angular App is a template application that demonstrates how to build an Angular UI Bundle on the Salesforce platform with the Angular CLI, TypeScript, Tailwind, Spartan NG (shadcn/ui for Angular), and the Salesforce UI Bundle SDK. It provides a minimal shell (home, 404), routing with standalone components and signals, so feature apps can extend it via the patches pipeline.
4
4
 
5
5
  This UI Bundle lives inside an SFDX project. The project root is the directory that contains `force-app/` and `sfdx-project.json`. Run the commands in the sections below from the paths indicated.
6
6
 
@@ -18,8 +18,8 @@
18
18
  "@ng-icons/core": "^32.2.0",
19
19
  "@ng-icons/lucide": "^32.2.0",
20
20
  "@salesforce/agentforce-conversation-client": "^12.0.0",
21
- "@salesforce/angular-plugin-ui-bundle": "^12.4.4",
22
- "@salesforce/platform-sdk": "^12.4.4",
21
+ "@salesforce/angular-plugin-ui-bundle": "^12.12.1",
22
+ "@salesforce/platform-sdk": "^12.12.1",
23
23
  "@spartan-ng/brain": "^1.3.1",
24
24
  "class-variance-authority": "^0.7.1",
25
25
  "clsx": "^2.1.1",
@@ -38,7 +38,7 @@
38
38
  "@graphql-codegen/typescript-operations": "^5.0.6",
39
39
  "@graphql-eslint/eslint-plugin": "^4.1.0",
40
40
  "@playwright/test": "^1.49.0",
41
- "@salesforce/graphiti": "^12.4.4",
41
+ "@salesforce/graphiti": "^12.12.1",
42
42
  "@spartan-ng/cli": "^1.3.1",
43
43
  "@tailwindcss/postcss": "^4.0.0",
44
44
  "angular-eslint": "^21.0.0",
@@ -51,7 +51,7 @@
51
51
  "tailwindcss": "^4.0.0",
52
52
  "typescript": "~5.9.2",
53
53
  "typescript-eslint": "^8.0.0",
54
- "vitest": "^4.1.0"
54
+ "vitest": "^4.1.11"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=22"
@@ -14137,9 +14137,9 @@
14137
14137
  }
14138
14138
  },
14139
14139
  "node_modules/ip-address": {
14140
- "version": "10.7.4",
14141
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
14142
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
14140
+ "version": "10.7.5",
14141
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
14142
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
14143
14143
  "dev": true,
14144
14144
  "license": "MIT",
14145
14145
  "engines": {
@@ -28,8 +28,8 @@
28
28
  "@angular/router": "^21.2.0",
29
29
  "@ng-icons/core": "^32.2.0",
30
30
  "@ng-icons/lucide": "^32.2.0",
31
- "@salesforce/angular-plugin-ui-bundle": "^12.4.4",
32
- "@salesforce/platform-sdk": "^12.4.4",
31
+ "@salesforce/angular-plugin-ui-bundle": "^12.12.1",
32
+ "@salesforce/platform-sdk": "^12.12.1",
33
33
  "@spartan-ng/brain": "^1.3.1",
34
34
  "class-variance-authority": "^0.7.1",
35
35
  "clsx": "^2.1.1",
@@ -61,8 +61,8 @@
61
61
  "tailwindcss": "^4.0.0",
62
62
  "typescript": "~5.9.2",
63
63
  "typescript-eslint": "^8.0.0",
64
- "vitest": "^4.1.0",
65
- "@salesforce/graphiti": "^12.4.4"
64
+ "vitest": "^4.1.11",
65
+ "@salesforce/graphiti": "^12.12.1"
66
66
  },
67
67
  "overrides": {
68
68
  "undici": "^7.28.0"
@@ -49,11 +49,9 @@ export class ObjectSearchService {
49
49
  } as TVariables);
50
50
 
51
51
  const uiapi = (data as Record<string, unknown>)?.["uiapi"] as
52
- | Record<string, unknown>
53
- | undefined;
52
+ Record<string, unknown> | undefined;
54
53
  const queryResult = (uiapi?.["query"] as Record<string, unknown> | undefined)?.[objectName] as
55
- | TResult
56
- | undefined;
54
+ TResult | undefined;
57
55
 
58
56
  if (!queryResult) {
59
57
  throw new Error(`No ${objectName} data returned`);
@@ -73,8 +71,7 @@ export class ObjectSearchService {
73
71
  const data = await this.client.execute<TQuery>(query);
74
72
 
75
73
  const uiapi = (data as Record<string, unknown>)?.["uiapi"] as
76
- | Record<string, unknown>
77
- | undefined;
74
+ Record<string, unknown> | undefined;
78
75
  const aggregate = (uiapi?.["aggregate"] as Record<string, unknown> | undefined)?.[
79
76
  objectName
80
77
  ] as { edges?: Array<{ node?: { aggregate?: Record<string, unknown> } }> } | undefined;
@@ -7,8 +7,7 @@ export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> =
7
7
  [_ in K]?: never;
8
8
  };
9
9
  export type Incremental<T> =
10
- | T
11
- | { [P in keyof T]?: P extends " $fragmentName" | "__typename" ? T[P] : never };
10
+ T | { [P in keyof T]?: P extends " $fragmentName" | "__typename" ? T[P] : never };
12
11
  /** All built-in and custom scalars, mapped to their actual values */
13
12
  export type Scalars = {
14
13
  ID: { input: string; output: string };
@@ -18,14 +18,7 @@ import { SpinnerComponent } from '../spinner/spinner';
18
18
 
19
19
  export type AppButtonAppearance = 'filled' | 'outlined' | 'text' | 'destructive';
20
20
  export type AppButtonSize =
21
- | 'default'
22
- | 'xs'
23
- | 'sm'
24
- | 'lg'
25
- | 'icon'
26
- | 'icon-xs'
27
- | 'icon-sm'
28
- | 'icon-lg';
21
+ 'default' | 'xs' | 'sm' | 'lg' | 'icon' | 'icon-xs' | 'icon-sm' | 'icon-lg';
29
22
 
30
23
  const APPEARANCE_TO_VARIANT: Record<AppButtonAppearance, string> = {
31
24
  filled: 'default',
@@ -10,7 +10,7 @@
10
10
  <div hlmDialogHeader>
11
11
  <ng-content select="[header]" />
12
12
  </div>
13
- <div class="text-sm">
13
+ <div class="min-w-0 text-sm">
14
14
  <ng-content />
15
15
  </div>
16
16
  <div hlmDialogFooter>
@@ -12,13 +12,16 @@ import {
12
12
  lucideChevronDown,
13
13
  lucideChevronRight,
14
14
  lucideCircleAlert,
15
+ lucideFile,
15
16
  lucideFileQuestion,
16
17
  lucideGlobe,
18
+ lucideImage,
17
19
  lucideListFilter,
18
20
  lucideLogIn,
19
21
  lucideLogOut,
20
22
  lucideSearch,
21
23
  lucideSearchX,
24
+ lucideUpload,
22
25
  lucideUser,
23
26
  lucideUserPen,
24
27
  lucideUserPlus,
@@ -43,6 +46,9 @@ export const APP_ICONS = {
43
46
  notFound: lucideFileQuestion,
44
47
  globe: lucideGlobe,
45
48
  check: lucideCheck,
49
+ image: lucideImage,
50
+ upload: lucideUpload,
51
+ file: lucideFile,
46
52
  } as const;
47
53
 
48
54
  export type AppIconName = keyof typeof APP_ICONS;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/ui-bundle-template-base-sfdx-project",
3
- "version": "12.4.4",
3
+ "version": "12.12.1",
4
4
  "description": "Base SFDX project template",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "publishConfig": {
@@ -0,0 +1,84 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join, resolve, dirname } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { XMLBuilder } from 'fast-xml-parser';
6
+ import { parseNetworkDocument, NetworkXmlError } from './org-setup-xml.mjs';
7
+ import { escapeSoqlString } from './org-setup-utils.mjs';
8
+
9
+ const builder = new XMLBuilder({
10
+ ignoreAttributes: false,
11
+ commentPropName: '#comment',
12
+ format: true,
13
+ indentBy: ' ',
14
+ suppressEmptyNode: true,
15
+ });
16
+
17
+ export function preserveNetworkSenders(projectDir, targetOrg, run = execFileSync) {
18
+ const project = JSON.parse(readFileSync(join(projectDir, 'sfdx-project.json'), 'utf8'));
19
+ const files = (project.packageDirectories ?? []).flatMap(({ path }) => {
20
+ const dir = join(projectDir, path, 'main/default/networks');
21
+ if (!existsSync(dir)) return [];
22
+ return readdirSync(dir)
23
+ .filter((name) => name.endsWith('.network-meta.xml'))
24
+ .map((name) => ({ name: name.slice(0, -'.network-meta.xml'.length), path: join(dir, name) }));
25
+ });
26
+ if (!files.length) return;
27
+
28
+ const names = [...new Set(files.map(({ name }) => `'${escapeSoqlString(name)}'`))];
29
+ const response = JSON.parse(run('sf', [
30
+ 'data', 'query', '--target-org', targetOrg,
31
+ '--query', `SELECT Name, EmailSenderAddress FROM Network WHERE Name IN (${names.join(',')})`,
32
+ '--json',
33
+ ], { cwd: projectDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 60000 }));
34
+ if (response.status !== 0 || !Array.isArray(response.result?.records) || !response.result.done) {
35
+ throw new Error('Could not read all target Network sender addresses; deployment stopped.');
36
+ }
37
+ const senders = new Map(response.result.records.map((record) => [record.Name, record.EmailSenderAddress]));
38
+
39
+ const updates = files.map((file) => {
40
+ const original = readFileSync(file.path, 'utf8');
41
+ const document = parseNetworkDocument(original);
42
+ const network = document.Network;
43
+ let changed = false;
44
+ if (senders.has(file.name)) {
45
+ const sender = senders.get(file.name);
46
+ if (typeof sender !== 'string' || !sender.trim()) {
47
+ throw new Error(`The target Network "${file.name}" has no sender address; deployment stopped.`);
48
+ }
49
+ if (typeof network.emailSenderAddress !== 'string') {
50
+ throw new NetworkXmlError(`Expected one emailSenderAddress in ${file.name}.network-meta.xml`);
51
+ }
52
+ if (network.emailSenderAddress !== sender) {
53
+ network.emailSenderAddress = sender;
54
+ changed = true;
55
+ }
56
+ }
57
+ // Sender changes belong to the site's Administration workspace.
58
+ if ('newSenderAddress' in network) {
59
+ delete network.newSenderAddress;
60
+ changed = true;
61
+ }
62
+ return { ...file, xml: changed ? builder.build(document) : original, changed };
63
+ });
64
+
65
+ for (const file of updates) {
66
+ if (file.changed) writeFileSync(file.path, file.xml);
67
+ }
68
+ }
69
+
70
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
71
+ const args = process.argv.slice(2);
72
+ if (args.length !== 2 || args[0] !== '--target-org' || !args[1].trim()) {
73
+ console.error('Usage: node scripts/network-senders.mjs --target-org <alias>');
74
+ process.exitCode = 1;
75
+ } else {
76
+ try {
77
+ preserveNetworkSenders(resolve(dirname(fileURLToPath(import.meta.url)), '..'), args[1]);
78
+ console.log('Network metadata prepared with the target org sender addresses.');
79
+ } catch (error) {
80
+ console.error(`Network metadata preparation failed: ${error.message}`);
81
+ process.exitCode = 1;
82
+ }
83
+ }
84
+ }
@@ -39,6 +39,7 @@ const parser = new XMLParser({
39
39
  ignoreAttributes: false,
40
40
  parseTagValue: false,
41
41
  parseAttributeValue: false,
42
+ commentPropName: '#comment',
42
43
  });
43
44
 
44
45
  /**
@@ -73,22 +74,26 @@ export function assertSafeProfileName(name) {
73
74
  }
74
75
 
75
76
  /**
76
- * Parse + assert this is a Network metadata document. Returns the parsed
77
- * `Network` object. Throws NetworkXmlError if the root is missing (e.g. a file
77
+ * Parse + assert this is a Network metadata document. Returns the full parsed
78
+ * document. Throws NetworkXmlError if the root is missing (e.g. a file
78
79
  * that is not actually network metadata).
79
80
  */
80
- export function parseNetwork(xml) {
81
+ export function parseNetworkDocument(xml) {
81
82
  let parsed;
82
83
  try {
83
- parsed = parser.parse(xml);
84
+ parsed = parser.parse(xml, true);
84
85
  } catch (e) {
85
86
  throw new NetworkXmlError(`network metadata is not well-formed XML: ${e.message}`);
86
87
  }
87
88
  const network = parsed?.[NETWORK_ROOT];
88
- if (network == null || typeof network !== 'object') {
89
+ if (network == null || typeof network !== 'object' || Array.isArray(network)) {
89
90
  throw new NetworkXmlError(`expected a <${NETWORK_ROOT}> root node, but none was found`);
90
91
  }
91
- return network;
92
+ return parsed;
93
+ }
94
+
95
+ export function parseNetwork(xml) {
96
+ return parseNetworkDocument(xml)[NETWORK_ROOT];
92
97
  }
93
98
 
94
99
  /** Normalize a fast-xml-parser child (absent | scalar | array) to an array. */
@@ -55,6 +55,7 @@ import {
55
55
  import { tmpdir } from 'node:os';
56
56
 
57
57
  import { validateConfig } from './org-setup-config-schema.mjs';
58
+ import { preserveNetworkSenders } from './network-senders.mjs';
58
59
  import {
59
60
  addProfileToMemberGroups,
60
61
  enableSelfRegInXml,
@@ -1149,9 +1150,14 @@ function ensureLogoutUrl(logoutUrl, siteName, targetOrg) {
1149
1150
  writeFileSync(networkXmlPath, result.xml);
1150
1151
  console.log(` Set <logoutUrl>${absoluteUrl}</logoutUrl> in ${siteName}.network-meta.xml`);
1151
1152
 
1152
- // Re-deploy ONLY the network file (mirrors enableSelfRegistration). Best-effort:
1153
- // a non-zero exit (e.g. the org's emailSenderAddress differs from the shipped
1154
- // value and can't be updated) logs loudly and continues.
1153
+ try {
1154
+ preserveNetworkSenders(ROOT, targetOrg);
1155
+ } catch (e) {
1156
+ console.error(` ERROR: cannot prepare Network metadata for "${siteName}" — ${e.message}. Skipping logout URL deployment.`);
1157
+ return;
1158
+ }
1159
+
1160
+ // Logout URL deployment is best-effort.
1155
1161
  const deployResult = spawnSync('sf', [
1156
1162
  'project', 'deploy', 'start',
1157
1163
  '--target-org', targetOrg,
@@ -1160,8 +1166,7 @@ function ensureLogoutUrl(logoutUrl, siteName, targetOrg) {
1160
1166
  if (deployResult.status !== 0) {
1161
1167
  console.error(
1162
1168
  ` ERROR: failed to deploy <logoutUrl> for "${siteName}" (sf exit ${deployResult.status ?? 1}). ` +
1163
- `If the org's Network emailSenderAddress differs from the shipped value it blocks this deploy — ` +
1164
- `set the logout URL manually in the site's Administration settings.`,
1169
+ `Set the logout URL manually in the site's Administration settings.`,
1165
1170
  );
1166
1171
  return;
1167
1172
  }
@@ -1208,6 +1213,8 @@ function enableSelfRegistration(selfRegConfig, siteName, targetOrg) {
1208
1213
  writeFileSync(networkXmlPath, result.xml);
1209
1214
  console.log(` Updated ${siteName}.network-meta.xml: selfRegistration=true, selfRegProfile=${selfRegProfile}`);
1210
1215
 
1216
+ preserveNetworkSenders(ROOT, targetOrg);
1217
+
1211
1218
  // Re-deploy only the network file
1212
1219
  const deployResult = spawnSync('sf', [
1213
1220
  'project', 'deploy', 'start',
@@ -2118,6 +2125,7 @@ async function main() {
2118
2125
  throw new StepError(`deploy blocked — ${licenseGate.reason}`);
2119
2126
  }
2120
2127
  }
2128
+ preserveNetworkSenders(ROOT, targetOrg);
2121
2129
  run('Deploy metadata', 'sf', ['project', 'deploy', 'start', '--target-org', targetOrg], {
2122
2130
  timeout: 180000,
2123
2131
  });
@@ -16999,9 +16999,9 @@
16999
16999
  }
17000
17000
  },
17001
17001
  "node_modules/ip-address": {
17002
- "version": "10.7.4",
17003
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
17004
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
17002
+ "version": "10.7.5",
17003
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
17004
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
17005
17005
  "license": "MIT",
17006
17006
  "engines": {
17007
17007
  "node": ">= 12"
@@ -16921,9 +16921,9 @@
16921
16921
  }
16922
16922
  },
16923
16923
  "node_modules/ip-address": {
16924
- "version": "10.7.4",
16925
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
16926
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
16924
+ "version": "10.7.5",
16925
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
16926
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
16927
16927
  "license": "MIT",
16928
16928
  "engines": {
16929
16929
  "node": ">= 12"
@@ -14118,9 +14118,9 @@
14118
14118
  }
14119
14119
  },
14120
14120
  "node_modules/ip-address": {
14121
- "version": "10.7.4",
14122
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
14123
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
14121
+ "version": "10.7.5",
14122
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
14123
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
14124
14124
  "dev": true,
14125
14125
  "license": "MIT",
14126
14126
  "engines": {
@@ -16902,9 +16902,9 @@
16902
16902
  }
16903
16903
  },
16904
16904
  "node_modules/ip-address": {
16905
- "version": "10.7.4",
16906
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
16907
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
16905
+ "version": "10.7.5",
16906
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
16907
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
16908
16908
  "license": "MIT",
16909
16909
  "engines": {
16910
16910
  "node": ">= 12"
@@ -9884,9 +9884,9 @@
9884
9884
  }
9885
9885
  },
9886
9886
  "node_modules/ip-address": {
9887
- "version": "10.7.4",
9888
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
9889
- "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
9887
+ "version": "10.7.5",
9888
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.5.tgz",
9889
+ "integrity": "sha512-t2v0rkILYv9WXmSL7TpAaU3HXgaFYOPUcH3QHgwQ++gpJuH3bqyMy4Fvt/DJCTKwzH3Cf+bAp5W/mFL39KPLzA==",
9890
9890
  "dev": true,
9891
9891
  "license": "MIT",
9892
9892
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/templates",
3
- "version": "66.17.3",
3
+ "version": "66.17.4",
4
4
  "description": "Salesforce JS library for templates",
5
5
  "bugs": "https://github.com/forcedotcom/salesforcedx-templates/issues",
6
6
  "repository": {
@@ -16,7 +16,7 @@
16
16
  "/messages"
17
17
  ],
18
18
  "dependencies": {
19
- "@salesforce/kit": "^4.0.0",
19
+ "@salesforce/kit": "^4.0.1",
20
20
  "ejs": "^3.1.10",
21
21
  "got": "^11.8.6",
22
22
  "hpagent": "^1.2.0",
@@ -30,7 +30,7 @@
30
30
  "@salesforce/dev-scripts": "^14.0.0",
31
31
  "@salesforce/prettier-config": "^0.0.4",
32
32
  "@tony.ganchev/eslint-plugin-header": "^3.4.4",
33
- "@salesforce/ui-bundle-template-app-angular-template-b2e": "^12.4.4",
33
+ "@salesforce/ui-bundle-template-app-angular-template-b2e": "^12.12.1",
34
34
  "@salesforce/ui-bundle-template-app-angular-template-b2x": "^12.12.0",
35
35
  "@salesforce/ui-bundle-template-app-react-template-b2e": "^12.9.0",
36
36
  "@salesforce/ui-bundle-template-app-react-template-b2x": "^12.9.0",