diff --git a/.gitea/workflows/code_check.yml b/.gitea/workflows/code_check.yml index b63c88c7..df49d094 100644 --- a/.gitea/workflows/code_check.yml +++ b/.gitea/workflows/code_check.yml @@ -51,7 +51,11 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "24" + cache: "npm" + cache-dependency-path: | + adminfront/package-lock.json + devfront/package-lock.json - name: i18n resource check run: | @@ -308,10 +312,25 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "24" cache: "npm" cache-dependency-path: userfront-e2e/package-lock.json + - name: Get Playwright version + id: playwright-version + run: | + cd userfront-e2e + echo "version=$(npm list @playwright/test | grep @playwright/test | awk -F@ '{print $NF}')" >> "$GITHUB_OUTPUT" + + - name: Cache Playwright Browsers + uses: actions/cache@v4 + id: playwright-cache + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Setup Flutter uses: subosito/flutter-action@v2 with: @@ -524,11 +543,28 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "24" cache: "npm" cache-dependency-path: adminfront/package-lock.json + - name: Get Playwright version + id: playwright-version + run: | + cd adminfront + echo "version=$(npm list @playwright/test | grep @playwright/test | awk -F@ '{print $NF}')" >> "$GITHUB_OUTPUT" + + - name: Cache Playwright Browsers + uses: actions/cache@v4 + id: playwright-cache + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Run adminfront tests + env: + PLAYWRIGHT_WORKERS: 2 run: | scripts/run_adminfront_ci_tests.sh adminfront-tests @@ -602,10 +638,25 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "24" cache: "npm" cache-dependency-path: devfront/package-lock.json + - name: Get Playwright version + id: playwright-version + run: | + cd devfront + echo "version=$(npm list @playwright/test | grep @playwright/test | awk -F@ '{print $NF}')" >> "$GITHUB_OUTPUT" + + - name: Cache Playwright Browsers + uses: actions/cache@v4 + id: playwright-cache + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Install devfront dependencies run: | mkdir -p reports @@ -666,6 +717,8 @@ jobs: fi - name: Run devfront tests + env: + PLAYWRIGHT_WORKERS: 2 run: | mkdir -p reports set +e diff --git a/adminfront/i18n-scan-output.txt b/adminfront/i18n-scan-output.txt new file mode 100644 index 00000000..d89397ed --- /dev/null +++ b/adminfront/i18n-scan-output.txt @@ -0,0 +1,474 @@ + +> adminfront@0.0.0 i18n-scan +> cd .. && node tools/i18n-scanner/index.js && node tools/i18n-scanner/report.js + + +ko.toml에 없는 키 +- ui.admin.users.list.table.msg.admin.users.detail.history_desc +- ui.admin.users.list.table.msg.admin.users.detail.no_history +- ui.admin.users.list.table.msg.admin.users.detail.no_tenants +- ui.admin.users.list.table.msg.admin.users.detail.reset_auto_desc +- ui.admin.users.list.table.msg.admin.users.detail.security_desc +- ui.admin.users.list.table.msg.admin.users.detail.tenant_slug_help +- ui.admin.users.list.table.msg.admin.users.detail.tenants_desc +- ui.admin.users.list.table.msg.common.copied +- ui.admin.users.list.table.msg.dev.clients.general.public_key.allowed_algorithms_tooltip +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithm_badge +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithm_reason +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithms_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithms_title +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.parsed_keys_empty +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.parsed_keys_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithm_reason +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithms_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithms_title +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_empty +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_refresh_failed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_refreshed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoke_confirm +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoke_failed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoked +- ui.admin.users.list.table.msg.dev.clients.general.public_key.validation.missing_parsed_algorithms +- ui.admin.users.list.table.msg.dev.clients.general.public_key.validation.unsupported_parsed_algorithms +- ui.admin.users.list.table.ui.admin.users.create.form.is_login_id +- ui.admin.users.list.table.ui.admin.users.detail.form.email +- ui.admin.users.list.table.ui.admin.users.detail.form.is_login_id +- ui.admin.users.list.table.ui.admin.users.detail.form.role_rp_admin +- ui.admin.users.list.table.ui.admin.users.detail.form.tenant_slug +- ui.admin.users.list.table.ui.admin.users.detail.generate_button +- ui.admin.users.list.table.ui.admin.users.detail.history_title +- ui.admin.users.list.table.ui.admin.users.detail.manual_confirm +- ui.admin.users.list.table.ui.admin.users.detail.manual_password +- ui.admin.users.list.table.ui.admin.users.detail.password_done +- ui.admin.users.list.table.ui.admin.users.detail.reset_auto +- ui.admin.users.list.table.ui.admin.users.detail.reset_execute +- ui.admin.users.list.table.ui.admin.users.detail.reset_manual +- ui.admin.users.list.table.ui.admin.users.detail.save_tenants +- ui.admin.users.list.table.ui.admin.users.detail.tabs.info +- ui.admin.users.list.table.ui.admin.users.detail.tabs.security +- ui.admin.users.list.table.ui.admin.users.detail.tabs.tenants +- ui.admin.users.list.table.ui.admin.users.detail.updated_at +- ui.admin.users.list.table.ui.common.generate +- ui.admin.users.list.table.ui.common.status.blocked +- ui.admin.users.list.table.ui.dev.clients.general.public_key.allowed_algorithms_info +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_client_secret_basic +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_none +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_private_key_jwt +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.cached_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.error +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.expires_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.failures +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.kids +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.last_checked_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.last_success +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.parsed_key_n +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.parsed_keys +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.status +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.title +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.uri +- ui.admin.users.list.table.ui.dev.clients.general.public_key.guide_toggle +- ui.admin.users.list.table.ui.dev.clients.general.public_key.headless_disabled +- ui.admin.users.list.table.ui.dev.clients.general.public_key.headless_enabled +- ui.admin.users.list.table.ui.dev.clients.general.public_key.jwks_inline +- ui.admin.users.list.table.ui.dev.clients.general.public_key.jwks_inline_placeholder +- ui.admin.users.list.table.ui.dev.clients.general.public_key.request_object_alg +- ui.admin.users.list.table.ui.dev.clients.general.public_key.request_object_alg_placeholder +- ui.admin.users.list.table.ui.dev.clients.general.public_key.revoke_cache +- ui.admin.users.list.table.ui.dev.clients.general.public_key.source +- ui.admin.users.list.table.ui.dev.clients.general.public_key.source_uri +- ui.admin.users.list.table.ui.dev.clients.general.security.trusted_rp_enable +- ui.admin.users.list.table.ui.dev.clients.general.security.trusted_rp_enable_help +- ui.admin.users.list.table.ui.dev.clients.help.docs_body +- ui.admin.users.list.table.ui.dev.clients.help.subtitle +- ui.admin.users.list.table.ui.dev.clients.registry.description +- ui.admin.users.list.table.ui.dev.clients.scopes.email +- ui.admin.users.list.table.ui.dev.clients.scopes.openid +- ui.admin.users.list.table.ui.dev.clients.scopes.profile +- ui.admin.users.list.table.ui.dev.session.refresh +- ui.admin.users.list.table.ui.dev.session.refreshing + +en.toml에 없는 키 +- ui.admin.users.list.table.msg.admin.users.detail.history_desc +- ui.admin.users.list.table.msg.admin.users.detail.no_history +- ui.admin.users.list.table.msg.admin.users.detail.no_tenants +- ui.admin.users.list.table.msg.admin.users.detail.reset_auto_desc +- ui.admin.users.list.table.msg.admin.users.detail.security_desc +- ui.admin.users.list.table.msg.admin.users.detail.tenant_slug_help +- ui.admin.users.list.table.msg.admin.users.detail.tenants_desc +- ui.admin.users.list.table.msg.common.copied +- ui.admin.users.list.table.msg.dev.clients.general.public_key.allowed_algorithms_tooltip +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithm_badge +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithm_reason +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithms_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithms_title +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.parsed_keys_empty +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.parsed_keys_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithm_reason +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithms_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithms_title +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_empty +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_refresh_failed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_refreshed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoke_confirm +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoke_failed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoked +- ui.admin.users.list.table.msg.dev.clients.general.public_key.validation.missing_parsed_algorithms +- ui.admin.users.list.table.msg.dev.clients.general.public_key.validation.unsupported_parsed_algorithms +- ui.admin.users.list.table.ui.admin.users.create.form.is_login_id +- ui.admin.users.list.table.ui.admin.users.detail.form.email +- ui.admin.users.list.table.ui.admin.users.detail.form.is_login_id +- ui.admin.users.list.table.ui.admin.users.detail.form.role_rp_admin +- ui.admin.users.list.table.ui.admin.users.detail.form.tenant_slug +- ui.admin.users.list.table.ui.admin.users.detail.generate_button +- ui.admin.users.list.table.ui.admin.users.detail.history_title +- ui.admin.users.list.table.ui.admin.users.detail.manual_confirm +- ui.admin.users.list.table.ui.admin.users.detail.manual_password +- ui.admin.users.list.table.ui.admin.users.detail.password_done +- ui.admin.users.list.table.ui.admin.users.detail.reset_auto +- ui.admin.users.list.table.ui.admin.users.detail.reset_execute +- ui.admin.users.list.table.ui.admin.users.detail.reset_manual +- ui.admin.users.list.table.ui.admin.users.detail.save_tenants +- ui.admin.users.list.table.ui.admin.users.detail.tabs.info +- ui.admin.users.list.table.ui.admin.users.detail.tabs.security +- ui.admin.users.list.table.ui.admin.users.detail.tabs.tenants +- ui.admin.users.list.table.ui.admin.users.detail.updated_at +- ui.admin.users.list.table.ui.common.generate +- ui.admin.users.list.table.ui.common.status.blocked +- ui.admin.users.list.table.ui.dev.clients.general.public_key.allowed_algorithms_info +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_client_secret_basic +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_none +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_private_key_jwt +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.cached_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.error +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.expires_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.failures +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.kids +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.last_checked_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.last_success +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.parsed_key_n +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.parsed_keys +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.status +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.title +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.uri +- ui.admin.users.list.table.ui.dev.clients.general.public_key.guide_toggle +- ui.admin.users.list.table.ui.dev.clients.general.public_key.headless_disabled +- ui.admin.users.list.table.ui.dev.clients.general.public_key.headless_enabled +- ui.admin.users.list.table.ui.dev.clients.general.public_key.jwks_inline +- ui.admin.users.list.table.ui.dev.clients.general.public_key.jwks_inline_placeholder +- ui.admin.users.list.table.ui.dev.clients.general.public_key.request_object_alg +- ui.admin.users.list.table.ui.dev.clients.general.public_key.request_object_alg_placeholder +- ui.admin.users.list.table.ui.dev.clients.general.public_key.revoke_cache +- ui.admin.users.list.table.ui.dev.clients.general.public_key.source +- ui.admin.users.list.table.ui.dev.clients.general.public_key.source_uri +- ui.admin.users.list.table.ui.dev.clients.general.security.trusted_rp_enable +- ui.admin.users.list.table.ui.dev.clients.general.security.trusted_rp_enable_help +- ui.admin.users.list.table.ui.dev.clients.help.docs_body +- ui.admin.users.list.table.ui.dev.clients.help.subtitle +- ui.admin.users.list.table.ui.dev.clients.registry.description +- ui.admin.users.list.table.ui.dev.clients.scopes.email +- ui.admin.users.list.table.ui.dev.clients.scopes.openid +- ui.admin.users.list.table.ui.dev.clients.scopes.profile +- ui.admin.users.list.table.ui.dev.session.refresh +- ui.admin.users.list.table.ui.dev.session.refreshing + +template.toml에 없는 코드 사용 키 +- msg.admin.users.detail.history_desc +- msg.admin.users.detail.no_history +- msg.admin.users.detail.no_tenants +- msg.admin.users.detail.reset_auto_desc +- msg.admin.users.detail.security_desc +- msg.admin.users.detail.tenant_slug_help +- msg.admin.users.detail.tenants_desc +- msg.common.copied +- msg.dev.clients.general.public_key.allowed_algorithms_tooltip +- msg.dev.clients.general.public_key.cache.missing_algorithm_badge +- msg.dev.clients.general.public_key.cache.missing_algorithm_reason +- msg.dev.clients.general.public_key.cache.missing_algorithms_help +- msg.dev.clients.general.public_key.cache.missing_algorithms_title +- msg.dev.clients.general.public_key.cache.parsed_keys_empty +- msg.dev.clients.general.public_key.cache.parsed_keys_help +- msg.dev.clients.general.public_key.cache.unsupported_algorithm_reason +- msg.dev.clients.general.public_key.cache.unsupported_algorithms_help +- msg.dev.clients.general.public_key.cache.unsupported_algorithms_title +- msg.dev.clients.general.public_key.cache_empty +- msg.dev.clients.general.public_key.cache_help +- msg.dev.clients.general.public_key.cache_refresh_failed +- msg.dev.clients.general.public_key.cache_refreshed +- msg.dev.clients.general.public_key.cache_revoke_confirm +- msg.dev.clients.general.public_key.cache_revoke_failed +- msg.dev.clients.general.public_key.cache_revoked +- msg.dev.clients.general.public_key.validation.missing_parsed_algorithms +- msg.dev.clients.general.public_key.validation.unsupported_parsed_algorithms +- ui.admin.users.create.form.is_login_id +- ui.admin.users.detail.form.email +- ui.admin.users.detail.form.is_login_id +- ui.admin.users.detail.form.role_rp_admin +- ui.admin.users.detail.form.tenant_slug +- ui.admin.users.detail.generate_button +- ui.admin.users.detail.history_title +- ui.admin.users.detail.manual_confirm +- ui.admin.users.detail.manual_password +- ui.admin.users.detail.password_done +- ui.admin.users.detail.reset_auto +- ui.admin.users.detail.reset_execute +- ui.admin.users.detail.reset_manual +- ui.admin.users.detail.save_tenants +- ui.admin.users.detail.tabs.info +- ui.admin.users.detail.tabs.security +- ui.admin.users.detail.tabs.tenants +- ui.admin.users.detail.updated_at +- ui.dev.clients.general.public_key.allowed_algorithms_info +- ui.dev.clients.general.public_key.cache.cached_at +- ui.dev.clients.general.public_key.cache.error +- ui.dev.clients.general.public_key.cache.expires_at +- ui.dev.clients.general.public_key.cache.failures +- ui.dev.clients.general.public_key.cache.kids +- ui.dev.clients.general.public_key.cache.last_checked_at +- ui.dev.clients.general.public_key.cache.last_success +- ui.dev.clients.general.public_key.cache.parsed_key_n +- ui.dev.clients.general.public_key.cache.parsed_keys +- ui.dev.clients.general.public_key.cache.status +- ui.dev.clients.general.public_key.cache.title +- ui.dev.clients.general.public_key.cache.uri +- ui.dev.clients.general.public_key.revoke_cache + +코드에서 사용되지 않는 키 +- err.backend.authorization_pending +- err.backend.bad_request +- err.backend.conflict +- err.backend.expired_token +- err.backend.forbidden +- err.backend.internal_error +- err.backend.invalid_code +- err.backend.invalid_or_expired_code +- err.backend.invalid_session +- err.backend.invalid_session_reference +- err.backend.not_found +- err.backend.not_supported +- err.backend.password_or_email_mismatch +- err.backend.rate_limited +- err.backend.service_unavailable +- err.backend.slow_down +- msg.admin.groups.create.description +- msg.admin.groups.create.title +- msg.admin.groups.list.import_error +- msg.admin.groups.list.import_success +- msg.admin.header.subtitle +- msg.admin.idp_env_prod +- msg.admin.notice.idp_policy +- msg.admin.notice.scope +- msg.admin.overview.idp_fallback +- msg.admin.overview.idp_primary +- msg.admin.overview.playbook.description +- msg.admin.overview.playbook.idp_body +- msg.admin.overview.playbook.idp_title +- msg.admin.overview.playbook.tenant_body +- msg.admin.overview.playbook.tenant_title +- msg.admin.overview.quick_links.description +- msg.admin.overview.summary.audit_events_24h +- msg.admin.overview.summary.oidc_clients +- msg.admin.overview.summary.policy_gate +- msg.admin.overview.summary.total_tenants +- msg.admin.scope_admin +- msg.admin.session_ttl +- msg.admin.tenant_headers +- msg.admin.users.create.form.login_id_help +- msg.admin.users.detail.delete_error +- msg.admin.users.detail.password_generated_help +- msg.admin.users.detail.reset_password_confirm +- msg.admin.users.detail.security.password_hint +- msg.admin.users.detail.update_success +- msg.common.copied_to_clipboard +- msg.dev.audit.forbidden +- msg.dev.clients.general.public_key.auth_method_client_secret_basic_help +- msg.dev.clients.general.public_key.auth_method_none_help +- msg.dev.clients.general.public_key.auth_method_private_key_jwt_help +- msg.dev.clients.general.public_key.guide_example +- msg.dev.clients.general.public_key.guide_intro +- msg.dev.clients.general.public_key.guide_step_1 +- msg.dev.clients.general.public_key.guide_step_2 +- msg.dev.clients.general.public_key.guide_step_3 +- msg.dev.clients.general.public_key.jwks_inline_help +- msg.dev.clients.general.public_key.request_object_alg_help +- msg.dev.clients.general.public_key.source_help +- msg.dev.clients.general.public_key.validation.headless_requires_alg +- msg.dev.clients.general.public_key.validation.headless_requires_private_key_jwt +- msg.dev.clients.general.public_key.validation.headless_requires_public_key +- msg.dev.clients.general.public_key.validation.invalid_jwks_inline +- msg.dev.clients.general.public_key.validation.missing_jwks_inline +- msg.dev.clients.general.public_key.validation.private_key_jwt_requires_public_key +- msg.userfront.signup.privacy_full +- msg.userfront.signup.tos_full +- non.existent.key +- test.key +- ui.admin.api_keys.list.breadcrumb.list +- ui.admin.api_keys.list.breadcrumb.section +- ui.admin.audit.breadcrumb.logs +- ui.admin.audit.breadcrumb.section +- ui.admin.groups.import_csv +- ui.admin.overview.kicker +- ui.admin.overview.playbook.title +- ui.admin.overview.quick_links.add_tenant +- ui.admin.overview.quick_links.api_key_management +- ui.admin.overview.quick_links.user_management +- ui.admin.overview.quick_links.view_audit_logs +- ui.admin.tenants.breadcrumb.list +- ui.admin.tenants.breadcrumb.section +- ui.admin.tenants.create.breadcrumb.action +- ui.admin.tenants.create.breadcrumb.section +- ui.admin.tenants.detail.breadcrumb_list +- ui.admin.tenants.detail.title +- ui.admin.users.create.breadcrumb.new +- ui.admin.users.create.breadcrumb.section +- ui.admin.users.create.form.login_id +- ui.admin.users.create.form.login_id_placeholder +- ui.admin.users.detail.breadcrumb.section +- ui.admin.users.detail.contact_title +- ui.admin.users.detail.form.department_placeholder +- ui.admin.users.detail.form.job_title_placeholder +- ui.admin.users.detail.form.login_id +- ui.admin.users.detail.form.login_id_placeholder +- ui.admin.users.detail.form.name_placeholder +- ui.admin.users.detail.form.phone_placeholder +- ui.admin.users.detail.form.position_placeholder +- ui.admin.users.detail.form.status_active +- ui.admin.users.detail.form.status_inactive +- ui.admin.users.detail.generate_password +- ui.admin.users.detail.password_mode_generated +- ui.admin.users.detail.password_mode_manual +- ui.admin.users.detail.password_result_title +- ui.admin.users.detail.reset_password_apply +- ui.admin.users.detail.security.password +- ui.admin.users.detail.security.password_placeholder +- ui.admin.users.detail.security.title +- ui.admin.users.detail.status_title +- ui.admin.users.detail.tenants_section.additional +- ui.admin.users.detail.tenants_section.primary +- ui.admin.users.detail.tenants_section.title +- ui.admin.users.detail.title +- ui.admin.users.detail.toggle_password_visibility +- ui.admin.users.list.breadcrumb.list +- ui.admin.users.list.breadcrumb.section +- ui.admin.users.list.empty +- ui.admin.users.list.fetch_error +- ui.admin.users.list.registry.count +- ui.admin.users.list.subtitle +- ui.admin.users.list.table.login_id +- ui.admin.users.list.table.msg.admin.users.detail.history_desc +- ui.admin.users.list.table.msg.admin.users.detail.no_history +- ui.admin.users.list.table.msg.admin.users.detail.no_tenants +- ui.admin.users.list.table.msg.admin.users.detail.reset_auto_desc +- ui.admin.users.list.table.msg.admin.users.detail.security_desc +- ui.admin.users.list.table.msg.admin.users.detail.tenant_slug_help +- ui.admin.users.list.table.msg.admin.users.detail.tenants_desc +- ui.admin.users.list.table.msg.common.copied +- ui.admin.users.list.table.msg.dev.clients.general.public_key.allowed_algorithms_tooltip +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithm_badge +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithm_reason +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithms_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.missing_algorithms_title +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.parsed_keys_empty +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.parsed_keys_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithm_reason +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithms_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache.unsupported_algorithms_title +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_empty +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_help +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_refresh_failed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_refreshed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoke_confirm +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoke_failed +- ui.admin.users.list.table.msg.dev.clients.general.public_key.cache_revoked +- ui.admin.users.list.table.msg.dev.clients.general.public_key.validation.missing_parsed_algorithms +- ui.admin.users.list.table.msg.dev.clients.general.public_key.validation.unsupported_parsed_algorithms +- ui.admin.users.list.table.ui.admin.users.create.form.is_login_id +- ui.admin.users.list.table.ui.admin.users.detail.form.email +- ui.admin.users.list.table.ui.admin.users.detail.form.is_login_id +- ui.admin.users.list.table.ui.admin.users.detail.form.role_rp_admin +- ui.admin.users.list.table.ui.admin.users.detail.form.tenant_slug +- ui.admin.users.list.table.ui.admin.users.detail.generate_button +- ui.admin.users.list.table.ui.admin.users.detail.history_title +- ui.admin.users.list.table.ui.admin.users.detail.manual_confirm +- ui.admin.users.list.table.ui.admin.users.detail.manual_password +- ui.admin.users.list.table.ui.admin.users.detail.password_done +- ui.admin.users.list.table.ui.admin.users.detail.reset_auto +- ui.admin.users.list.table.ui.admin.users.detail.reset_execute +- ui.admin.users.list.table.ui.admin.users.detail.reset_manual +- ui.admin.users.list.table.ui.admin.users.detail.save_tenants +- ui.admin.users.list.table.ui.admin.users.detail.tabs.info +- ui.admin.users.list.table.ui.admin.users.detail.tabs.security +- ui.admin.users.list.table.ui.admin.users.detail.tabs.tenants +- ui.admin.users.list.table.ui.admin.users.detail.updated_at +- ui.admin.users.list.table.ui.common.generate +- ui.admin.users.list.table.ui.common.status.blocked +- ui.admin.users.list.table.ui.dev.clients.general.public_key.allowed_algorithms_info +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_client_secret_basic +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_none +- ui.admin.users.list.table.ui.dev.clients.general.public_key.auth_method_private_key_jwt +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.cached_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.error +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.expires_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.failures +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.kids +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.last_checked_at +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.last_success +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.parsed_key_n +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.parsed_keys +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.status +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.title +- ui.admin.users.list.table.ui.dev.clients.general.public_key.cache.uri +- ui.admin.users.list.table.ui.dev.clients.general.public_key.guide_toggle +- ui.admin.users.list.table.ui.dev.clients.general.public_key.headless_disabled +- ui.admin.users.list.table.ui.dev.clients.general.public_key.headless_enabled +- ui.admin.users.list.table.ui.dev.clients.general.public_key.jwks_inline +- ui.admin.users.list.table.ui.dev.clients.general.public_key.jwks_inline_placeholder +- ui.admin.users.list.table.ui.dev.clients.general.public_key.request_object_alg +- ui.admin.users.list.table.ui.dev.clients.general.public_key.request_object_alg_placeholder +- ui.admin.users.list.table.ui.dev.clients.general.public_key.revoke_cache +- ui.admin.users.list.table.ui.dev.clients.general.public_key.source +- ui.admin.users.list.table.ui.dev.clients.general.public_key.source_uri +- ui.admin.users.list.table.ui.dev.clients.general.security.trusted_rp_enable +- ui.admin.users.list.table.ui.dev.clients.general.security.trusted_rp_enable_help +- ui.admin.users.list.table.ui.dev.clients.help.docs_body +- ui.admin.users.list.table.ui.dev.clients.help.subtitle +- ui.admin.users.list.table.ui.dev.clients.registry.description +- ui.admin.users.list.table.ui.dev.clients.scopes.email +- ui.admin.users.list.table.ui.dev.clients.scopes.openid +- ui.admin.users.list.table.ui.dev.clients.scopes.profile +- ui.admin.users.list.table.ui.dev.session.refresh +- ui.admin.users.list.table.ui.dev.session.refreshing +- ui.common.generate +- ui.common.status.blocked +- ui.dev.clients.general.public_key.auth_method +- ui.dev.clients.general.public_key.auth_method_client_secret_basic +- ui.dev.clients.general.public_key.auth_method_none +- ui.dev.clients.general.public_key.auth_method_private_key_jwt +- ui.dev.clients.general.public_key.guide_toggle +- ui.dev.clients.general.public_key.headless_disabled +- ui.dev.clients.general.public_key.headless_enabled +- ui.dev.clients.general.public_key.jwks_inline +- ui.dev.clients.general.public_key.jwks_inline_placeholder +- ui.dev.clients.general.public_key.request_object_alg +- ui.dev.clients.general.public_key.request_object_alg_placeholder +- ui.dev.clients.general.public_key.source +- ui.dev.clients.general.public_key.source_uri +- ui.dev.clients.general.security.trusted_rp_enable +- ui.dev.clients.general.security.trusted_rp_enable_help +- ui.dev.clients.help.docs_body +- ui.dev.clients.help.subtitle +- ui.dev.clients.registry.description +- ui.dev.clients.scopes.email +- ui.dev.clients.scopes.openid +- ui.dev.clients.scopes.profile +- ui.dev.session.refresh +- ui.dev.session.refreshing + +요약 +- [Sync Error] ko.toml 누락 키 84개 +- [Sync Error] en.toml 누락 키 84개 +- [Missing Key] template.toml 누락 키 59개 diff --git a/adminfront/playwright.config.ts b/adminfront/playwright.config.ts index 2acbace2..d1dc80d0 100644 --- a/adminfront/playwright.config.ts +++ b/adminfront/playwright.config.ts @@ -30,7 +30,7 @@ export default defineConfig({ /* Opt out of parallel tests on CI. */ workers: configuredWorkers ?? (process.env.CI ? 1 : undefined), /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: "html", + reporter: [["html", { open: "never" }], ["list"]], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ @@ -61,7 +61,9 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { - command: "npm run dev", + command: process.env.CI + ? "npm run build && npm run preview -- --port 5173" + : "npm run dev", url: "http://localhost:5173", reuseExistingServer: !process.env.CI, timeout: 120 * 1000, diff --git a/adminfront/src/features/tenants/routes/TenantSchemaPage.tsx b/adminfront/src/features/tenants/routes/TenantSchemaPage.tsx index 17ff2bdf..7b4fefa3 100644 --- a/adminfront/src/features/tenants/routes/TenantSchemaPage.tsx +++ b/adminfront/src/features/tenants/routes/TenantSchemaPage.tsx @@ -97,7 +97,6 @@ export function TenantSchemaPage() { useEffect(() => { const rawSchema = tenantQuery.data?.config?.userSchema; - const loginIdField = tenantQuery.data?.config?.loginIdField; if (Array.isArray(rawSchema)) { setFields( @@ -118,7 +117,7 @@ export function TenantSchemaPage() { validation: typeof field?.validation === "string" ? field.validation : "", unsigned: Boolean(field?.unsigned), - isLoginId: field?.key === loginIdField, + isLoginId: Boolean(field?.isLoginId), })), ); } @@ -126,13 +125,13 @@ export function TenantSchemaPage() { const updateMutation = useMutation({ mutationFn: (newFields: SchemaField[]) => { - const loginIdField = newFields.find((f) => f.isLoginId)?.key || ""; + // Remove legacy loginIdField, keep isLoginId natively in userSchema + const newConfig = { ...tenantQuery.data?.config }; + newConfig.loginIdField = undefined; + newConfig.userSchema = newFields; + return updateTenant(tenantId, { - config: { - ...tenantQuery.data?.config, - userSchema: newFields, - loginIdField: loginIdField, - }, + config: newConfig, }); }, onSuccess: () => { @@ -344,14 +343,10 @@ export function TenantSchemaPage() {