Move root PNPM workspace to js directory (#35456)

Closes #35455

Signed-off-by: Jon Koops <jonkoops@gmail.com>
This commit is contained in:
Jon Koops 2024-11-29 17:20:32 +01:00 committed by GitHub
parent 9861acc2aa
commit faf36dd2f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 149 additions and 138 deletions

6
.github/CODEOWNERS vendored
View File

@ -46,12 +46,6 @@
# UI (@keycloak/ui-maintainers)
###################################################################################################
/eslint.config.js @keycloak/ui-maintainers
/package.json @keycloak/ui-maintainers
/pnpm-lock.yaml @keycloak/ui-maintainers
/pnpm-workspace.yaml @keycloak/ui-maintainers
/tsconfig.eslint.json @keycloak/ui-maintainers
/tsconfig.json @keycloak/ui-maintainers
/themes/ @keycloak/ui-maintainers @keycloak/maintainers
/js/ @keycloak/ui-maintainers
/js/**/maven-resources-community/**/messages_*.properties @keycloak/ui-maintainers @keycloak/maintainers

View File

@ -32,12 +32,6 @@ operator/ operator
docs/guides/ guides
docs/documentation/ documentation
eslint.config.js js
package.json js
pnpm-lock.yaml js
pnpm-workspace.yaml js
tsconfig.eslint.json js
tsconfig.json js
js/ js
rest/admin-ui-ext/ js
services/ js

View File

@ -8,8 +8,8 @@ runs:
id: tooling-versions
shell: bash
run: |
echo "node=$(cat pom.xml | grep '<node.version>' | cut -d '>' -f 2 | cut -d '<' -f 1 | cut -c 2-)" >> $GITHUB_OUTPUT
echo "pnpm=$(cat pom.xml | grep '<pnpm.version>' | cut -d '>' -f 2 | cut -d '<' -f 1 | cut -c 1-)" >> $GITHUB_OUTPUT
echo "node=$(cat js/pom.xml | grep '<node.version>' | cut -d '>' -f 2 | cut -d '<' -f 1 | cut -c 2-)" >> $GITHUB_OUTPUT
echo "pnpm=$(cat js/pom.xml | grep '<pnpm.version>' | cut -d '>' -f 2 | cut -d '<' -f 1 | cut -c 1-)" >> $GITHUB_OUTPUT
# Downloading Node.js often fails due to network issues, therefore we cache the artifacts downloaded by the frontend plugin.
- uses: actions/cache@v4

View File

@ -29,6 +29,7 @@ runs:
- name: Install dependencies
shell: bash
run: pnpm install --prefer-offline --frozen-lockfile
working-directory: js
# This step is only needed to ensure that the Cypress binary is installed.
# If the binary was retrieved from the cache, this step is a no-op.

View File

@ -69,8 +69,10 @@ jobs:
- uses: ./.github/actions/pnpm-setup
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} lint
working-directory: js
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} build
working-directory: js
ui-shared:
name: UI Shared
@ -85,8 +87,10 @@ jobs:
- uses: ./.github/actions/pnpm-setup
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} lint
working-directory: js
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} build
working-directory: js
account-ui:
name: Account UI
@ -101,8 +105,10 @@ jobs:
- uses: ./.github/actions/pnpm-setup
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} lint
working-directory: js
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} build
working-directory: js
admin-ui:
name: Admin UI
@ -117,12 +123,16 @@ jobs:
- uses: ./.github/actions/pnpm-setup
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} lint
working-directory: js
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} test
working-directory: js
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} build
working-directory: js
- run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} cy:check-types
working-directory: js
account-ui-e2e:
name: Account UI E2E
@ -156,9 +166,11 @@ jobs:
- name: Install Playwright browsers
run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} exec playwright install --with-deps
working-directory: js
- name: Run Playwright tests
run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} test
working-directory: js
- name: Upload Playwright report
uses: actions/upload-artifact@v4
@ -228,6 +240,7 @@ jobs:
- name: Compile Admin Client
run: pnpm --fail-if-no-match --filter @keycloak/keycloak-admin-client build
working-directory: js
- name: Download Keycloak server
uses: actions/download-artifact@v4
@ -249,6 +262,7 @@ jobs:
- name: Start LDAP server
run: pnpm --fail-if-no-match --filter ${{ env.WORKSPACE }} cy:ldap-server &
working-directory: js
- name: Run Cypress
uses: cypress-io/github-action@v6

