Compare commits
56 Commits
Author | SHA1 | Date | |
---|---|---|---|
3cfc7d7fa9 | |||
b5d9055fcf | |||
63d644d95f | |||
e16192b416 | |||
505e018448 | |||
5ced0e2809 | |||
0e1d919f7e | |||
a009db998e | |||
d6c6bd933b | |||
859cc03f35 | |||
1a3b8ae3b8 | |||
863a08abf3 | |||
fd9c6afa5e | |||
8f3797407b | |||
7eedb23285 | |||
e4a2c95dd8 | |||
9429228b71 | |||
aafbc60f12 | |||
7170611791 | |||
59e57f3dd5 | |||
fd0d25b081 | |||
fa529c911a | |||
dc997b7ef4 | |||
0168d32f96 | |||
d6fc0c779c | |||
08be36edfa | |||
990d287953 | |||
a629d4ab45 | |||
78b48af886 | |||
72d267853c | |||
66a218c2ec | |||
d4f3ec2245 | |||
7bdc19bf4b | |||
103ef788fb | |||
b6f6d1f3cc | |||
ef3d2e4e04 | |||
8ec8b91ead | |||
819a1d473d | |||
c930337255 | |||
57bb4a9d96 | |||
1776341242 | |||
983eec6941 | |||
86d390ee1a | |||
91703409d9 | |||
3322d0e4a5 | |||
d09038fde2 | |||
71966deaac | |||
12e83c9468 | |||
fe27357dbb | |||
b93003e76d | |||
d6c0e9f783 | |||
18a1baae59 | |||
2330788995 | |||
40c146022a | |||
9844e7554f | |||
b064b8cbe6 |
160
.github/workflows/ci.yaml
vendored
160
.github/workflows/ci.yaml
vendored
@ -2,87 +2,135 @@ name: ci
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- main
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
test_node:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: macos-10.15
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node: [ '14', '13', '12' ]
|
node: [ '14', '13', '12' ]
|
||||||
name: Test with Node v${{ matrix.node }}
|
name: Test with Node v${{ matrix.node }}
|
||||||
steps:
|
steps:
|
||||||
- name: Tell if project is using npm or yarn
|
- name: Tell if project is using npm or yarn
|
||||||
id: _1
|
id: step1
|
||||||
uses: garronej/github_actions_toolkit@v1.11
|
uses: garronej/github_actions_toolkit@v2.2
|
||||||
with:
|
with:
|
||||||
action_name: tell_if_project_uses_npm_or_yarn
|
action_name: tell_if_project_uses_npm_or_yarn
|
||||||
owner: ${{github.repository_owner}}
|
- uses: actions/checkout@v2.3.4
|
||||||
repo: ${{github.event.repository.name}}
|
- uses: actions/setup-node@v2.1.3
|
||||||
branch: ${{github.ref}}
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node }}
|
node-version: ${{ matrix.node }}
|
||||||
- if: steps._1.outputs.npm_or_yarn == 'yarn'
|
- if: steps.step1.outputs.npm_or_yarn == 'yarn'
|
||||||
run: |
|
run: |
|
||||||
yarn install --frozen-lockfile
|
yarn install --frozen-lockfile
|
||||||
yarn run build
|
yarn build
|
||||||
yarn run test
|
yarn test
|
||||||
- if: steps._1.outputs.npm_or_yarn == 'npm'
|
- if: steps.step1.outputs.npm_or_yarn == 'npm'
|
||||||
run: |
|
run: |
|
||||||
npm ci
|
npm ci
|
||||||
npm run build
|
npm run build
|
||||||
npm run test
|
npm test
|
||||||
trigger_publish:
|
check_if_version_upgraded:
|
||||||
name: Trigger publish.yaml workflow if package.json version updated ( and secrets.PAT is set ).
|
name: Check if version upgrade
|
||||||
|
if: github.event_name == 'push'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
needs: test
|
||||||
PAT: ${{secrets.PAT}}
|
outputs:
|
||||||
if: github.event_name == 'push' && github.event.head_commit.author.name != 'ts_ci'
|
from_version: ${{ steps.step1.outputs.from_version }}
|
||||||
needs: test_node
|
to_version: ${{ steps.step1.outputs.to_version }}
|
||||||
|
is_upgraded_version: ${{steps.step1.outputs.is_upgraded_version }}
|
||||||
steps:
|
steps:
|
||||||
|
- uses: garronej/github_actions_toolkit@v2.2
|
||||||
- name: Get version on latest
|
id: step1
|
||||||
id: v_latest
|
|
||||||
uses: garronej/github_actions_toolkit@v1.11
|
|
||||||
with:
|
with:
|
||||||
action_name: get_package_json_version
|
action_name: is_package_json_version_upgraded
|
||||||
owner: ${{github.repository_owner}}
|
|
||||||
repo: ${{github.event.repository.name}}
|
|
||||||
branch: latest
|
|
||||||
compare_to_version: '0.0.0'
|
|
||||||
|
|
||||||
- name: Get version on develop
|
update_changelog:
|
||||||
id: v_develop
|
runs-on: ubuntu-latest
|
||||||
uses: garronej/github_actions_toolkit@v1.11
|
needs: check_if_version_upgraded
|
||||||
|
if: needs.check_if_version_upgraded.outputs.is_upgraded_version == 'true'
|
||||||
|
steps:
|
||||||
|
- uses: garronej/github_actions_toolkit@v2.2
|
||||||
with:
|
with:
|
||||||
action_name: get_package_json_version
|
action_name: update_changelog
|
||||||
owner: ${{github.repository_owner}}
|
branch: ${{ github.ref }}
|
||||||
repo: ${{github.event.repository.name}}
|
commit_author_email: ts_ci@github.com
|
||||||
branch: ${{ github.sha }}
|
|
||||||
compare_to_version: ${{steps.v_latest.outputs.version || '0.0.0'}}
|
|
||||||
|
|
||||||
- name: 'Trigger the ''publish'' workflow'
|
create_github_release:
|
||||||
if: ${{ !!env.PAT && steps.v_develop.outputs.compare_result == '1' }}
|
runs-on: ubuntu-latest
|
||||||
uses: garronej/github_actions_toolkit@v1.11
|
needs:
|
||||||
|
- update_changelog
|
||||||
|
- check_if_version_upgraded
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ github.ref }}
|
||||||
|
- name: Build GitHub release body
|
||||||
|
id: step1
|
||||||
|
run: |
|
||||||
|
if [ "$FROM_VERSION" = "0.0.0" ]; then
|
||||||
|
echo "::set-output name=body::🚀"
|
||||||
|
else
|
||||||
|
echo "::set-output name=body::📋 [CHANGELOG](https://github.com/$GITHUB_REPOSITORY/blob/v$TO_VERSION/CHANGELOG.md)"
|
||||||
|
fi
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.PAT }}
|
FROM_VERSION: ${{ needs.check_if_version_upgraded.outputs.from_version }}
|
||||||
|
TO_VERSION: ${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||||
|
- uses: garronej/action-gh-release@v0.2.0
|
||||||
with:
|
with:
|
||||||
action_name: dispatch_event
|
name: Release v${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||||
owner: ${{github.repository_owner}}
|
tag_name: v${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||||
repo: ${{github.event.repository.name}}
|
target_commitish: ${{ github.ref }}
|
||||||
event_type: publish
|
body: ${{ steps.step1.outputs.body }}
|
||||||
client_payload_json: |
|
draft: false
|
||||||
${{
|
prerelease: false
|
||||||
format(
|
env:
|
||||||
'{{"from_version":"{0}","to_version":"{1}","repo":"{2}"}}',
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
steps.v_latest.outputs.version,
|
|
||||||
steps.v_develop.outputs.version,
|
publish_on_npm:
|
||||||
github.event.repository.name
|
runs-on: macos-10.15
|
||||||
)
|
needs:
|
||||||
}}
|
- update_changelog
|
||||||
|
- check_if_version_upgraded
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2.3.4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.ref }}
|
||||||
|
- uses: actions/setup-node@v2.1.3
|
||||||
|
with:
|
||||||
|
node-version: '15'
|
||||||
|
- run: |
|
||||||
|
PACKAGE_MANAGER=npm
|
||||||
|
if [ -f "./yarn.lock" ]; then
|
||||||
|
PACKAGE_MANAGER=yarn
|
||||||
|
fi
|
||||||
|
if [ "$PACKAGE_MANAGER" = "yarn" ]; then
|
||||||
|
yarn install --frozen-lockfile
|
||||||
|
else
|
||||||
|
npm ci
|
||||||
|
fi
|
||||||
|
$PACKAGE_MANAGER run build
|
||||||
|
- run: npx -y -p denoify@0.6.5 denoify_enable_short_npm_import_path
|
||||||
|
env:
|
||||||
|
DRY_RUN: "0"
|
||||||
|
- name: Publishing on NPM
|
||||||
|
run: |
|
||||||
|
if [ "$(npm show . version)" = "$VERSION" ]; then
|
||||||
|
echo "This version is already published"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
if [ "$NPM_TOKEN" = "" ]; then
|
||||||
|
echo "Can't publish on NPM, You must first create a secret called NPM_TOKEN that contains your NPM auth token. https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets"
|
||||||
|
false
|
||||||
|
fi
|
||||||
|
echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > .npmrc
|
||||||
|
npm publish
|
||||||
|
rm .npmrc
|
||||||
|
env:
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
VERSION: ${{ needs.check_if_version_upgraded.outputs.to_version }}
|
116
.github/workflows/publish.yaml
vendored
116
.github/workflows/publish.yaml
vendored
@ -1,116 +0,0 @@
|
|||||||
on:
|
|
||||||
repository_dispatch:
|
|
||||||
types: publish
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
update_changelog_and_sync_package_lock_version:
|
|
||||||
name: Update CHANGELOG.md and make sure package.json and package-lock.json versions matches.
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Synchronize package.json and package-lock.json version if needed.
|
|
||||||
uses: garronej/github_actions_toolkit@v1.11
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.PAT }}
|
|
||||||
with:
|
|
||||||
action_name: sync_package_and_package_lock_version
|
|
||||||
owner: ${{github.repository_owner}}
|
|
||||||
repo: ${{github.event.client_payload.repo}}
|
|
||||||
branch: develop
|
|
||||||
commit_author_email: ts_ci@github.com
|
|
||||||
- name: Update CHANGELOG.md
|
|
||||||
if: ${{ !!github.event.client_payload.from_version }}
|
|
||||||
uses: garronej/github_actions_toolkit@v1.11
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.PAT }}
|
|
||||||
with:
|
|
||||||
action_name: update_changelog
|
|
||||||
owner: ${{github.repository_owner}}
|
|
||||||
repo: ${{github.event.client_payload.repo}}
|
|
||||||
branch_behind: latest
|
|
||||||
branch_ahead: develop
|
|
||||||
commit_author_email: ts_ci@github.com
|
|
||||||
exclude_commit_from_author_names_json: '["ts_ci"]'
|
|
||||||
|
|
||||||
publish:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: update_changelog_and_sync_package_lock_version
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
ref: develop
|
|
||||||
- name: Remove .github directory, useless on 'latest' branch
|
|
||||||
run: rm -r .github
|
|
||||||
- name: Remove branch 'latest'
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
git branch -d latest || true
|
|
||||||
git push origin :latest
|
|
||||||
- name: Create the new 'latest' branch
|
|
||||||
run: |
|
|
||||||
git branch latest
|
|
||||||
git checkout latest
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
- run: |
|
|
||||||
if [ -f "./yarn.lock" ]; then
|
|
||||||
yarn install --frozen-lockfile
|
|
||||||
else
|
|
||||||
npm ci
|
|
||||||
fi
|
|
||||||
- run: |
|
|
||||||
PACKAGE_MANAGER=npm
|
|
||||||
if [ -f "./yarn.lock" ]; then
|
|
||||||
PACKAGE_MANAGER=yarn
|
|
||||||
fi
|
|
||||||
$PACKAGE_MANAGER run enable_short_import_path
|
|
||||||
env:
|
|
||||||
DRY_RUN: "0"
|
|
||||||
- name: (DEBUG) Show how the files have been moved to enable short import
|
|
||||||
run: ls -lR
|
|
||||||
- name: Publishing on NPM
|
|
||||||
run: |
|
|
||||||
if [ "$(npm show . version)" = "$VERSION" ]; then
|
|
||||||
echo "This version is already published"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
if [ "$NPM_TOKEN" = "" ]; then
|
|
||||||
echo "Can't publish on NPM, You must first create a secret called NPM_TOKEN that contains your NPM auth token. https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets"
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > .npmrc
|
|
||||||
npm publish
|
|
||||||
rm .npmrc
|
|
||||||
env:
|
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
||||||
VERSION: ${{ github.event.client_payload.to_version }}
|
|
||||||
- name: Commit changes
|
|
||||||
run: |
|
|
||||||
git config --local user.email "ts_ci@github.com"
|
|
||||||
git config --local user.name "ts_ci"
|
|
||||||
git add -A
|
|
||||||
git commit -am "Enabling shorter import paths [automatic]"
|
|
||||||
- run: git push origin latest
|
|
||||||
- name: Release body
|
|
||||||
id: id_rb
|
|
||||||
run: |
|
|
||||||
if [ "$FROM_VERSION" = "" ]; then
|
|
||||||
echo "::set-output name=body::🚀"
|
|
||||||
else
|
|
||||||
echo "::set-output name=body::📋 [CHANGELOG](https://github.com/$OWNER/$REPO/blob/$REF/CHANGELOG.md)"
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
FROM_VERSION: ${{ github.event.client_payload.from_version }}
|
|
||||||
OWNER: ${{github.repository_owner}}
|
|
||||||
REPO: ${{github.event.client_payload.repo}}
|
|
||||||
REF: v${{github.event.client_payload.to_version}}
|
|
||||||
- name: Create Release
|
|
||||||
uses: garronej/create-release@master
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.PAT }}
|
|
||||||
with:
|
|
||||||
tag_name: v${{ github.event.client_payload.to_version }}
|
|
||||||
release_name: Release v${{ github.event.client_payload.to_version }}
|
|
||||||
branch: latest
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
body: ${{ steps.id_rb.outputs.body }}
|
|
56
CHANGELOG.md
56
CHANGELOG.md
@ -1,3 +1,59 @@
|
|||||||
|
### **0.2.9** (2021-03-19)
|
||||||
|
|
||||||
|
- Update deps and CI workflow
|
||||||
|
|
||||||
|
### **0.2.8** (2021-03-19)
|
||||||
|
|
||||||
|
- Bugfix: keycloak_build that grow and grow in size
|
||||||
|
- Add disclaimer about maitainment strategy
|
||||||
|
- Add a note for tested version support
|
||||||
|
|
||||||
|
### **0.2.7** (2021-03-13)
|
||||||
|
|
||||||
|
- Bump version
|
||||||
|
- Update README.md
|
||||||
|
- Update README.md
|
||||||
|
|
||||||
|
### **0.2.6** (2021-03-10)
|
||||||
|
|
||||||
|
- Fix generated gitignore
|
||||||
|
|
||||||
|
### **0.2.5** (2021-03-10)
|
||||||
|
|
||||||
|
- Fix generated .gitignore
|
||||||
|
|
||||||
|
### **0.2.4** (2021-03-10)
|
||||||
|
|
||||||
|
- Update README.md
|
||||||
|
|
||||||
|
### **0.2.3** (2021-03-09)
|
||||||
|
|
||||||
|
- fix gitignore generation
|
||||||
|
|
||||||
|
### **0.2.2** (2021-03-08)
|
||||||
|
|
||||||
|
- Add table of content
|
||||||
|
- Update README.md
|
||||||
|
- Update README.md
|
||||||
|
|
||||||
|
## **0.2.1** (2021-03-08)
|
||||||
|
|
||||||
|
- Update ci.yaml
|
||||||
|
- Update readme
|
||||||
|
- Update readme
|
||||||
|
- update deps
|
||||||
|
- Update readme
|
||||||
|
- Add all mocks for testing
|
||||||
|
- many small fixes
|
||||||
|
|
||||||
|
### **0.1.6** (2021-03-07)
|
||||||
|
|
||||||
|
- Fix Turkish
|
||||||
|
|
||||||
|
### **0.1.5** (2021-03-07)
|
||||||
|
|
||||||
|
- Fix getKcLanguageLabel
|
||||||
|
|
||||||
### **0.1.4** (2021-03-07)
|
### **0.1.4** (2021-03-07)
|
||||||
|
|
||||||
|
|
||||||
|
151
README.md
151
README.md
@ -2,7 +2,7 @@
|
|||||||
<img src="https://user-images.githubusercontent.com/6702424/109387840-eba11f80-7903-11eb-9050-db1dad883f78.png">
|
<img src="https://user-images.githubusercontent.com/6702424/109387840-eba11f80-7903-11eb-9050-db1dad883f78.png">
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<i>🔏 Keycloak theme generator for Reacts app 🔏</i>
|
<i>🔏 Customize key cloak's pages as if they were part of your App 🔏</i>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<img src="https://github.com/garronej/keycloakify/workflows/ci/badge.svg?branch=develop">
|
<img src="https://github.com/garronej/keycloakify/workflows/ci/badge.svg?branch=develop">
|
||||||
@ -11,9 +11,10 @@
|
|||||||
<img src="https://img.shields.io/npm/l/keycloakify">
|
<img src="https://img.shields.io/npm/l/keycloakify">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<i>Ultimately this build tool Generates a Keycloak theme</i>
|
||||||
**!!! This module is under active developement. It is not usable yet!!!**
|
<img src="https://user-images.githubusercontent.com/6702424/110260457-a1c3d380-7fac-11eb-853a-80459b65626b.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
# Motivations
|
# Motivations
|
||||||
|
|
||||||
@ -22,20 +23,38 @@ The problem:
|
|||||||

