100 lines
3.5 KiB
Markdown
100 lines
3.5 KiB
Markdown
# Publishing WrNexus to npm
|
|
|
|
All 26 `@wrnexus/*` packages are built and published to the **public npm registry**
|
|
(`registry.npmjs.org`), then installed on any machine with **Bun**.
|
|
|
|
## Prerequisites
|
|
|
|
The `@wrnexus/*` packages are **scoped**, so the `wrnexus` npm **organization** must
|
|
exist and you must be a member with publish rights (a username scope like
|
|
`@clintchiz` would work without an org, but the packages are named `@wrnexus/*`).
|
|
|
|
1. Create the org once at <https://www.npmjs.com/org/create> (name: `wrnexus`).
|
|
- A **free** org can publish unlimited **public** packages.
|
|
- To publish **private** (`restricted`) packages first and flip them public
|
|
later, the org needs a paid **Teams** plan (private scoped packages require it).
|
|
2. `npm login` (registry `https://registry.npmjs.org/`).
|
|
|
|
The repo `.npmrc` points the scope at public npm:
|
|
|
|
```
|
|
@wrnexus:registry=https://registry.npmjs.org/
|
|
```
|
|
|
|
## Publish
|
|
|
|
The packages ship raw TypeScript in the repo (`main`/`exports` → `src/*.ts`), so
|
|
they are **built** for publishing. `scripts/publish-packages.ts` builds each
|
|
package with [tsup](https://tsup.egoist.dev) (bundled JS + a single `.d.ts`) and
|
|
**stages** a publishable copy under `.publish/<name>/` with a rewritten manifest:
|
|
|
|
- `main`/`module`/`types`/`exports`/`bin` point at `./dist/*`
|
|
- `workspace:*` deps → `^<version>`
|
|
- `private` removed; `license` → `MIT`; `publishConfig` → `{ registry, access }`
|
|
- runtime assets copied (`@wrnexus/ui` → `components/`, `ui.css`)
|
|
|
|
The dev `package.json` (pointing at `src/`) is **never modified**, so in-repo dev
|
|
and tests keep working.
|
|
|
|
### 1. Private-first (test before the world sees it)
|
|
|
|
By default the script stages packages as **`restricted`** (private). Requires the
|
|
`wrnexus` org on a paid Teams plan.
|
|
|
|
```bash
|
|
# Build + stage all packages (access: restricted)
|
|
bun run scripts/publish-packages.ts
|
|
|
|
# Publish (deps first). The script prints the exact order + --access flag; e.g.
|
|
npm publish .publish/core --access restricted
|
|
npm publish .publish/compiler --access restricted
|
|
# … through …
|
|
npm publish .publish/cli --access restricted
|
|
```
|
|
|
|
Test the private packages (see below). When satisfied, **flip every package to
|
|
public** (no republish needed):
|
|
|
|
```bash
|
|
npm access public @wrnexus/core
|
|
npm access public @wrnexus/compiler
|
|
# … the script prints the full list …
|
|
```
|
|
|
|
### 2. Public directly
|
|
|
|
To stage public manifests from the start (free org is enough):
|
|
|
|
```bash
|
|
WRNEXUS_NPM_ACCESS=public bun run scripts/publish-packages.ts
|
|
npm publish .publish/core --access public
|
|
# …
|
|
```
|
|
|
|
Bump `version` in each `packages/*/package.json` before republishing (npm rejects a
|
|
duplicate version).
|
|
|
|
## Consume on another machine (needs Bun)
|
|
|
|
```bash
|
|
mkdir my-wire-app && cd my-wire-app
|
|
|
|
# Scaffold via the CLI
|
|
npm i @wrnexus/cli
|
|
bunx wrnexus create app
|
|
cd app # scaffolds with @wrnexus/* deps declared
|
|
bun install # pulls @wrnexus/core, styles, validation, db, cli
|
|
bun run dev # or: bun run build && bun dist/server.js
|
|
```
|
|
|
|
While the packages are still **private**, the consuming machine must be logged in
|
|
to npm (`npm login`) as a user with read access to the `wrnexus` org. Once public,
|
|
no auth is needed.
|
|
|
|
`wrnexus create` scaffolds an app that already declares its `@wrnexus/*` runtime
|
|
dependencies and a dev-dependency on `@wrnexus/cli`, so `bun install` + `bun run dev`
|
|
works standalone.
|
|
|
|
> Everything runs under **Bun** (the framework uses `Bun.serve`, `bun:sqlite`,
|
|
> `Bun.password`, `Bun.build`, …). Node is not a supported runtime.
|