* Squashed commit of the following: commit 42ef1ff8c3ff881b0f21cb4de23a5964f0bb106b Merge: 4940da4326c049748b88Author: Mattermost Build <build@mattermost.com> Date: Fri Mar 14 21:15:22 2025 +0200 Merge branch 'master' into MM-62695 commit 4940da4326ff787dd43fc486f06be415257181ae Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 12:14:45 2025 -0700 manage error the same way property field and value do commit cd9ec590264ca3751a55fc0926318cbb6f46d471 Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 12:05:02 2025 -0700 sanitize and validate commit 2672e90b06331ff2e31a7807737cc1feff1c1beb Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 12:02:20 2025 -0700 use Len test method commit d101950d655c7d6fd7a668a15554cc52a1d42667 Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 11:59:12 2025 -0700 rearrange consts commit ed1b8f66fb08f7be38615ced74282380d5d680b7 Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 11:58:56 2025 -0700 rename CPASortOrder method commit d3bc303fa3c9694d2f6d1531186f4fbe69efb956 Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 11:54:24 2025 -0700 rename CustomProfileAttributes in method to CPA commit b2323d44a6c3f31ea7c798f8a88c62878d5d2cdf Author: Julien Tant <julien@craftyx.fr> Date: Fri Mar 14 11:54:02 2025 -0700 Add SAML and LDAP attr commit d411ae9da5a078cfbac60c5662bee27622ff31e5 Author: Julien Tant <julien@craftyx.fr> Date: Wed Mar 12 11:58:21 2025 -0700 i18n commit 27bc74c71462ae08d496104c908454ebc4f2def3 Author: Julien Tant <julien@craftyx.fr> Date: Wed Mar 12 11:11:23 2025 -0700 fix TestDeleteCPAField test commit 0d77071225d8575ace89cbe38c6c06fa94d7696b Author: Julien Tant <julien@craftyx.fr> Date: Wed Mar 12 10:28:49 2025 -0700 err->appErr commit fe87a68caa49c7264c20c32cd4f598ffd18d503f Author: Julien Tant <julien@craftyx.fr> Date: Wed Mar 12 10:22:13 2025 -0700 i18n commit 3b3ddf978fce66d9506416a10c03b21d6a12e9d0 Author: Julien Tant <julien@craftyx.fr> Date: Wed Mar 12 10:21:12 2025 -0700 tests commit 2f898bd53b832dea60dcdb960a71cd47709cddf8 Author: Julien Tant <julien@craftyx.fr> Date: Tue Mar 11 15:09:12 2025 -0700 add validation and tests commit a8c20841af6e82a6bf4f5dde6324b5e56c4d754e Author: Julien Tant <julien@craftyx.fr> Date: Tue Mar 11 13:45:53 2025 -0700 code style commit 5bb3868b2ce93b9eb6e9d0836c597fa1176fbbbd Merge: a4180d5d8f7c25de2cffAuthor: Mattermost Build <build@mattermost.com> Date: Tue Mar 11 22:24:06 2025 +0200 Merge branch 'master' into MM-62695 commit a4180d5d8ff5e23a7a0a73b08806d37289e076ce Author: Julien Tant <julien@craftyx.fr> Date: Tue Feb 25 11:53:54 2025 -0700 use CPAField commit 988177024ceebe73750ce48c40ea0a9ca6db75d6 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Tue Feb 25 10:52:47 2025 -0700 refactor: Move validateCustomProfileAttributesField to Validate method on CPAField struct commit 783e64472c7ef3c1e33ce9a94b0716e96a72b105 Author: Julien Tant <julien@craftyx.fr> Date: Tue Feb 25 10:52:45 2025 -0700 refactor: Improve custom profile attributes field handling and validation commit aee06af59c748e74e5dc7718c1529527ac8c052a Author: Julien Tant (aider) <julien@craftyx.fr> Date: Tue Feb 25 10:50:29 2025 -0700 test: Add test case for CPA field with empty attributes commit 7ab4455f9feb88826fcf6abb3b93a8a7bb53ed3e Author: Julien Tant <julien@craftyx.fr> Date: Tue Feb 25 10:50:28 2025 -0700 refactor: Cleanup whitespace and remove empty Attrs in custom profile attributes test commit dbdb47d75818d58739c3962d8624388214382611 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Tue Feb 25 10:48:08 2025 -0700 test: Add test case for property field with empty attributes commit 43872e06933b40f45caadbca7708eab283cebd8d Author: Julien Tant (aider) <julien@craftyx.fr> Date: Tue Feb 25 10:44:39 2025 -0700 test: Add tests for NewCPAFieldFromPropertyField and CPAFieldToPropertyField commit 335f6b5c8901b6ecdc1e9f031a81695ffc269029 Merge: 01f632db46e8ef26196cAuthor: Julien Tant <julien@craftyx.fr> Date: Tue Feb 25 10:05:43 2025 -0700 Merge branch 'master' into MM-62695 commit 01f632db46cf0eeeea0bac337b10c66fad815a24 Author: Julien Tant <julien@craftyx.fr> Date: Thu Feb 13 19:16:33 2025 -0700 removed unused i18n commit 0214d7eb947d3d8ecfde169cb07c210ecbfc9c92 Merge: db0e371ca268c11e9ecbAuthor: Julien Tant <julien@craftyx.fr> Date: Thu Feb 13 19:15:08 2025 -0700 Merge remote-tracking branch 'origin/master' into MM-62695 commit db0e371ca239b5286e58ad264c46a8891eafbe9b Author: Julien Tant <julien@craftyx.fr> Date: Thu Feb 13 19:05:58 2025 -0700 generic options commit 3cd62774a1b54e5e9da0c1c5b2626de4f49116ca Merge: d95e5d983841e0f97176Author: Julien Tant <julien@craftyx.fr> Date: Thu Feb 13 10:48:47 2025 -0700 Merge remote-tracking branch 'origin/master' into MM-62695 commit d95e5d9838b9b00bd4ef9ec066df03cfc52596d7 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 17:07:28 2025 -0700 style commit 2256076ed174b25a5decc2631ee6abaa9fa1a3c1 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 17:06:22 2025 -0700 refactor: Make color field optional in custom profile attributes commit 7382b8ecb3964083d24d879210aa3d137983b404 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 16:40:10 2025 -0700 fix api test commit a54c2d653f9a2e46d989181f9ef5ffd3dcbdb8c0 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 16:02:27 2025 -0700 lint commit 9d2e3f78f6ba836b599df7f3cdd4766bf47cd600 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 15:50:31 2025 -0700 use custom types rather than string commit 4624df52cbda3cb9b0f8fa60b7a3d4f5ecf1c845 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 15:40:52 2025 -0700 refactor: Use consistent "ValidateCPAField" in error messages for custom profile attributes commit 42716170b7158cc4d3ce06cfef36046be6290def Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 15:36:04 2025 -0700 fix casing in custom profilte attributes test commit bcca3d87c47efcf95fcea2d1b380ce8aee89f7d4 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 15:33:26 2025 -0700 refactor: Modify CustomProfileAttributesSelectOption to use lowercase JSON keys commit 861e12c1fcaedb69d331120bd4ae58757df1fae1 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 15:29:23 2025 -0700 i18n commit a44f6f40eb5babab5f72a49078bec110a4645ddb Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 15:21:08 2025 -0700 improve test commit b2f002016fb7438a4507f9cb1cc236a43fb71e27 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 15:10:00 2025 -0700 test: Add test case for preserving option IDs when patching select field commit aac155ef23866d7b85ef49483eec5b610b2a8bc0 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 15:04:18 2025 -0700 don't do validation in constructor commit a88c092768fb0c46b76e72d6e27f417d3f25ba86 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 15:00:10 2025 -0700 feat: Enhance ID validation and trimming in custom profile attributes commit b6fb5f274a97f9de4d80899a406b4397d2a4983e Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 14:57:24 2025 -0700 test: Add test cases for preserving IDs in custom profile attributes commit bbb7f3e2610f4ebc96c6043504710f359d48a733 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 14:56:15 2025 -0700 refactor: Update CustomProfileAttributesSelectOption constructor to prioritize ID parameter commit dbd1728a14fd708e60a3c1180b21a155221a032a Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 14:50:14 2025 -0700 feat: Add validation for custom profile attributes fields commit e87689571bde77c2881f50af537930be9355f815 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 14:44:15 2025 -0700 test: Add comprehensive test for NewCustomProfileAttributesSelectOptionFromMap commit a2292d44ff2cc496e36633440c3d0cbdb1930e45 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 14:43:14 2025 -0700 feat: Add support for lowercase and title case keys in custom profile attributes map commit 47ca1848767d597f8305c4c183a68be476c034b9 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 14:43:12 2025 -0700 fix: Update custom profile attributes map keys to use capitalized names commit e8de7dfc6d01c73064c10f65e0ecc86c4b2ae320 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 14:01:31 2025 -0700 feat: Add comprehensive test cases for custom profile attributes field validation commit e798a53170d0aedbe25916cdaef3a11ac4191fd5 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 13:56:25 2025 -0700 add default visibility commit e54ea2ba2f19bbcea06c9deed1a28923a2db5532 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 13:22:04 2025 -0700 fix tests commit db1839a6e9b7d6a86ae334fa7bcae5e3aa622295 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 13:18:51 2025 -0700 feat: Add index number to validation error messages in custom profile attributes commit 35e29a0dfd3fb3cc09b7a2ec9234791719224c01 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 13:18:49 2025 -0700 refactor: Add validation and creation methods for custom profile attributes commit eac47527d27607fef30e840175c6ddb855445467 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 12:49:00 2025 -0700 feat: Add validation to prevent empty custom profile attribute options commit 1baece68f945de3d8fe8d4fe9df0ebcb243ba5f7 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 12:48:36 2025 -0700 refactor: Rename NewCustomProfileAttributeSelectOption to NewCustomProfileAttributesSelectOption commit 43710b018ab102f74ecaf2339e29593ae5dd3f55 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 12:46:43 2025 -0700 refactor: Replace map[string]bool with map[string]struct{} for key existence check commit 3263b04478cf69533e298535f75a9d6f252e46de Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 12:46:06 2025 -0700 feat: Add IsValid method to validate CustomProfileAttributesSelectOptions commit 4531710f560fbc22ab76f6a67597e154fec3c896 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 12:46:04 2025 -0700 refactor: Fix typo in custom profile attributes select option function name commit c1c821275c574e15a0e03987098891e191e9aa55 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 12:42:50 2025 -0700 gofmt commit 328c898a3f0c50f8b0dd83aa37c84c099342a8a4 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 12:41:14 2025 -0700 refactor: Trim spaces from name and color in custom profile attribute select option constructor commit b924431499b1b1472f377fd6c8bc1e726e8857c3 Author: Julien Tant <julien@craftyx.fr> Date: Wed Feb 12 12:41:12 2025 -0700 feat: Add custom profile attributes model with validation and constants commit 463ad161c5141cc8994bab0278cdc1df54f4b4e3 Author: Julien Tant (aider) <julien@craftyx.fr> Date: Wed Feb 12 12:40:19 2025 -0700 test: Add unit tests for custom profile attributes select options * sort_order int temp * name, type menu, dot menu * values add/remove * disabled when deleted * - max length - full height - validate options - clear attrs.options when not select/multiselect * Revert "sort_order int temp" This reverts commit ed675983c21965d7a9534e6c7b4eb38b8a751002. * Revert "Squashed commit of the following:" This reverts commit faf8b01169f0c285b7c77333f601e3cc7a1f4f18. * field values test * test type menu * test table * fix dot menu item id * test delete modal * test dot menu * fix system_properties test * fix user_properties_utils tests * fix attr sort_order type * i18n * fix lint * fix test types * lint scss * disable email type --------- Co-authored-by: Mattermost Build <build@mattermost.com>
This folder contains a number of packages intended to be built and shipped separately on NPM as well as a few legacy packages for internal use only (reselect and mattermost-redux). The following documentation only applies to the newer packages and not to the legacy ones.
Importing a subpackage
Subpackages should be imported using their full name, both inside the web app and when installing them using npm. They should not be imported using a relative path, and the src folder shouldn't be necessary to include.
// Correct
import {Client4} from '@mattermost/client';
import {UserProfile} from '@mattermost/types/users';
// Incorrect
import Client4 from 'packages/client/src/client4.ts';
import {UserProfile} from '../../types/src/users';
Some tools have difficulty doing this on their own, but they often support import path aliases so that we can keep them consistent acrosss the code base. More details on how to do this will be provided in packages where this is necessary such as types.
Importing one subpackage into another
When building packages that depend on each other, be careful to:
- Avoid import loops. While JavaScript lets us get away with these in most cases within a project, we cannot have two packages that depend directly with each other.
- Not compile one subpackage into another. We don't want the published libraries to include code from one subpackage into another. They should be set up so that they're peer dependencies in the
package.json, and if a project wants to use multiple packages, they can install them each separately.
As above, some tooling may need additional configuration to have one subpackage use code from another. For example, in packages compiled with the TypeScript compiler (tsc), you'll need to have the tsconfig.json from the dependent pacakge reference its dependency using the references field.
Versioning subpackages
At this time, we'll have the version of each package match the version of the web app. Versions can be incremented for each affected package by using npm version, and then npm install should be run to propagate those changes into the shared package-lock.json.
# Set a version of a single package
npm version 6.7.8 --workspace=packages/apple
# Increment the version of each package to the next minor version
npm version minor --workspaces
## Increment the version of a package to a pre-release version of the next minor version
npm version preminor --workspace=packages/apple
When a subpackage imports another, it should be set to depend on the * version of the other subpackage.
Adding a new subpackage
To set up a new package:
- Add a
package.jsonandREADME.mdfor that package. - Ensure all source files are located in
srcand all compiled files are built tolib. - Add an entry to the
workspacessection of the rootpackage.jsonso that NPM is aware of your package. - Set up import aliases so that the package is visible from the web app to the following tools:
-
TypeScript - In the root
tsconfig.json, add an entry to thecompilerOptions.pathssection pointing to thesrcfolder and an entry to thereferencessection pointing to the root of your package which should contain its owntsconfig.json.Note that the
compilerOptions.pathsentry will differ based on if your package exports just a single module (ie a singleindex.jsfile) or if it exports multiple submodules.{ "compilerOptions": { "paths": { "@mattermost/apple": ["packages/apple/lib"], // import * as Apple from '@mattermost/apple'; "@mattermost/banana/*": ["packages/banana/lib/*"], // import Yellow from '@mattermost/banana/yellow'; } }, "references": [ {"path": "./packages/apple"}, {"path": "./packages/banana"}, ] } -
Jest - Add an entry to the
jest.moduleNameMappersection of the rootjest.config.jsfor your package. Since that setting supports regexes, you can add these to the existing patterns used by theclientandtypespackages.Similar to TypeScript, this will differ based on if the package exports a single module or multiple modules.
{ "jest": { "moduleNameMapper": { "^@mattermost/(apple|client)$": "<rootDir>/packages/$1/src", "^@mattermost/(banana|types)/(.*)$": "<rootDir>/packages/$1/src/$2", } } }
-
- Add the compiled code to the CircleCI dependency cache. This is done by modifying the
pathsused by thesave_cachestep in.circleci/config.ymlaliases: - &save_cache save_cache: paths: - ~/mattermost/mattermost-webapp/packages/apple/lib - ~/mattermost/mattermost-webapp/packages/banana/lib
Publishing a subpackage
The following is the rough process for releasing these packages. They'll require someone with write access on our NPM organization to run them, and they'll likely change over time as we improve this process.
For full releases accompanying new versions of Mattermost:
-
Clean the repo.
make clean -
Update the version of the desired packages to match the server/web app as described above.
-
Download an up to date copy of the dependencies and update package-lock.json.
make node_modules -
Check in the changes to the package-lock.json.
-
Build the desired packages.
npm run build --workspace=packages/apple --workspace=packages/banana -
Test everything in the web app. This will be needed until the packages get their own standalone tests.
make check-style check-types test -
Assuming those pass, you can now publish those packages to npm. You can also do a dry run first or use
npm packto see exactly which files will be pushed.# Run a dry run which will list all the files to be included in the published package. npm publish --dry-run --workspace=packages/apple # Generate the tar file that will be uploaded to NPM for inspection. npm pack --workspace=packages/apple # Actually publish these packages. You can also use --workspaces to publish everything. npm publish --access=public --workspace=packages/apple --workspace=packages/bananaThe packages have now been published! There's still a few remaining cleanup tasks to do though.
-
Tag the commit for each package that has been updated. The tag name should be of the form
@mattermost/package-name@x.y.z. -
Push that commit and the corresponding tags up to GitHub
git push release-x.y git push origin @mattermost/apple@x.y.z @mattermost/banana@x.y.z
Publishing a pre-release version
Similarly, you can publish a pre-release version of the package. This can be done either to use changes from master while developing another product/plugin or to generate a release candidate.
This process is the same as above, except the version will have a suffix like -1, -2, etc. As explained above, this can be automatically done by using npm version preminor for minor releases, npm version premajor for major releases, and npm version prerelease for patch releases. These versions won't be automatically installed when people add them using npm add without a version, but they can be installed by specifying the version number manually.
Caveats
-
Currently, all packages are treated by CI as if they're part of the web app. This means that, for example, their style checking and tests are ran as part of the web app. In turn, that means that regardless of what tooling we use to build each package, they'll be compiled into the web app using webpack directly from source, and that it's possible for them to behave slightly differently in development compared to after release.
Eventually, we hope to get these building in parallel (so instead of having webpack watch the whole repo for changes during development, we'll have multiple watchers for the web app and each package) which should solve this issue, but that requires much larger changes that we're not ready to do yet.
-
For packages that export multiple submodules (such as
types), we've chosen to expose these using Node's subpath exports feature. Some tools like Webpack support this natively, but others like TypeScript and Jest don't support it yet. We've provided steps on how to support this in theREADME.mdfor thetypespackage, but this may vary depending on the project's setup.