@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.
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +3 -3
- package/lib/templates/project/angularintapp/CHANGELOG.md +169 -0
- package/lib/templates/project/angularintapp/README.md +82 -44
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +1 -1
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +7 -7
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +4 -4
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/_f_/_os_/api/object-search.service.ts +3 -6
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/graphql-operations-types.ts +1 -2
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +1 -8
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +1 -1
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/icon/icon.ts +6 -0
- package/lib/templates/project/angularintapp/package.json +1 -1
- package/lib/templates/project/angularintapp/scripts/network-senders.mjs +84 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +11 -6
- package/lib/templates/project/angularintapp/scripts/org-setup.mjs +13 -5
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +3 -3
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +3 -3
- package/lib/templates/uiBundles/angularbasic/package-lock.json +3 -3
- package/lib/templates/uiBundles/reactbasic/package-lock.json +3 -3
- package/lib/templates/uiBundles/vuebasic/package-lock.json +3 -3
- package/package.json +3 -3
|
@@ -14118,9 +14118,9 @@
|
|
|
14118
14118
|
}
|
|
14119
14119
|
},
|
|
14120
14120
|
"node_modules/ip-address": {
|
|
14121
|
-
"version": "10.7.
|
|
14122
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
14123
|
-
"integrity": "sha512-
|
|
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
|
-
#
|
|
1
|
+
# Angular Internal App
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
##
|
|
5
|
+
## What's included
|
|
6
6
|
|
|
7
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
22
|
-
"@salesforce/platform-sdk": "^12.
|
|
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.
|
|
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.
|
|
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.
|
|
14141
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
14142
|
-
"integrity": "sha512-
|
|
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.
|
|
32
|
-
"@salesforce/platform-sdk": "^12.
|
|
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.
|
|
65
|
-
"@salesforce/graphiti": "^12.
|
|
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
|
-
|
|
53
|
-
| undefined;
|
|
52
|
+
Record<string, unknown> | undefined;
|
|
54
53
|
const queryResult = (uiapi?.["query"] as Record<string, unknown> | undefined)?.[objectName] as
|
|
55
|
-
|
|
|
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
|
-
|
|
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;
|
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/graphql-operations-types.ts
CHANGED
|
@@ -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 };
|
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts
CHANGED
|
@@ -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
|
-
| '
|
|
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',
|
package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/icon/icon.ts
CHANGED
|
@@ -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;
|
|
@@ -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
|
-
*
|
|
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
|
|
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
|
|
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
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
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
|
-
`
|
|
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.
|
|
17003
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
17004
|
-
"integrity": "sha512-
|
|
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.
|
|
16925
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
16926
|
-
"integrity": "sha512-
|
|
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.
|
|
14122
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
14123
|
-
"integrity": "sha512-
|
|
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.
|
|
16906
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
16907
|
-
"integrity": "sha512-
|
|
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.
|
|
9888
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
9889
|
-
"integrity": "sha512-
|
|
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
|
+
"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.
|
|
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.
|
|
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",
|