-
-
Notifications
You must be signed in to change notification settings - Fork 5
Update npm dependencies #2116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update npm dependencies #2116
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the 📝 WalkthroughWalkthroughThis 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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Areas requiring extra attention:
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
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. Comment |
|
The latest updates on your projects. Learn more about Argos notifications ↗︎
|
24b4ee4 to
9640433
Compare
There was a problem hiding this 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: Usemessageinstead oferrorin.refineoptionsZod's
.refine()expects an options object withmessage(and optionallypath/params), noterror. 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
errorproperty. 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 standardmessagefieldThe email validation uses:
.refine((value) => !value.includes('@') || isEmail(value), { error: $t('form.invalid_email') })Zod v4 expects the error definition in the
messageproperty, noterror. The current pattern will not properly set validation messages, leaving client-side validation ineffective until the server responds withInvalidEmailError.Change to:
.refine( (value) => !value.includes('@') || isEmail(value), { message: $t('form.invalid_email') }, )Note:
AddOrgMemberModal.sveltehas 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
currentTypefrom$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 becausecurrentTypeneeds to be mutable for the toggle functionality intogglePasswordVisibility().
🧹 Nitpick comments (9)
frontend/src/lib/components/IconButton.svelte (1)
20-34: Outline derivation is correct; consider a clearer internal nameUsing
_outlineplusconst outline = $derived(_outline ?? variant !== 'btn-ghost')correctly:
- Honors an explicitly passed
outline={false}.- Falls back to
variant !== 'btn-ghost'only when the prop isnull/undefined.If you want slightly clearer intent, you could rename
_outlineto something likeoutlineProp:- 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 missingtraceIdwhen building the Honeycomb URLThe removal of the explicit string cast on
textContentmakes 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 withtrace_id=nullif 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: falsematches the current Superforms APIChanging from
nulltofalseis compatible with the newer superforms options, wheretaintedMessageisboolean | string | (() => Promise<boolean>)andfalsecleanly disables the leave-page prompt. (superforms.rocks)Since
falseis 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: AligngetBoolSearchParamkey type withgetSearchParamto avoid subtle divergence
getBoolSearchParamnow useskey: keyof ConditionalPick<T, boolean>, whilegetSearchParamexpectsExclude<keyof ConditionalPick<T, ...>, number | symbol>. GivenT extends PrimitiveRecordthis is fine today, but the two helpers now describe slightly different constraints. To keep them in lockstep and future‑proof against changes toPrimitiveRecordorConditionalPick, 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 ingetSearchParamlooks good; consider a shared aliasSwitching the
keyparameter toExclude<keyof ConditionalPick<T, (R extends StandardEnum<unknown> ? R[keyof R] : R)>, number | symbol>more directly encodes thatURLSearchParamskeys 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 ingetBoolSearchParam) for readability and consistency.frontend/src/lib/forms/UserTypeahead.svelte (1)
44-47: Consider simplifying the debounce option.The IIFE
(() => debounceMs)()immediately invokes and returnsdebounceMs, making it equivalent to just usingdebounceMsdirectly. SincedebounceMsis 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.resolvefor the backup link looks correctImporting
resolvefrom$app/pathsand using it for the backup download URL is aligned with current SvelteKit recommendations for base-aware path generation, so this should behave correctly even whenconfig.kit.paths.baseis 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 thefetch('/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 aroundvalidationis a no‑op and slightly obscures intent
(() => validation)()evaluates tovalidation, so the newformSchemais functionally identical toz.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:getFormStateTODO acknowledges a real edge case; safe to defer, but keep it trackedThe
getFormStateimplementation using an externaluntaintedValuescache andsf.capture()gives you usefultainted/changed/originalValue/currentValuesemantics, 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
untaintedValuesfrom the last known untainted snapshot (or storing that snapshot explicitly).- Guarding
sf.capture()/its.data/.constraintsaccess 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
⛔ Files ignored due to path filters (1)
frontend/pnpm-lock.yamlis 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.sveltefrontend/src/routes/(authenticated)/project/[project_code]/AddProjectMember.sveltefrontend/src/routes/(authenticated)/project/[project_code]/ProjectConfidentialityModal.sveltefrontend/src/routes/(authenticated)/org/[org_id]/AddMyProjectsToOrgModal.sveltefrontend/src/lib/error/UnexpectedErrorAlert.sveltefrontend/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.sveltefrontend/src/lib/components/Projects/ProjectTable.sveltefrontend/src/routes/(authenticated)/admin/AdminProjects.sveltefrontend/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.sveltefrontend/src/lib/components/FilterBar/FilterBar.sveltefrontend/src/lib/forms/MaybeProtectedForm.sveltefrontend/src/lib/layout/Breadcrumbs/PageBreadcrumb.sveltefrontend/src/routes/(authenticated)/project/[project_code]/OrgList.sveltefrontend/src/lib/layout/Layout.sveltefrontend/src/lib/components/HgLogView.sveltefrontend/src/lib/components/Projects/ProjectFilter.sveltefrontend/src/routes/(unauthenticated)/sandbox/i18n/late/+page.sveltefrontend/src/lib/layout/AppBar.sveltefrontend/src/lib/components/modals/FormModal.sveltefrontend/src/lib/components/Markdown/NewTabLinkRenderer.sveltefrontend/src/lib/forms/ProtectedForm.sveltefrontend/src/lib/email/EmailVerificationStatus.sveltefrontend/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.sveltefrontend/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.sveltefrontend/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.sveltefrontend/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.sveltefrontend/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)
frontend/src/routes/(authenticated)/project/[project_code]/ResetProjectModal.svelte
Show resolved
Hide resolved
9640433 to
b77bffa
Compare
No description provided.