Skip to content

Commit 444f7a0

Browse files
committed
refactor: new package architecture
1 parent b421fc5 commit 444f7a0

28 files changed

Lines changed: 605 additions & 0 deletions

biome.jsonc

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,173 @@
162162
}
163163
}
164164
},
165+
{
166+
"includes": ["packages/core/src/**/*.ts", "packages/core/src/**/*.tsx"],
167+
"linter": {
168+
"rules": {
169+
"style": {
170+
"noRestrictedImports": {
171+
"level": "error",
172+
"options": {
173+
"patterns": [
174+
{
175+
"group": [
176+
"electron",
177+
"react",
178+
"react-dom",
179+
"node:*",
180+
"@posthog/*"
181+
],
182+
"message": "core is a pure layer that must not depend on any platform-specific dependencies."
183+
}
184+
]
185+
}
186+
}
187+
}
188+
}
189+
}
190+
},
191+
{
192+
"includes": [
193+
"packages/api-client/src/**/*.ts",
194+
"packages/api-client/src/**/*.tsx"
195+
],
196+
"linter": {
197+
"rules": {
198+
"style": {
199+
"noRestrictedImports": {
200+
"level": "error",
201+
"options": {
202+
"patterns": [
203+
{
204+
"group": [
205+
"electron",
206+
"node:*",
207+
"@posthog/*",
208+
"!@posthog/core"
209+
],
210+
"message": "api-client must run in any JS environment."
211+
}
212+
]
213+
}
214+
}
215+
}
216+
}
217+
}
218+
},
219+
{
220+
"includes": [
221+
"packages/workspace-client/src/**/*.ts",
222+
"packages/workspace-client/src/**/*.tsx"
223+
],
224+
"linter": {
225+
"rules": {
226+
"style": {
227+
"noRestrictedImports": {
228+
"level": "error",
229+
"options": {
230+
"patterns": [
231+
{
232+
"group": [
233+
"electron",
234+
"node:*",
235+
"@posthog/*",
236+
"!@posthog/core",
237+
"!@posthog/api-client",
238+
"!@posthog/workspace-server"
239+
],
240+
"message": "workspace-client must run in any JS environment."
241+
}
242+
]
243+
}
244+
}
245+
}
246+
}
247+
}
248+
},
249+
{
250+
"includes": [
251+
"packages/platform/src/**/*.ts",
252+
"packages/platform/src/**/*.tsx"
253+
],
254+
"linter": {
255+
"rules": {
256+
"style": {
257+
"noRestrictedImports": {
258+
"level": "error",
259+
"options": {
260+
"patterns": [
261+
{
262+
"group": [
263+
"electron",
264+
"node:*",
265+
"@posthog/*",
266+
"!@posthog/core"
267+
],
268+
"message": "platform is interface-only."
269+
}
270+
]
271+
}
272+
}
273+
}
274+
}
275+
}
276+
},
277+
{
278+
"includes": [
279+
"packages/workspace-server/src/**/*.ts",
280+
"packages/workspace-server/src/**/*.tsx"
281+
],
282+
"linter": {
283+
"rules": {
284+
"style": {
285+
"noRestrictedImports": {
286+
"level": "error",
287+
"options": {
288+
"paths": {
289+
"electron": "workspace-server must be host-agnostic."
290+
},
291+
"patterns": [
292+
{
293+
"group": ["@posthog/ui", "@posthog/api-client"],
294+
"message": "workspace-server must not depend on UI or the PostHog API."
295+
}
296+
]
297+
}
298+
}
299+
}
300+
}
301+
}
302+
},
303+
{
304+
"includes": ["packages/ui/src/**/*.ts", "packages/ui/src/**/*.tsx"],
305+
"linter": {
306+
"rules": {
307+
"style": {
308+
"noRestrictedImports": {
309+
"level": "error",
310+
"options": {
311+
"patterns": [
312+
{
313+
"group": [
314+
"electron",
315+
"node:*",
316+
"@posthog/*",
317+
"!@posthog/core",
318+
"!@posthog/api-client",
319+
"!@posthog/workspace-client",
320+
"!@posthog/platform",
321+
"!@posthog/platform/*"
322+
],
323+
"message": "ui must run in any JS environment."
324+
}
325+
]
326+
}
327+
}
328+
}
329+
}
330+
}
331+
},
165332
{
166333
// Renderer code should use path aliases
167334
"includes": [

packages/api-client/package.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"name": "@posthog/api-client",
3+
"version": "1.0.0",
4+
"description": "Client for the PostHog API (auth, projects, task metadata, billing). Pure HTTPS, runs in any JS environment. Constructed via factory function — no DI container.",
5+
"private": true,
6+
"type": "module",
7+
"exports": {
8+
".": {
9+
"types": "./dist/index.d.ts",
10+
"import": "./dist/index.js"
11+
}
12+
},
13+
"scripts": {
14+
"build": "tsup",
15+
"dev": "tsup --watch",
16+
"typecheck": "tsc --noEmit",
17+
"clean": "node ../../scripts/rimraf.mjs dist .turbo"
18+
},
19+
"dependencies": {
20+
"@posthog/core": "workspace:*"
21+
},
22+
"devDependencies": {
23+
"@posthog/tsconfig": "workspace:*",
24+
"@posthog/tsup-config": "workspace:*",
25+
"tsup": "catalog:",
26+
"typescript": "catalog:"
27+
},
28+
"files": [
29+
"dist/**/*",
30+
"src/**/*"
31+
]
32+
}

packages/api-client/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {};

packages/api-client/tsconfig.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "@posthog/tsconfig/base.json",
3+
"include": ["src/**/*"]
4+
}

