@keycloakify/svelte 0.2.6 → 0.2.8-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/keycloakify-svelte/account/DefaultPage.svelte +1 -1
- package/keycloakify-svelte/account/Template.svelte +14 -7
- package/keycloakify-svelte/account/pages/Account.svelte +10 -8
- package/keycloakify-svelte/account/pages/Applications.svelte +8 -6
- package/keycloakify-svelte/account/pages/FederatedIdentity.svelte +2 -2
- package/keycloakify-svelte/account/pages/Log.svelte +8 -6
- package/keycloakify-svelte/account/pages/Password.svelte +10 -8
- package/keycloakify-svelte/account/pages/Sessions.svelte +8 -6
- package/keycloakify-svelte/account/pages/Totp.svelte +8 -6
- package/keycloakify-svelte/bin/200.index.js +78 -82
- package/keycloakify-svelte/bin/266.index.js +98 -103
- package/keycloakify-svelte/bin/{343.index.js → 545.index.js} +4079 -2565
- package/keycloakify-svelte/bin/709.index.js +91 -95
- package/keycloakify-svelte/bin/818.index.js +108 -113
- package/keycloakify-svelte/bin/index.js +623 -1908
- package/keycloakify-svelte/login/DefaultPage.svelte +1 -1
- package/keycloakify-svelte/login/Template.svelte +14 -8
- package/keycloakify-svelte/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +6 -4
- package/keycloakify-svelte/login/components/AddRemoveButtonsMultiValuedAttribute.svelte.d.ts +1 -1
- package/keycloakify-svelte/login/components/GroupLabel.svelte +11 -9
- package/keycloakify-svelte/login/components/InputFieldByType.svelte +2 -2
- package/keycloakify-svelte/login/components/InputTag.svelte +5 -5
- package/keycloakify-svelte/login/components/InputTagSelects.svelte +51 -47
- package/keycloakify-svelte/login/components/LogoutOtherSessions.svelte +1 -1
- package/keycloakify-svelte/login/components/PasswordWrapper.svelte +2 -2
- package/keycloakify-svelte/login/components/SelectTag.svelte +21 -19
- package/keycloakify-svelte/login/components/TermsAcceptance.svelte +1 -1
- package/keycloakify-svelte/login/components/TextareaTag.svelte +6 -3
- package/keycloakify-svelte/login/components/UserProfileFormFields.svelte +6 -6
- package/keycloakify-svelte/login/pages/Code.svelte +9 -7
- package/keycloakify-svelte/login/pages/DeleteAccountConfirm.svelte +8 -6
- package/keycloakify-svelte/login/pages/DeleteCredential.svelte +8 -6
- package/keycloakify-svelte/login/pages/Error.svelte +2 -2
- package/keycloakify-svelte/login/pages/FrontchannelLogout.svelte +2 -2
- package/keycloakify-svelte/login/pages/IdpReviewUserProfile.svelte +8 -6
- package/keycloakify-svelte/login/pages/Info.svelte +2 -2
- package/keycloakify-svelte/login/pages/Login.svelte +9 -6
- package/keycloakify-svelte/login/pages/LoginConfigTotp.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginIdpLinkConfirm.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginIdpLinkConfirmOverride.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginIdpLinkEmail.svelte +2 -2
- package/keycloakify-svelte/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginOauthGrant.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginOtp.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginPageExpired.svelte +2 -2
- package/keycloakify-svelte/login/pages/LoginPasskeysConditionalAuthenticate.svelte +14 -7
- package/keycloakify-svelte/login/pages/LoginPassword.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeConfig.svelte +10 -7
- package/keycloakify-svelte/login/pages/LoginRecoveryAuthnCodeInput.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginResetOtp.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginResetPassword.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginUpdatePassword.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginUpdateProfile.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginUsername.svelte +8 -6
- package/keycloakify-svelte/login/pages/LoginVerifyEmail.svelte +2 -2
- package/keycloakify-svelte/login/pages/LoginX509Info.svelte +8 -6
- package/keycloakify-svelte/login/pages/LogoutConfirm.svelte +8 -6
- package/keycloakify-svelte/login/pages/Register.svelte +9 -7
- package/keycloakify-svelte/login/pages/SamlPostForm.svelte +2 -2
- package/keycloakify-svelte/login/pages/SelectAuthenticator.svelte +3 -3
- package/keycloakify-svelte/login/pages/Terms.svelte +8 -6
- package/keycloakify-svelte/login/pages/UpdateEmail.svelte +8 -6
- package/keycloakify-svelte/login/pages/WebauthnAuthenticate.svelte +6 -5
- package/keycloakify-svelte/login/pages/WebauthnError.svelte +8 -6
- package/keycloakify-svelte/login/pages/WebauthnRegister.svelte +6 -5
- package/package.json +22 -20
- package/src/account/DefaultPage.svelte +1 -1
- package/src/account/Template.svelte +14 -7
- package/src/account/pages/Account.svelte +10 -8
- package/src/account/pages/Applications.svelte +8 -6
- package/src/account/pages/FederatedIdentity.svelte +2 -2
- package/src/account/pages/Log.svelte +8 -6
- package/src/account/pages/Password.svelte +10 -8
- package/src/account/pages/Sessions.svelte +8 -6
- package/src/account/pages/Totp.svelte +8 -6
- package/src/bin/initialize-account-theme/boilerplate/KcPage.svelte +3 -3
- package/src/bin/initialize-account-theme/boilerplate/KcPageStory.svelte +1 -1
- package/src/bin/initialize-account-theme/initialize-account-theme.ts +2 -1
- package/src/bin/tools/getThisCodebaseRootDirPath.ts +7 -0
- package/src/bin/tools/nodeModulesBinDirPath.ts +30 -1
- package/src/bin/tools/runPrettier.ts +42 -39
- package/src/login/DefaultPage.svelte +1 -1
- package/src/login/Template.svelte +14 -8
- package/src/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +6 -4
- package/src/login/components/GroupLabel.svelte +11 -9
- package/src/login/components/InputFieldByType.svelte +2 -2
- package/src/login/components/InputTag.svelte +5 -5
- package/src/login/components/InputTagSelects.svelte +51 -47
- package/src/login/components/LogoutOtherSessions.svelte +1 -1
- package/src/login/components/PasswordWrapper.svelte +2 -2
- package/src/login/components/SelectTag.svelte +21 -19
- package/src/login/components/TermsAcceptance.svelte +1 -1
- package/src/login/components/TextareaTag.svelte +6 -3
- package/src/login/components/UserProfileFormFields.svelte +6 -6
- package/src/login/pages/Code.svelte +9 -7
- package/src/login/pages/DeleteAccountConfirm.svelte +8 -6
- package/src/login/pages/DeleteCredential.svelte +8 -6
- package/src/login/pages/Error.svelte +2 -2
- package/src/login/pages/FrontchannelLogout.svelte +2 -2
- package/src/login/pages/IdpReviewUserProfile.svelte +8 -6
- package/src/login/pages/Info.svelte +2 -2
- package/src/login/pages/Login.svelte +9 -6
- package/src/login/pages/LoginConfigTotp.svelte +8 -6
- package/src/login/pages/LoginIdpLinkConfirm.svelte +8 -6
- package/src/login/pages/LoginIdpLinkConfirmOverride.svelte +8 -6
- package/src/login/pages/LoginIdpLinkEmail.svelte +2 -2
- package/src/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +8 -6
- package/src/login/pages/LoginOauthGrant.svelte +8 -6
- package/src/login/pages/LoginOtp.svelte +8 -6
- package/src/login/pages/LoginPageExpired.svelte +2 -2
- package/src/login/pages/LoginPasskeysConditionalAuthenticate.svelte +14 -7
- package/src/login/pages/LoginPassword.svelte +8 -6
- package/src/login/pages/LoginRecoveryAuthnCodeConfig.svelte +10 -7
- package/src/login/pages/LoginRecoveryAuthnCodeInput.svelte +8 -6
- package/src/login/pages/LoginResetOtp.svelte +8 -6
- package/src/login/pages/LoginResetPassword.svelte +8 -6
- package/src/login/pages/LoginUpdatePassword.svelte +8 -6
- package/src/login/pages/LoginUpdateProfile.svelte +8 -6
- package/src/login/pages/LoginUsername.svelte +8 -6
- package/src/login/pages/LoginVerifyEmail.svelte +2 -2
- package/src/login/pages/LoginX509Info.svelte +8 -6
- package/src/login/pages/LogoutConfirm.svelte +8 -6
- package/src/login/pages/Register.svelte +9 -7
- package/src/login/pages/SamlPostForm.svelte +2 -2
- package/src/login/pages/SelectAuthenticator.svelte +3 -3
- package/src/login/pages/Terms.svelte +8 -6
- package/src/login/pages/UpdateEmail.svelte +8 -6
- package/src/login/pages/WebauthnAuthenticate.svelte +6 -5
- package/src/login/pages/WebauthnError.svelte +8 -6
- package/src/login/pages/WebauthnRegister.svelte +6 -5
- package/src/bin/tools/readThisNpmPackageVersion.ts +0 -22
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keycloakify/svelte",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8-rc.1",
|
|
4
4
|
"description": "Svelte Components for Keycloakify",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"keycloak",
|
|
@@ -437,36 +437,38 @@
|
|
|
437
437
|
"svelte": "^5.0.0"
|
|
438
438
|
},
|
|
439
439
|
"devDependencies": {
|
|
440
|
-
"@
|
|
441
|
-
"@sveltejs/
|
|
442
|
-
"@sveltejs/
|
|
443
|
-
"@sveltejs/
|
|
440
|
+
"@eslint/js": "^10.0.1",
|
|
441
|
+
"@sveltejs/adapter-auto": "^7.0.1",
|
|
442
|
+
"@sveltejs/kit": "^2.53.4",
|
|
443
|
+
"@sveltejs/package": "^2.5.7",
|
|
444
|
+
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
444
445
|
"@types/eslint": "^9.6.1",
|
|
445
446
|
"@types/node": "^24.10.1",
|
|
446
447
|
"@vercel/ncc": "^0.38.4",
|
|
448
|
+
"chalk": "^5.6.2",
|
|
447
449
|
"cli-select": "^1.1.2",
|
|
448
450
|
"conventional-changelog": "^7.1.1",
|
|
449
451
|
"conventional-changelog-angular": "^8.1.0",
|
|
450
|
-
"eslint": "^
|
|
452
|
+
"eslint": "^10.0.2",
|
|
451
453
|
"eslint-config-prettier": "^10.1.8",
|
|
452
|
-
"eslint-plugin-prettier": "^5.5.
|
|
453
|
-
"eslint-plugin-svelte": "^3.
|
|
454
|
-
"eslint-plugin-unused-imports": "^4.
|
|
455
|
-
"globals": "^
|
|
454
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
455
|
+
"eslint-plugin-svelte": "^3.15.0",
|
|
456
|
+
"eslint-plugin-unused-imports": "^4.4.1",
|
|
457
|
+
"globals": "^17.3.0",
|
|
456
458
|
"husky": "^9.1.7",
|
|
457
|
-
"keycloakify": "^11.
|
|
458
|
-
"npm-check-updates": "^19.
|
|
459
|
-
"prettier": "^3.
|
|
460
|
-
"prettier-plugin-svelte": "^3.
|
|
461
|
-
"publint": "^0.3.
|
|
462
|
-
"svelte": "^5.
|
|
463
|
-
"svelte-check": "^4.
|
|
459
|
+
"keycloakify": "^11.15.1",
|
|
460
|
+
"npm-check-updates": "^19.6.3",
|
|
461
|
+
"prettier": "^3.8.1",
|
|
462
|
+
"prettier-plugin-svelte": "^3.5.0",
|
|
463
|
+
"publint": "^0.3.17",
|
|
464
|
+
"svelte": "^5.53.6",
|
|
465
|
+
"svelte-check": "^4.4.4",
|
|
464
466
|
"ts-node": "^10.9.2",
|
|
465
467
|
"tsx": "4.20.4",
|
|
466
468
|
"typescript": "~5.9.3",
|
|
467
|
-
"typescript-eslint": "^8.
|
|
468
|
-
"vite": "^7.
|
|
469
|
-
"zod": "^4.
|
|
469
|
+
"typescript-eslint": "^8.56.1",
|
|
470
|
+
"vite": "^7.3.1",
|
|
471
|
+
"zod": "^4.3.6"
|
|
470
472
|
},
|
|
471
473
|
"bin": {
|
|
472
474
|
"_keycloakify-custom-handler": "keycloakify-svelte/bin/index.js"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { KcContext } from './KcContext';
|
|
5
5
|
|
|
6
6
|
const props: PageProps<KcContext, I18n> = $props();
|
|
7
|
-
const { kcContext
|
|
7
|
+
const { kcContext, ...rest } = $derived(props);
|
|
8
8
|
const loadComponent = () => {
|
|
9
9
|
switch (kcContext.pageId) {
|
|
10
10
|
case 'password.ftl':
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
import { useSetClassName } from '@keycloakify/svelte/tools/useSetClassName';
|
|
5
5
|
import { getKcClsx } from 'keycloakify/account/lib/kcClsx';
|
|
6
6
|
import { clsx } from 'keycloakify/tools/clsx';
|
|
7
|
-
import { onMount } from 'svelte';
|
|
7
|
+
import { onMount, untrack } from 'svelte';
|
|
8
8
|
import type { I18n } from './i18n';
|
|
9
9
|
import type { KcContext } from './KcContext';
|
|
10
10
|
import { kcSanitize } from 'keycloakify/lib/kcSanitize';
|
|
11
11
|
|
|
12
12
|
const { kcContext, i18n, doUseDefaultCss, active, classes, children }: TemplateProps<KcContext, I18n> = $props();
|
|
13
|
-
const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
|
|
13
|
+
const { kcClsx } = $derived(getKcClsx({ doUseDefaultCss, classes }));
|
|
14
14
|
|
|
15
|
-
const { msg, msgStr, currentLanguage, enabledLanguages } = $i18n;
|
|
15
|
+
const { msg, msgStr, currentLanguage, enabledLanguages } = $derived($i18n);
|
|
16
16
|
|
|
17
|
-
const { url, features, realm, message, referrer } = kcContext;
|
|
17
|
+
const { url, features, realm, message, referrer } = $derived(kcContext);
|
|
18
18
|
|
|
19
19
|
onMount(() => {
|
|
20
20
|
document.title = msgStr('accountManagementTitle');
|
|
@@ -22,15 +22,22 @@
|
|
|
22
22
|
|
|
23
23
|
useSetClassName({
|
|
24
24
|
qualifiedName: 'html',
|
|
25
|
-
className: kcClsx('kcHtmlClass'),
|
|
25
|
+
className: untrack(() => kcClsx('kcHtmlClass')),
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
useSetClassName({
|
|
29
29
|
qualifiedName: 'body',
|
|
30
|
-
className: clsx(
|
|
30
|
+
className: clsx(
|
|
31
|
+
'admin-console',
|
|
32
|
+
'user',
|
|
33
|
+
untrack(() => kcClsx('kcBodyClass')),
|
|
34
|
+
),
|
|
31
35
|
});
|
|
32
36
|
|
|
33
|
-
const { isReadyToRender } = useInitialize({
|
|
37
|
+
const { isReadyToRender } = useInitialize({
|
|
38
|
+
kcContext: untrack(() => kcContext),
|
|
39
|
+
doUseDefaultCss: untrack(() => doUseDefaultCss),
|
|
40
|
+
});
|
|
34
41
|
</script>
|
|
35
42
|
|
|
36
43
|
{#if $isReadyToRender}
|
|
@@ -13,19 +13,21 @@
|
|
|
13
13
|
...props
|
|
14
14
|
}: PageProps<Extract<KcContext, { pageId: 'account.ftl' }>, I18n> = $props();
|
|
15
15
|
|
|
16
|
-
const classes = {
|
|
16
|
+
const classes = $derived({
|
|
17
17
|
...props.classes,
|
|
18
18
|
kcBodyClass: clsx(props.classes?.kcBodyClass, 'user'),
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const { kcClsx } = getKcClsx({
|
|
22
|
-
doUseDefaultCss,
|
|
23
|
-
classes,
|
|
24
19
|
});
|
|
25
20
|
|
|
26
|
-
const {
|
|
21
|
+
const { kcClsx } = $derived(
|
|
22
|
+
getKcClsx({
|
|
23
|
+
doUseDefaultCss,
|
|
24
|
+
classes,
|
|
25
|
+
}),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const { url, realm, messagesPerField, stateChecker, account, referrer } = $derived(kcContext);
|
|
27
29
|
|
|
28
|
-
const { msg } = $i18n;
|
|
30
|
+
const { msg } = $derived($i18n);
|
|
29
31
|
</script>
|
|
30
32
|
|
|
31
33
|
<Template
|
|
@@ -12,18 +12,20 @@
|
|
|
12
12
|
classes,
|
|
13
13
|
}: PageProps<Extract<KcContext, { pageId: 'applications.ftl' }>, I18n> = $props();
|
|
14
14
|
|
|
15
|
-
const { kcClsx } =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const { kcClsx } = $derived(
|
|
16
|
+
getKcClsx({
|
|
17
|
+
doUseDefaultCss,
|
|
18
|
+
classes,
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
19
21
|
|
|
20
22
|
const {
|
|
21
23
|
url,
|
|
22
24
|
applications: { applications },
|
|
23
25
|
stateChecker,
|
|
24
|
-
} = kcContext;
|
|
26
|
+
} = $derived(kcContext);
|
|
25
27
|
|
|
26
|
-
const { msg, advancedMsg } = $i18n;
|
|
28
|
+
const { msg, advancedMsg } = $derived($i18n);
|
|
27
29
|
|
|
28
30
|
function isArrayWithEmptyObject(variable: unknown): boolean {
|
|
29
31
|
return (
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
classes,
|
|
12
12
|
}: PageProps<Extract<KcContext, { pageId: 'federatedIdentity.ftl' }>, I18n> = $props();
|
|
13
13
|
|
|
14
|
-
const { url, federatedIdentity, stateChecker } = kcContext;
|
|
15
|
-
const { msg } = $i18n;
|
|
14
|
+
const { url, federatedIdentity, stateChecker } = $derived(kcContext);
|
|
15
|
+
const { msg } = $derived($i18n);
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<Template
|
|
@@ -12,14 +12,16 @@
|
|
|
12
12
|
classes,
|
|
13
13
|
}: PageProps<Extract<KcContext, { pageId: 'log.ftl' }>, I18n> = $props();
|
|
14
14
|
|
|
15
|
-
const { kcClsx } =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const { kcClsx } = $derived(
|
|
16
|
+
getKcClsx({
|
|
17
|
+
doUseDefaultCss,
|
|
18
|
+
classes,
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
19
21
|
|
|
20
|
-
const { log } = kcContext;
|
|
22
|
+
const { log } = $derived(kcContext);
|
|
21
23
|
|
|
22
|
-
const { msg } = $i18n;
|
|
24
|
+
const { msg } = $derived($i18n);
|
|
23
25
|
</script>
|
|
24
26
|
|
|
25
27
|
<Template
|
|
@@ -14,18 +14,20 @@
|
|
|
14
14
|
...props
|
|
15
15
|
}: PageProps<Extract<KcContext, { pageId: 'password.ftl' }>, I18n> = $props();
|
|
16
16
|
|
|
17
|
-
const classes = {
|
|
17
|
+
const classes = $derived({
|
|
18
18
|
...props.classes,
|
|
19
19
|
kcBodyClass: clsx(props.classes?.kcBodyClass, 'password'),
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const { kcClsx } = getKcClsx({
|
|
23
|
-
doUseDefaultCss,
|
|
24
|
-
classes,
|
|
25
20
|
});
|
|
26
|
-
const { url, password, account, stateChecker } = kcContext;
|
|
27
21
|
|
|
28
|
-
const {
|
|
22
|
+
const { kcClsx } = $derived(
|
|
23
|
+
getKcClsx({
|
|
24
|
+
doUseDefaultCss,
|
|
25
|
+
classes,
|
|
26
|
+
}),
|
|
27
|
+
);
|
|
28
|
+
const { url, password, account, stateChecker } = $derived(kcContext);
|
|
29
|
+
|
|
30
|
+
const { msgStr, msg } = $derived($i18n);
|
|
29
31
|
|
|
30
32
|
const [currentPassword, setCurrentPassword] = useState('');
|
|
31
33
|
const [newPassword, setNewPassword] = useState('');
|
|
@@ -12,14 +12,16 @@
|
|
|
12
12
|
classes,
|
|
13
13
|
}: PageProps<Extract<KcContext, { pageId: 'sessions.ftl' }>, I18n> = $props();
|
|
14
14
|
|
|
15
|
-
const { kcClsx } =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const { kcClsx } = $derived(
|
|
16
|
+
getKcClsx({
|
|
17
|
+
doUseDefaultCss,
|
|
18
|
+
classes,
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
19
21
|
|
|
20
|
-
const { url, stateChecker, sessions } = kcContext;
|
|
22
|
+
const { url, stateChecker, sessions } = $derived(kcContext);
|
|
21
23
|
|
|
22
|
-
const { msg } = $i18n;
|
|
24
|
+
const { msg } = $derived($i18n);
|
|
23
25
|
</script>
|
|
24
26
|
|
|
25
27
|
<Template
|
|
@@ -14,14 +14,16 @@
|
|
|
14
14
|
classes,
|
|
15
15
|
}: PageProps<Extract<KcContext, { pageId: 'totp.ftl' }>, I18n> = $props();
|
|
16
16
|
|
|
17
|
-
const { kcClsx } =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const { kcClsx } = $derived(
|
|
18
|
+
getKcClsx({
|
|
19
|
+
doUseDefaultCss,
|
|
20
|
+
classes,
|
|
21
|
+
}),
|
|
22
|
+
);
|
|
21
23
|
|
|
22
|
-
const { totp, mode, url, messagesPerField, stateChecker } = kcContext;
|
|
24
|
+
const { totp, mode, url, messagesPerField, stateChecker } = $derived(kcContext);
|
|
23
25
|
|
|
24
|
-
const { msg, msgStr, advancedMsg } = $i18n;
|
|
26
|
+
const { msg, msgStr, advancedMsg } = $derived($i18n);
|
|
25
27
|
</script>
|
|
26
28
|
|
|
27
29
|
<Template
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
const { kcContext }: { kcContext: KcContext } = $props();
|
|
8
8
|
|
|
9
|
-
const { i18n } = useI18n({ kcContext });
|
|
10
|
-
const page = async () => {
|
|
9
|
+
const { i18n } = $derived(useI18n({ kcContext }));
|
|
10
|
+
const page = $derived(async () => {
|
|
11
11
|
switch (kcContext.pageId) {
|
|
12
12
|
default:
|
|
13
13
|
return import('@keycloakify/svelte/account/DefaultPage.svelte');
|
|
14
14
|
}
|
|
15
|
-
};
|
|
15
|
+
});
|
|
16
16
|
|
|
17
17
|
const classes = {} satisfies { [key in ClassKey]?: string };
|
|
18
18
|
</script>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { getKcContextMock, type KcPageStoryProps } from './KcPageStory';
|
|
4
4
|
|
|
5
5
|
const { pageId, kcContext }: KcPageStoryProps = $props();
|
|
6
|
-
const kcContextMock = getKcContextMock({ pageId, overrides: kcContext });
|
|
6
|
+
const kcContextMock = $derived(getKcContextMock({ pageId, overrides: kcContext }));
|
|
7
7
|
</script>
|
|
8
8
|
|
|
9
9
|
<KcPage kcContext={kcContextMock} />
|
|
@@ -26,7 +26,7 @@ export async function command(params: { buildContext: BuildContext }) {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
exit_if_uncommitted_changes: {
|
|
29
|
-
let hasUncommittedChanges: boolean | undefined
|
|
29
|
+
let hasUncommittedChanges: boolean | undefined;
|
|
30
30
|
|
|
31
31
|
try {
|
|
32
32
|
hasUncommittedChanges =
|
|
@@ -73,6 +73,7 @@ export async function command(params: { buildContext: BuildContext }) {
|
|
|
73
73
|
account: {
|
|
74
74
|
isImplemented: true,
|
|
75
75
|
type: accountThemeType,
|
|
76
|
+
hasEarlyColorSchemeScript: false,
|
|
76
77
|
},
|
|
77
78
|
},
|
|
78
79
|
},
|
|
@@ -20,3 +20,10 @@ export function getThisCodebaseRootDirPath(): string {
|
|
|
20
20
|
|
|
21
21
|
return (result = getThisCodebaseRootDirPath_rec(__dirname));
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
export function getNearestPackageJsonDirPath(dirPath: string): string {
|
|
25
|
+
if (fs.existsSync(path.join(dirPath, 'package.json'))) {
|
|
26
|
+
return dirPath;
|
|
27
|
+
}
|
|
28
|
+
return getNearestPackageJsonDirPath(path.join(dirPath, '..'));
|
|
29
|
+
}
|
|
@@ -1,7 +1,20 @@
|
|
|
1
|
-
import { sep as pathSep } from 'path';
|
|
1
|
+
import { dirname as pathDirname, join as pathJoin, sep as pathSep } from 'path';
|
|
2
|
+
import { getNearestPackageJsonDirPath } from './getThisCodebaseRootDirPath';
|
|
2
3
|
|
|
3
4
|
let cache: string | undefined = undefined;
|
|
4
5
|
|
|
6
|
+
/** NOTE: Careful, this function can fail when the binary
|
|
7
|
+
* Used is not in the node_modules directory of the project
|
|
8
|
+
* (for example when running tests with vscode extension we'll get
|
|
9
|
+
* '/Users/dylan/.vscode/extensions/vitest.explorer-1.16.0/dist/worker.js'
|
|
10
|
+
*
|
|
11
|
+
* instead of
|
|
12
|
+
* '/Users/joseph/.nvm/versions/node/v22.12.0/bin/node'
|
|
13
|
+
* or
|
|
14
|
+
* '/Users/joseph/github/keycloakify-starter/node_modules/.bin/vite'
|
|
15
|
+
*
|
|
16
|
+
* as the value of process.argv[1]
|
|
17
|
+
*/
|
|
5
18
|
export function getNodeModulesBinDirPath() {
|
|
6
19
|
if (cache !== undefined) {
|
|
7
20
|
return cache;
|
|
@@ -9,6 +22,18 @@ export function getNodeModulesBinDirPath() {
|
|
|
9
22
|
|
|
10
23
|
const binPath = process.argv[1];
|
|
11
24
|
|
|
25
|
+
special_case_running_not_from_distribution: {
|
|
26
|
+
if (!binPath.endsWith('.ts')) {
|
|
27
|
+
break special_case_running_not_from_distribution;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const packageJsonDirPath = getNearestPackageJsonDirPath(pathDirname(binPath));
|
|
31
|
+
|
|
32
|
+
const nodeModulesBinDirPath = pathJoin(packageJsonDirPath, 'node_modules', '.bin');
|
|
33
|
+
|
|
34
|
+
return nodeModulesBinDirPath;
|
|
35
|
+
}
|
|
36
|
+
|
|
12
37
|
const segments: string[] = ['.bin'];
|
|
13
38
|
|
|
14
39
|
let foundNodeModules = false;
|
|
@@ -30,6 +55,10 @@ export function getNodeModulesBinDirPath() {
|
|
|
30
55
|
segments.unshift(segment);
|
|
31
56
|
}
|
|
32
57
|
|
|
58
|
+
if (!foundNodeModules) {
|
|
59
|
+
throw new Error(`Could not find node_modules in path ${binPath}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
33
62
|
const nodeModulesBinDirPath = segments.join(pathSep);
|
|
34
63
|
|
|
35
64
|
cache = nodeModulesBinDirPath;
|
|
@@ -2,12 +2,10 @@ import chalk from 'chalk';
|
|
|
2
2
|
import * as crypto from 'crypto';
|
|
3
3
|
import * as fsPr from 'fs/promises';
|
|
4
4
|
import { join as pathJoin, resolve as pathResolve } from 'path';
|
|
5
|
-
import { assert } from 'tsafe/assert';
|
|
5
|
+
import { assert, is } from 'tsafe/assert';
|
|
6
6
|
import { id } from 'tsafe/id';
|
|
7
|
-
import { is } from 'tsafe/is';
|
|
8
7
|
import { symToStr } from 'tsafe/symToStr';
|
|
9
8
|
import { getNodeModulesBinDirPath } from './nodeModulesBinDirPath';
|
|
10
|
-
import { readThisNpmPackageVersion } from './readThisNpmPackageVersion';
|
|
11
9
|
|
|
12
10
|
getIsPrettierAvailable.cache = id<boolean | undefined>(undefined);
|
|
13
11
|
|
|
@@ -29,7 +27,10 @@ export async function getIsPrettierAvailable(): Promise<boolean> {
|
|
|
29
27
|
return isPrettierAvailable;
|
|
30
28
|
}
|
|
31
29
|
|
|
32
|
-
type PrettierAndConfigHash = {
|
|
30
|
+
type PrettierAndConfigHash = {
|
|
31
|
+
prettier: typeof import('prettier');
|
|
32
|
+
configHash: string;
|
|
33
|
+
};
|
|
33
34
|
|
|
34
35
|
getPrettier.cache = id<PrettierAndConfigHash | undefined>(undefined);
|
|
35
36
|
|
|
@@ -43,36 +44,28 @@ export async function getPrettier(): Promise<PrettierAndConfigHash> {
|
|
|
43
44
|
let prettier = id<typeof import('prettier') | undefined>(undefined);
|
|
44
45
|
|
|
45
46
|
import_prettier: {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
prettier = await new Promise((_resolve) => {
|
|
60
|
-
eval(
|
|
61
|
-
`import("file:///${pathJoin(prettierDirPath, 'index.mjs').replace(/\\/g, '/')}").then(prettier => _resolve(prettier))`,
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
assert(!is<undefined>(prettier));
|
|
67
|
-
|
|
68
|
-
break import_prettier;
|
|
47
|
+
const prettierDirPath = pathResolve(pathJoin(getNodeModulesBinDirPath(), '..', 'prettier'));
|
|
48
|
+
|
|
49
|
+
const isCJS = typeof module !== 'undefined' && module.exports;
|
|
50
|
+
|
|
51
|
+
if (isCJS) {
|
|
52
|
+
eval(`${symToStr({ prettier })} = require("${prettierDirPath}")`);
|
|
53
|
+
} else {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
55
|
+
prettier = await new Promise((_resolve) => {
|
|
56
|
+
eval(
|
|
57
|
+
`import("file:///${pathJoin(prettierDirPath, 'index.mjs').replace(/\\/g, '/')}").then(prettier => _resolve(prettier))`,
|
|
58
|
+
);
|
|
59
|
+
});
|
|
69
60
|
}
|
|
70
61
|
|
|
71
|
-
|
|
62
|
+
assert(!is<undefined>(prettier));
|
|
63
|
+
|
|
64
|
+
break import_prettier;
|
|
72
65
|
}
|
|
73
66
|
|
|
74
67
|
const configHash = await (async () => {
|
|
75
|
-
const configFilePath = await prettier.resolveConfigFile(pathJoin(getNodeModulesBinDirPath(), '..'));
|
|
68
|
+
const configFilePath = await prettier.resolveConfigFile(pathJoin(getNodeModulesBinDirPath(), '..', '..'));
|
|
76
69
|
|
|
77
70
|
if (configFilePath === null) {
|
|
78
71
|
return '';
|
|
@@ -83,14 +76,19 @@ export async function getPrettier(): Promise<PrettierAndConfigHash> {
|
|
|
83
76
|
return crypto.createHash('sha256').update(data).digest('hex');
|
|
84
77
|
})();
|
|
85
78
|
|
|
86
|
-
const prettierAndConfig: PrettierAndConfigHash = {
|
|
79
|
+
const prettierAndConfig: PrettierAndConfigHash = {
|
|
80
|
+
prettier,
|
|
81
|
+
configHash,
|
|
82
|
+
};
|
|
87
83
|
|
|
88
84
|
getPrettier.cache = prettierAndConfig;
|
|
89
85
|
|
|
90
86
|
return prettierAndConfig;
|
|
91
87
|
}
|
|
92
88
|
|
|
93
|
-
export async function runPrettier(params: { sourceCode: string; filePath: string }): Promise<string
|
|
89
|
+
export async function runPrettier(params: { sourceCode: string; filePath: string }): Promise<string>;
|
|
90
|
+
export async function runPrettier(params: { sourceCode: Buffer; filePath: string }): Promise<Buffer>;
|
|
91
|
+
export async function runPrettier(params: { sourceCode: string | Buffer; filePath: string }): Promise<string | Buffer> {
|
|
94
92
|
const { sourceCode, filePath } = params;
|
|
95
93
|
|
|
96
94
|
let formattedSourceCode: string;
|
|
@@ -98,24 +96,29 @@ export async function runPrettier(params: { sourceCode: string; filePath: string
|
|
|
98
96
|
try {
|
|
99
97
|
const { prettier } = await getPrettier();
|
|
100
98
|
|
|
101
|
-
const { ignored, inferredParser } = await prettier.getFileInfo(filePath, {
|
|
99
|
+
const { ignored, inferredParser } = await prettier.getFileInfo(filePath, {
|
|
100
|
+
resolveConfig: true,
|
|
101
|
+
});
|
|
102
102
|
|
|
103
|
-
if (ignored) {
|
|
103
|
+
if (ignored || inferredParser === null) {
|
|
104
104
|
return sourceCode;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
const config = await prettier.resolveConfig(filePath);
|
|
108
108
|
|
|
109
|
-
formattedSourceCode = await prettier.format(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
formattedSourceCode = await prettier.format(
|
|
110
|
+
typeof sourceCode === 'string' ? sourceCode : sourceCode.toString('utf8'),
|
|
111
|
+
{
|
|
112
|
+
...config,
|
|
113
|
+
filePath,
|
|
114
|
+
parser: inferredParser,
|
|
115
|
+
},
|
|
116
|
+
);
|
|
114
117
|
} catch (error) {
|
|
115
118
|
console.log(chalk.red(`You probably need to upgrade the version of prettier in your project`));
|
|
116
119
|
|
|
117
120
|
throw error;
|
|
118
121
|
}
|
|
119
122
|
|
|
120
|
-
return formattedSourceCode;
|
|
123
|
+
return typeof sourceCode === 'string' ? formattedSourceCode : Buffer.from(formattedSourceCode, 'utf8');
|
|
121
124
|
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
doMakeUserConfirmPassword: boolean;
|
|
11
11
|
};
|
|
12
12
|
const props: DefaultPageProps = $props();
|
|
13
|
-
const { kcContext
|
|
13
|
+
const { kcContext, ...rest } = $derived(props);
|
|
14
14
|
const loadComponent = () => {
|
|
15
15
|
switch (kcContext.pageId) {
|
|
16
16
|
case 'login.ftl':
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { kcSanitize } from 'keycloakify/lib/kcSanitize';
|
|
6
6
|
import { getKcClsx } from 'keycloakify/login/lib/kcClsx';
|
|
7
7
|
import { clsx } from 'keycloakify/tools/clsx';
|
|
8
|
-
import { onMount } from 'svelte';
|
|
8
|
+
import { onMount, untrack } from 'svelte';
|
|
9
9
|
import type { I18n } from './i18n';
|
|
10
10
|
import type { KcContext } from './KcContext';
|
|
11
11
|
|
|
@@ -24,24 +24,30 @@
|
|
|
24
24
|
classes,
|
|
25
25
|
children,
|
|
26
26
|
}: TemplateProps<KcContext, I18n> = $props();
|
|
27
|
-
const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
|
|
27
|
+
const { kcClsx } = $derived(getKcClsx({ doUseDefaultCss, classes }));
|
|
28
28
|
|
|
29
|
-
const { msgStr, currentLanguage, enabledLanguages } = $i18n;
|
|
29
|
+
const { msgStr, currentLanguage, enabledLanguages } = $derived($i18n);
|
|
30
|
+
|
|
31
|
+
const { realm, auth, url, message, isAppInitiatedAction } = $derived(kcContext);
|
|
30
32
|
|
|
31
|
-
const { realm, auth, url, message, isAppInitiatedAction } = kcContext;
|
|
32
33
|
onMount(() => {
|
|
33
|
-
document.title = documentTitle ?? msgStr('loginTitle', kcContext.realm.displayName);
|
|
34
|
+
document.title = documentTitle ?? untrack(() => msgStr('loginTitle', kcContext.realm.displayName));
|
|
34
35
|
});
|
|
36
|
+
|
|
35
37
|
useSetClassName({
|
|
36
38
|
qualifiedName: 'html',
|
|
37
|
-
className: kcClsx('kcHtmlClass'),
|
|
39
|
+
className: untrack(() => kcClsx('kcHtmlClass')),
|
|
38
40
|
});
|
|
39
41
|
|
|
40
42
|
useSetClassName({
|
|
41
43
|
qualifiedName: 'body',
|
|
42
|
-
className: bodyClassName ?? kcClsx('kcBodyClass'),
|
|
44
|
+
className: untrack(() => bodyClassName ?? kcClsx('kcBodyClass')),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const { isReadyToRender } = useInitialize({
|
|
48
|
+
kcContext: untrack(() => kcContext),
|
|
49
|
+
doUseDefaultCss: untrack(() => doUseDefaultCss),
|
|
43
50
|
});
|
|
44
|
-
const { isReadyToRender } = useInitialize({ kcContext, doUseDefaultCss });
|
|
45
51
|
</script>
|
|
46
52
|
|
|
47
53
|
{#if $isReadyToRender}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
type FormAction,
|
|
5
5
|
} from '@keycloakify/svelte/login/lib/useUserProfileForm';
|
|
6
6
|
import type { Attribute } from 'keycloakify/login/KcContext';
|
|
7
|
-
import type
|
|
7
|
+
import { untrack, type EventDispatcher } from 'svelte';
|
|
8
8
|
import type { Readable } from 'svelte/store';
|
|
9
9
|
import type { I18n } from '../i18n';
|
|
10
10
|
|
|
@@ -17,11 +17,13 @@
|
|
|
17
17
|
};
|
|
18
18
|
const { attribute, values, fieldIndex, dispatchFormAction, i18n }: AddRemoveButtonsMultiValuedAttributeProps =
|
|
19
19
|
$props();
|
|
20
|
-
const { msg } = $i18n;
|
|
20
|
+
const { msg } = $derived($i18n);
|
|
21
21
|
|
|
22
|
-
const { hasAdd, hasRemove } =
|
|
22
|
+
const { hasAdd, hasRemove } = $derived(
|
|
23
|
+
getButtonToDisplayForMultivaluedAttributeField({ attribute, values, fieldIndex }),
|
|
24
|
+
);
|
|
23
25
|
|
|
24
|
-
const idPostfix = `-${attribute.name}-${fieldIndex + 1}`;
|
|
26
|
+
const idPostfix = `-${untrack(() => attribute.name)}-${untrack(() => fieldIndex) + 1}`;
|
|
25
27
|
</script>
|
|
26
28
|
|
|
27
29
|
{#if hasRemove}
|