test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error - #2

Merged
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests
Feb 13, 2026
Merged

test: add @ybyra/react unit tests, fix playground tests, and fix docs MIME error#2
wilcorrea merged 1 commit into
mainfrom
test/react-unit-tests

Conversation

@iguit0

@iguit0iguit0 commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Description

  • Adds the first test suite for @ybyra/react, covering all non-hook utility modules — 79 tests across 5 files
  • Fixes pre-existing test failures in playground/sveltekit and playground/react-native
  • Fixes MIME type console errors on all VitePress documentation pages caused by demo nav links

New tests (packages/react/src/)

FileTestsModule under test
validation.test.ts33All 8 built-in validators, registerValidator, validateField, validateAllFields, translate passthrough
proxy.test.ts18createStateProxy change tracking, createSchemaProxy override tracking, immutability guarantees
translate.test.ts10resolveFieldLabel, resolveGroupLabel, resolveActionLabel fallback chains
icons.test.ts9configureIcons, resolveActionIcon, resolveGroupIcon domain→common fallback
registry.test.ts9registerRenderers, getRenderer, createRegistry global/scoped isolation

Playground fixes

playground/sveltekit — All 14 test suites were failing:

  • esbuild.tsconfigRaw: '{}' in vitest config to bypass missing .svelte-kit/tsconfig.json
  • New $app/paths mock (was aliased for $app/navigation and $app/state but not $app/paths)
  • Added Send icon to lucide-svelte mocks in layout.test.ts and icons.test.ts
  • Centralized lucide-svelte mock in tests/setup.ts for coverage of all route tests

