Skip to content

Add isPlainObject util, and use it for v.record - also add v.pojo() schema#1429

Open
EskiMojo14 wants to merge 7 commits intoopen-circle:mainfrom
EskiMojo14:pojo
Open

Add isPlainObject util, and use it for v.record - also add v.pojo() schema#1429
EskiMojo14 wants to merge 7 commits intoopen-circle:mainfrom
EskiMojo14:pojo

Conversation

@EskiMojo14
Copy link
Copy Markdown
Member

@EskiMojo14 EskiMojo14 commented Mar 17, 2026

Based on the utility used by Redux, among other libraries:

export function isPlainObject(
  value: unknown
): value is Record<string, unknown> {
  if (typeof value !== 'object' || value === null) {
    return false;
  }

  let proto = value;
  while (Object.getPrototypeOf(proto) !== null) {
    proto = Object.getPrototypeOf(proto);
  }

  return (
    Object.getPrototypeOf(value) === proto ||
    Object.getPrototypeOf(value) === null
  );
}

This util correctly identifies POJOs (including null prototypes and POJOs from other realms) vs complex objects like arrays.

fixes #1387 (technically breaking, though arguably a bug fix to align with existing types)

@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 17, 2026

@EskiMojo14 is attempting to deploy a commit to the Open Circle Team on Vercel.

A member of the Team first needs to authorize it.

@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Mar 17, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 17, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8f252d0a-d449-4047-83f1-1ebbc2210869

📥 Commits

Reviewing files that changed from the base of the PR and between 589eab7 and 0ceb0a8.

📒 Files selected for processing (1)
  • library/src/utils/isPlainObject/isPlainObject.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • library/src/utils/isPlainObject/isPlainObject.ts

Walkthrough

Adds a new pojo schema (runtime implementation, PojoSchema, PojoIssue) and associated unit and declaration tests. Introduces isPlainObject utility with tests and re-exports it; updates record and recordAsync to use isPlainObject for root-object checks and re-enables array-related tests. Exposes pojo and isPlainObject via library barrels. Updates TypeScript setup (types: ["node"] in tsconfig and @types/node devDependency). Adds comprehensive documentation and API/type metadata pages for pojo, PojoSchema, and PojoIssue.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main changes: adding an isPlainObject utility, applying it to v.record, and introducing a new v.pojo() schema.
Description check ✅ Passed The description provides context about the isPlainObject implementation (Redux-based), the util's correctness, and references issue #1387 about v.record accepting arrays at runtime.
Linked Issues check ✅ Passed The PR successfully addresses issue #1387 by implementing isPlainObject to reject non-plain objects (arrays) in v.record, aligning runtime validation with TypeScript types, and introducing v.pojo() for plain-object-only validation.
Out of Scope Changes check ✅ Passed All changes are scoped to the stated objectives: implementing isPlainObject utility, applying it to v.record/recordAsync, adding v.pojo schema with tests, and updating related documentation.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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


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

❤️ Share

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

@dosubot dosubot Bot added the enhancement New feature or request label Mar 17, 2026
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Mar 17, 2026

Open in StackBlitz

npm i https://pkg.pr.new/valibot@1429

commit: 0ceb0a8

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
library/src/utils/isPlainObject/isPlainObject.test.ts (1)

5-29: Consider adding an explicit cross-realm POJO test.

The current suite is strong, but the PR explicitly claims cross-realm support. Adding one dedicated cross-realm case would lock that guarantee against regressions.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@library/src/utils/isPlainObject/isPlainObject.test.ts` around lines 5 - 29,
Add a dedicated cross-realm POJO test to the isPlainObject test suite: create an
object from a different realm (e.g., using Node's vm to run '({})' in a new
context or an iframe in browser runs) and assert isPlainObject returns true for
that object; update library/src/utils/isPlainObject/isPlainObject.test.ts to
include this case alongside the existing plain-object tests so cross-realm
behavior of isPlainObject is explicitly covered.
library/src/schemas/pojo/pojo.ts (1)

57-63: Missing blank line between interface definition and JSDoc.

There should be a blank line between the closing brace of PojoSchema interface and the JSDoc comment for the pojo function, for consistency with the rest of the codebase.

Suggested fix
   readonly message: TMessage;
 }
+
 /**
  * Creates a POJO schema.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@library/src/schemas/pojo/pojo.ts` around lines 57 - 63, The JSDoc for the
