Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
9cef134
feat: implement three-tier export architecture with dedicated entries…
yamcodes Feb 21, 2026
0bd952e
feat: reorganize ArkEnv export surface into three tiers with dedicate…
yamcodes Feb 21, 2026
326a999
feat: add single validation implementation requirement for main and s…
yamcodes Feb 21, 2026
bc551cd
feat: implement three-tier export architecture with dedicated entries…
yamcodes Feb 21, 2026
8541b2b
feat: complete implementation of three-tier export architecture with …
yamcodes Feb 21, 2026
12d6272
fix: reorder exports in core and index files for consistency
yamcodes Feb 21, 2026
d67ea7b
Merge branch 'main' into arkenv-standard-import
yamcodes Feb 21, 2026
9c3f296
fix: update import paths to use "arkenv" instead of "arkenv/arktype" …
yamcodes Feb 21, 2026
3558137
fix: update import paths to use "arkenv" instead of "arkenv/arktype" …
yamcodes Feb 21, 2026
824ce87
fix: update import statements to use "arkenv" for consistency across …
yamcodes Feb 21, 2026
141a170
fix: consolidate arkenv imports in Vite configuration files for consi…
yamcodes Feb 21, 2026
f575cc4
fix: update import statements to remove file extensions for consistency
yamcodes Feb 21, 2026
d884933
fix: add assertion to ensure bundle contains no arktype references
yamcodes Feb 21, 2026
e5edfe7
fix: refactor export surface by removing arktype sub-path and adding …
yamcodes Feb 21, 2026
6d953e0
fix: enhance import structure and formatting for consistency across f…
yamcodes Feb 21, 2026
4525906
Typecheck fixes
yamcodes Feb 21, 2026
cbbd408
bump limit to 3k
yamcodes Feb 21, 2026
4ef4ac8
CR changes
yamcodes Feb 21, 2026
324fd6f
Update docs to reflect new type name
yamcodes Feb 21, 2026
3999074
style: standardize em dash to hyphen in docs and code
yamcodes Feb 21, 2026
61cf498
docs: document new entry points for arktype and standard
yamcodes Feb 21, 2026
0db0820
docs: Correct hyphen in arkenv/core description
yamcodes Feb 21, 2026
ff60f50
docs: document `arkenv/standard` entrypoint
yamcodes Feb 21, 2026
8d4aea1
docs: clarify arkenv import instructions
yamcodes Feb 21, 2026
1bc288c
refactor(arkenv): improve type definitions and robustness
yamcodes Feb 21, 2026
c0ffb61
docs(imports): consolidate arkenv imports
yamcodes Feb 21, 2026
468938f
docs: update arktype export & dependency docs
yamcodes Feb 21, 2026
a968bbf
docs: update arkenv quickstart and vite docs
yamcodes Feb 21, 2026
77ada53
Merge branch 'main' into arkenv-standard-import
yamcodes Feb 21, 2026
0b83d15
address all code review notes in files
yamcodes Feb 22, 2026
0d5a8de
make 'src/index.ts' the sot for 'type'
yamcodes Feb 22, 2026
85acc4c
remove 'validator: "standard"' option from main 'createEnv'
yamcodes Feb 22, 2026
6fe2c6f
fix build and failing tests
yamcodes Feb 22, 2026
da40c64
address modified plan in commit
yamcodes Feb 22, 2026
7bdb199
sync examples
yamcodes Feb 22, 2026
7e83152
Merge branch 'main'
yamcodes Feb 22, 2026
e1b78d3
fix typecheck
yamcodes Feb 22, 2026
03c7d8d
fix formatting
yamcodes Feb 22, 2026
204640c
take care of all validator: "standard" references
yamcodes Feb 22, 2026
477f7b3
fix low-risk redos pattern
yamcodes Feb 22, 2026
02704b4
fix cr comments
yamcodes Feb 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .agent/workflows/openspec-apply.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ description: Implement an approved OpenSpec change and keep tasks in sync.
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
Track these steps as TODOs and complete them one by one.
1. Read `changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
3. Confirm completion before updating statusesmake sure every item in `tasks.md` is finished.
3. Confirm completion before updating statuses - make sure every item in `tasks.md` is finished.
4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
5. Reference `openspec list` or `openspec show <item>` when additional context is required.

Expand Down
2 changes: 1 addition & 1 deletion .agent/workflows/openspec-archive.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Archive a deployed OpenSpec change and update specs.
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
1. Determine the change ID to archive:
Expand Down
2 changes: 1 addition & 1 deletion .agent/workflows/openspec-proposal.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Scaffold a new OpenSpec change and validate strictly.
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.
- Do not write any code during the proposal stage. Only create design documents (proposal.md, tasks.md, design.md, and spec deltas). Implementation happens in the apply stage after approval.

Expand Down
41 changes: 41 additions & 0 deletions .changeset/nine-poems-rule.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
"arkenv": minor
"@arkenv/vite-plugin": patch
---

#### Add `arkenv/standard` import for non-ArkType consumers

`arkenv` now ships three separate imports:

- **`arkenv`** (main): ArkType-first. Includes `createEnv`, `type`, and `ArkEnvError`. The `type` helper, previously at `arkenv/arktype`, has moved here.
- **`arkenv/standard`**: ArkType-free. A standalone `createEnv` for Standard Schema validators (Zod, Valibot, etc.) with zero ArkType in the bundle.
- **`arkenv/core`**: Mode-agnostic primitives - `ArkEnvError` and `ValidationIssue`.

**For Standard Schema users** (Zod, Valibot, etc.), import from `arkenv/standard` directly, without passing `{ validator: "standard" }` on every call:

```ts
// ❌ Before
import { createEnv } from "arkenv";
import { z } from "zod";

