Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: feathersjs/feathers-utils
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: main
Choose a base ref
...
head repository: feathersjs/feathers-utils
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: feat/dotify-nestify-query
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 2 commits
  • 13 files changed
  • 2 contributors

Commits on Aug 20, 2026

  1. feat: new utils dotifyQuery & nestifyQuery

    Convert Feathers queries between dot notation (`{ 'user.name': 'x' }`) and
    nested objects (`{ user: { name: 'x' } }`). Queries arrive in both shapes
    depending on where they come from, but adapters only reliably understand the
    dot form, so every call site had to normalize this by hand.
    
    Both are query-aware rather than a generic flatten/unflatten:
    
    - operators (`$ne`, `$in`, ...) never become path segments
    - `$or`/`$and`/`$nor`/`$not` branches are converted per branch
    - `$sort` keys stay in dot notation in both directions — the only form adapters
      understand
    - `$select`, `$limit`, `$skip` and custom operators pass through untouched
    
    Because "value vs. path" is not always decidable, both take a per-key predicate
    (`descend`/`split`) plus declarative `include`/`exclude` shortcuts.
    
    Colliding paths never lose data: deep-equal values collapse, objects with
    disjoint keys merge, and a genuine contradiction is wrapped in `$and` — matching
    addToQuery. A key whose path is blocked by a non-object value simply stays in
    dot notation, which is already a valid condition.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    2 people authored and Frederik Schmatz committed Aug 20, 2026
    Configuration menu
    Copy the full SHA
    62b0415 View commit details
    Browse the repository at this point in the history
  2. chore: scope test and lint discovery to src and test

    `test.include` was never set, so vitest fell back to its project-wide default
    (`**/*.{test,spec}.*`), which only skips `node_modules` and `dist`. The globs
    that are set cover something else: `includeSource` is for in-source tests and
    `coverage.include` only bounds the coverage scope.
    
    As a result, stray checkouts — e.g. a git worktree under `.claude/` — had their
    tests and type tests picked up and run. ESLint had the same problem from the
    other side: `eslint .` walked into them, and since they are outside
    `tsconfig.eslint.json` every file came back as a parser error.
    
    Scope the discovery instead of blacklisting one directory, so future worktrees
    and temporary clones are covered too.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    2 people authored and Frederik Schmatz committed Aug 20, 2026
    Configuration menu
    Copy the full SHA
    24390c6 View commit details
    Browse the repository at this point in the history
Loading