@yekhan/pxkit (0.2.0)
Installation
@yekhan:registry=https://git.pumax.de/api/packages/yekhan/npm/npm install @yekhan/pxkit@0.2.0"@yekhan/pxkit": "0.2.0"About this package
pxkit
Gemeinsames Grundstock-Paket für alle Pumax-Produkte an der zentralen Supabase-Auth-Instanz (pxfin, pxtime, pxbook, künftig weitere). Bündelt:
- UI-Kit (
ui/index.tsx+ui/tokens.css) — schlanke Basis-Komponenten (Stack,Card,Button,Field,Tableetc.) und das zugehörige CSS-Token-System (.px-*-Klassen, CSS-Custom-Properties). - Supabase-Client-Helfer (
supabase/client.ts,server.ts,service.ts,middleware.ts) — Browser-/Server-/Service-Role-Client sowie eine parametrisierbare Session-Middleware. Alle drei Client-Helfer akzeptieren seit0.2.0ein optionales{ schema?: string }(Default'public') — für Produkte mit eigenem Postgres-Schema (Struktur/info.md Regel 11, erster Konsument: pxorder):Ohne Argument verhalten sich bestehende Aufrufe (pxfin, pxtime) unverändert — betrifft nurconst supabase = await createSupabaseServerClient({ schema: "pxorder" });.from()/.rpc()/.channel(),supabase.auth.*ist davon unabhängig. Das Ziel-Schema muss serverseitig als "Exposed schema" in PostgREST freigegeben sein (PGRST_DB_SCHEMAS, siehetools/pxsrv/SCHEMA-TRENNUNG.mdAbschnitt 6). - Passwort-Policy (
auth/passwort.ts) — einheitliche Mindestanforderung (12 Zeichen, Zahl, Klein-/Großbuchstabe, Sonderzeichen). - Modul-Gate-Kern (
module/hasModule.ts,module/pathMatcher.ts) — Aufruf der geteilten Postgres-Funktionhas_module()gegentenant_modules, plus generischer Pfad-Matcher.
Bewusst NICHT enthalten (bleibt in jedem Produkt-Repo, siehe Analyse in
tools/pxtime/status.md "Analyse: Was gehört ins Foundation-Package?"):
produktspezifische Modul-Wrapper (hasRechnungModule etc.), Routen-
Pfadlisten (RECHNUNG_PFADE etc.), Auth-Mails mit Produkt-Branding
(Login-Alarm etc.), sowie alle DB-seitigen RLS-/Berechtigungsfunktionen
(is_org_member, has_write_role, record_shares, ...) — das ist
geteiltes Datenbankschema, kein npm-Paket-Thema.
Herkunft
Extrahiert 2026-08-31 aus tools/pxfin/app als erster Schritt der
Modul-Aufspaltung (siehe tools/pxtime/CLAUDE.md "Zielarchitektur").
pxfin selbst nutzt zu diesem Zeitpunkt noch nicht dieses Paket,
sondern weiterhin seine eigenen Kopien — die Umstellung passiert erst
beim eigentlichen pxtime/pxbook-Pilot-Split, um den laufenden
(eingefrorenen) Monolithen währenddessen nicht anzufassen.
Kein Build-Schritt nötig
Das Paket wird als TypeScript-Quellcode veröffentlicht (kein tsc-Build,
kein dist/). Next.js transpiliert node_modules-Pakete standardmäßig
nicht — jedes konsumierende Produkt muss deshalb in seiner
next.config.js/next.config.mjs eintragen:
const nextConfig = {
transpilePackages: ["@yekhan/pxkit"],
};
Installation (in einem Produkt-Repo)
.npmrc.examplein diesem Ordner nach.npmrcim Produkt-Repo kopieren,NODE_AUTH_TOKENals Umgebungsvariable setzen (Token-Erzeugung siehe Kommentar in.npmrc.example).npm install @yekhan/pxkit- CSS-Tokens einmal global einbinden, z.B. in
app/layout.tsx:import "@yekhan/pxkit/ui.css"; - Helfer/Komponenten importieren — drei getrennte Einstiegspunkte,
nicht mischen in einer Client Component (siehe Kommentar in
src/index.ts; Grund:@yekhan/pxkitre-exportiert auch next/headers-abhängigen Code, was jede Client Component zum Absturz bringt, die von dort auch nur ein UI-Bauteil importiert):// Server Components / Server Actions / Middleware — voller Umfang: import { hasModule, passwortPruefen, createSupabaseServerClient } from "@yekhan/pxkit"; // Client Components ("use client") — NUR die UI-Bausteine, von hier: import { Card, Button } from "@yekhan/pxkit/ui"; // Client Components mit authentifiziertem Browser-Supabase-Client (z.B. // Realtime-Abos) — dritter, ebenfalls next/headers-freier Einstiegspunkt, // seit 0.2.0: import { createBrowserSupabaseClient } from "@yekhan/pxkit/client";
Veröffentlichen (nach einer Änderung hier)
npm version patch # oder minor/major
npm publish
Braucht ein .npmrc mit write:package-Scope-Token (siehe
.npmrc.example) — Publish erfolgt gegen die private Gitea-npm-Registry
unter https://git.pumax.de/api/packages/yekhan/npm/, nicht gegen die
öffentliche npm-Registry.
Dependencies
Development Dependencies
| ID | Version |
|---|---|
| @supabase/ssr | ^0.5.2 |
| @supabase/supabase-js | ^2.45.4 |
| @types/node | ^22.5.0 |
| @types/react | 19.2.18 |
| next | 16.3.2 |
| react | 19.2.8 |
| typescript | ^5.6.3 |
| vitest | ^2.1.2 |
Peer Dependencies
| ID | Version |
|---|---|
| @supabase/ssr | >=0.5 |
| @supabase/supabase-js | >=2 |
| next | >=14 |
| react | >=18 |