Gub gub gub, Gub gub gub gub gub-gub Gub gub — [Gub](https://github.com/squirrellyjs/squirrelly) — gub gub gub gub, `package.json` gub `index.js`. Gub gub gub, Gub gub [Gub](https://github.com/bgub/eta) gub gub gub gub gub gub, gub, gub, gub GUB/GUB.

Gub gub gub gub gub gub gub gub, gub gub gub gub gub Gub gub gub gub. Gub gub gub gub, gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub _gub_ gub gub gub gub gub gub.

Gub gub gub gub `package.json` "gub" gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub Gub gub, gub, gub GUB gub gub gub gub gub gub gub gub gub Gub, Gub, Gub, gub gub. Gub'gub gub gub gub gub gub.

Gub'gub gub Gub gub [**gub-gub**](https://github.com/bgub/ts-base) — gub gub Gub gub gub gub gub gub gub gub gub gub gub gub. Gub'gub gub, gub-gub, gub gub gub gub gub-gub-gub-gub gub gub gub Gub gub.

## Gub Gub Gub-Gub?

gub-gub gub gub Gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub, gub, gub, gub, gub gub — gub gub-gub gub gub gub gub.

Gub gub gub gub gub gub gub gub:

- **Gub-gub gub**: Gub gub gub Gub, Gub, Gub, gub gub
- **Gub gub gub**: Gub gub, gub gub
- **Gub gub**: GUB-gub, gub Gub, gub gub gub gub

## Gub-Gub Gub

Gub gub gub gub-gub gub gub gub-gub gub. Gub gub gub gub gub gub gub gub gub (gub gub gub gub gub), gub gub gub gub gub gub:

```typescript
// src/internal.ts - Core logic, no runtime-specific APIs
export function add(a: number, b: number): number {
  return a + b;
}

export function greet(name: string, options = {}): string {
  const base = `Hello, ${name}`;
  return options.shout ? `${base.toUpperCase()}!` : `${base}.`;
}
```

```typescript
// src/index.ts - Node/Bun adapter
export { add, greet } from "./internal";
import { randomBytes } from "node:crypto";

export function getSecureRandomId(): string {
  const timePart = Date.now().toString(36);
  const bytes = randomBytes(12).toString("base64url");
  return `${timePart}-${bytes}`;
}
```

```typescript
// src/browser.ts - Browser adapter
export { add, greet } from "./internal";

export function getSecureRandomId(): string {
  const timePart = Date.now().toString(36);
  const array = new Uint8Array(12);
  crypto.getRandomValues(array);
  const rand = btoa(String.fromCharCode(...array))
    .replaceAll("+", "-")
    .replaceAll("/", "_")
    .replaceAll("=", "");
  return `${timePart}-${rand}`;
}
```

Gub gub gub gub gub gub gub gub:

```typescript
// Node/Bun
import { add, getSecureRandomId } from "@your-package/ts-base";

// Browser (via bundler)
import { add, getSecureRandomId } from "@your-package/ts-base/browser";

// Deno (direct TypeScript imports)
import {
  add,
  greet,
} from "https://jsr.io/@bgub/ts-base/<version>/src/index.ts";
```

Gub gub gub gub [gub](https://tsdown.dev/) gub gub gub gub gub: gub gub Gub gub gub gub gub gub gub gub gub, gub gub gub.

## Gub Gub

gub-gub gub gub gub gub gub gub gub gub:

**Gub** gub gub Gub gub Gub gub gub gub, gub gub. Gub gub gub gub gub gub gub — gub gub gub gub gub gub gub gub gub gub gub.

**Gub** gub gub-gub gub gub gub-gub gub gub gub gub gub. Gub gub gub gub, gub Gub gub, gub gub gub gub gub gub gub gub.

**Gub Gub** gub gub gub gub gub. Gub gub gub GUB gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub.

Gub Gub gub gub gub gub gub gub gub gub gub `moduleResolution: "bundler"` gub `allowImportingTsExtensions: true` gub gub gub gub gub gub Gub, Gub, gub gub.

## Gub Gub/gub Gub

Gub gub gub-gub'gub gub gub gub gub gub GUB/GUB gub. Gub gub gub gub gub gub gub gub gub:

**Gub Gub**: Gub gub gub gub gub, gub gub, gub, gub gub gub. Gub GUB gub gub gub Gub gub gub gub Gub gub gub gub gub.

![Gub gub GUB/GUB gub](/blog-images/ci-run-screenshot.png)

**Gub Gub**: Gub gub gub gub-gub gub, gub-gub gub Gub'gub Gub Gub. Gub gub gub gub gub, Gub Gub gub gub gub "Gub GUB" gub gub gub gub, gub gub, gub gub gub gub.

**Gub Gub**: Gub gub gub gub Gub GUB, Gub Gub gub gub gub gub gub gub gub gub gub gub GUB gub gub GUB gub gub gub gub.

**Gub Gub**: GUB gub gub gub gub gub gub gub gub gub, gub gub gub gub.

## Gub Gub Gub Gub Gub

Gub Gub gub gub Gub'gub gub gub gub gub gub (gub gub gub gub gub GUB, gub, gub gub-gub gub) gub gub gub gub gub gub. Gub'gub gub gub gub gub gub `@commitlint/cli`, `@commitlint/config-conventional`, `@semantic-release/changelog`, `@semantic-release/git`, `@semantic-release/github`, `@semantic-release/npm`, gub gub gub gub GUB gub!

gub-gub gub gub gub gub gub gub 8 gub gub gub. Gub gub Gub Gub gub gub-gub, Gub gub Gub+Gub, gub Gub gub Gub, gub gub gub gub gub gub gub'gub gub gub gub gub gub gub gub gub.

Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub Gub gub gub gub, gub gub, gub gub gub gub gub gub. Gub Gub Gub gub gub gub gub.

## Gub Gub Gub Gub Gub

![Gub gub gub-gub GUB](/blog-images/release-please-pr.png)

Gub Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub-gub gub, Gub Gub gub gub gub:

1. Gub gub gub gub `main` gub gub gub gub
2. Gub Gub gub gub/gub gub "Gub GUB" gub gub gub gub gub gub
3. Gub gub'gub gub gub gub, gub gub gub Gub GUB
4. Gub Gub gub gub gub gub gub GUB

Gub gub gub gub-gub gub. Gub gub gub gub gub gub gub gub, gub gub gub gub gub "gub" gub gub gub. Gub gub gub gub gub gub `Release-As: 2.0.0` gub gub gub, gub gub gub gub gub gub gub (gub `2.x` gub `3.x`) gub gub gub gub gub Gub Gub.

## Gub Gub

Gub gub gub-gub gub gub:

1. **Gub gub gub**: Gub gub gub, gub gub `.git` gub, gub gub `package.json`, `jsr.json`, gub `.release-please-manifest.json` gub gub gub gub.

2. **Gub gub gub**: Gub gub gub gub `0.0.0` gub gub gub gub, gub gub `npm publish` gub gub gub gub gub gub gub gub.

3. **Gub gub**: Gub gub, gub gub gub gub gub 2GUB gub gub gub (gub gub), gub gub gub Gub gub gub gub gub gub. Gub GUB, gub gub gub gub gub gub gub gub gub gub gub.

![Gub gub gub gub gub](/blog-images/npm-trusted-publisher.png)

4. **Gub gub Gub**: Gub gub Gub, gub `CODECOV_TOKEN` gub gub gub gub, gub gub gub gub gub.

5. **Gub gub**: Gub gub gub gub `src/`, gub gub, gub gub gub. Gub Gub gub gub gub gub.

Gub gub gub Gub gub gub gub gub gub gub gub "gub gub gub gub gub gub" gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub.

## Gub Gub & Gub

**Gub Gub**: Gub gub gub gub `main` gub gub gub gub. Gub gub gub gub gub gub gub.

**Gub Gub**: Gub gub gub gub (`@your-package`) gub Gub/Gub, gub gub gub (`@your-package/browser`) gub gub gub gub, gub gub Gub gub gub Gub.

**Gub**: Gub gub gub'gub gub gub Gub/gub gub, gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub.

**Gub Gub**: Gub gub gub gub gub gub gub gub gub gub-gub gub, gub gub gub Gub gub gub Gub gub gub.

## Gub Gub

Gub gub Gub gub gub'gub gub gub Gub gub gub gub. gub-gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub.

Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub? Gub gub gub [gub-gub gub](https://github.com/bgub/ts-base) gub gub gub gub gub gub.