Skip to content

Conversation

@myieye
Copy link
Collaborator

@myieye myieye commented Dec 2, 2025

No description provided.

@coderabbitai
Copy link

coderabbitai bot commented Dec 2, 2025

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

This pull request encompasses significant frontend refactoring and backend cleanup. Major changes include dependency version upgrades, introduction of path resolution patterns throughout the application, a comprehensive form type system overhaul from Zod-based to validation-schema-based types, conversion of ViewMode from a const enum to string literals, and type narrowing improvements across utility functions.

Changes

Cohort / File(s) Summary
Backend cleanup
backend/LexBoxApi/Services/HgService.cs
Removed unused using directives (System.Diagnostics, System.Net.Http.Headers, System.Text)
Frontend configuration & dependencies
frontend/eslint.config.js, frontend/package.json, frontend/pnpm-workspace.yaml, frontend/playwright.config.ts
ESLint plugin updates with new imports and quote rule refinement; broad devDependency/dependency version bumps (dotenvx, SvelteKit, Tailwind, urql, zod, OpenTelemetry packages); pnpm catalog updates with new Playwright, Vitest, ESLint, and Svelte tooling; Playwright storageStateOrigins config updated to use serverBaseUrl
Type system foundation
frontend/src/lib/type.utils.ts, frontend/src/lib/forms/types.ts, frontend/src/lib/forms/superforms.ts, frontend/src/lib/i18n/index.ts
OmitNever and OrIfNever refactored to use If/IsNever; DeepPaths simplified to exclude base key paths; replaced AnySuperForm with FormEnhance type; comprehensive form state redesign using ZodValidationSchema and Infer; I18nPaths introduced for path-based i18n resolution
Application types & locals
frontend/src/app.d.ts, frontend/src/routes/+layout.server.ts, frontend/src/routes/(authenticated)/+layout.ts
Added optional projectViewMode to App.Locals; extended layout load return types to include projectViewMode from parent data
Path resolution implementation
frontend/src/lib/layout/{AppBar,AppMenu,Breadcrumbs/*,Footer,Layout}.svelte, frontend/src/routes/(authenticated)/org/list/+page.svelte, frontend/src/routes/(authenticated)/project/[project_code]/{+page,OpenInFlexButton,OrgList}.svelte, frontend/src/routes/(unauthenticated)/{login,register,forgotPassword,sandbox}/+page.svelte
Imported resolve from $app/paths and applied dynamic path resolution to navigation hrefs and goto calls throughout application
ViewMode refactoring
frontend/src/routes/(authenticated)/shared.ts, frontend/src/routes/(authenticated)/+page.svelte, frontend/src/routes/(authenticated)/+page.ts
Converted ViewMode from const enum (Table/Grid) to type alias ('table'
Form system overhaul
frontend/src/lib/forms/{Form,MaybeProtectedForm,ProtectedForm,Input,UserTypeahead}.svelte, frontend/src/lib/components/{EditableText,modals/FormModal,modals/ConfirmDeleteModal}.svelte
Replaced AnySuperForm with FormEnhance type; converted Form.enhance optional chaining syntax; switched Input.currentType from $state to $derived; updated form validation error handling to use error property; FormModal refactored to use ZodValidationSchema with Infer-based typing; added resetForm and taintedMessage options
Component store reactivity
frontend/src/lib/components/{IconButton,FilterBar}.svelte, frontend/src/lib/email/{ApproveProjectRequest,CreateProjectRequest,JoinProjectRequest,UserAdded}.svelte
Updated multiple components to use $derived instead of $state for computed values; FilterBar switched from manual watcher to derived-store pattern; email templates now use $derived for URL construction
Type narrowing & utilities
frontend/src/lib/util/{project,query-params,types}.ts, frontend/src/lib/user.ts
Narrowed projectUrl return type to `/project/${string}`; constrained getHomePath to `'/admin'
Component prop type refinements
frontend/src/lib/components/{RegisterWithGoogleButton,SigninWithGoogleButton,Projects/ProjectFilter,Projects/ProjectTable}.svelte, frontend/src/lib/layout/Breadcrumbs/PageBreadcrumb.svelte
RegisterWithGoogleButton derived Props from SigninWithGoogleButton via ComponentProps; SigninWithGoogleButton narrowed href to `/api/login/google${string}`; ProjectFilter.DraftProject narrowed createUrl to optional /project/create?${string}; PageBreadcrumb.href typed as ResolvedPathname
Markdown & navigation components
frontend/src/lib/components/Markdown/NewTabLinkRenderer.svelte, frontend/src/lib/components/help/{SupHelp,index}.ts
Added rel="noopener noreferrer" for security; added ESLint directives for navigation; helpLinks converted to const assertion for literal type inference
Email validation refinement
frontend/src/lib/components/Users/{CreateUser,UserProjects}.svelte, frontend/src/routes/(authenticated)/org/[org_id]/{+page,AddOrgMemberModal}.svelte, frontend/src/routes/(authenticated)/project/[project_code]/{AddProjectMember,ResetProjectModal}.svelte
Zod refine error handling standardized to use error property instead of message across validation schemas
Error handling & telemetry
frontend/src/lib/error/{UnexpectedError,UnexpectedErrorAlert}.svelte, frontend/src/lib/otel/{otel.client,otel.server,trace-exporter-browser-with-xhr-retry}.ts, frontend/src/lib/otel/types.ts
Added try-catch for dialog open; replaced template literals with plain strings; OpenTelemetry resource construction refactored using semantic convention attributes; trace exporter refactored from send() to export() method with ExportResult handling; updated span processor to array-based configuration
Layout & page components
frontend/src/routes/(authenticated)/org/[org_id]/+page.svelte, frontend/src/routes/(authenticated)/project/[project_code]/+page.svelte, frontend/src/routes/(authenticated)/+page.svelte, frontend/src/routes/+error.svelte
Integrated resolve path resolution throughout navigation; replaced goto calls with resolved paths; updated PageBreadcrumb hrefs to use resolve(); added derived projectStore
Admin & shared pages
frontend/src/routes/(authenticated)/admin/{AdminProjects,EditUserAccount}.svelte, frontend/src/routes/(authenticated)/user/+page.svelte
Applied path resolution and lexSuperForm options (resetForm: false, taintedMessage); refined validation error handling in schemas
Test infrastructure updates
frontend/tests/{components/addMemberModal,components/authenticatedDrawer,email/{e2e-mailbox,email-page,maildev-mailbox},oauth,errorHandling,fixtures}.ts, frontend/tests/pages/{acceptInvitationPage,adminDashboardPage,basePage,createProjectPage,oidcDebuggerPage,registerPage,resetPasswordPage}.ts
OIDC/OAuth test refactored: fillForm now returns {codeVerifier}, token methods require codeVerifier parameter with dual-path retrieval (browser PKCE or manual token request); email tests converted enum to const enum; API URL checks broadened; string literals normalized

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • Form type system overhaul (frontend/src/lib/forms/superforms.ts, frontend/src/lib/forms/types.ts, frontend/src/lib/components/modals/FormModal.svelte) — Complex generic type migration from Zod-based to validation-schema-based; affects many dependent components
  • ViewMode conversion (frontend/src/routes/(authenticated)/shared.ts and dependencies) — Changes from enum to string literals with async getViewMode; verify all usages properly converted
  • Path resolution pattern consistency — Widespread introduction of resolve() from $app/paths across 30+ files; ensure pattern applied uniformly and no hardcoded paths remain where needed
  • OIDC debugger refactoring (frontend/tests/pages/oidcDebuggerPage.ts) — Significant logic addition for manual PKCE token retrieval including authorization response parsing
  • OpenTelemetry attribute changes (frontend/src/lib/otel/*) — Semantic convention attributes and new resource construction; verify correct HTTP attribute codes and export method signature changes

Possibly related PRs

Suggested labels

dependencies, frontend, refactor, type-system, forms

Suggested reviewers

  • rmunn
  • hahn-kev
  • imnasnainaec

Poem

🐰 Whisker-twitching through the code we go,
Path resolved with resolve() flow,
From enum hops to strings so bright,
Forms get types that feel just right,
Deps bump up, the tests do pass,
A rabbit's joy—this refactor's class! 🎉

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.52% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Description check ❓ Inconclusive No description was provided by the author; the PR lacks context explaining the scope, rationale, or impact of the dependency updates. Add a description explaining the dependency update strategy, any breaking changes, compatibility concerns, or testing performed to validate the updates.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Update npm dependencies' accurately reflects the main change—a broad set of dependency version updates across frontend package configuration files.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added 💻 FW Lite issues related to the fw lite application, not miniLcm or crdt related 📦 Lexbox issues related to any server side code, fw-headless included labels Dec 2, 2025
@github-actions
Copy link

github-actions bot commented Dec 2, 2025

UI unit Tests

  1 files  ±0   45 suites  ±0   17s ⏱️ -2s
111 tests ±0  111 ✅ ±0  0 💤 ±0  0 ❌ ±0 
160 runs  ±0  160 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit b77bffa. ± Comparison against base commit 9cc9b68.

♻️ This comment has been updated with latest results.

@argos-ci
Copy link

argos-ci bot commented Dec 2, 2025

The latest updates on your projects. Learn more about Argos notifications ↗︎

Build Status Details Updated (UTC)
default (Inspect) ✅ No changes detected - Dec 5, 2025, 9:41 AM

@github-actions
Copy link

github-actions bot commented Dec 2, 2025

C# Unit Tests

137 tests  ±0   137 ✅ ±0   20s ⏱️ +2s
 21 suites ±0     0 💤 ±0 
  1 files   ±0     0 ❌ ±0 

Results for commit b77bffa. ± Comparison against base commit 9cc9b68.

♻️ This comment has been updated with latest results.

@myieye myieye changed the base branch from develop to 2111-add-onlybuiltdependencies-to-all-packagejson-files December 2, 2025 15:49
@myieye myieye changed the base branch from 2111-add-onlybuiltdependencies-to-all-packagejson-files to develop December 2, 2025 18:49
@myieye myieye changed the base branch from develop to 2111-add-onlybuiltdependencies-to-all-packagejson-files December 2, 2025 18:51
Base automatically changed from 2111-add-onlybuiltdependencies-to-all-packagejson-files to develop December 2, 2025 18:51
@myieye myieye force-pushed the update-npm-dependencies branch 2 times, most recently from 24b4ee4 to 9640433 Compare December 4, 2025 15:03
@myieye myieye marked this pull request as ready for review December 4, 2025 18:50
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
frontend/src/routes/(authenticated)/org/[org_id]/AddOrgMemberModal.svelte (1)

22-30: Use message instead of error in .refine options

Zod's .refine() expects an options object with message (and optionally path/params), not error. The current code:

.refine((value) => !value.includes('@') || isEmail(value), { error: $t('form.invalid_email') })

will not apply the localized error message because Zod ignores the error property. The validation will pass or fail correctly, but users will see a generic error message instead of $t('form.invalid_email').

Change to:

.refine((value) => !value.includes('@') || isEmail(value), { message: $t('form.invalid_email') })
frontend/src/routes/(authenticated)/project/[project_code]/AddProjectMember.svelte (1)

19-27: Fix Zod .refine() error property to use standard message field

The email validation uses:

.refine((value) => !value.includes('@') || isEmail(value), { error: $t('form.invalid_email') })

Zod v4 expects the error definition in the message property, not error. The current pattern will not properly set validation messages, leaving client-side validation ineffective until the server responds with InvalidEmailError.

Change to:

.refine(
  (value) => !value.includes('@') || isEmail(value),
  { message: $t('form.invalid_email') },
)

Note: AddOrgMemberModal.svelte has the same issue and should be fixed consistently.

frontend/src/lib/forms/Input.svelte (1)

35-41: Critical bug: Cannot mutate a $derived value.

Line 35 changed currentType from $state(type) to $derived(type), but line 39 attempts to mutate this value. In Svelte 5, $derived() creates a read-only reactive value that cannot be reassigned. This will cause a runtime error when the user clicks the eye icon to toggle password visibility.

Apply this diff to fix the issue:

-  let currentType = $derived(type);
+  let currentType = $state(type);

The $state() rune is required here because currentType needs to be mutable for the toggle functionality in togglePasswordVisibility().

🧹 Nitpick comments (9)
frontend/src/lib/components/IconButton.svelte (1)

20-34: Outline derivation is correct; consider a clearer internal name

Using _outline plus const outline = $derived(_outline ?? variant !== 'btn-ghost') correctly:

  • Honors an explicitly passed outline={false}.
  • Falls back to variant !== 'btn-ghost' only when the prop is null/undefined.

If you want slightly clearer intent, you could rename _outline to something like outlineProp:

-    outline: _outline,
+    outline: outlineProp,
@@
-  const outline = $derived(_outline ?? variant !== 'btn-ghost');
+  const outline = $derived(outlineProp ?? variant !== 'btn-ghost');

Purely a readability nit; behavior looks good.

frontend/src/lib/error/UnexpectedError.svelte (1)

50-55: Consider guarding against missing traceId when building the Honeycomb URL

The removal of the explicit string cast on textContent makes the type more accurate (string | null) and is an improvement. While this doesn’t change runtime behavior, you may want to add a small guard so you don’t open a Honeycomb URL with trace_id=null if the span somehow lacks content:

   function onTraceIdClick(event: MouseEvent): void {
     if (event.ctrlKey) {
-      const traceId = (event.target as HTMLElement).textContent;
+      const traceId = (event.target as HTMLElement).textContent;
+      if (!traceId) return;
       const honeyCombEnv = getHoneyCombEnv();
       const url = `https://ui.honeycomb.io/sil-language-forge/environments/${honeyCombEnv}/trace?trace_id=${traceId}&${TIME_RANGE_2024_TO_2040}`;
       window.open(url, '_blank')?.focus();
     }
   }

This is optional but makes the click handler a bit more robust.

frontend/src/routes/(unauthenticated)/login/+page.svelte (1)

49-50: taintedMessage: false matches the current Superforms API

Changing from null to false is compatible with the newer superforms options, where taintedMessage is boolean | string | (() => Promise<boolean>) and false cleanly disables the leave-page prompt. (superforms.rocks)

Since false is now the library default, you could drop this option entirely once you’re confident you don’t want a tainted dialog here, but keeping it explicit is also fine.

frontend/src/lib/util/query-params.ts (2)

79-88: Align getBoolSearchParam key type with getSearchParam to avoid subtle divergence

getBoolSearchParam now uses key: keyof ConditionalPick<T, boolean>, while getSearchParam expects Exclude<keyof ConditionalPick<T, ...>, number | symbol>. Given T extends PrimitiveRecord this is fine today, but the two helpers now describe slightly different constraints. To keep them in lockstep and future‑proof against changes to PrimitiveRecord or ConditionalPick, consider:

export function getBoolSearchParam<T extends PrimitiveRecord>(
  key: Exclude<keyof ConditionalPick<T, boolean>, number | symbol>,
  params: URLSearchParams,
  defaultValue = false
): boolean {
  // ...
}

or extract a shared key alias re‑used by both functions. Based on learnings, this is an optional tidy‑up rather than a required change.


90-95: Key constraint change in getSearchParam looks good; consider a shared alias

Switching the key parameter to Exclude<keyof ConditionalPick<T, (R extends StandardEnum<unknown> ? R[keyof R] : R)>, number | symbol> more directly encodes that URLSearchParams keys are string‑only while preserving the existing enum/value picking behavior. To reduce duplication and keep helpers synchronized, you might extract this into a named type, e.g.:

type SearchParamKey<T extends PrimitiveRecord, R> =
  Exclude<keyof ConditionalPick<T, (R extends StandardEnum<unknown> ? R[keyof R] : R)>, number | symbol>;

and then use SearchParamKey<T, R> here (and in getBoolSearchParam) for readability and consistency.

frontend/src/lib/forms/UserTypeahead.svelte (1)

44-47: Consider simplifying the debounce option.

The IIFE (() => debounceMs)() immediately invokes and returns debounceMs, making it equivalent to just using debounceMs directly. Since debounceMs is a primitive number, the wrapping provides no benefit.

  const _typeaheadResults = resource(() => trigger,
    (value) => typeaheadSearch(value),
-   {initialValue: [], debounce: (() => debounceMs)()},
+   {initialValue: [], debounce: debounceMs},
  );
frontend/src/routes/(authenticated)/project/[project_code]/ResetProjectModal.svelte (1)

2-6: Use of $app/paths.resolve for the backup link looks correct

Importing resolve from $app/paths and using it for the backup download URL is aligned with current SvelteKit recommendations for base-aware path generation, so this should behave correctly even when config.kit.paths.base is non-root. (svelte.dev)

If you expect this app to run under a non-root base path, you may optionally also consider using resolve(...) (or another base-aware helper) for the fetch('/api/…') calls later in the file to keep API endpoints consistent, but that's not strictly required for this PR’s dependency bump focus.

Also applies to: 8-13, 133-140

frontend/src/lib/components/EditableText.svelte (1)

2-3: IIFE around validation is a no‑op and slightly obscures intent

(() => validation)() evaluates to validation, so the new formSchema is functionally identical to z.object({ value: validation }). Unless this shape is required for some typing quirk elsewhere, consider simplifying back to a direct reference (or adding a short comment on why the IIFE is needed) to keep the schema easier to read.

Also applies to: 30-30

frontend/src/lib/forms/superforms.ts (1)

74-77: getFormState TODO acknowledges a real edge case; safe to defer, but keep it tracked

The getFormState implementation using an external untaintedValues cache and sf.capture() gives you useful tainted/changed/originalValue/currentValue semantics, but the inline TODO correctly calls out that initialization/untainted tracking is not fully robust (especially when forms are initialized later with { taint: false }).

Since this behavior and the “99% sure we get all field keys” heuristic pre‑exist and you’ve now documented the bug clearly, I wouldn’t block this PR on reworking it. When you do tackle the TODO, it will likely be worth:

  • Re‑deriving untaintedValues from the last known untainted snapshot (or storing that snapshot explicitly).
  • Guarding sf.capture()/its .data/.constraints access for uninitialized forms.

Based on learnings, deferring that deeper refactor to a targeted follow‑up aligns with your preference to bundle such changes with the broader form‑state work.

Also applies to: 79-101

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9cc9b68 and 9640433.

⛔ Files ignored due to path filters (1)
  • frontend/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (107)
  • backend/LexBoxApi/Services/HgService.cs (0 hunks)
  • frontend/eslint.config.js (2 hunks)
  • frontend/package.json (1 hunks)
  • frontend/playwright.config.ts (1 hunks)
  • frontend/pnpm-workspace.yaml (1 hunks)
  • frontend/src/app.d.ts (1 hunks)
  • frontend/src/hooks.server.ts (1 hunks)
  • frontend/src/lib/components/EditableText.svelte (2 hunks)
  • frontend/src/lib/components/FilterBar/FilterBar.svelte (3 hunks)
  • frontend/src/lib/components/HgLogView.svelte (2 hunks)
  • frontend/src/lib/components/IconButton.svelte (2 hunks)
  • frontend/src/lib/components/Markdown/NewTabLinkRenderer.svelte (2 hunks)
  • frontend/src/lib/components/ProjectList.svelte (2 hunks)
  • frontend/src/lib/components/Projects/ProjectFilter.svelte (2 hunks)
  • frontend/src/lib/components/Projects/ProjectTable.svelte (3 hunks)
  • frontend/src/lib/components/RegisterWithGoogleButton.svelte (1 hunks)
  • frontend/src/lib/components/SigninWithGoogleButton.svelte (2 hunks)
  • frontend/src/lib/components/Users/CreateUser.svelte (3 hunks)
  • frontend/src/lib/components/Users/UserProjects.svelte (2 hunks)
  • frontend/src/lib/components/help/SupHelp.svelte (2 hunks)
  • frontend/src/lib/components/help/index.ts (1 hunks)
  • frontend/src/lib/components/modals/ConfirmDeleteModal.svelte (2 hunks)
  • frontend/src/lib/components/modals/FormModal.svelte (4 hunks)
  • frontend/src/lib/email/ApproveProjectRequest.svelte (1 hunks)
  • frontend/src/lib/email/CreateProjectRequest.svelte (1 hunks)
  • frontend/src/lib/email/EmailVerificationStatus.svelte (3 hunks)
  • frontend/src/lib/email/JoinProjectRequest.svelte (1 hunks)
  • frontend/src/lib/email/UserAdded.svelte (1 hunks)
  • frontend/src/lib/error/UnexpectedError.svelte (3 hunks)
  • frontend/src/lib/error/UnexpectedErrorAlert.svelte (3 hunks)
  • frontend/src/lib/forms/Form.svelte (1 hunks)
  • frontend/src/lib/forms/Input.svelte (1 hunks)
  • frontend/src/lib/forms/MaybeProtectedForm.svelte (1 hunks)
  • frontend/src/lib/forms/ProtectedForm.svelte (1 hunks)
  • frontend/src/lib/forms/UserTypeahead.svelte (2 hunks)
  • frontend/src/lib/forms/superforms.ts (3 hunks)
  • frontend/src/lib/forms/types.ts (1 hunks)
  • frontend/src/lib/forms/utils.ts (1 hunks)
  • frontend/src/lib/gql/gql-client.ts (1 hunks)
  • frontend/src/lib/i18n/index.ts (4 hunks)
  • frontend/src/lib/layout/AppBar.svelte (3 hunks)
  • frontend/src/lib/layout/AppMenu.svelte (3 hunks)
  • frontend/src/lib/layout/Breadcrumbs/HomeBreadcrumb.svelte (1 hunks)
  • frontend/src/lib/layout/Breadcrumbs/PageBreadcrumb.svelte (2 hunks)
  • frontend/src/lib/layout/Footer.svelte (2 hunks)
  • frontend/src/lib/layout/Layout.svelte (2 hunks)
  • frontend/src/lib/otel/otel.client.ts (2 hunks)
  • frontend/src/lib/otel/otel.server.ts (3 hunks)
  • frontend/src/lib/otel/trace-exporter-browser-with-xhr-retry.ts (2 hunks)
  • frontend/src/lib/otel/types.ts (1 hunks)
  • frontend/src/lib/type.utils.ts (2 hunks)
  • frontend/src/lib/user.ts (3 hunks)
  • frontend/src/lib/util/project.ts (1 hunks)
  • frontend/src/lib/util/query-params.ts (2 hunks)
  • frontend/src/lib/util/types.ts (1 hunks)
  • frontend/src/routes/(authenticated)/+layout.ts (2 hunks)
  • frontend/src/routes/(authenticated)/+page.svelte (4 hunks)
  • frontend/src/routes/(authenticated)/+page.ts (1 hunks)
  • frontend/src/routes/(authenticated)/admin/AdminProjects.svelte (4 hunks)
  • frontend/src/routes/(authenticated)/admin/EditUserAccount.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/org/[org_id]/+page.svelte (5 hunks)
  • frontend/src/routes/(authenticated)/org/[org_id]/AddMyProjectsToOrgModal.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/org/[org_id]/AddOrgMemberModal.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/org/[org_id]/BulkAddOrgMembers.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/org/[org_id]/ChangeOrgMemberRoleModal.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/org/create/+page.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/org/list/+page.svelte (3 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/+page.svelte (8 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/AddOrganization.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/AddProjectMember.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/AddPurpose.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/BulkAddProjectMembers.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/ChangeMemberRoleModal.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/MembersList.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/OpenInFlexButton.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/OrgList.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/ProjectConfidentialityModal.svelte (1 hunks)
  • frontend/src/routes/(authenticated)/project/[project_code]/ResetProjectModal.svelte (3 hunks)
  • frontend/src/routes/(authenticated)/project/create/+page.svelte (5 hunks)
  • frontend/src/routes/(authenticated)/resetPassword/+page.svelte (2 hunks)
  • frontend/src/routes/(authenticated)/shared.ts (1 hunks)
  • frontend/src/routes/(authenticated)/user/+page.svelte (4 hunks)
  • frontend/src/routes/(unauthenticated)/acceptInvitation/+page.svelte (1 hunks)
  • frontend/src/routes/(unauthenticated)/forgotPassword/+page.svelte (3 hunks)
  • frontend/src/routes/(unauthenticated)/forgotPassword/emailSent/+page.svelte (2 hunks)
  • frontend/src/routes/(unauthenticated)/login/+page.svelte (4 hunks)
  • frontend/src/routes/(unauthenticated)/register/+page.svelte (1 hunks)
  • frontend/src/routes/(unauthenticated)/sandbox/+page.svelte (2 hunks)
  • frontend/src/routes/(unauthenticated)/sandbox/i18n/late/+page.svelte (1 hunks)
  • frontend/src/routes/+error.svelte (2 hunks)
  • frontend/src/routes/+layout.server.ts (1 hunks)
  • frontend/src/routes/+layout.svelte (2 hunks)
  • frontend/tests/components/addMemberModal.ts (1 hunks)
  • frontend/tests/components/authenticatedDrawer.ts (1 hunks)
  • frontend/tests/email/e2e-mailbox.ts (1 hunks)
  • frontend/tests/email/email-page.ts (1 hunks)
  • frontend/tests/email/maildev-mailbox.ts (2 hunks)
  • frontend/tests/errorHandling.test.ts (3 hunks)
  • frontend/tests/fixtures.ts (1 hunks)
  • frontend/tests/oauth.test.ts (4 hunks)
  • frontend/tests/pages/acceptInvitationPage.ts (1 hunks)
  • frontend/tests/pages/adminDashboardPage.ts (1 hunks)
  • frontend/tests/pages/basePage.ts (1 hunks)
  • frontend/tests/pages/createProjectPage.ts (1 hunks)
  • frontend/tests/pages/oidcDebuggerPage.ts (3 hunks)
  • frontend/tests/pages/registerPage.ts (1 hunks)
  • frontend/tests/pages/resetPasswordPage.ts (1 hunks)
⛔ Files not processed due to max files limit (27)
  • frontend/tests/pages/sandboxPage.ts
  • frontend/tests/pages/userAccountSettingsPage.ts
  • frontend/tests/pages/userDashboardPage.ts
  • frontend/viewer/eslint.config.js
  • frontend/viewer/package.json
  • frontend/viewer/src/DotnetProjectView.svelte
  • frontend/viewer/src/app.postcss
  • frontend/viewer/src/home/ServersList.svelte
  • frontend/viewer/src/lib/activity/ActivityItem.svelte
  • frontend/viewer/src/lib/activity/ActivityView.svelte
  • frontend/viewer/src/lib/components/audio/AudioDialog.svelte
  • frontend/viewer/src/lib/components/audio/ffmpeg/ffmpeg-api.ts
  • frontend/viewer/src/lib/components/dictionary/DictionaryEntry.svelte
  • frontend/viewer/src/lib/components/if-once/if-once.svelte
  • frontend/viewer/src/lib/components/ui/anchor/anchor.svelte
  • frontend/viewer/src/lib/components/ui/dialog-shared/dialog-shared-root.svelte
  • frontend/viewer/src/lib/entry-editor/FieldHelpIcon.svelte
  • frontend/viewer/src/lib/markdown/NewTabLinkRenderer.svelte
  • frontend/viewer/src/lib/sandbox/EditorSandbox.svelte
  • frontend/viewer/src/project/browse/EntriesList.svelte
  • frontend/viewer/src/project/demo/in-memory-demo-api.ts
  • frontend/viewer/src/project/tasks/tasks-service.ts
  • frontend/viewer/src/stories/editor/fields/multi-select.stories.svelte
  • frontend/viewer/src/stories/editor/fields/select.stories.svelte
  • frontend/viewer/src/stories/editor/misc/reorderer.stories.svelte
  • frontend/viewer/src/stories/editor/stomping/stomp-safe-lcm-rich-text-editor.stories.svelte
  • frontend/viewer/vitest.config.ts
💤 Files with no reviewable changes (1)
  • backend/LexBoxApi/Services/HgService.cs
🧰 Additional context used
🧠 Learnings (12)
📓 Common learnings
Learnt from: imnasnainaec
Repo: sillsdev/languageforge-lexbox PR: 1867
File: platform.bible-extension/src/main.ts:239-246
Timestamp: 2025-07-31T19:10:41.178Z
Learning: In the sillsdev/languageforge-lexbox repository, user imnasnainaec prefers to defer code improvements when there are related TODO comments indicating planned refactoring work, choosing to bundle related changes together rather than making incremental improvements that would need to be modified again during the larger refactoring.
📚 Learning: 2025-08-14T12:50:25.135Z
Learnt from: myieye
Repo: sillsdev/languageforge-lexbox PR: 1906
File: frontend/viewer/src/lib/components/ui/dialog-shared/dialog-shared-root.svelte:3-3
Timestamp: 2025-08-14T12:50:25.135Z
Learning: In the dialog-shared-root.svelte component, the module-level `openDialogs` state is intentionally shared across all component instances to coordinate dialog stacking and overlay behavior across the entire application. This enables proper z-index management where newer dialogs appear on top and only the bottom dialog shows its overlay.

Applied to files:

  • frontend/src/routes/(authenticated)/org/[org_id]/AddOrgMemberModal.svelte
  • frontend/src/routes/(authenticated)/project/[project_code]/AddProjectMember.svelte
  • frontend/src/routes/(authenticated)/project/[project_code]/ProjectConfidentialityModal.svelte
  • frontend/src/routes/(authenticated)/org/[org_id]/AddMyProjectsToOrgModal.svelte
  • frontend/src/lib/error/UnexpectedErrorAlert.svelte
  • frontend/src/routes/(authenticated)/org/[org_id]/BulkAddOrgMembers.svelte
📚 Learning: 2025-07-30T04:53:41.702Z
Learnt from: rmunn
Repo: sillsdev/languageforge-lexbox PR: 1844
File: frontend/viewer/src/lib/entry-editor/ItemListItem.svelte:26-37
Timestamp: 2025-07-30T04:53:41.702Z
Learning: In frontend/viewer/src/lib/entry-editor/ItemListItem.svelte, the TODO comments for unused props `index` and `actions` are intentional reminders for future work to be completed in a separate PR, not issues to be resolved immediately. These represent planned functionality that will be implemented later.

Applied to files:

  • frontend/src/routes/(authenticated)/project/[project_code]/AddPurpose.svelte
  • frontend/src/lib/components/Projects/ProjectTable.svelte
  • frontend/src/routes/(authenticated)/admin/AdminProjects.svelte
  • frontend/src/routes/(authenticated)/project/[project_code]/+page.svelte
📚 Learning: 2025-05-27T06:18:33.852Z
Learnt from: hahn-kev
Repo: sillsdev/languageforge-lexbox PR: 1710
File: frontend/viewer/src/project/browse/BrowseView.svelte:17-19
Timestamp: 2025-05-27T06:18:33.852Z
Learning: The NewEntryButton component in frontend/viewer/src/project/NewEntryButton.svelte already internally checks features.write permission and conditionally renders based on write access, so external disabled props are not needed.

Applied to files:

  • frontend/src/routes/(authenticated)/project/[project_code]/AddPurpose.svelte
📚 Learning: 2025-11-14T14:47:26.135Z
Learnt from: myieye
Repo: sillsdev/languageforge-lexbox PR: 2104
File: frontend/viewer/src/lib/entry-editor/NewEntryDialog.svelte:1-4
Timestamp: 2025-11-14T14:47:26.135Z
Learning: In Svelte components, TypeScript type imports defined in the instance script (regular `<script>` block) can be referenced by type definitions in the module script (`<script lang="ts" module>` block), even though runtime values cannot flow from instance to module. This is valid because types are compile-time only constructs.

Applied to files:

  • frontend/src/lib/components/Projects/ProjectTable.svelte
  • frontend/src/lib/components/FilterBar/FilterBar.svelte
  • frontend/src/lib/forms/MaybeProtectedForm.svelte
  • frontend/src/lib/layout/Breadcrumbs/PageBreadcrumb.svelte
  • frontend/src/routes/(authenticated)/project/[project_code]/OrgList.svelte
  • frontend/src/lib/layout/Layout.svelte
  • frontend/src/lib/components/HgLogView.svelte
  • frontend/src/lib/components/Projects/ProjectFilter.svelte
  • frontend/src/routes/(unauthenticated)/sandbox/i18n/late/+page.svelte
  • frontend/src/lib/layout/AppBar.svelte
  • frontend/src/lib/components/modals/FormModal.svelte
  • frontend/src/lib/components/Markdown/NewTabLinkRenderer.svelte
  • frontend/src/lib/forms/ProtectedForm.svelte
  • frontend/src/lib/email/EmailVerificationStatus.svelte
  • frontend/src/lib/i18n/index.ts
📚 Learning: 2025-06-18T05:13:00.591Z
Learnt from: hahn-kev
Repo: sillsdev/languageforge-lexbox PR: 1757
File: frontend/viewer/src/lib/components/field-editors/multi-select.svelte:130-136
Timestamp: 2025-06-18T05:13:00.591Z
Learning: In frontend/viewer/src/lib/components/field-editors/multi-select.svelte, the computeCommandScore function from 'bits-ui' handles empty filter strings appropriately and does not hide all options when the filter is empty, contrary to initial analysis assumptions.

Applied to files:

  • frontend/src/lib/components/FilterBar/FilterBar.svelte
  • frontend/src/lib/components/Projects/ProjectFilter.svelte
📚 Learning: 2025-07-24T03:26:59.388Z
Learnt from: hahn-kev
Repo: sillsdev/languageforge-lexbox PR: 1841
File: frontend/viewer/src/project/browse/filter/OpFilter.svelte:10-17
Timestamp: 2025-07-24T03:26:59.388Z
Learning: In Svelte 5, reactive statements use `$derived()` instead of the Svelte 4 `$:` syntax. For example, to make an array reactive to translation changes, use `const ops = $derived([...])` instead of `$: ops = [...]`.

Applied to files:

  • frontend/src/lib/components/FilterBar/FilterBar.svelte
  • frontend/src/lib/forms/Input.svelte
📚 Learning: 2025-07-31T15:58:56.761Z
Learnt from: imnasnainaec
Repo: sillsdev/languageforge-lexbox PR: 1867
File: platform.bible-extension/.eslintrc.js:29-29
Timestamp: 2025-07-31T15:58:56.761Z
Learning: In the sillsdev/languageforge-lexbox repository's platform.bible-extension, duplicate ESLint rules in .eslintrc.js files are intentional when part of the template system. The configuration uses a layered approach where rules are first defined in shared regions and then potentially overridden in later sections to allow for template inheritance with customization.

Applied to files:

  • frontend/eslint.config.js
📚 Learning: 2025-08-14T12:54:04.004Z
Learnt from: myieye
Repo: sillsdev/languageforge-lexbox PR: 1906
File: frontend/viewer/src/lib/components/ui/alert-dialog/alert-dialog-root.svelte:11-13
Timestamp: 2025-08-14T12:54:04.004Z
Learning: In Svelte 5, children are rendered using snippets with {render children?.()} syntax instead of the legacy <slot /> approach used in earlier Svelte versions. Components should destructure children from props and use {render children?.()} to render child content.

Applied to files:

  • frontend/src/lib/layout/Breadcrumbs/PageBreadcrumb.svelte
  • frontend/src/lib/components/Markdown/NewTabLinkRenderer.svelte
📚 Learning: 2025-08-18T14:33:32.639Z
Learnt from: myieye
Repo: sillsdev/languageforge-lexbox PR: 1928
File: frontend/viewer/src/lib/entry-editor/DeleteDialog.svelte:0-0
Timestamp: 2025-08-18T14:33:32.639Z
Learning: In Svelte, when using $state<T>() without an initial value, the type is automatically inferred as T | undefined, not just T. This means $state<string>() actually has type string | undefined.

Applied to files:

  • frontend/src/routes/(unauthenticated)/sandbox/i18n/late/+page.svelte
  • frontend/src/lib/forms/Input.svelte
📚 Learning: 2025-07-31T19:33:04.864Z
Learnt from: imnasnainaec
Repo: sillsdev/languageforge-lexbox PR: 1867
File: platform.bible-extension/webpack.config.ts:10-12
Timestamp: 2025-07-31T19:33:04.864Z
Learning: In the sillsdev/languageforge-lexbox repository's platform.bible-extension, the webpack configuration already enforces proper build order using webpack's `dependencies` array. The configWebView has `name: 'webView'` and configMain has `dependencies: ['webView']`, ensuring the WebView build completes before the main build starts.

Applied to files:

  • frontend/pnpm-workspace.yaml
📚 Learning: 2025-07-31T19:33:04.864Z
Learnt from: imnasnainaec
Repo: sillsdev/languageforge-lexbox PR: 1867
File: platform.bible-extension/webpack.config.ts:10-12
Timestamp: 2025-07-31T19:33:04.864Z
Learning: In the sillsdev/languageforge-lexbox repository's platform.bible-extension, the webpack configuration already properly enforces build order using webpack's `dependencies` array. The configWebView has `name: 'webView'` and configMain has `dependencies: ['webView']`, ensuring the WebView build completes before the main build starts. This is the correct way to handle build dependencies in webpack multi-compiler setups.

Applied to files:

  • frontend/pnpm-workspace.yaml
🧬 Code graph analysis (6)
frontend/src/routes/(authenticated)/+page.ts (1)
frontend/src/routes/(authenticated)/shared.ts (1)
  • getViewMode (9-17)
frontend/src/lib/util/query-params.ts (2)
frontend/src/lib/util/types.ts (1)
  • PrimitiveRecord (4-4)
frontend/src/lib/type.utils.ts (1)
  • StandardEnum (36-38)
frontend/src/hooks.server.ts (1)
frontend/src/routes/(authenticated)/shared.ts (1)
  • setViewMode (19-21)
frontend/src/lib/forms/superforms.ts (2)
frontend/src/lib/forms/types.ts (1)
  • ErrorMessage (8-8)
frontend/src/lib/forms/utils.ts (1)
  • randomFormId (4-6)
frontend/src/lib/i18n/index.ts (1)
frontend/src/lib/type.utils.ts (1)
  • DeepPathsToType (25-27)
frontend/src/lib/otel/otel.server.ts (2)
frontend/src/lib/otel/otel.shared.ts (2)
  • traceHeaders (160-167)
  • SERVICE_NAME (22-22)
frontend/src/lib/util/version.ts (1)
  • APP_VERSION (1-1)

@myieye myieye force-pushed the update-npm-dependencies branch from 9640433 to b77bffa Compare December 5, 2025 08:49
@myieye myieye closed this Dec 5, 2025
@myieye myieye reopened this Dec 5, 2025
@myieye myieye enabled auto-merge (squash) December 5, 2025 10:00
@myieye myieye disabled auto-merge December 5, 2025 10:00
@myieye myieye merged commit 055fe51 into develop Dec 5, 2025
42 of 47 checks passed
@myieye myieye deleted the update-npm-dependencies branch December 5, 2025 10:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💻 FW Lite issues related to the fw lite application, not miniLcm or crdt related 📦 Lexbox issues related to any server side code, fw-headless included

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants