Skip to content

fix(docs): regenerate the API pages from JSDoc and gate the drift in CI - #452

Merged
hyesungoh merged 12 commits into
mainfrom
fix/docs-drift-gate
Aug 31, 2026
Merged

fix(docs): regenerate the API pages from JSDoc and gate the drift in CI#452
hyesungoh merged 12 commits into
mainfrom
fix/docs-drift-gate

Conversation

@hyesungoh

@hyesungoh hyesungoh commented Aug 28, 2026

Copy link
Copy Markdown
Member

Problem

27 of the 55 English API pages had drifted from the JSDoc they are generated from. verifySkill.ts checks the skill against those pages, but nothing checked the pages against their source, so the skill's references/ inherited every stale page while CI stayed green.

Regenerating blindly would have made things worse. The drift was three things at once:

  • Generator defects — apostrophes escaped as \' inside double-quoted attributes, @description bullet lists flattened into one line, doubled periods, rest parameters rendered without the spread.
  • JSDoc defectsuseIntersectionObserver typed options.root as boolean; useList and useSet described their returns only in the hand-written .md, in a shape the generator cannot produce; mergeProps and mergeRefs did not mark their rest parameter.
  • Plain staleness — pages left behind after a JSDoc change, most visibly useBodyScrollLock's hoisted single-lock example.

Approach

Fix the generator, fix the JSDoc, add the gate, then regenerate — in that order so nothing regresses.

.scripts/verifyDocs.ts renders every public export from its JSDoc and requires the committed page to match byte for byte. The gate commit is red on its own; the regeneration commit turns it green. useList and useSet now render their returns as a :nested array like the other pages.

The CI JSDoc structure check also needed one change: it rejected [initialState=new Set()] because the name pattern could not span a space.

Testing

renderEnglishDoc() was extracted so the generator is testable without the filesystem; .scripts/commands/generateDocs/index.spec.ts is new, each test written failing first.

All green: yarn test, yarn test:docs, yarn test:skill, 521 unit tests at 100% coverage.

The 10 Korean pages that changed were reviewed by two independent translation-reviewer passes. Findings within this PR's scope are applied. Pre-existing issues they flagged are left alone: 함수에요함수예요 in 6 files, inconsistent copula after navigator.userAgent, and the useThrottle summary dropping "React hook".

…llets or doubled periods

replaceDescription escaped apostrophes for every caller, but only the :nested
array wraps them in a single-quoted JS string; a double-quoted attribute leaked
the backslash into the page. @description was also read with compact spacing,
which collapsed its bullet lists into one line, and a nested return description
already ending in a period got a second one.
… returns in the generator's shape

useList and useSet documented their return shape only in the committed .md,
in a layout the generator cannot produce; regenerating would have dropped every
action. Both now declare the generic, the optional initial state and each
returned member the way useCounter does.
verifySkill.ts compares the skill to the .md pages and nothing compared the
pages to their source, so 21 of 55 drifted while CI stayed green. This commit
alone is red by design; the next one regenerates the pages.
…tact

Preserving the parser's spacing kept the bullet lists but also baked the source's
editor wrapping into every page. Blank lines and list items are structure; a line
break inside a paragraph is not.
27 pages had drifted: some were left behind after a JSDoc change, the rest
carried the escaping, spacing and rest-parameter defects fixed earlier in this
branch.
The signature is mergeRefs(...refs) but the JSDoc typed it as a plain array, so
the generated page dropped the spread.
@changeset-bot

changeset-bot Bot commented Aug 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 5ddd3ea

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
react-simplikit Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@codecov-commenter

codecov-commenter commented Aug 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (65ce435) to head (5ddd3ea).

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff            @@
##              main      #452   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           58        58           
  Lines         1664      1664           
  Branches       500       500           
=========================================
  Hits          1664      1664           
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: +651 B (+0.67%)

Total Size: 97.9 kB