pojo() function is directly adjacent to the closing brace of the PojoSchema
interface; add a single blank line between the end of the PojoSchema interface
(the closing "}") and the JSDoc block above the export function pojo():
PojoSchema<undefined> so the file matches the project's spacing conventions and
other schema declarations.
library/src/schemas/pojo/pojo.test.ts (1)

36-46: Consider adding a test for cross-realm objects.

The PR objectives mention that the isPlainObject implementation handles cross-realm POJOs. Consider adding a test to verify this behavior, though this may be better suited for the isPlainObject utility tests.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@library/src/schemas/pojo/pojo.test.ts` around lines 36 - 46, Add a test in
pojo.test.ts that verifies cross-realm plain objects are accepted: create an
object from another realm (e.g., using Node's vm.Module/VM or an iframe in
browser tests) and call expectNoSchemaIssue(schema, [crossRealmObj]) where
schema = pojo(); reference the existing test harness (expectNoSchemaIssue and
pojo()) and ensure the new test mirrors the "for null prototype" style so it
asserts the schema accepts cross-realm POJOs handled by isPlainObject.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@library/src/schemas/record/recordAsync.ts`:
- Line 138: The async branch in recordAsync (the guard using
isPlainObject(input) in recordAsync.ts) lacks test coverage because the
async-array rejection test in recordAsync.test.ts is disabled; either re-enable
and fix that test (lines ~117–121) to assert that passing an array to the async
record function rejects (mirror the sync behavior) or explicitly document in
recordAsync.ts why async differs from record if you intend divergence—locate the
test referencing the async record function and update it to await the call and
expect a rejection for arrays, or add a clear TODO/comment near the
isPlainObject(input) guard explaining the intentional difference and linking to
the test decision.

---

Nitpick comments:
In `@library/src/schemas/pojo/pojo.test.ts`:
- Around line 36-46: Add a test in pojo.test.ts that verifies cross-realm plain
objects are accepted: create an object from another realm (e.g., using Node's
vm.Module/VM or an iframe in browser tests) and call expectNoSchemaIssue(schema,
[crossRealmObj]) where schema = pojo(); reference the existing test harness
(expectNoSchemaIssue and pojo()) and ensure the new test mirrors the "for null
prototype" style so it asserts the schema accepts cross-realm POJOs handled by
isPlainObject.

In `@library/src/schemas/pojo/pojo.ts`:
- Around line 57-63: The JSDoc for the pojo() function is directly adjacent to
the closing brace of the PojoSchema interface; add a single blank line between
the end of the PojoSchema interface (the closing "}") and the JSDoc block above
the export function pojo(): PojoSchema<undefined> so the file matches the
project's spacing conventions and other schema declarations.

In `@library/src/utils/isPlainObject/isPlainObject.test.ts`:
- Around line 5-29: Add a dedicated cross-realm POJO test to the isPlainObject
test suite: create an object from a different realm (e.g., using Node's vm to
run '({})' in a new context or an iframe in browser runs) and assert
isPlainObject returns true for that object; update
library/src/utils/isPlainObject/isPlainObject.test.ts to include this case
alongside the existing plain-object tests so cross-realm behavior of
isPlainObject is explicitly covered.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 670a4389-0857-4eb2-bca1-b9ee3768b9eb

📥 Commits

Reviewing files that changed from the base of the PR and between 2d9f15d and 5353362.