const env = createEnv(
{ PORT: z.coerce.number() },
{ validator: "standard" },
);

// ✅ After
import { createEnv } from "arkenv/standard";
import { z } from "zod";

const env = createEnv({ PORT: z.coerce.number() });
```

**For `arkenv/arktype` users**, the `type` helper has moved to the main entry:

```ts
// ❌ Before
import { type } from "arkenv/arktype";

// ✅ After
import { type } from "arkenv"; // 'type' is the ArkEnv helper, not a TS type modifier
```
4 changes: 2 additions & 2 deletions .claude/commands/openspec/apply.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ tags: [openspec, apply]
## Guardrails
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

## Steps
Track these steps as TODOs and complete them one by one.
1. Read `changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
3. Confirm completion before updating statusesmake sure every item in `tasks.md` is finished.
3. Confirm completion before updating statuses - make sure every item in `tasks.md` is finished.
4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
5. Reference `openspec list` or `openspec show <item>` when additional context is required.

Expand Down
2 changes: 1 addition & 1 deletion .claude/commands/openspec/archive.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ tags: [openspec, archive]
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
1. Determine the change ID to archive:
Expand Down
2 changes: 1 addition & 1 deletion .claude/commands/openspec/proposal.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ tags: [openspec, change]
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.
- Do not write any code during the proposal stage. Only create design documents (proposal.md, tasks.md, design.md, and spec deltas). Implementation happens in the apply stage after approval.

Expand Down
4 changes: 2 additions & 2 deletions .cursor/commands/openspec-apply.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ description: Implement an approved OpenSpec change and keep tasks in sync.
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
Track these steps as TODOs and complete them one by one.
1. Read `changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
3. Confirm completion before updating statusesmake sure every item in `tasks.md` is finished.
3. Confirm completion before updating statuses - make sure every item in `tasks.md` is finished.
4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
5. Reference `openspec list` or `openspec show <item>` when additional context is required.

Expand Down
2 changes: 1 addition & 1 deletion .cursor/commands/openspec-archive.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Archive a deployed OpenSpec change and update specs.
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
1. Determine the change ID to archive:
Expand Down
2 changes: 1 addition & 1 deletion .cursor/commands/openspec-proposal.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: Scaffold a new OpenSpec change and validate strictly.
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directoryrun `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory - run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.
- Do not write any code during the proposal stage. Only create design documents (proposal.md, tasks.md, design.md, and spec deltas). Implementation happens in the apply stage after approval.