📦 View Changed
Filename Size Change
packages/react-simplikit/dist/hooks/useIntersectionObserver/useIntersectionObserver.cjs 972 B +5 B (+0.52%)
packages/react-simplikit/dist/hooks/useIntersectionObserver/useIntersectionObserver.mjs 945 B +6 B (+0.64%)
packages/react-simplikit/dist/hooks/useList/useList.cjs 952 B +102 B (+12%) ⚠️
packages/react-simplikit/dist/hooks/useList/useList.mjs 930 B +105 B (+12.73%) ⚠️
packages/react-simplikit/dist/hooks/useSet/useSet.cjs 1.03 kB +212 B (+25.79%) 🚨
packages/react-simplikit/dist/hooks/useSet/useSet.mjs 1 kB +213 B (+26.93%) 🚨
packages/react-simplikit/dist/utils/mergeProps/mergeProps.cjs 671 B +2 B (+0.3%)
packages/react-simplikit/dist/utils/mergeProps/mergeProps.mjs 670 B +2 B (+0.3%)
packages/react-simplikit/dist/utils/mergeRefs/mergeRefs.cjs 616 B +2 B (+0.33%)
packages/react-simplikit/dist/utils/mergeRefs/mergeRefs.mjs 614 B +2 B (+0.33%)
ℹ️ View Unchanged
Filename Size
packages/react-simplikit/dist/components/ImpressionArea/ImpressionArea.cjs 1.01 kB
packages/react-simplikit/dist/components/ImpressionArea/ImpressionArea.mjs 984 B
packages/react-simplikit/dist/components/Separated/Separated.cjs 686 B
packages/react-simplikit/dist/components/Separated/Separated.mjs 684 B
packages/react-simplikit/dist/components/SwitchCase/SwitchCase.cjs 701 B
packages/react-simplikit/dist/components/SwitchCase/SwitchCase.mjs 699 B
packages/react-simplikit/dist/hooks/useAsyncEffect/useAsyncEffect.cjs 626 B
packages/react-simplikit/dist/hooks/useAsyncEffect/useAsyncEffect.mjs 615 B
packages/react-simplikit/dist/hooks/useBooleanState/useBooleanState.cjs 539 B
packages/react-simplikit/dist/hooks/useBooleanState/useBooleanState.mjs 529 B
packages/react-simplikit/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.cjs 790 B
packages/react-simplikit/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.mjs 762 B
packages/react-simplikit/dist/hooks/useConditionalEffect/useConditionalEffect.cjs 955 B
packages/react-simplikit/dist/hooks/useConditionalEffect/useConditionalEffect.mjs 934 B
packages/react-simplikit/dist/hooks/useControlledState/useControlledState.cjs 865 B
packages/react-simplikit/dist/hooks/useControlledState/useControlledState.mjs 855 B
packages/react-simplikit/dist/hooks/useCounter/useCounter.cjs 1.03 kB
packages/react-simplikit/dist/hooks/useCounter/useCounter.mjs 1.01 kB
packages/react-simplikit/dist/hooks/useDebounce/debounce.cjs 458 B
packages/react-simplikit/dist/hooks/useDebounce/debounce.mjs 456 B
packages/react-simplikit/dist/hooks/useDebounce/useDebounce.cjs 974 B
packages/react-simplikit/dist/hooks/useDebounce/useDebounce.mjs 953 B
packages/react-simplikit/dist/hooks/useDebouncedCallback/useDebouncedCallback.cjs 1.36 kB
packages/react-simplikit/dist/hooks/useDebouncedCallback/useDebouncedCallback.mjs 1.34 kB
packages/react-simplikit/dist/hooks/useDoubleClick/useDoubleClick.cjs 965 B
packages/react-simplikit/dist/hooks/useDoubleClick/useDoubleClick.mjs 950 B
packages/react-simplikit/dist/hooks/useGeolocation/useGeolocation.cjs 2.02 kB
packages/react-simplikit/dist/hooks/useGeolocation/useGeolocation.mjs 2.02 kB
packages/react-simplikit/dist/hooks/useImpressionRef/useImpressionRef.cjs 1.12 kB
packages/react-simplikit/dist/hooks/useImpressionRef/useImpressionRef.mjs 1.08 kB
packages/react-simplikit/dist/hooks/useInputState/useInputState.cjs 663 B
packages/react-simplikit/dist/hooks/useInputState/useInputState.mjs 654 B
packages/react-simplikit/dist/hooks/useInterval/useInterval.cjs 837 B
packages/react-simplikit/dist/hooks/useInterval/useInterval.mjs 811 B
packages/react-simplikit/dist/hooks/useIsClient/useIsClient.cjs 585 B
packages/react-simplikit/dist/hooks/useIsClient/useIsClient.mjs 574 B
packages/react-simplikit/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.cjs 577 B
packages/react-simplikit/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.mjs 575 B
packages/react-simplikit/dist/hooks/useLoading/useLoading.cjs 919 B
packages/react-simplikit/dist/hooks/useLoading/useLoading.mjs 909 B
packages/react-simplikit/dist/hooks/useLongPress/useLongPress.cjs 1.68 kB
packages/react-simplikit/dist/hooks/useLongPress/useLongPress.mjs 1.64 kB
packages/react-simplikit/dist/hooks/useMap/useMap.cjs 730 B
packages/react-simplikit/dist/hooks/useMap/useMap.mjs 713 B
packages/react-simplikit/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.cjs 789 B
packages/react-simplikit/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.mjs 758 B
packages/react-simplikit/dist/hooks/usePreservedCallback/usePreservedCallback.cjs 691 B
packages/react-simplikit/dist/hooks/usePreservedCallback/usePreservedCallback.mjs 675 B
packages/react-simplikit/dist/hooks/usePreservedReference/usePreservedReference.cjs 805 B
packages/react-simplikit/dist/hooks/usePreservedReference/usePreservedReference.mjs 789 B
packages/react-simplikit/dist/hooks/usePrevious/usePrevious.cjs 643 B
packages/react-simplikit/dist/hooks/usePrevious/usePrevious.mjs 635 B
packages/react-simplikit/dist/hooks/useRefEffect/useRefEffect.cjs 780 B
packages/react-simplikit/dist/hooks/useRefEffect/useRefEffect.mjs 753 B
packages/react-simplikit/dist/hooks/useStorageState/storage.cjs 543 B
packages/react-simplikit/dist/hooks/useStorageState/storage.mjs 527 B
packages/react-simplikit/dist/hooks/useStorageState/useStorageState.cjs 966 B
packages/react-simplikit/dist/hooks/useStorageState/useStorageState.mjs 957 B
packages/react-simplikit/dist/hooks/useThrottle/throttle.cjs 306 B
packages/react-simplikit/dist/hooks/useThrottle/throttle.mjs 298 B
packages/react-simplikit/dist/hooks/useThrottle/useThrottle.cjs 864 B
packages/react-simplikit/dist/hooks/useThrottle/useThrottle.mjs 838 B
packages/react-simplikit/dist/hooks/useThrottledCallback/useThrottledCallback.cjs 1.22 kB
packages/react-simplikit/dist/hooks/useThrottledCallback/useThrottledCallback.mjs 1.19 kB
packages/react-simplikit/dist/hooks/useTimeout/useTimeout.cjs 627 B
packages/react-simplikit/dist/hooks/useTimeout/useTimeout.mjs 600 B
packages/react-simplikit/dist/hooks/useToggle/useToggle.cjs 524 B
packages/react-simplikit/dist/hooks/useToggle/useToggle.mjs 506 B
packages/react-simplikit/dist/hooks/useVisibilityEvent/useVisibilityEvent.cjs 692 B
packages/react-simplikit/dist/hooks/useVisibilityEvent/useVisibilityEvent.mjs 674 B
packages/react-simplikit/dist/index.cjs 1.37 kB
packages/react-simplikit/dist/index.mjs 997 B
packages/react-simplikit/dist/mobile/hooks/useAvoidKeyboard/useAvoidKeyboard.cjs 990 B
packages/react-simplikit/dist/mobile/hooks/useAvoidKeyboard/useAvoidKeyboard.mjs 968 B
packages/react-simplikit/dist/mobile/hooks/useBodyScrollLock/useBodyScrollLock.cjs 551 B
packages/react-simplikit/dist/mobile/hooks/useBodyScrollLock/useBodyScrollLock.mjs 527 B
packages/react-simplikit/dist/mobile/hooks/useKeyboardHeight/useKeyboardHeight.cjs 690 B
packages/react-simplikit/dist/mobile/hooks/useKeyboardHeight/useKeyboardHeight.mjs 671 B
packages/react-simplikit/dist/mobile/hooks/useNetworkStatus/useNetworkStatus.cjs 1.2 kB
packages/react-simplikit/dist/mobile/hooks/useNetworkStatus/useNetworkStatus.mjs 1.19 kB
packages/react-simplikit/dist/mobile/hooks/usePageVisibility/usePageVisibility.cjs 936 B
packages/react-simplikit/dist/mobile/hooks/usePageVisibility/usePageVisibility.mjs 917 B
packages/react-simplikit/dist/mobile/hooks/useSafeAreaInset/useSafeAreaInset.cjs 947 B
packages/react-simplikit/dist/mobile/hooks/useSafeAreaInset/useSafeAreaInset.mjs 932 B
packages/react-simplikit/dist/mobile/hooks/useScrollDirection/useScrollDirection.cjs 960 B
packages/react-simplikit/dist/mobile/hooks/useScrollDirection/useScrollDirection.mjs 949 B
packages/react-simplikit/dist/mobile/hooks/useVisualViewport/useVisualViewport.cjs 1.24 kB
packages/react-simplikit/dist/mobile/hooks/useVisualViewport/useVisualViewport.mjs 1.22 kB
packages/react-simplikit/dist/mobile/utils/disableBodyScrollLock/disableBodyScrollLock.cjs 681 B
packages/react-simplikit/dist/mobile/utils/disableBodyScrollLock/disableBodyScrollLock.mjs 673 B
packages/react-simplikit/dist/mobile/utils/enableBodyScrollLock/enableBodyScrollLock.cjs 677 B
packages/react-simplikit/dist/mobile/utils/enableBodyScrollLock/enableBodyScrollLock.mjs 666 B
packages/react-simplikit/dist/mobile/utils/getKeyboardHeight/getKeyboardHeight.cjs 613 B
packages/react-simplikit/dist/mobile/utils/getKeyboardHeight/getKeyboardHeight.mjs 607 B
packages/react-simplikit/dist/mobile/utils/getSafeAreaInset/getSafeAreaInset.cjs 907 B
packages/react-simplikit/dist/mobile/utils/getSafeAreaInset/getSafeAreaInset.mjs 898 B
packages/react-simplikit/dist/mobile/utils/isAndroid/isAndroid.cjs 547 B
packages/react-simplikit/dist/mobile/utils/isAndroid/isAndroid.mjs 538 B
packages/react-simplikit/dist/mobile/utils/isIOS/isIOS.cjs 758 B
packages/react-simplikit/dist/mobile/utils/isIOS/isIOS.mjs 751 B
packages/react-simplikit/dist/mobile/utils/isKeyboardVisible/isKeyboardVisible.cjs 434 B
packages/react-simplikit/dist/mobile/utils/isKeyboardVisible/isKeyboardVisible.mjs 423 B
packages/react-simplikit/dist/mobile/utils/isServer/isServer.cjs 386 B
packages/react-simplikit/dist/mobile/utils/isServer/isServer.mjs 384 B
packages/react-simplikit/dist/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.cjs 1.12 kB
packages/react-simplikit/dist/mobile/utils/subscribeKeyboardHeight/subscribeKeyboardHeight.mjs 1.1 kB
packages/react-simplikit/dist/utils/buildContext/buildContext.cjs 809 B
packages/react-simplikit/dist/utils/buildContext/buildContext.mjs 788 B

