@salesforce/ui-bundle-template-feature-react-customer-web-client-chat 11.52.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 (107) hide show
  1. package/LICENSE.txt +82 -0
  2. package/README.md +63 -0
  3. package/dist/.forceignore +15 -0
  4. package/dist/.husky/pre-commit +4 -0
  5. package/dist/.prettierignore +11 -0
  6. package/dist/.prettierrc +17 -0
  7. package/dist/CHANGELOG.md +4553 -0
  8. package/dist/README.md +77 -0
  9. package/dist/config/project-scratch-def.json +13 -0
  10. package/dist/eslint.config.js +7 -0
  11. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/.forceignore +15 -0
  12. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/.graphqlrc.yml +2 -0
  13. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/.prettierignore +9 -0
  14. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/.prettierrc +11 -0
  15. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/CHANGELOG.md +10 -0
  16. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/README.md +75 -0
  17. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/codegen.yml +95 -0
  18. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/components.json +18 -0
  19. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/e2e/app.spec.ts +17 -0
  20. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/eslint.config.js +169 -0
  21. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/feature-react-customer-web-client-chat.uibundle-meta.xml +7 -0
  22. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/index.html +12 -0
  23. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/package.json +76 -0
  24. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/playwright.config.ts +24 -0
  25. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/scripts/get-graphql-schema.mjs +71 -0
  26. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/scripts/rewrite-e2e-assets.mjs +23 -0
  27. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/api/graphqlClient.ts +44 -0
  28. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/app.tsx +17 -0
  29. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/appLayout.tsx +83 -0
  30. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/icons/book.svg +3 -0
  31. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/icons/copy.svg +4 -0
  32. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/icons/rocket.svg +3 -0
  33. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/icons/star.svg +3 -0
  34. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/images/codey-1.png +0 -0
  35. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/images/codey-2.png +0 -0
  36. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/images/codey-3.png +0 -0
  37. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/assets/images/vibe-codey.svg +194 -0
  38. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/CustomerWebClientChat.tsx +74 -0
  39. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/alerts/status-alert.tsx +52 -0
  40. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/layouts/card-layout.tsx +29 -0
  41. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/alert.tsx +76 -0
  42. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/avatar.tsx +109 -0
  43. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/badge.tsx +48 -0
  44. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/breadcrumb.tsx +109 -0
  45. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/button.tsx +67 -0
  46. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/calendar.tsx +232 -0
  47. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/card.tsx +103 -0
  48. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/checkbox.tsx +32 -0
  49. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/collapsible.tsx +33 -0
  50. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/datePicker.tsx +127 -0
  51. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/dialog.tsx +162 -0
  52. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/dropdown-menu.tsx +257 -0
  53. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/field.tsx +237 -0
  54. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/index.ts +109 -0
  55. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/input.tsx +19 -0
  56. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/label.tsx +22 -0
  57. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/pagination.tsx +132 -0
  58. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/popover.tsx +89 -0
  59. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/select.tsx +193 -0
  60. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/separator.tsx +26 -0
  61. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/skeleton.tsx +14 -0
  62. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/sonner.tsx +20 -0
  63. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/spinner.tsx +16 -0
  64. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/table.tsx +121 -0
  65. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/ui/tabs.tsx +88 -0
  66. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/hooks/useAsyncData.ts +67 -0
  67. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/index.ts +6 -0
  68. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/lib/utils.ts +6 -0
  69. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/navigationMenu.tsx +80 -0
  70. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/pages/Home.tsx +12 -0
  71. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/pages/NotFound.tsx +18 -0
  72. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/pages/TestChatPage.tsx +26 -0
  73. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/router-utils.tsx +35 -0
  74. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/routes.tsx +28 -0
  75. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/styles/global.css +135 -0
  76. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/types/chat.ts +36 -0
  77. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/tsconfig.json +45 -0
  78. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/tsconfig.node.json +13 -0
  79. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/tsconfig.tsbuildinfo +1 -0
  80. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/ui-bundle.json +7 -0
  81. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/vite-env.d.ts +4 -0
  82. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/vite.config.ts +106 -0
  83. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/vitest-env.d.ts +2 -0
  84. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/vitest.config.ts +11 -0
  85. package/dist/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/vitest.setup.ts +1 -0
  86. package/dist/jest.config.js +6 -0
  87. package/dist/package-lock.json +10066 -0
  88. package/dist/package.json +46 -0
  89. package/dist/scripts/apex/hello.apex +10 -0
  90. package/dist/scripts/gitignore-templates.json +4 -0
  91. package/dist/scripts/graphql-search.sh +191 -0
  92. package/dist/scripts/org-setup-config-schema.mjs +120 -0
  93. package/dist/scripts/org-setup-dev.mjs +87 -0
  94. package/dist/scripts/org-setup-utils.mjs +569 -0
  95. package/dist/scripts/org-setup-xml.mjs +182 -0
  96. package/dist/scripts/org-setup.config.json +5 -0
  97. package/dist/scripts/org-setup.mjs +2345 -0
  98. package/dist/scripts/sf-project-setup.mjs +103 -0
  99. package/dist/scripts/soql/account.soql +6 -0
  100. package/dist/scripts/validate-org-setup-config.mjs +38 -0
  101. package/dist/sfdx-project.json +12 -0
  102. package/package.json +51 -0
  103. package/src/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/components/CustomerWebClientChat.tsx +74 -0
  104. package/src/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/index.ts +6 -0
  105. package/src/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/pages/TestChatPage.tsx +26 -0
  106. package/src/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/routes.tsx +23 -0
  107. package/src/force-app/main/default/uiBundles/feature-react-customer-web-client-chat/src/types/chat.ts +36 -0