playground/react-native — App tests (add, view, edit, index) were failing:

  • Added @ybyra/persistence/web alias in vitest config (subpath wasn't resolved)
  • Added vi.mock('@ybyra/persistence/web') in packages/react-native/testing/setup.ts

Docs fix — MIME type error on demo pages

Symptom: Every VitePress documentation page logged console errors:

Failed to load module script: Expected a JavaScript-or-Wasm module script but the server
responded with a MIME type of "text/html".

Root cause: The "Demos" dropdown in the VitePress nav used relative links (/demo/react-web/, etc.). VitePress only recognizes links as external if they start with a protocol (https://). Relative paths are treated as internal routes, causing VitePress to prefetch non-existent page modules — the server returned the 404 HTML page instead of JavaScript, triggering strict MIME type checking.

Fix: Changed all four demo nav links in docs/.vitepress/config.ts to use absolute URLs (https://devitools.github.io/ybyra/demo/react-web/, etc.). VitePress now correctly treats them as external links and skips prefetching.

Note:target: '_blank' only affects click behavior — it does NOT prevent VitePress from prefetching the link as an internal route. Full URL with protocol is required.

Why

@ybyra/react is the most complex package in the monorepo (form state, proxy system, validation, i18n, icon resolution) but had zero tests. These five modules are pure functions with no React dependency, so they can be tested with plain vitest — no jsdom or @testing-library/react needed.

The playground test failures were pre-existing (not introduced by this PR) but blocked the full pnpm test suite from passing.

Bug documented

createSchemaProxy interacts with structuredClone upstream, but pattern() in TextFieldDefinition stores a raw RegExp in validation params. structuredClone throws on RegExp objects. This is documented in a test comment in proxy.test.ts for a future fix in core.

Summary by CodeRabbit

  • Tests

    • Added comprehensive test coverage for validation, translation, icon resolution, proxy utilities, and registry management in React package.
    • Enhanced test infrastructure for React Native and SvelteKit playgrounds.
  • Chores

    • Updated demo navigation links to external URLs.
    • Refined TypeScript configuration to exclude test files from compilation.

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces comprehensive test coverage for React utilities (icons, proxy, registry, translation, and validation), updates documentation navigation to external URLs, expands test mocking infrastructure across projects, and adjusts TypeScript and Vitest configurations to accommodate test files.

Changes

Cohort / File(s)Summary
Documentation Navigation
docs/.vitepress/config.ts
Updates Demos navigation items to use external URLs pointing to deployed demo sites for React Web, React Native, Vue + Quasar, and SvelteKit.
React Test Suites
packages/react/src/icons.test.ts, packages/react/src/proxy.test.ts, packages/react/src/registry.test.ts, packages/react/src/translate.test.ts, packages/react/src/validation.test.ts
Introduces five new test suites with comprehensive coverage: icons module (configureIcons, resolveActionIcon, resolveGroupIcon); proxy utilities (createStateProxy and createSchemaProxy); registry module (registerRenderers, getRenderer, createRegistry); translation functions (resolveFieldLabel, resolveGroupLabel, resolveActionLabel); and validation utilities (built-in validators, custom validators, field validation with translation support).
React TypeScript Config
packages/react/tsconfig.json
Adds exclude pattern to omit test files (src/**/*.test.ts and src/**/*.spec.ts) from TypeScript compilation scope.
React Native Test Setup
packages/react-native/testing/setup.ts
Adds mock for @ybyra/persistence/web with createWebDriver function exposing mocked methods (initialize, create, read, update, destroy, search).
SvelteKit Test Configuration
playground/sveltekit/vitest.config.mts
Adds esbuild configuration with tsconfigRaw property to vitest config. Also includes minor formatting adjustment in react-native vitest config.
SvelteKit Test Setup
playground/sveltekit/tests/setup.ts, playground/sveltekit/tests/src/settings/icons.test.ts
Restores Plus and X exports in lucide-svelte mock; introduces new icons test with vitest mock setup and dynamic module import to ensure test isolation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 A flurry of tests now adorns our code,
Configuration paths freshly bestowed,
Icons and proxies, validations divine,
Each module now tested—oh, how they shine! ✨
With mocks standing guard at the SvelteKit gate,
Our coverage grows grand, our future's first-rate!

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately summarizes the three main components of the changeset: adding unit tests for @ybyra/react, fixing playground tests, and fixing a docs MIME error.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test/react-unit-tests

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@playground/sveltekit/tests/src/settings/icons.test.ts`:
- Line 14: Remove the ineffective top-level dynamic import
import('../../../src/lib/settings/icons') — it’s a no-op because it’s neither
awaited nor assigned; instead rely on the awaited import already present inside
the test (the dynamic import used at line 18) or, if you intended module
initialization before tests, replace the bare import with an awaited
import/assignment in a beforeAll hook. Specifically delete the bare import(...)
statement (or convert it to await import('../../../src/lib/settings/icons') in a
setup block) and keep the existing awaited import inside the test.
🧹 Nitpick comments (5)
packages/react/tsconfig.json (1)

11-12: Consider adding .tsx test file exclusions.

The current patterns exclude .test.ts and .spec.ts files but not their .tsx counterparts. If any React component tests use JSX syntax (.test.tsx or .spec.tsx), they would still be included in the compilation.

💡 Proposed fix to cover TSX test files
 "include": ["src"],
- "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"]+ "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"]
playground/sveltekit/tests/src/settings/icons.test.ts (1)

4-12: Duplicate mock — already defined in setup.ts.

The lucide-svelte mock is already configured in playground/sveltekit/tests/setup.ts (which is referenced in vitest.config.mts as a setup file). This inline mock is redundant and could cause confusion about which mock takes precedence.

♻️ Proposed fix to remove duplicate mock
 import { resolveActionIcon } from '@ybyra/sveltekit'
-import { describe, it, expect, vi } from 'vitest'--vi.mock('lucide-svelte', () => ({- Plus: 'Plus',- Eye: 'Eye',- Pencil: 'Pencil',- Save: 'Save',- Send: 'Send',- X: 'X',- Trash2: 'Trash2',-}))+import { describe, it, expect } from 'vitest'
packages/react/src/validation.test.ts (3)

5-18: Consider extracting shared test helper.

The makeFieldConfig helper is duplicated from proxy.test.ts. While duplication in test files is generally acceptable for isolation, if more test files need this helper, consider extracting it to a shared test utilities file.


42-45: Minor: Comment says "returns null" but function returns empty array.

The test name says "returns null for non-empty string" but validateField returns an array. The assertion is correct (toHaveLength(0)), but the test name could be clearer.

📝 Suggested test name clarification
- it('returns null for non-empty string', () => {+ it('returns no errors for non-empty string', () => {
const errors = validateField('hello', [rule])
expect(errors).toHaveLength(0)
})

Similar naming appears in other tests (lines 47, 52, 75, 80, 95, 110, 115, 130, 145, 160, 175).


136-164: Consider adding date edge case tests.

The minDate and maxDate tests use ISO date strings which is good. Consider adding tests for:

  • Equal date (boundary condition: '2024-01-01' with minDate '2024-01-01')
  • Invalid date strings (to verify graceful handling)

This is optional as the current coverage is adequate for typical use cases.

Comment threadplayground/sveltekit/tests/src/settings/icons.test.ts
@wilcorrea
wilcorrea merged commit 78d3c3b into mainFeb 13, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@iguit0@wilcorrea