compressed-size-action

… import

The English useList page took its example from the JSDoc in this branch, replacing
a TodoList component the Korean page still mirrored. Two independent reviews also
found useSet's Korean snippet missing the import line the English has.
The description check matched the parameter name as [^ -]*, which cannot span the
space in a default like [initialState=new Set()] and reported the description as
missing. The name now matches either a bracketed form or a bare one; a @PARAM
without a description still fails.
@hyesungoh
hyesungoh marked this pull request as ready for review August 28, 2026 09:59
@hyesungoh
hyesungoh requested a review from mnxmnz as a code owner August 28, 2026 09:59
Copilot AI lite review requested due to automatic review settings August 28, 2026 09:59

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…ejoin wrapped bullet lines

Review findings on this branch. A double quote in a nested return description
survived into the double-quoted :nested attribute and made the Vue formatter
throw — dormant only because no current JSDoc contains one. A bullet's first
continuation line was left unwrapped while later ones joined, baking the
editor's wrapping into two pages. ko/useInterval also gains the required flag
the regenerated English page states for options.delay.
@hyesungoh
hyesungoh merged commit fd312f5 into main Aug 31, 2026
18 checks passed
@hyesungoh
hyesungoh deleted the fix/docs-drift-gate branch August 31, 2026 07:54
Sign up for free to 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.

3 participants