15
.gitignore vendored
View File

@ -86,24 +86,9 @@ quarkus/data/*.db
# Git ephemeral files
*.versionsBackup
# frontend-maven-plugin
node
# Wireit
.wireit
# Vite
dist
!/quarkus/dist
!/quarkus/**/src/**/dist
# ESLint
.eslintcache
# NPM
node_modules
# SDKMAM environment file
.sdkmanrc

14
js/.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
# frontend-maven-plugin
node
# Wireit
.wireit
# Vite
dist
# ESLint
.eslintcache
# NPM
node_modules

View File

@ -7,6 +7,9 @@ if [ ! -f "$FILE" ]; then
exit 0;
fi
# Change to the js directory.
cd js
# Exit if dependencies are not installed.
if [ ! -d "node_modules" ]; then
exit 0;

View File

@ -1,5 +1,5 @@
{
"extends": "../../../tsconfig.json",
"extends": "../../tsconfig.json",
"include": ["src"],
"exclude": ["**/*.test.ts", "**/*.test.tsx"]
}

View File

@ -1,5 +1,5 @@
import type GroupRepresentation from "@keycloak/keycloak-admin-client/lib/defs/groupRepresentation";
import UserRepresentation from "js/libs/keycloak-admin-client/lib/defs/userRepresentation";
import UserRepresentation from "@keycloak/keycloak-admin-client/lib/defs/userRepresentation";
import { Modal, ModalVariant } from "@patternfly/react-core";
import {
Button,

View File

@ -1,5 +1,5 @@
{
"extends": "../../../tsconfig.json",
"extends": "../../tsconfig.json",
"include": ["src"],
"exclude": ["**/*.test.ts", "**/*.test.tsx"],
"references": [{ "path": "./tsconfig.node.json" }]

View File

@ -161,16 +161,16 @@ export default tseslint.config(
},
{
...playwright.configs["flat/recommended"],
files: ["js/apps/account-ui/test/**"],
files: ["apps/account-ui/test/**"],
},
{
files: ["js/libs/keycloak-admin-client/test/**"],
files: ["libs/keycloak-admin-client/test/**"],
rules: {
"@typescript-eslint/no-unused-expressions": "off",
},
},
{
files: ["js/libs/keycloak-admin-client/src/**"],
files: ["libs/keycloak-admin-client/src/**"],
rules: {
"@typescript-eslint/no-empty-object-type": "off",
},

View File

@ -1,5 +1,5 @@
{
"extends": "../../../tsconfig.json",
"extends": "../../tsconfig.json",
"include": ["src"],
"compilerOptions": {
"module": "Node16",

View File

@ -1,5 +1,5 @@
{
"extends": "../../../tsconfig.json",
"extends": "../../tsconfig.json",
"include": ["src"],
"exclude": ["**/*.test.ts", "**/*.test.tsx"]
}

View File

@ -4,7 +4,7 @@
"type": "module",
"packageManager": "pnpm@9.14.4+sha512.c8180b3fbe4e4bca02c94234717896b5529740a6cbadf19fa78254270403ea2f27d4e1d46a08a0f56c89b63dc8ebfd3ee53326da720273794e6200fcf0d184ab",
"scripts": {
"prepare": "husky js/.husky"
"prepare": "cd .. && husky js/.husky"
},
"devDependencies": {
"@eslint/compat": "^1.2.3",

View File

@ -72,7 +72,7 @@ importers:
specifier: ^0.14.9
version: 0.14.9
js/apps/account-ui:
apps/account-ui:
dependencies:
'@keycloak/keycloak-ui-shared':
specifier: workspace:*
@ -148,7 +148,7 @@ importers:
specifier: ^4.3.0
version: 4.3.0(@types/node@22.10.1)(rollup@4.27.4)(typescript@5.7.2)(vite@6.0.1(@types/node@22.10.1)(lightningcss@1.28.2)(terser@5.36.0)(tsx@4.19.2)(yaml@2.5.1))
js/apps/admin-ui:
apps/admin-ui:
dependencies:
'@keycloak/keycloak-admin-client':
specifier: workspace:*
@ -176,7 +176,7 @@ importers:
version: 5.4.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
admin-ui:
specifier: 'file:'
version: '@keycloak/keycloak-admin-ui@file:js/apps/admin-ui(@types/react@18.3.12)(typescript@5.7.2)'
version: '@keycloak/keycloak-admin-ui@file:apps/admin-ui(@types/react@18.3.12)(typescript@5.7.2)'
dagre:
specifier: ^0.8.5
version: 0.8.5
@ -299,7 +299,7 @@ importers:
specifier: ^2.1.6
version: 2.1.6(@types/node@22.10.1)(jsdom@25.0.1)(lightningcss@1.28.2)(terser@5.36.0)(tsx@4.19.2)(yaml@2.5.1)
js/apps/create-keycloak-theme:
apps/create-keycloak-theme:
dependencies:
chalk:
specifier: ^5.3.0
@ -317,7 +317,7 @@ importers:
specifier: ^3.27.0
version: 3.27.0
js/apps/keycloak-server:
apps/keycloak-server:
dependencies:
'@octokit/rest':
specifier: ^21.0.2
@ -335,7 +335,7 @@ importers:
specifier: ^3.0.6
version: 3.0.6
js/libs/keycloak-admin-client:
libs/keycloak-admin-client:
dependencies:
camelize-ts:
specifier: ^3.0.0
@ -375,9 +375,9 @@ importers:
specifier: ^10.9.2
version: 10.9.2(@swc/core@1.9.3)(@types/node@22.10.1)(typescript@5.7.2)
js/libs/keycloak-js: {}
libs/keycloak-js: {}
js/libs/ui-shared:
libs/ui-shared:
dependencies:
'@keycloak/keycloak-admin-client':
specifier: workspace:*
@ -447,7 +447,7 @@ importers:
specifier: ^2.1.6
version: 2.1.6(@types/node@22.10.1)(jsdom@25.0.1)(lightningcss@1.28.2)(terser@5.36.0)(tsx@4.19.2)(yaml@2.5.1)
js/themes-vendor:
themes-vendor:
dependencies:
'@noble/hashes':
specifier: ^1.6.1
@ -1081,8 +1081,8 @@ packages:
'@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
'@keycloak/keycloak-admin-ui@file:js/apps/admin-ui':
resolution: {directory: js/apps/admin-ui, type: directory}
'@keycloak/keycloak-admin-ui@file:apps/admin-ui':
resolution: {directory: apps/admin-ui, type: directory}
'@kwsites/file-exists@1.1.1':
resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==}
@ -5509,10 +5509,10 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@keycloak/keycloak-admin-ui@file:js/apps/admin-ui(@types/react@18.3.12)(typescript@5.7.2)':
'@keycloak/keycloak-admin-ui@file:apps/admin-ui(@types/react@18.3.12)(typescript@5.7.2)':
dependencies:
'@keycloak/keycloak-admin-client': link:js/libs/keycloak-admin-client
'@keycloak/keycloak-ui-shared': link:js/libs/ui-shared
'@keycloak/keycloak-admin-client': link:libs/keycloak-admin-client
'@keycloak/keycloak-ui-shared': link:libs/ui-shared
'@patternfly/patternfly': 5.4.2
'@patternfly/react-code-editor': 5.4.13(monaco-editor@0.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@patternfly/react-core': 5.4.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -5524,7 +5524,7 @@ snapshots:
flat: 6.0.1
i18next: 24.0.2(typescript@5.7.2)
i18next-http-backend: 3.0.1
keycloak-js: link:js/libs/keycloak-js
keycloak-js: link:libs/keycloak-js
lodash-es: 4.17.21
monaco-editor: 0.52.0
p-debounce: 4.0.0

4
js/pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,4 @@
packages:
- apps/*
- libs/*
- themes-vendor

View File

@ -25,7 +25,94 @@
</modules>
<properties>
<node.version>v22.11.0</node.version>
<pnpm.version>9.14.4</pnpm.version>
<!-- The clean step is skipped on Windows -->
<js.skip.clean>false</js.skip.clean>
<!-- The JavaScript projects use the non-standard 'src' folder for their sources, therefore, name it here explicitly -->
<maven.build.cache.input.1>src</maven.build.cache.input.1>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>${frontend.plugin.version}</version>
<executions>
<execution>
<goals>
<goal>install-node-and-pnpm</goal>
</goals>
</execution>
<execution>
<id>pnpm-install</id>
<goals>
<goal>pnpm</goal>
</goals>
<configuration>
<arguments>install --prefer-offline --frozen-lockfile --ignore-scripts</arguments>
<workingDirectory>${maven.multiModuleProjectDirectory}/js</workingDirectory>
</configuration>
</execution>
<execution>
<id>pnpm-build</id>
<goals>
<goal>pnpm</goal>
</goals>
<configuration>
<arguments>build</arguments>
</configuration>
</execution>
</executions>
<configuration>
<nodeVersion>${node.version}</nodeVersion>
<pnpmVersion>${pnpm.version}</pnpmVersion>
<installDirectory>${maven.multiModuleProjectDirectory}/js</installDirectory>
<pnpmInheritsProxyConfigFromMaven>false</pnpmInheritsProxyConfigFromMaven>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<followSymLinks>false</followSymLinks>
<!-- Skip this step if on windows -->
<skip>${js.skip.clean}</skip>
<filesets>
<fileset>
<directory>${basedir}</directory>
<includes>
<include>**/.wireit/**</include>
<include>**/node_modules/**</include>
</includes>
</fileset>
<!-- include all non-maven projects here as well -->
<fileset>
<directory>js/apps/keycloak-server</directory>
<includes>
<include>server/**</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>clean-when-not-on-windows</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<properties>
<js.skip.clean>true</js.skip.clean>
</properties>
</profile>
</profiles>
</project>

View File

@ -1,4 +0,0 @@
packages:
- js/apps/*
- js/libs/*
- js/themes-vendor

81
pom.xml
View File

@ -232,13 +232,6 @@
<!-- Version suffix that is appended to directories. Default is the maven GAV version but this can be edited to use a short form version -->
<server.output.dir.version>${project.version}</server.output.dir.version>
<!-- Frontend -->
<node.version>v22.11.0</node.version>
<pnpm.version>9.14.4</pnpm.version>
<pnpm.args.install>install --prefer-offline --frozen-lockfile --ignore-scripts</pnpm.args.install>
<!-- The clean step is skipped on Windows -->
<js.skip.clean>false</js.skip.clean>
<!-- Set to true on release to update proto.lock files -->
<commitProtoLockChanges>false</commitProtoLockChanges>
<skipProtoLock>false</skipProtoLock>
@ -1461,68 +1454,6 @@
<verificationFile>target/verifier/verifications.xml</verificationFile>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<followSymLinks>false</followSymLinks>
<!-- Skip this step if on windows -->
<skip>${js.skip.clean}</skip>
<filesets>
<fileset>
<directory>${basedir}</directory>
<includes>
<include>**/.wireit/**</include>
<include>**/node_modules/**</include>
</includes>
</fileset>
<!-- include all non-maven projects here as well -->
<fileset>
<directory>js/apps/keycloak-server</directory>
<includes>
<include>server/**</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>${frontend.plugin.version}</version>
<executions>
<execution>
<goals>
<goal>install-node-and-pnpm</goal>
</goals>
</execution>
<execution>
<id>pnpm-install</id>
<goals>
<goal>pnpm</goal>
</goals>
<configuration>
<arguments>${pnpm.args.install}</arguments>
<workingDirectory>${maven.multiModuleProjectDirectory}</workingDirectory>
</configuration>
</execution>
<execution>
<id>pnpm-build</id>
<goals>
<goal>pnpm</goal>
</goals>
<configuration>
<arguments>build</arguments>
</configuration>
</execution>
</executions>
<configuration>
<nodeVersion>${node.version}</nodeVersion>
<pnpmVersion>${pnpm.version}</pnpmVersion>
<installDirectory>${maven.multiModuleProjectDirectory}</installDirectory>
<pnpmInheritsProxyConfigFromMaven>false</pnpmInheritsProxyConfigFromMaven>
</configuration>
</plugin>
<plugin>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-distribution-licenses-maven-plugin</artifactId>
@ -1741,17 +1672,5 @@
<keycloak.crypto.artifactId>keycloak-crypto-fips1402</keycloak.crypto.artifactId>
</properties>
</profile>
<profile>
<id>clean-when-not-on-windows</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<properties>
<js.skip.clean>true</js.skip.clean>
</properties>
</profile>
</profiles>
</project>