Expand Down
2 changes: 1 addition & 1 deletion .github/actions/size-limit/src/output.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const createTable = (results: SizeLimitResult[]): string => {
const tableRows = results
.map(
(r) =>
`| \`${r.package}\` | \`${r.size}\` | \`${r.limit}\` | \`${r.diff ?? ""}\` | ${r.status} |`,
`| \`${r.package}\` | \`${r.size}\` | \`${r.limit}\` | \`${r.diff ?? " - "}\` | ${r.status} |`,
)
.join("\n");
return `| Package | Size | Limit | Diff | Status |\n|:--- | :---:| :---:| :---:| :---:|\n${tableRows}`;
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/size-limit/src/results.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export const calculateDiffs = (
`⚠️ No baseline found for ${key}. Baseline map is empty (size: ${baselineSizes.size}).`,
);
}
result.diff = "";
result.diff = " - ";
}
}
};
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/size-limit/src/utils/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export async function parseJsonFiles(): Promise<SizeLimitResult[]> {
const limit =
typeof rawLimit === "number"
? formatBytes(rawLimit)
: rawLimit || "";
: rawLimit || " - ";

results.push({
package: pkgName,
Expand Down
6 changes: 3 additions & 3 deletions .github/actions/size-limit/src/utils/size.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export const calculateDiff = (
baseline: SizeInBytes,
): string => {
if (baseline === 0) {
return current > 0 ? "+∞%" : "";
return current > 0 ? "+∞%" : " - ";
}

// Check if sizes are equal (or very close due to floating point precision)
Expand All @@ -53,9 +53,9 @@ export const calculateDiff = (
}

const diff = ((current - baseline) / baseline) * 100;
// Show "" for very small changes (< 0.1%) that aren't exactly equal
// Show "<0.1%" for measurable but sub-0.1% changes (distinct from the "no data" sentinel)
if (Math.abs(diff) < 0.1) {
return "";
return "<0.1%";
}
const sign = diff > 0 ? "+" : "";
return `${sign}${diff.toFixed(1)}%`;
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ To manage Vercel resource usage, we implement a soft rate limiter for preview de
- **Daily Limit**: 72 preview deployments per 24 hours.
- **Cooldown**: 20 minutes between deployments on the same PR.

If the limit or cooldown is reached, the deployment step in the GitHub Action will be skipped. This is a "soft" limitit doesn't fail the build, it just pauses deployments. Production deployments are not gated but will trigger an alert if frequency exceeds 24/day.
If the limit or cooldown is reached, the deployment step in the GitHub Action will be skipped. This is a "soft" limit - it doesn't fail the build, it just pauses deployments. Production deployments are not gated but will trigger an alert if frequency exceeds 24/day.

## Changesets

Expand Down
2 changes: 1 addition & 1 deletion apps/playgrounds/bun-react/src/env.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type } from "arkenv/arktype";
import { type } from "arkenv";

export default type({
BUN_PUBLIC_API_URL: "string.url",
Expand Down
2 changes: 1 addition & 1 deletion apps/playgrounds/solid-start/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ The example uses a single schema definition in `app.config.ts` that defines the
```ts title="app.config.ts"
import arkenvVitePlugin from "@arkenv/vite-plugin";
import { defineConfig } from "@solidjs/start/config";
import { type } from "arkenv/arktype";
import { type } from "arkenv";

// Define the schema
export const Env = type({
Expand Down
2 changes: 1 addition & 1 deletion apps/playgrounds/solid-start/app.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import arkenvVitePlugin from "@arkenv/vite-plugin";
import { defineConfig } from "@solidjs/start/config";
import { type } from "arkenv/arktype";
import { type } from "arkenv";

export const Env = type({
VITE_TEST: "string",
Expand Down
51 changes: 24 additions & 27 deletions apps/playgrounds/standard-schema/index.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,32 @@
import arkenv from "arkenv";
import arkenv from "arkenv/standard";
import * as z from "zod";

const env = arkenv(
{
// Zod validators (great for complex validation and transformations)
DATABASE_URL: z.url(),
API_KEY: z
.string()
.min(32)
.describe("API key must be at least 32 characters"),
const env = arkenv({
// Zod validators (great for complex validation and transformations)
DATABASE_URL: z.url(),
API_KEY: z
.string()
.min(32)
.describe("API key must be at least 32 characters"),

// Standard Schema compatible validators
MAX_RETRIES: z.coerce.number().int().positive().default(3),
TIMEOUT_MS: z.coerce.number().int().min(0).max(30000).default(5000),
// Standard Schema compatible validators
MAX_RETRIES: z.coerce.number().int().positive().default(3),
TIMEOUT_MS: z.coerce.number().int().min(0).max(30000).default(5000),

// Complex transformations with Zod
ALLOWED_ORIGINS: z
.string()
.transform((str: string) => str.split(","))
.pipe(z.array(z.url())),
// Complex transformations with Zod
ALLOWED_ORIGINS: z
.string()
.transform((str: string) => str.split(","))
.pipe(z.array(z.url())),

NODE_ENV: z
.enum(["development", "production", "test"])
.default("development"),
DEBUG: z
.union([z.boolean(), z.enum(["true", "false", "1", "0"])])
.transform((v) => v === true || v === "true" || v === "1")
.default(false),
},
{ validator: "standard" },
);
NODE_ENV: z
.enum(["development", "production", "test"])
.default("development"),
DEBUG: z
.union([z.boolean(), z.enum(["true", "false", "1", "0"])])
.transform((v) => v === true || v === "true" || v === "1")
.default(false),
});

// All validators work together seamlessly with full type inference
console.log({
Expand Down
3 changes: 1 addition & 2 deletions apps/playgrounds/vite-legacy/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import arkenvVitePlugin from "@arkenv/vite-plugin";
import reactPlugin from "@vitejs/plugin-react";
import arkenv from "arkenv";
import { type } from "arkenv/arktype";
import arkenv, { type } from "arkenv";
import { defineConfig, loadEnv } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";

Expand Down
2 changes: 1 addition & 1 deletion apps/playgrounds/vite/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ The example uses a single schema definition that's reused for both server-side c

```ts title="vite.config.ts"
import arkenvVitePlugin from "@arkenv/vite-plugin";
import arkenv from "arkenv"; import { type } from "arkenv/arktype";
import arkenv, { type } from "arkenv";
import { defineConfig, loadEnv } from "vite";

// Define the schema once
Expand Down
3 changes: 1 addition & 2 deletions apps/playgrounds/vite/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import arkenvVitePlugin from "@arkenv/vite-plugin";
import reactPlugin from "@vitejs/plugin-react";
import arkenv from "arkenv";
import { type } from "arkenv/arktype";
import arkenv, { type } from "arkenv";
import { defineConfig, loadEnv } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";

Expand Down
2 changes: 1 addition & 1 deletion apps/www/components/page/video-demo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export function VideoDemo() {
<div className="w-3 h-3 rounded-full bg-[#27c93f]" />
</div>
<div className="mx-auto text-xs font-mono text-gray-600 dark:text-gray-300 select-none">
basic index.ts
basic - index.ts
</div>
</div>

Expand Down
2 changes: 1 addition & 1 deletion apps/www/content/docs/arkenv/coercion.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: Environment variables are auto-morphed into typesafe numbers, boole
Traditionally, environment variables are always strings by default. ArkEnv **coerces** these strings into their target types based on your schema, so you only have to think about the types you want.

> [!IMPORTANT]
> Coercion is only available in **ArkType mode** (the default). When using `validator: "standard"`, your Standard Schema validators handle their own parsing and type conversion.
> Coercion is only available in **ArkType mode** (the default). When using `arkenv/standard`, your Standard Schema validators handle their own parsing and type conversion.

## Numbers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ Choose between ArkType (default) or Standard Schema validators:

```typescript title="src/config/env.ts" twoslash
import arkenv from 'arkenv';
import arkenvStandard from 'arkenv/standard';
import { z } from 'zod';

// ArkType mode (default) - requires ArkType to be installed
Expand All @@ -214,13 +215,10 @@ const env1 = arkenv({
});

// Standard mode - works without ArkType
const env2 = arkenv(
{
PORT: z.coerce.number().int().min(0).max(65535),
DATABASE_URL: z.url(),
},
{ validator: "standard" }
);
const env2 = arkenvStandard({
PORT: z.coerce.number().int().min(0).max(65535),
DATABASE_URL: z.url(),
});
```

### Coercion
Expand Down
3 changes: 1 addition & 2 deletions apps/www/content/docs/arkenv/how-to/reuse-schemas.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ This might sound like a niche use-case, but it comes up more often than you'd th
That's where type definitions start making sense: define your schema once with `type()`, and reuse it wherever you need.

```ts twoslash
import arkenv from 'arkenv';
import { type } from 'arkenv/arktype';
import arkenv, { type } from 'arkenv';

const Env = type({
HOST: "string.host",
Expand Down
Loading
Loading