|

|
||||||
|
|
||||||
When we redirected to Keycloak the user suffers from a harsh context switch.
|
When we redirected to Keycloak the user suffers from a harsh context switch.
|
||||||
On je login/register pages the language is set back to default and the theme is different that the one on the app.
|
|
||||||
|
|
||||||
Keycloak does offer a way to customize theses pages but it requires a lot of raw HTML/CSS hacking
|
Keycloak does offer a way to customize theses pages but it requires a lot of raw HTML/CSS hacking
|
||||||
to reproduce the look and feel of a specific app. Not mentioning the maintenance cost of such an endeavour.
|
to reproduce the look and feel of a specific app. Not mentioning the maintenance cost of such an endeavour.
|
||||||
|
|
||||||
Wouldn't it be great if we could just design the login and register pages as if they where part of our app while
|
Wouldn't it be great if we could just design the login and register pages as if they where part of our app?
|
||||||
still letting Keycloak handle the heavy lifting of actually authenticating the users?
|
|
||||||
|
|
||||||
Here is `yarn add keycloakify` for you 🍸
|
Here is `yarn add keycloakify` for you 🍸
|
||||||
|
|
||||||
TODO: Insert video after.
|
TODO: Insert video after.
|
||||||
|
|
||||||
# How to use
|
Tested with the following Keycloak versions:
|
||||||
|
- [11.0.3](https://hub.docker.com/layers/jboss/keycloak/11.0.3/images/sha256-4438f1e51c1369371cb807dffa526e1208086b3ebb9cab009830a178de949782?context=explore)
|
||||||
|
- [12.0.4](https://hub.docker.com/layers/jboss/keycloak/12.0.4/images/sha256-67e0c88e69bd0c7aef972c40bdeb558a974013a28b3668ca790ed63a04d70584?context=explore)
|
||||||
|
|
||||||
|
**Disclaimer**: This tool will be maintained to stay compatible with Keycloak v11 and up, however, the default pages you will get
|
||||||
|
(before you customize it) will always be the ones of the Keycloak v11.
|
||||||
|
|
||||||
|
- [Motivations](#motivations)
|
||||||
|
- [How to use](#how-to-use)
|
||||||
|
- [Setting up the build tool](#setting-up-the-build-tool)
|
||||||
|
- [Developing your login and register pages in your React app](#developing-your-login-and-register-pages-in-your-react-app)
|
||||||
|
- [Just changing the look](#just-changing-the-look)
|
||||||
|
- [Changing the look **and** feel](#changing-the-look-and-feel)
|
||||||
|
- [Hot reload](#hot-reload)
|
||||||
|
- [How to implement context persistance](#how-to-implement-context-persistance)
|
||||||
|
- [If your keycloak is a subdomain of your app.](#if-your-keycloak-is-a-subdomain-of-your-app)
|
||||||
|
- [Else](#else)
|
||||||
|
- [GitHub Actions](#github-actions)
|
||||||
|
- [REQUIREMENTS](#requirements)
|
||||||
|
- [API Reference](#api-reference)
|
||||||
|
- [The build tool](#the-build-tool)
|
||||||
|
- [The fronted lib ( imported into your react app )](#the-fronted-lib--imported-into-your-react-app-)
|
||||||
|
|
||||||
|
# How to use
|
||||||
## Setting up the build tool
|
## Setting up the build tool
|
||||||
|
|
||||||
Add `keycloakify` to the dev dependencies of your project `npm install --save-dev keycloakify` or `yarn add --dev keycloakify`
|
Add `keycloakify` to the dev dependencies of your project `npm install --save-dev keycloakify` or `yarn add --dev keycloakify`
|
||||||
@ -43,31 +62,124 @@ then configure your `package.json` build's script to build the keycloak's theme
|
|||||||
|
|
||||||
Typically you will get:
|
Typically you will get:
|
||||||
|
|
||||||
`package.json`:
|
`package.json`
|
||||||
```json
|
```json
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"keycloakify": "^0.0.10"
|
"keycloakify": "^0.0.10"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "react-scripts build && build-keycloak-theme"
|
"keycloak": "yarn build && build-keycloak-theme",
|
||||||
},
|
},
|
||||||
```
|
```
|
||||||
|
|
||||||
Then build your app with `yarn run build` or `npm run build`, you will be provided with instructions
|
Then run `yarn keycloak` or `npm run keycloak`, you will be provided with instructions
|
||||||
about how to load the theme into Keycloak.
|
about how to load the theme into Keycloak.
|
||||||
|
|
||||||
[](https://youtu.be/xTz0Rj7i2v8)
|
|
||||||
|
|
||||||
## Developing your login and register pages in your React app
|
## Developing your login and register pages in your React app
|
||||||
|
|
||||||
TODO
|
### Just changing the look
|
||||||
|
|
||||||
|
The fist approach is to only arr/replace the default class names by your
|
||||||
|
own.
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
|
||||||
|
import { App } from "./<wherever>/App";
|
||||||
|
import {
|
||||||
|
KcApp,
|
||||||
|
defaultKcProps,
|
||||||
|
kcContext
|
||||||
|
} from "keycloakify";
|
||||||
|
import { css } from "tss-react";
|
||||||
|
|
||||||
|
const myClassName = css({ "color": "red" });
|
||||||
|
|
||||||
|
reactDom.render(
|
||||||
|
// Unless the app is currently being served by Keycloak
|
||||||
|
// kcContext is undefined.
|
||||||
|
kcContext !== undefined ?
|
||||||
|
<KcApp
|
||||||
|
kcContext={kcContext}
|
||||||
|
{...{
|
||||||
|
...defaultKcProps,
|
||||||
|
"kcHeaderWrapperClass": myClassName
|
||||||
|
}}
|
||||||
|
/> :
|
||||||
|
<App />, // Your actual app
|
||||||
|
document.getElementById("root")
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
<i>result:</i>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/6702424/110261408-688d6280-7fb0-11eb-9822-7003d268b459.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Changing the look **and** feel
|
||||||
|
|
||||||
|
If you want to really re-implement the pages the best approach is to
|
||||||
|
create you own version of the [`<KcApp />`](https://github.com/garronej/keycloakify/blob/develop/src/lib/components/KcApp.tsx).
|
||||||
|
Copy/past some of [the components](https://github.com/garronej/keycloakify/tree/develop/src/lib/components) provided by this module and start hacking around.
|
||||||
|
|
||||||
|
### Hot reload
|
||||||
|
|
||||||
|
By default, in order to see your changes you will have to wait for
|
||||||
|
`yarn build` to complete which can takes sevrall minute.
|
||||||
|
|
||||||
|
If you want to test your login screens outside of Keycloak, in [storybook](https://storybook.js.org/)
|
||||||
|
for example you can use `kcContextMocks`.
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
import {
|
||||||
|
KcApp,
|
||||||
|
defaultKcProps,
|
||||||
|
kcContextMocks
|
||||||
|
} from "keycloakify";
|
||||||
|
|
||||||
|
reactDom.render(
|
||||||
|
kcContext !== undefined ?
|
||||||
|
<KcApp
|
||||||
|
kcContext={kcContextMocks.kcLoginContext}
|
||||||
|
{...defaultKcProps}
|
||||||
|
/>
|
||||||
|
document.getElementById("root")
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
then `yarn start` ...
|
||||||
|
|
||||||
|
Checkout [this concrete example](https://github.com/garronej/keycloakify-demo-app/blob/main/src/index.tsx)
|
||||||
|
|
||||||
|
|
||||||
|
*NOTE: keycloak-react-theming was renamed keycloakify since this video was recorded*
|
||||||
|
[](https://youtu.be/xTz0Rj7i2v8)
|
||||||
# How to implement context persistance
|
# How to implement context persistance
|
||||||
|
|
||||||
If you want dark mode preference, language and others users preferences your can do so
|
If you want dark mode preference, language and others users preferences
|
||||||
very easily by using [`powerhooks/useGlobalState`](https://github.com/garronej/powerhooks)
|
to persist within the page served by keycloak here are the methods you can
|
||||||
|
adopt.
|
||||||
|
|
||||||
WARNING: `powerhooks` is still a work in progress.
|
## If your keycloak is a subdomain of your app.
|
||||||
|
|
||||||
|
E.g: Your app url is `my-app.com` and your keycloak url is `auth.my-app.com`.
|
||||||
|
|
||||||
|
In this case there is a very straightforward approach and it is to use [`powerhooks/useGlobalState`](https://github.com/garronej/powerhooks).
|
||||||
|
Instead of `{ "persistance": "localStorage" }` use `{ "persistance": "cookie" }`.
|
||||||
|
|
||||||
|
## Else
|
||||||
|
|
||||||
|
You will have to use URL parameters to passes states when you redirect to
|
||||||
|
the login page.
|
||||||
|
|
||||||
|
TOTO: Provide a clean way, as abstracted as possible, way to do that.
|
||||||
|
|
||||||
|
# GitHub Actions
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Here is a demo repo](https://github.com/garronej/keycloakify-demo-app) to show how to automate
|
||||||
|
the building and publishing of the theme (the .jar file).
|
||||||
|
|
||||||
# REQUIREMENTS
|
# REQUIREMENTS
|
||||||
|
|
||||||
@ -97,3 +209,4 @@ Part of the lib that runs with node, at build time.
|
|||||||
Part of the lib that you import in your react project and runs on the browser.
|
Part of the lib that you import in your react project and runs on the browser.
|
||||||
|
|
||||||
**TODO**
|
**TODO**
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "keycloakify",
|
"name": "keycloakify",
|
||||||
"version": "0.1.4",
|
"version": "0.2.9",
|
||||||
"description": "Keycloak theme generator for Reacts app",
|
"description": "Keycloak theme generator for Reacts app",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -49,13 +49,14 @@
|
|||||||
"properties-parser": "^0.3.1",
|
"properties-parser": "^0.3.1",
|
||||||
"react": "^17.0.1",
|
"react": "^17.0.1",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^4.1.5"
|
"typescript": "^4.2.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cheerio": "^1.0.0-rc.5",
|
"cheerio": "^1.0.0-rc.5",
|
||||||
"evt": "2.0.0-beta.15",
|
"evt": "2.0.0-beta.15",
|
||||||
"minimal-polyfills": "^2.1.6",
|
"minimal-polyfills": "^2.1.6",
|
||||||
"powerhooks": "^0.0.19",
|
"path": "^0.12.7",
|
||||||
|
"powerhooks": "^0.0.27",
|
||||||
"scripting-tools": "^0.19.13",
|
"scripting-tools": "^0.19.13",
|
||||||
"tss-react": "^0.0.11"
|
"tss-react": "^0.0.11"
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,8 @@ import { builtinThemesUrl } from "../install-builtin-keycloak-themes";
|
|||||||
import { downloadAndUnzip } from "../tools/downloadAndUnzip";
|
import { downloadAndUnzip } from "../tools/downloadAndUnzip";
|
||||||
import * as child_process from "child_process";
|
import * as child_process from "child_process";
|
||||||
import { ftlValuesGlobalName } from "./ftlValuesGlobalName";
|
import { ftlValuesGlobalName } from "./ftlValuesGlobalName";
|
||||||
|
import { resourcesCommonPath, resourcesPath, subDirOfPublicDirBasename } from "../../lib/kcContextMocks/urlResourcesPath";
|
||||||
|
import { isInside } from "../tools/isInside";
|
||||||
|
|
||||||
export function generateKeycloakThemeResources(
|
export function generateKeycloakThemeResources(
|
||||||
params: {
|
params: {
|
||||||
@ -31,6 +33,17 @@ export function generateKeycloakThemeResources(
|
|||||||
"srcDirPath": reactAppBuildDirPath,
|
"srcDirPath": reactAppBuildDirPath,
|
||||||
"transformSourceCode": ({ filePath, sourceCode }) => {
|
"transformSourceCode": ({ filePath, sourceCode }) => {
|
||||||
|
|
||||||
|
//NOTE: Prevent cycles, excludes the folder we generated for debug in public/
|
||||||
|
if (
|
||||||
|
isInside({
|
||||||
|
"dirPath": pathJoin(reactAppBuildDirPath, subDirOfPublicDirBasename),
|
||||||
|
filePath
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (/\.css?$/i.test(filePath)) {
|
if (/\.css?$/i.test(filePath)) {
|
||||||
|
|
||||||
const { cssGlobalsToDefine, fixedCssCode } = replaceImportFromStaticInCssCode(
|
const { cssGlobalsToDefine, fixedCssCode } = replaceImportFromStaticInCssCode(
|
||||||
@ -90,11 +103,48 @@ export function generateKeycloakThemeResources(
|
|||||||
"destDirPath": tmpDirPath
|
"destDirPath": tmpDirPath
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const themeResourcesDirPath = pathJoin(themeDirPath, "resources");
|
||||||
|
|
||||||
transformCodebase({
|
transformCodebase({
|
||||||
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "login", "resources"),
|
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "login", "resources"),
|
||||||
"destDirPath": pathJoin(themeDirPath, "resources")
|
"destDirPath": themeResourcesDirPath
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const reactAppPublicDirPath = pathJoin(reactAppBuildDirPath, "..", "public");
|
||||||
|
|
||||||
|
transformCodebase({
|
||||||
|
"srcDirPath": themeResourcesDirPath,
|
||||||
|
"destDirPath": pathJoin(
|
||||||
|
reactAppPublicDirPath,
|
||||||
|
resourcesPath
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
transformCodebase({
|
||||||
|
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "common", "resources"),
|
||||||
|
"destDirPath": pathJoin(
|
||||||
|
reactAppPublicDirPath,
|
||||||
|
resourcesCommonPath
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
const keycloakResourcesWithinPublicDirPath =
|
||||||
|
pathJoin(reactAppPublicDirPath, subDirOfPublicDirBasename);
|
||||||
|
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
pathJoin(keycloakResourcesWithinPublicDirPath, "README.txt"),
|
||||||
|
Buffer.from([
|
||||||
|
"This is just a test folder that helps develop",
|
||||||
|
"the login and register page without having to yarn build"
|
||||||
|
].join(" "))
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
pathJoin(keycloakResourcesWithinPublicDirPath, ".gitignore"),
|
||||||
|
Buffer.from("*", "utf8")
|
||||||
|
);
|
||||||
|
|
||||||
child_process.execSync(`rm -r ${tmpDirPath}`);
|
child_process.execSync(`rm -r ${tmpDirPath}`);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
14
src/bin/tools/isInside.ts
Normal file
14
src/bin/tools/isInside.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { relative as pathRelative } from "path";
|
||||||
|
|
||||||
|
export function isInside(
|
||||||
|
params: {
|
||||||
|
dirPath: string;
|
||||||
|
filePath: string;
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
|
||||||
|
const { dirPath, filePath } = params;
|
||||||
|
|
||||||
|
return !pathRelative(dirPath, filePath).startsWith("..");
|
||||||
|
|
||||||
|
}
|
@ -3,24 +3,20 @@ import { memo } from "react";
|
|||||||
import { Template } from "./Template";
|
import { Template } from "./Template";
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { assert } from "../tools/assert";
|
import { assert } from "../tools/assert";
|
||||||
import { kcContext } from "../kcContext";
|
import type { KcContext } from "../KcContext";
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
|
|
||||||
export const Error = memo((props: KcProps) => {
|
export const Error = memo(({ kcContext, ...props }: { kcContext: KcContext.Error; } & KcProps) => {
|
||||||
|
|
||||||
const { msg } = useKcMessage();
|
const { msg } = useKcMessage();
|
||||||
|
|
||||||
assert(
|
assert(kcContext.message !== undefined);
|
||||||
kcContext !== undefined &&
|
|
||||||
kcContext.pageId === "error.ftl" &&
|
|
||||||
kcContext.message !== undefined
|
|
||||||
);
|
|
||||||
|
|
||||||
const { message, client } = kcContext;
|
const { message, client } = kcContext;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Template
|
<Template
|
||||||
{...props}
|
{...{ kcContext, ...props }}
|
||||||
displayMessage={false}
|
displayMessage={false}
|
||||||
headerNode={msg("errorTitle")}
|
headerNode={msg("errorTitle")}
|
||||||
formNode={
|
formNode={
|
||||||
|
@ -3,18 +3,14 @@ import { memo } from "react";
|
|||||||
import { Template } from "./Template";
|
import { Template } from "./Template";
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { assert } from "../tools/assert";
|
import { assert } from "../tools/assert";
|
||||||
import { kcContext } from "../kcContext";
|
import type { KcContext } from "../KcContext";
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
|
|
||||||
export const Info = memo((props: KcProps) => {
|
export const Info = memo(({ kcContext, ...props }: { kcContext: KcContext.Info; } & KcProps) => {
|
||||||
|
|
||||||
const { msg } = useKcMessage();
|
const { msg } = useKcMessage();
|
||||||
|
|
||||||
assert(
|
assert(kcContext.message !== undefined);
|
||||||
kcContext !== undefined &&
|
|
||||||
kcContext.pageId === "info.ftl" &&
|
|
||||||
kcContext.message !== undefined
|
|
||||||
);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
messageHeader,
|
messageHeader,
|
||||||
@ -28,7 +24,7 @@ export const Info = memo((props: KcProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Template
|
<Template
|
||||||
{...props}
|
{...{ kcContext, ...props }}
|
||||||
displayMessage={false}
|
displayMessage={false}
|
||||||
headerNode={
|
headerNode={
|
||||||
messageHeader !== undefined ?
|
messageHeader !== undefined ?
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
import { memo } from "react";
|
import { memo } from "react";
|
||||||
import { kcContext } from "../kcContext";
|
import type { KcContext } from "../KcContext";
|
||||||
import { assert } from "../tools/assert";
|
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { Login } from "./Login";
|
import { Login } from "./Login";
|
||||||
import { Register } from "./Register";
|
import { Register } from "./Register";
|
||||||
@ -10,17 +9,13 @@ import { Error } from "./Error";
|
|||||||
import { LoginResetPassword } from "./LoginResetPassword";
|
import { LoginResetPassword } from "./LoginResetPassword";
|
||||||
import { LoginVerifyEmail } from "./LoginVerifyEmail";
|
import { LoginVerifyEmail } from "./LoginVerifyEmail";
|
||||||
|
|
||||||
export const KcApp = memo((props: KcProps) => {
|
export const KcApp = memo(({ kcContext, ...props }: { kcContext: KcContext; } & KcProps ) => {
|
||||||
|
|
||||||
assert(kcContext !== undefined, "App is not currently served by a Keycloak server");
|
|
||||||
|
|
||||||
switch (kcContext.pageId) {
|
switch (kcContext.pageId) {
|
||||||
case "login.ftl": return <Login {...props} />;
|
case "login.ftl": return <Login {...{ kcContext, ...props }} />;
|
||||||
case "register.ftl": return <Register {...props} />;
|
case "register.ftl": return <Register {...{ kcContext, ...props }} />;
|
||||||
case "info.ftl": return <Info {...props} />;
|
case "info.ftl": return <Info {...{ kcContext, ...props }} />;
|
||||||
case "error.ftl": return <Error {...props} />;
|
case "error.ftl": return <Error {...{ kcContext, ...props }} />;
|
||||||
case "login-reset-password.ftl": return <LoginResetPassword {...props} />;
|
case "login-reset-password.ftl": return <LoginResetPassword {...{ kcContext, ...props }} />;
|
||||||
case "login-verify-email.ftl": return <LoginVerifyEmail {...props} />;
|
case "login-verify-email.ftl": return <LoginVerifyEmail {...{ kcContext, ...props }} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
@ -2,21 +2,15 @@
|
|||||||
import { useState, memo } from "react";
|
import { useState, memo } from "react";
|
||||||
import { Template } from "./Template";
|
import { Template } from "./Template";
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { assert } from "../tools/assert";
|
import type { KcContext } from "../KcContext";
|
||||||
import { kcContext } from "../kcContext";
|
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
import { cx } from "tss-react";
|
import { cx } from "tss-react";
|
||||||
import { useConstCallback } from "powerhooks";
|
import { useConstCallback } from "powerhooks";
|
||||||
|
|
||||||
export const Login = memo((props: KcProps) => {
|
export const Login = memo(({ kcContext, ...props }: { kcContext: KcContext.Login; } & KcProps) => {
|
||||||
|
|
||||||
const { msg, msgStr } = useKcMessage();
|
const { msg, msgStr } = useKcMessage();
|
||||||
|
|
||||||
assert(
|
|
||||||
kcContext !== undefined &&
|
|
||||||
kcContext.pageId === "login.ftl"
|
|
||||||
);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
social, realm, url,
|
social, realm, url,
|
||||||
usernameEditDisabled, login,
|
usernameEditDisabled, login,
|
||||||
@ -31,7 +25,7 @@ export const Login = memo((props: KcProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Template
|
<Template
|
||||||
{...props}
|
{...{ kcContext, ...props }}
|
||||||
displayInfo={social.displayInfo}
|
displayInfo={social.displayInfo}
|
||||||
displayWide={realm.password && social.providers !== undefined}
|
displayWide={realm.password && social.providers !== undefined}
|
||||||
headerNode={msg("doLogIn")}
|
headerNode={msg("doLogIn")}
|
||||||
@ -68,7 +62,7 @@ export const Login = memo((props: KcProps) => {
|
|||||||
name="username"
|
name="username"
|
||||||
defaultValue={login.username ?? ''}
|
defaultValue={login.username ?? ''}
|
||||||
type="text"
|
type="text"
|
||||||
{...(usernameEditDisabled ? { "disabled": true } : { "autoFocus": true, "autocomplete": "off" })}
|
{...(usernameEditDisabled ? { "disabled": true } : { "autoFocus": true, "autoComplete": "off" })}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className={cx(props.kcFormGroupClass)}>
|
<div className={cx(props.kcFormGroupClass)}>
|
||||||
|
@ -2,20 +2,14 @@
|
|||||||
import { memo } from "react";
|
import { memo } from "react";
|
||||||
import { Template } from "./Template";
|
import { Template } from "./Template";
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { assert } from "../tools/assert";
|
import type { KcContext } from "../KcContext";
|
||||||
import { kcContext } from "../kcContext";
|
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
import { cx } from "tss-react";
|
import { cx } from "tss-react";
|
||||||
|
|
||||||
export const LoginResetPassword = memo((props: KcProps) => {
|
export const LoginResetPassword = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginResetPassword; } & KcProps) => {
|
||||||
|
|
||||||
const { msg, msgStr } = useKcMessage();
|
const { msg, msgStr } = useKcMessage();
|
||||||
|
|
||||||
assert(
|
|
||||||
kcContext !== undefined &&
|
|
||||||
kcContext.pageId === "login-reset-password.ftl"
|
|
||||||
);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
url,
|
url,
|
||||||
realm,
|
realm,
|
||||||
@ -24,7 +18,7 @@ export const LoginResetPassword = memo((props: KcProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Template
|
<Template
|
||||||
{...props}
|
{...{ kcContext, ...props }}
|
||||||
displayMessage={false}
|
displayMessage={false}
|
||||||
headerNode={msg("emailForgotTitle")}
|
headerNode={msg("emailForgotTitle")}
|
||||||
formNode={
|
formNode={
|
||||||
|
@ -2,26 +2,20 @@
|
|||||||
import { memo } from "react";
|
import { memo } from "react";
|
||||||
import { Template } from "./Template";
|
import { Template } from "./Template";
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { assert } from "../tools/assert";
|
import type { KcContext } from "../KcContext";
|
||||||
import { kcContext } from "../kcContext";
|
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
|
|
||||||
export const LoginVerifyEmail = memo((props: KcProps) => {
|
export const LoginVerifyEmail = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginVerifyEmail; } & KcProps) => {
|
||||||
|
|
||||||
const { msg } = useKcMessage();
|
const { msg } = useKcMessage();
|
||||||
|
|
||||||
assert(
|
|
||||||
kcContext !== undefined &&
|
|
||||||
kcContext.pageId === "login-verify-email.ftl"
|
|
||||||
);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
url
|
url
|
||||||
} = kcContext;
|
} = kcContext;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Template
|
<Template
|
||||||
{...props}
|
{...{ kcContext, ...props }}
|
||||||
displayMessage={false}
|
displayMessage={false}
|
||||||
headerNode={msg("emailVerifyTitle")}
|
headerNode={msg("emailVerifyTitle")}
|
||||||
formNode={
|
formNode={
|
||||||
|
@ -1,20 +1,14 @@
|
|||||||
import { memo } from "react";
|
import { memo } from "react";
|
||||||
import { Template } from "./Template";
|
import { Template } from "./Template";
|
||||||
import type { KcProps } from "./KcProps";
|
import type { KcProps } from "./KcProps";
|
||||||
import { assert } from "../tools/assert";
|
import type { KcContext } from "../KcContext";
|
||||||
import { kcContext } from "../kcContext";
|
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
import { cx } from "tss-react";
|
import { cx } from "tss-react";
|
||||||
|
|
||||||
export const Register = memo((props: KcProps) => {
|
export const Register = memo(({ kcContext, ...props }: { kcContext: KcContext.Register; } & KcProps) => {
|
||||||
|
|
||||||
const { msg, msgStr } = useKcMessage();
|
const { msg, msgStr } = useKcMessage();
|
||||||
|
|
||||||
assert(
|
|
||||||
kcContext !== undefined &&
|
|
||||||
kcContext.pageId === "register.ftl"
|
|
||||||
);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
url,
|
url,
|
||||||
messagesPerField,
|
messagesPerField,
|
||||||
@ -27,7 +21,7 @@ export const Register = memo((props: KcProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Template
|
<Template
|
||||||
{...props}
|
{...{ kcContext, ...props }}
|
||||||
headerNode={msg("registerTitle")}
|
headerNode={msg("registerTitle")}
|
||||||
formNode={
|
formNode={
|
||||||
<form id="kc-register-form" className={cx(props.kcFormClass)} action={url.registrationAction} method="post">
|
<form id="kc-register-form" className={cx(props.kcFormClass)} action={url.registrationAction} method="post">
|
||||||
|
@ -3,7 +3,7 @@ import { useReducer, useEffect, memo } from "react";
|
|||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
import { useKcMessage } from "../i18n/useKcMessage";
|
import { useKcMessage } from "../i18n/useKcMessage";
|
||||||
import { useKcLanguageTag } from "../i18n/useKcLanguageTag";
|
import { useKcLanguageTag } from "../i18n/useKcLanguageTag";
|
||||||
import { kcContext } from "../kcContext";
|
import type { KcContext } from "../KcContext";
|
||||||
import { assert } from "../tools/assert";
|
import { assert } from "../tools/assert";
|
||||||
import { cx } from "tss-react";
|
import { cx } from "tss-react";
|
||||||
import type { KcLanguageTag } from "../i18n/KcLanguageTag";
|
import type { KcLanguageTag } from "../i18n/KcLanguageTag";
|
||||||
@ -25,7 +25,7 @@ export type TemplateProps = {
|
|||||||
showUsernameNode?: ReactNode;
|
showUsernameNode?: ReactNode;
|
||||||
formNode: ReactNode;
|
formNode: ReactNode;
|
||||||
infoNode?: ReactNode;
|
infoNode?: ReactNode;
|
||||||
} & KcTemplateProps;
|
} & { kcContext: KcContext.Template; } & KcTemplateProps;
|
||||||
|
|
||||||
|
|
||||||
export const Template = memo((props: TemplateProps) => {
|
export const Template = memo((props: TemplateProps) => {
|
||||||
@ -39,7 +39,8 @@ export const Template = memo((props: TemplateProps) => {
|
|||||||
headerNode,
|
headerNode,
|
||||||
showUsernameNode = null,
|
showUsernameNode = null,
|
||||||
formNode,
|
formNode,
|
||||||
infoNode = null
|
infoNode = null,
|
||||||
|
kcContext
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
useEffect(() => { console.log("Rendering this page with react using keycloakify") }, []);
|
useEffect(() => { console.log("Rendering this page with react using keycloakify") }, []);
|
||||||
@ -58,8 +59,6 @@ export const Template = memo((props: TemplateProps) => {
|
|||||||
(document.forms["kc-select-try-another-way-form" as never].submit(), false)
|
(document.forms["kc-select-try-another-way-form" as never].submit(), false)
|
||||||
);
|
);
|
||||||
|
|
||||||
assert(kcContext !== undefined);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
realm, locale, auth,
|
realm, locale, auth,
|
||||||
url, message, isAppInitiatedAction
|
url, message, isAppInitiatedAction
|
||||||
@ -154,7 +153,7 @@ export const Template = memo((props: TemplateProps) => {
|
|||||||
{
|
{
|
||||||
locale.supported.map(
|
locale.supported.map(
|
||||||
({ languageTag }) =>
|
({ languageTag }) =>
|
||||||
<li className="kc-dropdown-item">
|
<li key={languageTag} className="kc-dropdown-item">
|
||||||
<a href="#" onClick={onChangeLanguageClickFactory(languageTag)}>
|
<a href="#" onClick={onChangeLanguageClickFactory(languageTag)}>
|
||||||
{getKcLanguageTagLabel(languageTag)}
|
{getKcLanguageTagLabel(languageTag)}
|
||||||
</a>
|
</a>
|
||||||
|
@ -8,7 +8,7 @@ export type LanguageLabel =
|
|||||||
/* spell-checker: disable */
|
/* spell-checker: disable */
|
||||||
"Deutsch" | "Norsk" | "Русский" | "Svenska" | "Português (Brasil)" | "Lietuvių" |
|
"Deutsch" | "Norsk" | "Русский" | "Svenska" | "Português (Brasil)" | "Lietuvių" |
|
||||||
"English" | "Italiano" | "Français" | "中文简体" | "Español" | "Čeština" | "日本語" |
|
"English" | "Italiano" | "Français" | "中文简体" | "Español" | "Čeština" | "日本語" |
|
||||||
"Slovenčina" | "Polish" | "Català" | "Nederlands" | "tr";
|
"Slovenčina" | "Polski" | "Català" | "Nederlands" | "Türkçe";
|
||||||
/* spell-checker: enable */
|
/* spell-checker: enable */
|
||||||
|
|
||||||
export function getKcLanguageTagLabel(language: KcLanguageTag): LanguageLabel {
|
export function getKcLanguageTagLabel(language: KcLanguageTag): LanguageLabel {
|
||||||
@ -24,16 +24,15 @@ export function getKcLanguageTagLabel(language: KcLanguageTag): LanguageLabel {
|
|||||||
case "no": return "Norsk";
|
case "no": return "Norsk";
|
||||||
case "pt-BR": return "Português (Brasil)";
|
case "pt-BR": return "Português (Brasil)";
|
||||||
case "ru": return "Русский";
|
case "ru": return "Русский";
|
||||||
case "sk":
|
case "sk": return "Slovenčina";
|
||||||
case "sv": return "Slovenčina";
|
|
||||||
case "ja": return "日本語";
|
case "ja": return "日本語";
|
||||||
case "pl": return "Polish";
|
case "pl": return "Polski";
|
||||||
case "zh-CN": return "中文简体"
|
case "zh-CN": return "中文简体"
|
||||||
case "sv": return "Svenska";
|
case "sv": return "Svenska";
|
||||||
case "lt": return "Lietuvių";
|
case "lt": return "Lietuvių";
|
||||||
case "cs": return "Čeština";
|
case "cs": return "Čeština";
|
||||||
case "nl": return "Nederlands";
|
case "nl": return "Nederlands";
|
||||||
case "tr": return "tr"
|
case "tr": return "Türkçe";
|
||||||
/* spell-checker: enable */
|
/* spell-checker: enable */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
|
|
||||||
import { createUseGlobalState } from "powerhooks";
|
import { createUseGlobalState } from "powerhooks";
|
||||||
import { kcContext } from "../kcContext";
|
import { kcContext } from "../KcContext";
|
||||||
import { getBestMatchAmongKcLanguageTag } from "./KcLanguageTag";
|
import { getBestMatchAmongKcLanguageTag } from "./KcLanguageTag";
|
||||||
|
|
||||||
export const { useKcLanguageTag } = createUseGlobalState(
|
//export const { useKcLanguageTag, evtKcLanguageTag } = createUseGlobalState(
|
||||||
|
const wrap = createUseGlobalState(
|
||||||
"kcLanguageTag",
|
"kcLanguageTag",
|
||||||
() => getBestMatchAmongKcLanguageTag(
|
() => getBestMatchAmongKcLanguageTag(
|
||||||
kcContext?.locale?.current ??
|
kcContext?.locale?.current ??
|
||||||
@ -11,3 +12,12 @@ export const { useKcLanguageTag } = createUseGlobalState(
|
|||||||
),
|
),
|
||||||
{ "persistance": "cookie" }
|
{ "persistance": "cookie" }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const { useKcLanguageTag } = wrap;
|
||||||
|
|
||||||
|
export function getEvtKcLanguage() {
|
||||||
|
return wrap.evtKcLanguageTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
export * from "./kcContext";
|
export * from "./KcContext";
|
||||||
|
|
||||||
export * from "./i18n/KcLanguageTag";
|
export * from "./i18n/KcLanguageTag";
|
||||||
export * from "./i18n/useKcLanguageTag";
|
export * from "./i18n/useKcLanguageTag";
|
||||||
@ -14,3 +14,5 @@ export * from "./components/LoginResetPassword";
|
|||||||
export * from "./components/LoginVerifyEmail";
|
export * from "./components/LoginVerifyEmail";
|
||||||
|
|
||||||
export * from "./tools/assert";
|
export * from "./tools/assert";
|
||||||
|
|
||||||
|
export * as kcContextMocks from "./kcContextMocks";
|
@ -117,7 +117,6 @@ export declare namespace KcContext {
|
|||||||
};
|
};
|
||||||
passwordRequired: boolean;
|
passwordRequired: boolean;
|
||||||
recaptchaRequired: boolean;
|
recaptchaRequired: boolean;
|
||||||
/** undefined if !recaptchaRequired */
|
|
||||||
recaptchaSiteKey?: string;
|
recaptchaSiteKey?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -157,3 +156,5 @@ doExtends<KcContext["pageId"], PageId>();
|
|||||||
doExtends<PageId, KcContext["pageId"]>();
|
doExtends<PageId, KcContext["pageId"]>();
|
||||||
|
|
||||||
export const kcContext = id<KcContext | undefined>((window as any)[ftlValuesGlobalName]);
|
export const kcContext = id<KcContext | undefined>((window as any)[ftlValuesGlobalName]);
|
||||||
|
|
||||||
|
|
||||||
|
201
src/lib/kcContextMocks/index.ts
Normal file
201
src/lib/kcContextMocks/index.ts
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
|
||||||
|
|
||||||
|
import type { KcContext } from "../KcContext";
|
||||||
|
import { getEvtKcLanguage } from "../i18n/useKcLanguageTag";
|
||||||
|
import { getKcLanguageTagLabel } from "../i18n/KcLanguageTag";
|
||||||
|
//NOTE: Aside because we want to be able to import them from node
|
||||||
|
import { resourcesCommonPath, resourcesPath } from "./urlResourcesPath";
|
||||||
|
|
||||||
|
export const kcTemplateContext: KcContext.Template = {
|
||||||
|
"url": {
|
||||||
|
"loginAction": "#",
|
||||||
|
"resourcesPath": "/" + resourcesPath,
|
||||||
|
"resourcesCommonPath": "/" + resourcesCommonPath,
|
||||||
|
"loginRestartFlowUrl": "/auth/realms/myrealm/login-actions/restart?client_id=account&tab_id=HoAx28ja4xg",
|
||||||
|
"loginUrl": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg",
|
||||||
|
},
|
||||||
|
"realm": {
|
||||||
|
"displayName": "myrealm",
|
||||||
|
"displayNameHtml": "myrealm",
|
||||||
|
"internationalizationEnabled": true,
|
||||||
|
"registrationEmailAsUsername": true,
|
||||||
|
},
|
||||||
|
"locale": {
|
||||||
|
"supported": [
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=de",
|
||||||
|
"languageTag": "de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=no",
|
||||||
|
"languageTag": "no"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ru",
|
||||||
|
"languageTag": "ru"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sv",
|
||||||
|
"languageTag": "sv"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pt-BR",
|
||||||
|
"languageTag": "pt-BR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=lt",
|
||||||
|
"languageTag": "lt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=en",
|
||||||
|
"languageTag": "en"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=it",
|
||||||
|
"languageTag": "it"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=fr",
|
||||||
|
"languageTag": "fr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=zh-CN",
|
||||||
|
"languageTag": "zh-CN"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=es",
|
||||||
|
"languageTag": "es"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=cs",
|
||||||
|
"languageTag": "cs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ja",
|
||||||
|
"languageTag": "ja"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sk",
|
||||||
|
"languageTag": "sk"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pl",
|
||||||
|
"languageTag": "pl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ca",
|
||||||
|
"languageTag": "ca"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=nl",
|
||||||
|
"languageTag": "nl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=tr",
|
||||||
|
"languageTag": "tr"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"current": null as any
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"showUsername": false,
|
||||||
|
"showResetCredentials": false,
|
||||||
|
"showTryAnotherWayLink": false
|
||||||
|
},
|
||||||
|
"scripts": [],
|
||||||
|
"message": {
|
||||||
|
"type": "success",
|
||||||
|
"summary": "This is a test message"
|
||||||
|
},
|
||||||
|
"isAppInitiatedAction": false,
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.defineProperty(
|
||||||
|
kcTemplateContext.locale!,
|
||||||
|
"current",
|
||||||
|
{
|
||||||
|
"get": () => getKcLanguageTagLabel(getEvtKcLanguage().state),
|
||||||
|
"enumerable": true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export const kcLoginContext: KcContext.Login = {
|
||||||
|
...kcTemplateContext,
|
||||||
|
"pageId": "login.ftl",
|
||||||
|
"url": {
|
||||||
|
...kcTemplateContext.url,
|
||||||
|
"loginResetCredentialsUrl": "/auth/realms/myrealm/login-actions/reset-credentials?client_id=account&tab_id=HoAx28ja4xg",
|
||||||
|
"registrationUrl": "/auth/realms/myrealm/login-actions/registration?client_id=account&tab_id=HoAx28ja4xg"
|
||||||
|
},
|
||||||
|
"realm": {
|
||||||
|
...kcTemplateContext.realm,
|
||||||
|
"loginWithEmailAllowed": true,
|
||||||
|
"rememberMe": true,
|
||||||
|
"password": true,
|
||||||
|
"resetPasswordAllowed": true,
|
||||||
|
"registrationAllowed": true
|
||||||
|
},
|
||||||
|
"auth": kcTemplateContext.auth!,
|
||||||
|
"social": {
|
||||||
|
"displayInfo": true
|
||||||
|
},
|
||||||
|
"usernameEditDisabled": false,
|
||||||
|
"login": {
|
||||||
|
"rememberMe": false
|
||||||
|
},
|
||||||
|
"registrationDisabled": false,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const kcRegisterContext: KcContext.Register = {
|
||||||
|
...kcTemplateContext,
|
||||||
|
"url": {
|
||||||
|
...kcLoginContext.url,
|
||||||
|
"registrationAction": "http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0"
|
||||||
|
},
|
||||||
|
"messagesPerField": {
|
||||||
|
"printIfExists": (...[,x]) => x
|
||||||
|
},
|
||||||
|
"scripts": [],
|
||||||
|
"isAppInitiatedAction": false,
|
||||||
|
"pageId": "register.ftl",
|
||||||
|
"register": {
|
||||||
|
"formData": {}
|
||||||
|
},
|
||||||
|
"passwordRequired": true,
|
||||||
|
"recaptchaRequired": false
|
||||||
|
};
|
||||||
|
|
||||||
|
export const kcInfoContext: KcContext.Info ={
|
||||||
|
...kcTemplateContext,
|
||||||
|
"pageId": "info.ftl",
|
||||||
|
"messageHeader": "<Message header>",
|
||||||
|
"requiredActions": undefined,
|
||||||
|
"skipLink": false,
|
||||||
|
"actionUri": "#",
|
||||||
|
"client": {
|
||||||
|
"baseUrl": "#"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const kcErrorContext: KcContext.Error = {
|
||||||
|
...kcTemplateContext,
|
||||||
|
"pageId": "error.ftl",
|
||||||
|
"client": {
|
||||||
|
"baseUrl": "#"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const kcLoginResetPasswordContext: KcContext.LoginResetPassword = {
|
||||||
|
...kcTemplateContext,
|
||||||
|
"pageId": "login-reset-password.ftl",
|
||||||
|
"realm":{
|
||||||
|
...kcTemplateContext.realm,
|
||||||
|
"loginWithEmailAllowed": false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const kcLoginVerifyEmailContext: KcContext.LoginVerifyEmail = {
|
||||||
|
...kcTemplateContext,
|
||||||
|
"pageId": "login-verify-email.ftl"
|
||||||
|
};
|
||||||
|
|
6
src/lib/kcContextMocks/urlResourcesPath.ts
Normal file
6
src/lib/kcContextMocks/urlResourcesPath.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
import { join as pathJoin } from "path";
|
||||||
|
|
||||||
|
export const subDirOfPublicDirBasename = "keycloak_static";
|
||||||
|
export const resourcesPath = pathJoin(subDirOfPublicDirBasename, "/resources");
|
||||||
|
export const resourcesCommonPath = pathJoin(subDirOfPublicDirBasename, "/resources_common");
|
177
yarn.lock
177
yarn.lock
@ -27,9 +27,9 @@
|
|||||||
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
|
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
|
||||||
|
|
||||||
"@babel/highlight@^7.12.13":
|
"@babel/highlight@^7.12.13":
|
||||||
version "7.13.8"
|
version "7.13.10"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.8.tgz#10b2dac78526424dfc1f47650d0e415dfd9dc481"
|
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
|
||||||
integrity sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==
|
integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-validator-identifier" "^7.12.11"
|
"@babel/helper-validator-identifier" "^7.12.11"
|
||||||
chalk "^2.0.0"
|
chalk "^2.0.0"
|
||||||
@ -43,9 +43,9 @@
|
|||||||
"@babel/helper-plugin-utils" "^7.12.13"
|
"@babel/helper-plugin-utils" "^7.12.13"
|
||||||
|
|
||||||
"@babel/runtime@^7.7.2":
|
"@babel/runtime@^7.7.2":
|
||||||
version "7.13.9"
|
version "7.13.10"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz#97dbe2116e2630c489f22e0656decd60aaa1fcee"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
|
||||||
integrity sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA==
|
integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.4"
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
@ -109,9 +109,9 @@
|
|||||||
integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
|
integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
|
||||||
|
|
||||||
"@emotion/serialize@^1.0.0":
|
"@emotion/serialize@^1.0.0":
|
||||||
version "1.0.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.0.tgz#1a61f4f037cf39995c97fc80ebe99abc7b191ca9"
|
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.1.tgz#322cdebfdbb5a88946f17006548191859b9b0855"
|
||||||
integrity sha512-zt1gm4rhdo5Sry8QpCOpopIUIKU+mUSpV9WNmFILUraatm5dttNEaYzUWWSboSMUE6PtN2j1cAsuvcugfdI3mw==
|
integrity sha512-TXlKs5sgUKhFlszp/rg4lIAZd7UUSmJpwaf9/lAEFcUh2vPi32i7x4wk7O8TN8L8v2Ol8k0CxnhRBY0zQalTxA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@emotion/hash" "^0.8.0"
|
"@emotion/hash" "^0.8.0"
|
||||||
"@emotion/memoize" "^0.7.4"
|
"@emotion/memoize" "^0.7.4"
|
||||||
@ -147,15 +147,16 @@
|
|||||||
"@octokit/types" "^6.0.3"
|
"@octokit/types" "^6.0.3"
|
||||||
|
|
||||||
"@octokit/core@^3.2.3":
|
"@octokit/core@^3.2.3":
|
||||||
version "3.2.5"
|
version "3.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.5.tgz#57becbd5fd789b0592b915840855f3a5f233d554"
|
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.3.1.tgz#c6bb6ba171ad84a5f430853a98892cfe8f93d8cd"
|
||||||
integrity sha512-+DCtPykGnvXKWWQI0E1XD+CCeWSBhB6kwItXqfFmNBlIlhczuDPbg+P6BtLnVBaRJDAjv+1mrUJuRsFSjktopg==
|
integrity sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@octokit/auth-token" "^2.4.4"
|
"@octokit/auth-token" "^2.4.4"
|
||||||
"@octokit/graphql" "^4.5.8"
|
"@octokit/graphql" "^4.5.8"
|
||||||
"@octokit/request" "^5.4.12"
|
"@octokit/request" "^5.4.12"
|
||||||
|
"@octokit/request-error" "^2.0.5"
|
||||||
"@octokit/types" "^6.0.3"
|
"@octokit/types" "^6.0.3"
|
||||||
before-after-hook "^2.1.0"
|
before-after-hook "^2.2.0"
|
||||||
universal-user-agent "^6.0.0"
|
universal-user-agent "^6.0.0"
|
||||||
|
|
||||||
"@octokit/endpoint@^6.0.1":
|
"@octokit/endpoint@^6.0.1":
|
||||||
@ -168,23 +169,23 @@
|
|||||||
universal-user-agent "^6.0.0"
|
universal-user-agent "^6.0.0"
|
||||||
|
|
||||||
"@octokit/graphql@^4.5.8":
|
"@octokit/graphql@^4.5.8":
|
||||||
version "4.6.0"
|
version "4.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.0.tgz#f9abca55f82183964a33439d5264674c701c3327"
|
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.1.tgz#f975486a46c94b7dbe58a0ca751935edc7e32cc9"
|
||||||
integrity sha512-CJ6n7izLFXLvPZaWzCQDjU/RP+vHiZmWdOunaCS87v+2jxMsW9FB5ktfIxybRBxZjxuJGRnxk7xJecWTVxFUYQ==
|
integrity sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@octokit/request" "^5.3.0"
|
"@octokit/request" "^5.3.0"
|
||||||
"@octokit/types" "^6.0.3"
|
"@octokit/types" "^6.0.3"
|
||||||
universal-user-agent "^6.0.0"
|
universal-user-agent "^6.0.0"
|
||||||
|
|
||||||
"@octokit/openapi-types@^5.3.0":
|
"@octokit/openapi-types@^5.3.2":
|
||||||
version "5.3.1"
|
version "5.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-5.3.1.tgz#a49d119a1b9e47b7a9f5133ab14be2d8afaa183d"
|
resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-5.3.2.tgz#b8ac43c5c3d00aef61a34cf744e315110c78deb4"
|
||||||
integrity sha512-TvVk2QuIA0lQZcIMd6xbdGaGDVeNYIOa3l1ZVagAIk5K3t/WMYbcg4BISNDhzdVhm/TgQB26frAgd/GV81aHJA==
|
integrity sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA==
|
||||||
|
|
||||||
"@octokit/plugin-paginate-rest@^2.6.2":
|
"@octokit/plugin-paginate-rest@^2.6.2":
|
||||||
version "2.11.0"
|
version "2.13.3"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.11.0.tgz#3568c43896a3355f4a0bbb3a64f443b2abdc760d"
|
resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a"
|
||||||
integrity sha512-7L9xQank2G3r1dGqrVPo1z62V5utbykOUzlmNHPz87Pww/JpZQ9KyG5CHtUzgmB4n5iDRKYNK/86A8D98HP0yA==
|
integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@octokit/types" "^6.11.0"
|
"@octokit/types" "^6.11.0"
|
||||||
|
|
||||||
@ -193,15 +194,15 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d"
|
resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d"
|
||||||
integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==
|
integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==
|
||||||
|
|
||||||
"@octokit/plugin-rest-endpoint-methods@4.13.4":
|
"@octokit/plugin-rest-endpoint-methods@4.13.5":
|
||||||
version "4.13.4"
|
version "4.13.5"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.4.tgz#093b130d558760f6bc912c6f622ce502522410af"
|
resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.5.tgz#ad76285b82fe05fbb4adf2774a9c887f3534a880"
|
||||||
integrity sha512-MGxptzVfiP8O+aydC/riheYzS/yJ9P16M29OuvtZep/sF5sKuOCQP8Wf83YCKXRsQF+ZpYfke2snbPPSIMZKzg==
|
integrity sha512-kYKcWkFm4Ldk8bZai2RVEP1z97k1C/Ay2FN9FNTBg7JIyKoiiJjks4OtT6cuKeZX39tqa+C3J9xeYc6G+6g8uQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@octokit/types" "^6.12.0"
|
"@octokit/types" "^6.12.2"
|
||||||
deprecation "^2.3.1"
|
deprecation "^2.3.1"
|
||||||
|
|
||||||
"@octokit/request-error@^2.0.0":
|
"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5":
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143"
|
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143"
|
||||||
integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==
|
integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==
|
||||||
@ -225,21 +226,21 @@
|
|||||||
universal-user-agent "^6.0.0"
|
universal-user-agent "^6.0.0"
|
||||||
|
|
||||||
"@octokit/rest@^18.0.0":
|
"@octokit/rest@^18.0.0":
|
||||||
version "18.3.4"
|
version "18.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.3.4.tgz#8e7ab02cd509e2fe7e71917a54254a8f8b827f20"
|
resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.3.5.tgz#a89903d46e0b4273bd3234674ec2777a651d68ab"
|
||||||
integrity sha512-NES0pHbwyFB1D0jrLkdnIXgEmze/gLE0JoSNgfAe4vwD77/qaQGO/lRWNuPPsoBVBjiW6mmA9CU5cYHujJTKQA==
|
integrity sha512-ZPeRms3WhWxQBEvoIh0zzf8xdU2FX0Capa7+lTca8YHmRsO3QNJzf1H3PcuKKsfgp91/xVDRtX91sTe1kexlbw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@octokit/core" "^3.2.3"
|
"@octokit/core" "^3.2.3"
|
||||||
"@octokit/plugin-paginate-rest" "^2.6.2"
|
"@octokit/plugin-paginate-rest" "^2.6.2"
|
||||||
"@octokit/plugin-request-log" "^1.0.2"
|
"@octokit/plugin-request-log" "^1.0.2"
|
||||||
"@octokit/plugin-rest-endpoint-methods" "4.13.4"
|
"@octokit/plugin-rest-endpoint-methods" "4.13.5"
|
||||||
|
|
||||||
"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.12.0", "@octokit/types@^6.7.1":
|
"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.12.2", "@octokit/types@^6.7.1":
|
||||||
version "6.12.0"
|
version "6.12.2"
|
||||||
resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.12.0.tgz#8376fd60edfd5d1eebfeedb994c6bcb5b862c7a1"
|
resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.12.2.tgz#5b44add079a478b8eb27d78cf384cc47e4411362"
|
||||||
integrity sha512-KwOf16soD7aDEEi/PgNeJlHzjZPfrmmNy+7WezSdrpnqZ7YImBJcNnX9+5RUHt1MnA4h8oISRHTqaZDGsX9DRQ==
|
integrity sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@octokit/openapi-types" "^5.3.0"
|
"@octokit/openapi-types" "^5.3.2"
|
||||||
|
|
||||||
"@types/comment-json@^1.1.1":
|
"@types/comment-json@^1.1.1":
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
@ -247,9 +248,9 @@
|
|||||||
integrity sha512-U70oEqvnkeSSp8BIJwJclERtT13rd9ejK7XkIzMCQQePZe3VW1b7iQggXyW4ZvfGtGeXD0pZw24q5iWNe++HqQ==
|
integrity sha512-U70oEqvnkeSSp8BIJwJclERtT13rd9ejK7XkIzMCQQePZe3VW1b7iQggXyW4ZvfGtGeXD0pZw24q5iWNe++HqQ==
|
||||||
|
|
||||||
"@types/node@^10.0.0":
|
"@types/node@^10.0.0":
|
||||||
version "10.17.54"
|
version "10.17.55"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.54.tgz#a737488631aca3ec7bd9f6229d77f1079e444793"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.55.tgz#a147f282edec679b894d4694edb5abeb595fecbd"
|
||||||
integrity sha512-c8Lm7+hXdSPmWH4B9z/P/xIXhFK3mCQin4yCYMd2p1qpMG5AfgyJuYZ+3q2dT7qLiMMMGMd5dnkFpdqJARlvtQ==
|
integrity sha512-koZJ89uLZufDvToeWO5BrC4CR4OUfHnUz2qoPs/daQH6qq3IN62QFxCTZ+bKaCE0xaoCAJYE4AXre8AbghCrhg==
|
||||||
|
|
||||||
"@types/parse-json@^4.0.0":
|
"@types/parse-json@^4.0.0":
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
@ -262,13 +263,19 @@
|
|||||||
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
|
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
|
||||||
|
|
||||||
"@types/react@^17.0.0":
|
"@types/react@^17.0.0":
|
||||||
version "17.0.2"
|
version "17.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8"
|
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79"
|
||||||
integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==
|
integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/prop-types" "*"
|
"@types/prop-types" "*"
|
||||||
|
"@types/scheduler" "*"
|
||||||
csstype "^3.0.2"
|
csstype "^3.0.2"
|
||||||
|
|
||||||
|
"@types/scheduler@*":
|
||||||
|
version "0.16.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275"
|
||||||
|
integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==
|
||||||
|
|
||||||
ansi-regex@^5.0.0:
|
ansi-regex@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
|
||||||
@ -302,7 +309,7 @@ balanced-match@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||||
|
|
||||||
before-after-hook@^2.1.0:
|
before-after-hook@^2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.0.tgz#09c40d92e936c64777aa385c4e9b904f8147eaf0"
|
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.0.tgz#09c40d92e936c64777aa385c4e9b904f8147eaf0"
|
||||||
integrity sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==
|
integrity sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==
|
||||||
@ -521,9 +528,9 @@ domhandler@^4.0.0:
|
|||||||
domelementtype "^2.1.0"
|
domelementtype "^2.1.0"
|
||||||
|
|
||||||
domutils@^2.4.3, domutils@^2.4.4:
|
domutils@^2.4.3, domutils@^2.4.4:
|
||||||
version "2.4.4"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.4.tgz#282739c4b150d022d34699797369aad8d19bbbd3"
|
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.0.tgz#42f49cffdabb92ad243278b331fd761c1c2d3039"
|
||||||
integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==
|
integrity sha512-Ho16rzNMOFk2fPwChGh3D2D9OEHAfG19HgmRR2l+WLSsIstNsAYBzePH412bL0y5T44ejABIVfTHQ8nqi/tBCg==
|
||||||
dependencies:
|
dependencies:
|
||||||
dom-serializer "^1.0.1"
|
dom-serializer "^1.0.1"
|
||||||
domelementtype "^2.0.1"
|
domelementtype "^2.0.1"
|
||||||
@ -615,14 +622,6 @@ event-emitter@^0.3.5:
|
|||||||
d "1"
|
d "1"
|
||||||
es5-ext "~0.10.14"
|
es5-ext "~0.10.14"
|
||||||
|
|
||||||
evt@2.0.0-beta.13:
|
|
||||||
version "2.0.0-beta.13"
|
|
||||||
resolved "https://registry.yarnpkg.com/evt/-/evt-2.0.0-beta.13.tgz#a84828cc15b535fabdeaf551982d0705ed428a6f"
|
|
||||||
integrity sha512-Y71l8BU1r/hs7MOyaNb5PTf8Jp+5h8Vt6T8ixvJSqDmKhwCjjCVKP2b1E3UE+Qlr1bZnCOWnVTucTeTeJghWEQ==
|
|
||||||
dependencies:
|
|
||||||
minimal-polyfills "^2.1.5"
|
|
||||||
run-exclusive "^2.2.14"
|
|
||||||
|
|
||||||
evt@2.0.0-beta.15:
|
evt@2.0.0-beta.15:
|
||||||
version "2.0.0-beta.15"
|
version "2.0.0-beta.15"
|
||||||
resolved "https://registry.yarnpkg.com/evt/-/evt-2.0.0-beta.15.tgz#a34ef224c827152c06f29157a9af5a41644e1a36"
|
resolved "https://registry.yarnpkg.com/evt/-/evt-2.0.0-beta.15.tgz#a34ef224c827152c06f29157a9af5a41644e1a36"
|
||||||
@ -708,15 +707,10 @@ has@^1.0.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
function-bind "^1.1.1"
|
function-bind "^1.1.1"
|
||||||
|
|
||||||
html-escaper@^3.0.3:
|
|
||||||
version "3.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6"
|
|
||||||
integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==
|
|
||||||
|
|
||||||
htmlparser2@^6.0.0:
|
htmlparser2@^6.0.0:
|
||||||
version "6.0.0"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.0.tgz#c2da005030390908ca4c91e5629e418e0665ac01"
|
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.1.tgz#422521231ef6d42e56bd411da8ba40aa36e91446"
|
||||||
integrity sha512-numTQtDZMoh78zJpaNdJ9MXb2cv5G3jwUoe3dMQODubZvLoGvTE/Ofp6sHvH8OGKcN/8A47pGLi/k58xHP/Tfw==
|
integrity sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w==
|
||||||
dependencies:
|
dependencies:
|
||||||
domelementtype "^2.0.1"
|
domelementtype "^2.0.1"
|
||||||
domhandler "^4.0.0"
|
domhandler "^4.0.0"
|
||||||
@ -744,6 +738,11 @@ inherits@2, inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3:
|
|||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
|
||||||
|
inherits@2.0.3:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||||
|
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
||||||
|
|
||||||
is-arrayish@^0.2.1:
|
is-arrayish@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
||||||
@ -937,12 +936,20 @@ path-type@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
||||||
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
||||||
|
|
||||||
powerhooks@^0.0.19:
|
path@^0.12.7:
|
||||||
version "0.0.19"
|
version "0.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/powerhooks/-/powerhooks-0.0.19.tgz#86f4157dbde32cd44082c756ab747c64f6045449"
|
resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
|
||||||
integrity sha512-yaODFWkflrZCSz4lvRQ2O4AjolheiE6oXa1F4mny2LUOwai4ip+zer16fgXEM53R+IiDnqj6ff8wooU5x4GslQ==
|
integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=
|
||||||
dependencies:
|
dependencies:
|
||||||
evt "2.0.0-beta.13"
|
process "^0.11.1"
|
||||||
|
util "^0.10.3"
|
||||||
|
|
||||||
|
powerhooks@^0.0.27:
|
||||||
|
version "0.0.27"
|
||||||
|
resolved "https://registry.yarnpkg.com/powerhooks/-/powerhooks-0.0.27.tgz#e9dc29258860d2f6bf32b249d9cba07c6f53f393"
|
||||||
|
integrity sha512-ohayWhtIEdLqiC2th/GEhaRfOhqekFg2uFo0JZ8Dn7oTnAZybs618QJeq5ag9oy3lFVzl+kbROpVa8Ch5zrkaA==
|
||||||
|
dependencies:
|
||||||
|
evt "2.0.0-beta.15"
|
||||||
memoizee "^0.4.15"
|
memoizee "^0.4.15"
|
||||||
resize-observer-polyfill "^1.5.1"
|
resize-observer-polyfill "^1.5.1"
|
||||||
|
|
||||||
@ -951,6 +958,11 @@ process-nextick-args@~2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
|
||||||
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
|
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
|
||||||
|
|
||||||
|
process@^0.11.1:
|
||||||
|
version "0.11.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||||
|
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
||||||
|
|
||||||
properties-parser@^0.3.1:
|
properties-parser@^0.3.1:
|
||||||
version "0.3.1"
|
version "0.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/properties-parser/-/properties-parser-0.3.1.tgz#1316e9539ffbfd93845e369b211022abd478771a"
|
resolved "https://registry.yarnpkg.com/properties-parser/-/properties-parser-0.3.1.tgz#1316e9539ffbfd93845e369b211022abd478771a"
|
||||||
@ -1130,11 +1142,11 @@ type@^1.0.1:
|
|||||||
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
|
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
|
||||||
|
|
||||||
type@^2.0.0:
|
type@^2.0.0:
|
||||||
version "2.3.0"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/type/-/type-2.3.0.tgz#ada7c045f07ead08abf9e2edd29be1a0c0661132"
|
resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
|
||||||
integrity sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg==
|
integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
|
||||||
|
|
||||||
typescript@^4.1.5:
|
typescript@^4.2.3:
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
|
||||||
integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==
|
integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==
|
||||||
@ -1159,6 +1171,13 @@ util-deprecate@~1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
||||||
|
|
||||||
|
util@^0.10.3:
|
||||||
|
version "0.10.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
|
||||||
|
integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
|
||||||
|
dependencies:
|
||||||
|
inherits "2.0.3"
|
||||||
|
|
||||||
wrap-ansi@^7.0.0:
|
wrap-ansi@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
@ -1184,14 +1203,14 @@ y18n@^5.0.5:
|
|||||||
integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
|
integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
|
||||||
|
|
||||||
yaml@^1.7.2:
|
yaml@^1.7.2:
|
||||||
version "1.10.0"
|
version "1.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
|
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
||||||
integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
|
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
||||||
|
|
||||||
yargs-parser@^20.2.2:
|
yargs-parser@^20.2.2:
|
||||||
version "20.2.6"
|
version "20.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20"
|
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
|
||||||
integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA==
|
integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
|
||||||
|
|
||||||
yargs@^16.1.0:
|
yargs@^16.1.0:
|
||||||
version "16.2.0"
|
version "16.2.0"
|
||||||
|
Reference in New Issue
Block a user