package/dist/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # Salesforce DX Project: Next Steps
2
+
3
+ Now that you’ve created a Salesforce DX project, what’s next? Here are some documentation resources to get you started.
4
+
5
+ ## Web app: install, build, and dev server
6
+
7
+ From the **SFDX project root** (this directory), run:
8
+
9
+ ```bash
10
+ npm run sf-project-setup
11
+ ```
12
+
13
+ This installs dependencies in the UI Bundle, builds it, and starts the Vite dev server. Use this after cloning or extracting the project.
14
+
15
+ ## Set up the org
16
+
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.
22
+
23
+ ```bash
24
+ npm run setup -- --target-org <alias> # or omit --target-org to use the default / pick
25
+ ```
26
+
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:
29
+
30
+ ```bash
31
+ npm run dev:preview
32
+ ```
33
+
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
+ }
54
+ ```
55
+
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.
63
+
64
+ ## How Do You Plan to Deploy Your Changes?
65
+
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).
67
+
68
+ ## Configure Your Salesforce DX Project
69
+
70
+ The `sfdx-project.json` file contains useful configuration information for your project. See [Salesforce DX Project Configuration](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_config.htm) in the _Salesforce DX Developer Guide_ for details about this file.
71
+
72
+ ## Read All About It
73
+
74
+ - [Salesforce Extensions Documentation](https://developer.salesforce.com/tools/vscode/)
75
+ - [Salesforce CLI Setup Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_intro.htm)
76
+ - [Salesforce DX Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_intro.htm)
77
+ - [Salesforce CLI Command Reference](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htm)
@@ -0,0 +1,13 @@
1
+ {
2
+ "orgName": "My Saleforce Org",
3
+ "edition": "Developer",
4
+ "features": ["EnableSetPasswordInApi"],
5
+ "settings": {
6
+ "lightningExperienceSettings": {
7
+ "enableS1DesktopEnabled": true
8
+ },
9
+ "mobileSettings": {
10
+ "enableS1EncryptedStoragePref2": false
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ESLint 9 flat config for LWC and Aura.
3
+ * @see https://github.com/salesforce/eslint-config-lwc
4
+ */
5
+ const lwcConfig = require("@salesforce/eslint-config-lwc");
6
+
7
+ module.exports = [...lwcConfig.configs.recommended];
@@ -0,0 +1,15 @@
1
+ # List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:status
2
+ # More information: https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm
3
+ #
4
+
5
+ package.xml
6
+
7
+ # LWC configuration files
8
+ **/jsconfig.json
9
+ **/.eslintrc.json
10
+
11
+ # LWC Jest
12
+ **/__tests__/**
13
+
14
+ node_modules/
15
+ .DS_Store
@@ -0,0 +1,2 @@
1
+ schema: '../../../../../schema.graphql'
2
+ documents: 'src/**/*.{graphql,js,ts,jsx,tsx}'
@@ -0,0 +1,9 @@
1
+ node_modules
2
+ dist
3
+ build
4
+ .vite
5
+ coverage
6
+ *.min.js
7
+ *.min.css
8
+ *.map
9
+ package-lock.json
@@ -0,0 +1,11 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "es5",
4
+ "singleQuote": true,
5
+ "printWidth": 80,
6
+ "tabWidth": 2,
7
+ "useTabs": false,
8
+ "bracketSpacing": true,
9
+ "arrowParens": "avoid",
10
+ "endOfLine": "lf"
11
+ }
@@ -0,0 +1,10 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ # [1.59.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v1.58.2...v1.59.0) (2026-02-27)
7
+
8
+ ### Features
9
+
10
+ - auto bump base react app versions and fix issue with base ui-bundle json ([#175](https://github.com/salesforce-experience-platform-emu/webapps/issues/175)) ([048b5a8](https://github.com/salesforce-experience-platform-emu/webapps/commit/048b5a8449c899fc923aeebc3c76bc5bf1c5e0d4))
@@ -0,0 +1,75 @@
1
+ # Base React App
2
+
3
+ Base React App is a template application that demonstrates how to build a React UI Bundle on the Salesforce platform with Vite, TypeScript, Tailwind, shadcn/ui, and the Salesforce UI Bundle SDK. It provides a minimal shell (home, 404), routing, and GraphQL codegen support so feature apps can extend it via the patches pipeline.
4
+
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
+
7
+ ## Table of contents
8
+
9
+ - [Run (development)](#run-development)
10
+ - [Build](#build)
11
+ - [Deploy](#deploy)
12
+ - [Test](#test)
13
+
14
+ ## Run (development)
15
+
16
+ From the UI Bundle directory (`force-app/main/default/uiBundles/base-react-app`):
17
+
18
+ ```bash
19
+ npm install
20
+ npm run dev
21
+ ```
22
+
23
+ This starts the Vite dev server (e.g. http://localhost:5173). Use `npm run dev:design` to run in design mode.
24
+
25
+ ## Build
26
+
27
+ From the UI Bundle directory:
28
+
29
+ ```bash
30
+ npm install
31
+ npm run build
32
+ ```
33
+
34
+ The production build is written to `dist/` inside the UI Bundle folder. Deploy using the steps in [Deploy](#deploy).
35
+
36
+ ## Deploy
37
+
38
+ From the **SFDX project root** (the directory that contains `force-app/`):
39
+
40
+ 1. Build the UI Bundle:
41
+
42
+ ```bash
43
+ cd force-app/main/default/uiBundles/base-react-app && npm install && npm run build && cd -
44
+ ```
45
+
46
+ 2. Deploy the UI Bundle only:
47
+
48
+ ```bash
49
+ sf project deploy start --source-dir force-app/main/default/ui-bundles --target-org <alias>
50
+ ```
51
+
52
+ Or deploy all metadata:
53
+
54
+ ```bash
55
+ sf project deploy start --source-dir force-app --target-org <alias>
56
+ ```
57
+
58
+ Replace `<alias>` with your target org alias.
59
+
60
+ ## Test
61
+
62
+ From the UI Bundle directory:
63
+
64
+ ```bash
65
+ npm install
66
+ npm run test
67
+ ```
68
+
69
+ This runs the unit test suite (Vitest). For end-to-end tests from the **base-react-app package root**:
70
+
71
+ ```bash
72
+ npm run test:e2e
73
+ ```
74
+
75
+ This installs dependencies, builds with E2E asset rewrites, and runs Playwright. Ensure Chromium is installed (`npx playwright install chromium` if needed).
@@ -0,0 +1,95 @@
1
+ schema: '../../../../../schema.graphql'
2
+ documents: 'src/**/*.{graphql,ts,tsx}'
3
+ generates:
4
+ src/api/graphql-operations-types.ts:
5
+ plugins:
6
+ - 'graphql-codegen-typescript-operation-types'
7
+ - 'typescript-operations'
8
+ config:
9
+ onlyOperationTypes: true
10
+ skipTypename: true
11
+ preResolveTypes: true
12
+ scalars:
13
+ # String-serialized scalars
14
+ JSON:
15
+ input: 'string'
16
+ output: 'string'
17
+ Date:
18
+ input: 'string'
19
+ output: 'string'
20
+ DateTime:
21
+ input: 'string'
22
+ output: 'string'
23
+ Time:
24
+ input: 'string'
25
+ output: 'string'
26
+ Email:
27
+ input: 'string'
28
+ output: 'string'
29
+ Url:
30
+ input: 'string'
31
+ output: 'string'
32
+ PhoneNumber:
33
+ input: 'string'
34
+ output: 'string'
35
+ Picklist:
36
+ input: 'string'
37
+ output: 'string'
38
+ MultiPicklist:
39
+ input: 'string'
40
+ output: 'string'
41
+ TextArea:
42
+ input: 'string'
43
+ output: 'string'
44
+ LongTextArea:
45
+ input: 'string'
46
+ output: 'string'
47
+ RichTextArea:
48
+ input: 'string'
49
+ output: 'string'
50
+ EncryptedString:
51
+ input: 'string'
52
+ output: 'string'
53
+ Base64:
54
+ input: 'string'
55
+ output: 'string'
56
+ IdOrRef:
57
+ input: 'string'
58
+ output: 'string'
59
+ # BigDecimal-serialized scalars (accepts number or string, returns number)
60
+ Currency:
61
+ input: 'number | string'
62
+ output: 'number'
63
+ BigDecimal:
64
+ input: 'number | string'
65
+ output: 'number'
66
+ Double:
67
+ input: 'number | string'
68
+ output: 'number'
69
+ Percent:
70
+ input: 'number | string'
71
+ output: 'number'
72
+ Longitude:
73
+ input: 'number | string'
74
+ output: 'number'
75
+ Latitude:
76
+ input: 'number | string'
77
+ output: 'number'
78
+ # Integer-like scalars
79
+ Long:
80
+ input: 'number'
81
+ output: 'number'
82
+ BigInteger:
83
+ input: 'number'
84
+ output: 'number'
85
+ Short:
86
+ input: 'number'
87
+ output: 'number'
88
+ Byte:
89
+ input: 'number'
90
+ output: 'number'
91
+ Char:
92
+ input: 'number'
93
+ output: 'number'
94
+ overwrite: true
95
+ ignoreNoDocuments: true
@@ -0,0 +1,18 @@
1
+ {
2
+ "style": "new-york",
3
+ "rsc": true,
4
+ "tailwind": {
5
+ "config": "",
6
+ "css": "styles/global.css",
7
+ "baseColor": "neutral",
8
+ "cssVariables": true
9
+ },
10
+ "iconLibrary": "lucide",
11
+ "aliases": {
12
+ "components": "@/components",
13
+ "utils": "@/lib/utils",
14
+ "ui": "@/components/ui",
15
+ "lib": "@/lib",
16
+ "hooks": "@/hooks"
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ import { test, expect } from '@playwright/test';
2
+
3
+ test.describe('base-react-app', () => {
4
+ test('home page loads and shows welcome content', async ({ page }) => {
5
+ await page.goto('/');
6
+ await expect(page.getByRole('heading', { name: 'Home' })).toBeVisible();
7
+ await expect(
8
+ page.getByText('Welcome to your React application.')
9
+ ).toBeVisible();
10
+ });
11
+
12
+ test('not found route shows 404', async ({ page }) => {
13
+ await page.goto('/non-existent-route');
14
+ await expect(page.getByRole('heading', { name: '404' })).toBeVisible();
15
+ await expect(page.getByText('Page not found')).toBeVisible();
16
+ });
17
+ });
@@ -0,0 +1,169 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname } from 'node:path';
5
+ import js from '@eslint/js';
6
+ import tseslint from '@typescript-eslint/eslint-plugin';
7
+ import tsparser from '@typescript-eslint/parser';
8
+ import react from 'eslint-plugin-react';
9
+ import reactHooks from 'eslint-plugin-react-hooks';
10
+ import reactRefresh from 'eslint-plugin-react-refresh';
11
+ import globals from 'globals';
12
+ import graphqlPlugin from '@graphql-eslint/eslint-plugin';
13
+
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const schemaPath = resolve(__dirname, '../../../../../schema.graphql');
16
+ const schemaExists = existsSync(schemaPath);
17
+
18
+ const config = [
19
+ // Global ignores
20
+ {
21
+ ignores: [
22
+ 'build/**/*',
23
+ 'dist/**/*',
24
+ 'coverage/**/*',
25
+ 'src/api/graphql-operations-types.ts',
26
+ ],
27
+ },
28
+ // Config files and build tools (first to avoid inheritance)
29
+ {
30
+ files: ['*.config.{js,ts}', 'vite.config.ts'],
31
+ languageOptions: {
32
+ parser: tsparser,
33
+ parserOptions: {
34
+ ecmaVersion: 'latest',
35
+ sourceType: 'module',
36
+ },
37
+ globals: {
38
+ ...globals.node,
39
+ __dirname: 'readonly',
40
+ process: 'readonly',
41
+ },
42
+ },
43
+ plugins: {
44
+ '@typescript-eslint': tseslint,
45
+ },
46
+ rules: {
47
+ '@typescript-eslint/no-var-requires': 'off',
48
+ },
49
+ },
50
+ // Main TypeScript/React files
51
+ {
52
+ files: ['**/*.{ts,tsx}'],
53
+ ignores: [
54
+ 'coverage',
55
+ 'dist',
56
+ 'node_modules',
57
+ 'build',
58
+ '*.config.{js,ts}',
59
+ 'vite.config.ts',
60
+ ],
61
+ languageOptions: {
62
+ ecmaVersion: 2020,
63
+ sourceType: 'module',
64
+ parser: tsparser,
65
+ parserOptions: {
66
+ ecmaFeatures: {
67
+ jsx: true,
68
+ },
69
+ ecmaVersion: 'latest',
70
+ sourceType: 'module',
71
+ project: './tsconfig.json',
72
+ },
73
+ globals: {
74
+ ...globals.browser,
75
+ JSX: 'readonly',
76
+ React: 'readonly',
77
+ process: 'readonly',
78
+ },
79
+ },
80
+ plugins: {
81
+ react,
82
+ 'react-hooks': reactHooks,
83
+ 'react-refresh': reactRefresh,
84
+ '@typescript-eslint': tseslint,
85
+ },
86
+ rules: {
87
+ ...js.configs.recommended.rules,
88
+ ...tseslint.configs.recommended.rules,
89
+ ...react.configs.recommended.rules,
90
+ ...reactHooks.configs.recommended.rules,
91
+ 'react/react-in-jsx-scope': 'off',
92
+ 'react/prop-types': 'off',
93
+ 'react/jsx-no-comment-textnodes': 'off',
94
+ 'react/no-unescaped-entities': 'off',
95
+ '@typescript-eslint/no-unused-vars': [
96
+ 'error',
97
+ {
98
+ argsIgnorePattern: '^_',
99
+ varsIgnorePattern: '^_',
100
+ caughtErrorsIgnorePattern: '^_',
101
+ ignoreRestSiblings: true,
102
+ },
103
+ ],
104
+ '@typescript-eslint/explicit-function-return-type': 'off',
105
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
106
+ '@typescript-eslint/no-explicit-any': 'off',
107
+ 'react-hooks/set-state-in-effect': 'warn',
108
+ },
109
+ settings: {
110
+ react: {
111
+ version: 'detect',
112
+ },
113
+ },
114
+ },
115
+ // Test files
116
+ {
117
+ files: [
118
+ '**/*.test.{ts,tsx}',
119
+ '**/test/**/*.{ts,tsx}',
120
+ 'src/test/**/*.{ts,tsx}',
121
+ ],
122
+ languageOptions: {
123
+ parser: tsparser,
124
+ globals: {
125
+ ...globals.browser,
126
+ ...globals.node,
127
+ global: 'writable',
128
+ JSX: 'readonly',
129
+ },
130
+ },
131
+ rules: {
132
+ '@typescript-eslint/no-explicit-any': 'off',
133
+ },
134
+ },
135
+ ];
136
+
137
+ // Only add GraphQL rules when schema exists (e.g. after graphql:schema).
138
+ // In CI or when schema is not checked in, skip so lint succeeds.
139
+ if (schemaExists) {
140
+ config.push(
141
+ {
142
+ files: ['**/*.{ts,tsx}'],
143
+ processor: graphqlPlugin.processor,
144
+ },
145
+ {
146
+ files: ['**/*.graphql'],
147
+ languageOptions: {
148
+ parser: graphqlPlugin.parser,
149
+ parserOptions: {
150
+ graphQLConfig: {
151
+ schema: '../../../../../schema.graphql',
152
+ },
153
+ },
154
+ },
155
+ plugins: {
156
+ '@graphql-eslint': graphqlPlugin,
157
+ },
158
+ rules: {
159
+ '@graphql-eslint/no-anonymous-operations': 'error',
160
+ '@graphql-eslint/no-duplicate-fields': 'error',
161
+ '@graphql-eslint/known-fragment-names': 'error',
162
+ '@graphql-eslint/no-undefined-variables': 'error',
163
+ '@graphql-eslint/no-unused-variables': 'error',
164
+ },
165
+ }
166
+ );
167
+ }
168
+
169
+ export default config;
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <UIBundle xmlns="http://soap.sforce.com/2006/04/metadata">
3
+ <masterLabel>feature-react-customer-web-client-chat</masterLabel>
4
+ <description>A Salesforce UI Bundle.</description>
5
+ <isActive>true</isActive>
6
+ <version>1</version>
7
+ </UIBundle>
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Welcome to React App</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="src/app.tsx"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "base-react-app",
3
+ "private": true,
4
+ "version": "1.59.0",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22"
8
+ },
9
+ "scripts": {
10
+ "dev": "vite",
11
+ "dev:design": "vite --mode design",
12
+ "build": "tsc -b && vite build",
13
+ "build:e2e": "npm run build && node scripts/rewrite-e2e-assets.mjs",
14
+ "lint": "eslint .",
15
+ "preview": "vite preview",
16
+ "test": "vitest",
17
+ "graphql:codegen": "graphql-codegen",
18
+ "graphql:schema": "node scripts/get-graphql-schema.mjs"
19
+ },
20
+ "dependencies": {
21
+ "@salesforce/platform-sdk": "^11.52.0",
22
+ "@salesforce/ui-bundle": "^11.52.0",
23
+ "@tailwindcss/vite": "^4.1.17",
24
+ "class-variance-authority": "^0.7.1",
25
+ "clsx": "^2.1.1",
26
+ "date-fns": "^4.1.0",
27
+ "lucide-react": "^0.562.0",
28
+ "radix-ui": "^1.4.3",
29
+ "react": "^19.2.0",
30
+ "react-day-picker": "^9.14.0",
31
+ "react-dom": "^19.2.0",
32
+ "react-router": "^8.3.0",
33
+ "shadcn": "^3.8.5",
34
+ "sonner": "^1.7.0",
35
+ "tailwind-merge": "^3.5.0",
36
+ "tailwindcss": "^4.1.17",
37
+ "tw-animate-css": "^1.4.0"
38
+ },
39
+ "devDependencies": {
40
+ "@eslint/js": "^9.39.1",
41
+ "@graphql-codegen/cli": "^6.1.0",
42
+ "@graphql-codegen/typescript": "^5.0.6",
43
+ "@graphql-codegen/typescript-operations": "^5.0.6",
44
+ "@graphql-eslint/eslint-plugin": "^4.1.0",
45
+ "@graphql-tools/utils": "^11.0.0",
46
+ "@playwright/test": "^1.49.0",
47
+ "@salesforce/graphiti": "^11.52.0",
48
+ "@salesforce/vite-plugin-ui-bundle": "^11.52.0",
49
+ "@testing-library/jest-dom": "^6.6.3",
50
+ "@testing-library/react": "^16.1.0",
51
+ "@testing-library/user-event": "^14.5.2",
52
+ "@types/node": "^24.10.1",
53
+ "@types/react": "^19.2.5",
54
+ "@types/react-dom": "^19.2.3",
55
+ "@vitejs/plugin-react": "^5.1.1",
56
+ "@vitest/ui": "^4.1.0",
57
+ "eslint": "^9.39.1",
58
+ "eslint-plugin-react": "^7.37.2",
59
+ "eslint-plugin-react-hooks": "^7.0.1",
60
+ "eslint-plugin-react-refresh": "^0.4.24",
61
+ "globals": "^16.5.0",
62
+ "graphql": "^16.11.0",
63
+ "graphql-codegen-typescript-operation-types": "^2.0.2",
64
+ "jsdom": "^25.0.1",
65
+ "serve": "^14.2.5",
66
+ "typescript": "~5.9.3",
67
+ "typescript-eslint": "^8.46.4",
68
+ "vite": "^7.2.4",
69
+ "vite-plugin-graphql-codegen": "^3.6.3",
70
+ "vitest": "^4.1.0"
71
+ },
72
+ "overrides": {
73
+ "lodash": "^4.18.1",
74
+ "undici": "^7.28.0"
75
+ }
76
+ }
@@ -0,0 +1,24 @@
1
+ import { defineConfig, devices } from '@playwright/test';
2
+
3
+ const E2E_PORT = 5175;
4
+
5
+ export default defineConfig({
6
+ testDir: './e2e',
7
+ fullyParallel: true,
8
+ forbidOnly: !!process.env.CI,
9
+ retries: process.env.CI ? 2 : 0,
10
+ workers: process.env.CI ? 1 : undefined,
11
+ reporter: 'html',
12
+ use: {
13
+ baseURL: `http://localhost:${E2E_PORT}`,
14
+ trace: 'on-first-retry',
15
+ },
16
+ projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
17
+ webServer: {
18
+ // Serve built dist/ with static server so e2e works in CI without SF org (vite preview runs plugin and can fail)
19
+ command: `npx serve dist -l ${E2E_PORT}`,
20
+ url: `http://localhost:${E2E_PORT}`,
21
+ reuseExistingServer: !process.env.CI,
22
+ timeout: process.env.CI ? 120_000 : 60_000,
23
+ },
24
+ });