Skip to content
Back to skills

Deno

BSecurity

Deno runtime for TypeScript/JavaScript. Covers permissions, standard library, testing, and Deploy. Use for secure, TypeScript-native backend development. USE WHEN: user mentions "deno", "permissions", "Deno.serve", asks about "deno test", "deno deploy", "standard library", "top-level await", "npm compatibility" DO NOT USE FOR: Node.js runtime - use `nodejs` skill instead DO NOT USE FOR: Fresh/Oak frameworks - use framework-specific skills DO NOT USE FOR: Language syntax - use `typescript` s...

  • 31 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
ai-agentsjavascripttypescriptjavabashnodenodejsexpresstestingapidatabase

Works with

  • api
  • mcp

Security analysis

B88/100
  • criticalAccesses sensitive system or user directories

Pro scans all 2 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add claude-dev-suite/claude-dev-suite --skill deno --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Deno?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Deno
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/claude-dev-suite-deno/badge)](https://www.skillsdirectory.com/skills/claude-dev-suite-deno)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: deno
description: |
  Deno runtime for TypeScript/JavaScript. Covers permissions, standard library,
  testing, and Deploy. Use for secure, TypeScript-native backend development.

  USE WHEN: user mentions "deno", "permissions", "Deno.serve", asks about
  "deno test", "deno deploy", "standard library", "top-level await", "npm compatibility"

  DO NOT USE FOR: Node.js runtime - use `nodejs` skill instead
  DO NOT USE FOR: Fresh/Oak frameworks - use framework-specific skills
  DO NOT USE FOR: Language syntax - use `typescript` skill
allowed-tools: Read, Grep, Glob, Write, Edit
---
# Deno Core Knowledge

> **Full Reference**: See [advanced.md](advanced.md) for production readiness, testing patterns, middleware, Deno Deploy, and npm compatibility.

> **Deep Knowledge**: Use `mcp__documentation__fetch_docs` with technology: `deno` for comprehensive documentation.

## Basics

### Running Scripts

```bash
# Run a TypeScript file
deno run main.ts

# Run with permissions
deno run --allow-net --allow-read main.ts

# Run remote script
deno run https://deno.land/std/examples/welcome.ts

# Check/compile without running
deno check main.ts
```

### TypeScript Native

```typescript
// main.ts - TypeScript works out of the box
interface User {
  id: number;
  name: string;
  email: string;
}

async function fetchUser(id: number): Promise<User> {
  const response = await fetch(`https://api.example.com/users/${id}`);
  return await response.json();
}

// Top-level await - no async wrapper needed
const user = await fetchUser(1);
console.log(user.name);
```

---

## Permissions

### Permission Types

| Flag | Description |
|------|-------------|
| `--allow-read` | File system read access |
| `--allow-write` | File system write access |
| `--allow-net` | Network access |
| `--allow-env` | Environment variable access |
| `--allow-run` | Subprocess execution |
| `--allow-ffi` | Foreign function interface |
| `--allow-sys` | System information |
| `-A` or `--allow-all` | All permissions |

### Granular Permissions

```bash
# Specific paths
deno run --allow-read=/etc,/tmp script.ts

# Specific hosts
deno run --allow-net=api.example.com,db.example.com:5432 script.ts

# Specific environment variables
deno run --allow-env=DATABASE_URL,API_KEY script.ts
```

### Runtime Permission Requests

```typescript
// Request permission at runtime
const status = await Deno.permissions.request({ name: "read", path: "/etc" });
if (status.state === "granted") {
  const data = await Deno.readTextFile("/etc/passwd");
}

// Query current permission
const netStatus = await Deno.permissions.query({
  name: "net",
  host: "api.example.com"
});
console.log(netStatus.state);  // "granted", "denied", or "prompt"
```

---

## Standard Library

### File System

```typescript
// Read file
const content = await Deno.readTextFile("./data.txt");

// Write file
await Deno.writeTextFile("./output.txt", "Hello, World!");

// Read directory
for await (const entry of Deno.readDir("./")) {
  console.log(entry.name, entry.isFile, entry.isDirectory);
}

// File info
const stat = await Deno.stat("./file.txt");
console.log(stat.size, stat.mtime);

// Copy/remove files
await Deno.copyFile("./src.txt", "./dest.txt");
await Deno.remove("./temp.txt");
await Deno.remove("./temp-dir", { recursive: true });
```

### Path Operations

```typescript
import { join, basename, dirname, extname } from "https://deno.land/std/path/mod.ts";

const fullPath = join("home", "user", "documents", "file.txt");
console.log(basename(fullPath));  // "file.txt"
console.log(dirname(fullPath));   // "home/user/documents"
console.log(extname(fullPath));   // ".txt"
```

### Async Utilities

```typescript
import { delay } from "https://deno.land/std/async/delay.ts";
import { deadline } from "https://deno.land/std/async/deadline.ts";