packages/api-client/tsup.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { defineLibPackage } from "@posthog/tsup-config";
2+
3+
export default defineLibPackage();

packages/core/package.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "@posthog/core",
3+
"version": "1.0.0",
4+
"description": "Zero-dependency pure domain layer. Types, schemas, pure functions. Runs in any JS environment (Node, Bun, browser, RN, edge). No I/O, no platform calls, no framework deps.",
5+
"private": true,
6+
"type": "module",
7+
"exports": {
8+
".": {
9+
"types": "./dist/index.d.ts",
10+
"import": "./dist/index.js"
11+
}
12+
},
13+
"scripts": {
14+
"build": "tsup",
15+
"dev": "tsup --watch",
16+
"typecheck": "tsc --noEmit",
17+
"clean": "node ../../scripts/rimraf.mjs dist .turbo"
18+
},
19+
"devDependencies": {
20+
"@posthog/tsconfig": "workspace:*",
21+
"@posthog/tsup-config": "workspace:*",
22+
"tsup": "catalog:",
23+
"typescript": "catalog:"
24+
},
25+
"files": [
26+
"dist/**/*",
27+
"src/**/*"
28+
]
29+
}

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {};

packages/core/tsconfig.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "@posthog/tsconfig/base.json",
3+
"include": ["src/**/*"]
4+
}

packages/core/tsup.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { defineLibPackage } from "@posthog/tsup-config";
2+
3+
export default defineLibPackage();

packages/ui/package.json

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"name": "@posthog/ui",
3+
"version": "1.0.0",
4+
"description": "React UI layer. Components, stores, hooks. Pure rendering and UI state — no I/O, no business logic. Built on @posthog/quill. Consumed by every host app (desktop, web, mobile-web).",
5+
"private": true,
6+
"type": "module",
7+
"exports": {
8+
".": {
9+
"types": "./dist/index.d.ts",
10+
"import": "./dist/index.js"
11+
}
12+
},
13+
"scripts": {
14+
"build": "tsup",
15+
"dev": "tsup --watch",
16+
"typecheck": "tsc --noEmit",
17+
"clean": "node ../../scripts/rimraf.mjs dist .turbo"
18+
},
19+
"dependencies": {
20+
"@posthog/api-client": "workspace:*",
21+
"@posthog/core": "workspace:*",
22+
"@posthog/platform": "workspace:*",
23+
"@posthog/workspace-client": "workspace:*"
24+
},
25+
"peerDependencies": {
26+
"react": "catalog:",
27+
"react-dom": "catalog:"
28+
},
29+
"devDependencies": {
30+
"@posthog/tsconfig": "workspace:*",
31+
"@posthog/tsup-config": "workspace:*",
32+
"@types/react": "catalog:",
33+
"@types/react-dom": "catalog:",
34+
"react": "catalog:",
35+
"react-dom": "catalog:",
36+
"tsup": "catalog:",
37+
"typescript": "catalog:"
38+
},
39+
"files": [
40+
"dist/**/*",
41+
"src/**/*"
42+
]
43+
}

0 commit comments

Comments
 (0)