📒 Files selected for processing (26)
  • library/src/schemas/index.ts
  • library/src/schemas/pojo/index.ts
  • library/src/schemas/pojo/pojo.test-d.ts
  • library/src/schemas/pojo/pojo.test.ts
  • library/src/schemas/pojo/pojo.ts
  • library/src/schemas/record/record.test.ts
  • library/src/schemas/record/record.ts
  • library/src/schemas/record/recordAsync.ts
  • library/src/utils/index.ts
  • library/src/utils/isPlainObject/index.ts
  • library/src/utils/isPlainObject/isPlainObject.test.ts
  • library/src/utils/isPlainObject/isPlainObject.ts
  • website/src/routes/api/(schemas)/looseObject/index.mdx
  • website/src/routes/api/(schemas)/object/index.mdx
  • website/src/routes/api/(schemas)/objectWithRest/index.mdx
  • website/src/routes/api/(schemas)/pojo/index.mdx
  • website/src/routes/api/(schemas)/pojo/properties.ts
  • website/src/routes/api/(schemas)/record/index.mdx
  • website/src/routes/api/(schemas)/strictObject/index.mdx
  • website/src/routes/api/(types)/PojoIssue/index.mdx
  • website/src/routes/api/(types)/PojoIssue/properties.ts
  • website/src/routes/api/(types)/PojoSchema/index.mdx
  • website/src/routes/api/(types)/PojoSchema/properties.ts
  • website/src/routes/api/menu.md
  • website/src/routes/guides/(main-concepts)/schemas/index.mdx
  • website/src/routes/guides/(schemas)/objects/index.mdx

Comment thread library/src/schemas/record/recordAsync.ts
@EskiMojo14
Copy link
Copy Markdown
Member Author

undecided if we should use object or Record<string, unknown> for the narrowed type here, open to feedback


// If root type is valid, check nested types
if (input && typeof input === 'object') {
if (input && isPlainObject(input)) {
Copy link
Copy Markdown
Member Author

@EskiMojo14 EskiMojo14 Mar 17, 2026

Choose a reason for hiding this comment

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

this could just be if (isPlainObject(input)) but i think a falsy check will probably fail faster

@fabian-hiller
Copy link
Copy Markdown
Member

Do you think there will be a meaningful performance impact?

@fabian-hiller fabian-hiller self-assigned this Mar 17, 2026
@fabian-hiller fabian-hiller added the priority This has priority label Mar 17, 2026
@fabian-hiller fabian-hiller added this to the v1.4 milestone Mar 17, 2026
@EskiMojo14
Copy link
Copy Markdown
Member Author

depends on how slow Object.getPrototypeOf is, I guess - primitives will still fail fast, plain objects should be pretty fast since the loop will only happen once, but non-plain objects may be slower (but they should be failing now instead of passing)

@EskiMojo14
Copy link
Copy Markdown
Member Author

it would probably be quicker without the loop (Object.getPrototypeOf(value) === Object.prototype), but then you lose correctness for cross-realm objects (VM, iframe, etc)

@belgattitude
Copy link
Copy Markdown

belgattitude commented Apr 11, 2026

BTW you might have a look at this implem:

https://github.com/belgattitude/httpx/tree/main/packages/plain-object#readme.

100% redux compat, might be 2x-4x times faster depending (see benchmarks).

 RUN  v4.1.4 /home/sebastien/github/httpx/packages/plain-object

 ✓ bench/comparative.bench.ts > Compare calling isPlainObject with 110x mixed types values 6702ms
     name                                                           hz     min     max    mean     p75     p99    p995    p999     rme  samples
   · "@httpx/plain-object": `isPlainObject(v)`            1,301,180.23  0.0007  1.2707  0.0008  0.0007  0.0013  0.0016  0.0090  ±0.71%   650591
   · "is-plain-obj":"4.1.0": 'isPlainObj(v)'              1,170,620.68  0.0007  0.4172  0.0009  0.0008  0.0016  0.0019  0.0119  ±0.52%   585311
   · "@sindresorhus/is":"8.0.0": 'is.plainObject(v)'      1,135,634.79  0.0007  0.7565  0.0009  0.0008  0.0016  0.0019  0.0123  ±0.75%   567818
   · "es-toolkit":"1.45.1": 'isPlainObject(v)'            1,040,985.16  0.0008  0.7910  0.0010  0.0008  0.0018  0.0021  0.0149  ±0.58%   520493
   · "redux":"5.0.1": 'isPlainObject(v)'                    367,333.57  0.0021  8.2123  0.0027  0.0022  0.0052  0.0061  0.0333  ±4.96%   183667
   · "is-plain-object":"5.0.0": 'isPlainObject(v)'          553,579.82  0.0014  7.1030  0.0018  0.0015  0.0040  0.0043  0.0254  ±2.91%   276791
   · "immer/is-plain-object":"4.2.0": 'isPlainObject(v)'    429,868.70  0.0020  1.3350  0.0023  0.0020  0.0050  0.0056  0.0280  ±0.95%   214935
   · lodash-es:"4.18.1": '_.isPlainObject(v)'                16,017.70  0.0475  6.8642  0.0624  0.0663  0.1644  0.2127  0.4020  ±3.10%     8011

 BENCH  Summary
                                                                                                                                                                                    
  "@httpx/plain-object": `isPlainObject(v)` - bench/comparative.bench.ts > Compare calling isPlainObject with 110x mixed types values
    1.11x faster than "is-plain-obj":"4.1.0": 'isPlainObj(v)'
    1.15x faster than "@sindresorhus/is":"8.0.0": 'is.plainObject(v)'
    1.25x faster than "es-toolkit":"1.45.1": 'isPlainObject(v)'
    2.35x faster than "is-plain-object":"5.0.0": 'isPlainObject(v)'
    3.03x faster than "immer/is-plain-object":"4.2.0": 'isPlainObject(v)'
    3.54x faster than "redux":"5.0.1": 'isPlainObject(v)'
    81.23x faster than lodash-es:"4.18.1": '_.isPlainObject(v)'

Tested on bun, node, chrome, workers.

import type { BasePlainObject, DefaultBasePlainObject } from './internal.types';
import type { PlainObject } from './plain-object.types';

/**
 * Check if a value is a plain object
 *
 * A plain object is a basic JavaScript object, such as {}, { data: [] }, new Object() or Object.create(null).
 *
 * @example
 * ```typescript
 * import { isPlainObject } from '@httpx/plain-object';
 *
 * // ✅👇 True
 *
 * isPlainObject({ });                       // ✅
 * isPlainObject({ key: 'value' });          // ✅
 * isPlainObject({ key: new Date() });       // ✅
 * isPlainObject(new Object());              // ✅
 * isPlainObject(Object.create(null));       // ✅
 * isPlainObject({ nested: { key: true} });  // ✅
 * isPlainObject(new Proxy({}, {}));         // ✅
 * isPlainObject({ [Symbol('tag')]: 'A' });  // ✅
 *
 * // ✅👇 (node context, workers, ...)
 * const runInNewContext = await import('node:vm').then(
 *     (mod) => mod.runInNewContext
 * );
 * isPlainObject(runInNewContext('({})'));   // ✅
 *
 * // ❌👇 False
 *
 * class Test { };
 * isPlainObject(new Test())           // ❌
 * isPlainObject(10);                  // ❌
 * isPlainObject(null);                // ❌
 * isPlainObject('hello');             // ❌
 * isPlainObject([]);                  // ❌
 * isPlainObject(new Date());          // ❌
 * isPlainObject(new Uint8Array([1])); // ❌
 * isPlainObject(Buffer.from('ABC'));  // ❌
 * isPlainObject(Promise.resolve({})); // ❌
 * isPlainObject(Object.create({}));   // ❌
 * isPlainObject(new (class Cls {}));  // ❌
 *
 * // ⚠️ Edge cases
 * //
 * // 👇 globalThis isn't properly portable across all JS environments
 * //
 *
 * isPlainObject(globalThis);          // ✅ with Bun ❌ otherwise (browser, Nodejs, edge, cloudflare)
 *
 * // 👇 Static built-in classes aren't properly checked. This is a trade-off
 * //    to maintain the best performance and size. If you need to check for these,
 * //    use a custom type guard. But in most cases, you won't need to check for these
 * //    as the probability of writing a code that receives these as plain objects is low.
 * //    and probably indicates an issue in your code.
 *
 * isPlainObject(Math);                // ⚠️✅ return true, but Math is not a plain object
 * isPlainObject(JSON);                // ⚠️✅ return true, but JSON is not a plain object
 * isPlainObject(Atomics);             // ⚠️✅ return true, but Atomics is not a plain object
 * isPlainObject(Reflect);             // ⚠️✅ return true, but Reflect is not a plain object
 * ```
 */
export const isPlainObject = <
  TValue extends BasePlainObject = DefaultBasePlainObject,
>(
  v: unknown
): v is TValue extends DefaultBasePlainObject
  ? BasePlainObject
  : PlainObject<TValue> => {
  if (v === null || typeof v !== 'object') {
    return false;
  }

  const proto = Object.getPrototypeOf(v) as typeof Object.prototype | null;
  return (
    proto === null ||
    proto === Object.prototype ||
    // Required to support node:vm.runInNewContext({})
    Object.getPrototypeOf(proto) === null
  );
};

Test file:

https://github.com/belgattitude/httpx/blob/main/packages/plain-object/src/__tests__/is-plain-object.test.ts

@fabian-hiller
Copy link
Copy Markdown
Member

If we implement this, does parsing env variables still work? I remember that env variables (I think it was Node.js) were not a plain object. We should check that before we continue with this PR.

@fabian-hiller fabian-hiller added the next version Something to look at for our next major release label Apr 12, 2026
@EskiMojo14
Copy link
Copy Markdown
Member Author

image

looks like you're right, process.env is not a plain object.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
website/src/routes/api/(schemas)/object/index.mdx (1)

36-36: Polish repetitive sentence openings in the explanation block.

Line 36 starts multiple consecutive sentences with “To”, which reads a bit choppy. A small rewording would improve flow.

✍️ Suggested wording
-> This schema removes unknown entries. The output will only include the entries you specify. To include unknown entries, use <Link href="../looseObject/">`looseObject`</Link>. To return an issue for unknown entries, use <Link href="../strictObject/">`strictObject`</Link>. To include and validate unknown entries, use <Link href="../objectWithRest/">`objectWithRest`</Link>. If you only need to validate that the input is a plain object, use <Link href="../pojo/">`pojo`</Link>.
+> This schema removes unknown entries, so the output only includes the entries you specify. Use <Link href="../looseObject/">`looseObject`</Link> to include unknown entries, <Link href="../strictObject/">`strictObject`</Link> to return an issue for unknown entries, and <Link href="../objectWithRest/">`objectWithRest`</Link> to include and validate unknown entries. If you only need plain-object root validation, use <Link href="../pojo/">`pojo`</Link>.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@website/src/routes/api/`(schemas)/object/index.mdx at line 36, The
explanation paragraph is choppy because multiple consecutive sentences begin
with "To"; reword the block that mentions looseObject, strictObject,
objectWithRest, and pojo so it flows better (e.g., combine clauses and vary
openings), e.g., lead with a short summary about unknown entries then list
alternatives using those schema names (`looseObject`, `strictObject`,
`objectWithRest`, `pojo`) with one-sentence descriptions each; update the text
in the same paragraph where the current sentence starting "To include unknown
entries..." appears.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@website/src/routes/api/`(schemas)/object/index.mdx:
- Line 36: The explanation paragraph is choppy because multiple consecutive
sentences begin with "To"; reword the block that mentions looseObject,
strictObject, objectWithRest, and pojo so it flows better (e.g., combine clauses
and vary openings), e.g., lead with a short summary about unknown entries then
list alternatives using those schema names (`looseObject`, `strictObject`,
`objectWithRest`, `pojo`) with one-sentence descriptions each; update the text
in the same paragraph where the current sentence starting "To include unknown
entries..." appears.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ab11dc19-d008-4123-a6f9-09a14060ede3

📥 Commits

Reviewing files that changed from the base of the PR and between 36ec82f and 589eab7.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (29)
  • library/package.json
  • library/src/schemas/index.ts
  • library/src/schemas/pojo/index.ts
  • library/src/schemas/pojo/pojo.test-d.ts
  • library/src/schemas/pojo/pojo.test.ts
  • library/src/schemas/pojo/pojo.ts
  • library/src/schemas/record/record.test.ts
  • library/src/schemas/record/record.ts
  • library/src/schemas/record/recordAsync.test.ts
  • library/src/schemas/record/recordAsync.ts
  • library/src/utils/index.ts
  • library/src/utils/isPlainObject/index.ts
  • library/src/utils/isPlainObject/isPlainObject.test.ts
  • library/src/utils/isPlainObject/isPlainObject.ts
  • library/tsconfig.json
  • website/src/routes/api/(schemas)/looseObject/index.mdx
  • website/src/routes/api/(schemas)/object/index.mdx
  • website/src/routes/api/(schemas)/objectWithRest/index.mdx
  • website/src/routes/api/(schemas)/pojo/index.mdx
  • website/src/routes/api/(schemas)/pojo/properties.ts
  • website/src/routes/api/(schemas)/record/index.mdx
  • website/src/routes/api/(schemas)/strictObject/index.mdx
  • website/src/routes/api/(types)/PojoIssue/index.mdx
  • website/src/routes/api/(types)/PojoIssue/properties.ts
  • website/src/routes/api/(types)/PojoSchema/index.mdx
  • website/src/routes/api/(types)/PojoSchema/properties.ts
  • website/src/routes/api/menu.md
  • website/src/routes/guides/(main-concepts)/schemas/index.mdx
  • website/src/routes/guides/(schemas)/objects/index.mdx
✅ Files skipped from review due to trivial changes (18)
  • library/src/utils/index.ts
  • website/src/routes/api/(schemas)/looseObject/index.mdx
  • library/src/schemas/pojo/index.ts
  • library/src/utils/isPlainObject/index.ts
  • library/tsconfig.json
  • website/src/routes/api/(schemas)/record/index.mdx
  • website/src/routes/api/(schemas)/strictObject/index.mdx
  • website/src/routes/api/(types)/PojoIssue/index.mdx
  • website/src/routes/guides/(schemas)/objects/index.mdx
  • website/src/routes/api/(types)/PojoIssue/properties.ts
  • website/src/routes/api/(types)/PojoSchema/index.mdx
  • website/src/routes/api/menu.md
  • website/src/routes/api/(schemas)/pojo/index.mdx
  • website/src/routes/api/(types)/PojoSchema/properties.ts
  • library/src/schemas/pojo/pojo.test-d.ts
  • website/src/routes/api/(schemas)/pojo/properties.ts
  • library/package.json
  • library/src/utils/isPlainObject/isPlainObject.test.ts
🚧 Files skipped from review as they are similar to previous changes (9)
  • library/src/schemas/index.ts
  • library/src/schemas/record/recordAsync.ts
  • website/src/routes/api/(schemas)/objectWithRest/index.mdx
  • website/src/routes/guides/(main-concepts)/schemas/index.mdx
  • library/src/schemas/record/record.ts
  • library/src/schemas/record/record.test.ts
  • library/src/utils/isPlainObject/isPlainObject.ts
  • library/src/schemas/pojo/pojo.test.ts
  • library/src/schemas/record/recordAsync.test.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request next version Something to look at for our next major release priority This has priority size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v.record() accepts arrays at runtime but TypeScript types reject them

3 participants