// Delay
await delay(1000);  // Wait 1 second

// Deadline (timeout)
try {
  const result = await deadline(fetchData(), 5000);  // 5 second timeout
} catch (e) {
  if (e instanceof DeadlineError) {
    console.log("Request timed out");
  }
}
```

---

## Deno.serve (Modern HTTP)

### Basic Server

```typescript
Deno.serve((req: Request) => {
  return new Response("Hello, World!");
});
```

### With Configuration

```typescript
Deno.serve({
  port: 8000,
  hostname: "0.0.0.0",
  onListen: ({ port, hostname }) => {
    console.log(`Server started at http://${hostname}:${port}`);
  },
}, handler);
```

### Routing

```typescript
Deno.serve((req: Request) => {
  const url = new URL(req.url);
  const { pathname } = url;

  if (req.method === "GET" && pathname === "/") {
    return new Response("Home");
  }

  if (req.method === "GET" && pathname === "/api/users") {
    return Response.json(users);
  }

  if (req.method === "POST" && pathname === "/api/users") {
    return handleCreateUser(req);
  }

  // Pattern matching
  const userMatch = pathname.match(/^\/api\/users\/(\d+)$/);
  if (userMatch && req.method === "GET") {
    const userId = parseInt(userMatch[1]);
    return Response.json(users.find(u => u.id === userId));
  }

  return new Response("Not Found", { status: 404 });
});
```

---

## Testing

### Basic Tests

```typescript
import { assertEquals, assertThrows } from "https://deno.land/std/assert/mod.ts";

Deno.test("simple test", () => {
  assertEquals(1 + 1, 2);
});

Deno.test("async test", async () => {
  const response = await fetch("https://api.example.com/health");
  assertEquals(response.status, 200);
});

Deno.test("throws test", () => {
  assertThrows(
    () => { throw new Error("boom"); },
    Error,
    "boom"
  );
});
```

### Running Tests

```bash
# Run all tests
deno test

# Run specific file
deno test user_test.ts

# With permissions
deno test --allow-net --allow-read

# Watch mode
deno test --watch

# Coverage
deno test --coverage=coverage
deno coverage coverage --lcov > coverage.lcov
```

---

## deno.json Configuration

```json
{
  "tasks": {
    "dev": "deno run --watch --allow-net main.ts",
    "start": "deno run --allow-net main.ts",
    "test": "deno test --allow-read"
  },
  "imports": {
    "@std/": "https://deno.land/std@0.210.0/",
    "express": "npm:express@4",
    "zod": "npm:zod"
  },
  "compilerOptions": {
    "strict": true
  }
}
```

---

## When NOT to Use This Skill

| Scenario | Use Instead |
|----------|-------------|
| Node.js runtime specifics | `nodejs` skill |
| Fresh framework | Framework-specific skill |
| Oak framework | Framework-specific skill |
| TypeScript syntax | `typescript` skill |
| npm package ecosystem | `nodejs` skill |

---

## Anti-Patterns

| Anti-Pattern | Why It's Bad | Correct Approach |
|--------------|--------------|------------------|
| Using --allow-all | Defeats security model | Grant specific permissions |
| Not versioning imports | Breaking changes | Pin versions in imports |
| Ignoring lock file | Reproducibility issues | Commit deno.lock |
| Mixing npm: and https: imports | Inconsistent deps | Prefer one approach |
| Not handling permission errors | Runtime failures | Check permissions first |
| Synchronous file I/O | Blocks runtime | Use async Deno APIs |
| No error boundaries | Unhandled errors | Add error middleware |
| Hardcoded URLs | Portability issues | Use environment variables |

---

## Quick Troubleshooting

| Issue | Cause | Solution |
|-------|-------|----------|
| "PermissionDenied" | Missing permission flag | Add --allow-* flag |
| "Module not found" | Wrong URL or version | Check import URL |
| "Integrity check failed" | Lock file mismatch | Run with --lock-write |
| "Top-level await not allowed" | .js file extension | Use .ts or .mjs |
| "Cannot find module 'node:fs'" | Node compat needed | Use Deno.* APIs instead |
| Slow startup | Downloading remote modules | Use vendor or deno cache |
| Type errors with npm packages | Missing types | Use @types or as any |
| Test failures | Permissions in tests | Add --allow-* to test command |

---

## Reference Documentation

- [Permissions](quick-ref/permissions.md)
- [Standard Library](quick-ref/std.md)
- [Testing](quick-ref/testing.md)

> **Deep Knowledge**: Use `mcp__documentation__fetch_docs` with technology: `deno` for comprehensive documentation.

Files in this skill

  • SKILL.md8 KB
  • advanced.md5.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.