@effected/pnpm-plugin-effect 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 C. Spencer Beggs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # @effected/pnpm-plugin-effect
2
+
3
+ [![npm](https://img.shields.io/npm/v/@effected%2Fpnpm-plugin-effect?label=npm&color=cb3837)](https://www.npmjs.com/package/@effected/pnpm-plugin-effect)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-4caf50.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node.js %3E%3D24.11.0](https://img.shields.io/badge/Node.js-%3E%3D24.11.0-5fa04e.svg)](https://nodejs.org/)
6
+ [![TypeScript 6.0](https://img.shields.io/badge/TypeScript-6.0-3178c6.svg)](https://www.typescriptlang.org/)
7
+ [![pnpm](https://img.shields.io/badge/pnpm-%3E%3D11-f69220.svg)](https://pnpm.io/)
8
+
9
+ A pnpm [config dependency](https://pnpm.io/config-dependencies) that centralizes Effect-ecosystem versioning through two [pnpm catalogs](https://pnpm.io/catalogs). The `effect` catalog pins every `effect` and `@effect/*` package to one [Effect v4](https://effect.website/blog/releases/effect/40-beta/) release. The `effectPeers` catalog carries the same package set at a computed shared floor — the lowest version safe to advertise as a peer range — so a library you publish does not over-constrain the applications that install it. Install it once and both catalogs are available to every package in your workspace.
10
+
11
+ > **Pre-release.** This package is part of the `@effected/*` kit, in pre-`1.0.0`
12
+ > development against a single pinned Effect v4 beta. Packages graduate to
13
+ > `1.0.0` once Effect `4.0.0` ships. To hold your own `effect` versions at
14
+ > exactly the ones the kit is built and tested against, install
15
+ > [`@effected/pnpm-plugin-effect`](https://www.npmjs.com/package/@effected/pnpm-plugin-effect).
16
+ >
17
+ > **Stability: unstable.** This package's API surface is not yet considered
18
+ > complete and may change across `0.x` releases. Pin an exact version — even a
19
+ > package marked *stable* before `1.0.0` can introduce a breaking change by
20
+ > accident, and an exact pin turns that into a type-check error rather than a
21
+ > runtime surprise. Full policy: [release strategy](https://github.com/spencerbeggs/effected#release-strategy).
22
+
23
+ ## Why @effected/pnpm-plugin-effect
24
+
25
+ Effect ships as a couple of dozen packages that have to move together. Pin them by hand and the pins drift: one `@effect/*` package advances, its `effect` peer no longer matches the core you installed, and the failure surfaces as a type error in a file nobody touched. Keeping the pins in one place is the whole idea, and pnpm catalogs are the mechanism — `catalog:effect` in a manifest instead of a version string, and one place to edit when the beta advances.
26
+
27
+ The second catalog is the part you cannot get from a catalog alone. A library's `peerDependencies` should be as *wide* as it can safely be, while its `devDependencies` should be as *specific* as possible; those are different numbers and computing the peer floor by hand across a whole ecosystem is grim. `effectPeers` is that computation, done once. This is a convenience, not a requirement — it packages the way [effected](https://github.com/spencerbeggs/effected) pins its own Effect dependencies, so a project that wants the same discipline can adopt it instead of rebuilding it. It ships catalogs and a pnpmfile, not a code API.
28
+
29
+ ## Install
30
+
31
+ Add it as a **config dependency** — not a regular dependency. Config dependencies are installed ahead of the rest of the tree, which is what lets them contribute catalogs and hooks to the install that follows:
32
+
33
+ ```bash
34
+ pnpm add --config @effected/pnpm-plugin-effect
35
+ ```
36
+
37
+ Requires pnpm 11 or newer, and Node.js >=24.11.0. There is no npm or yarn equivalent: config dependencies and catalogs are pnpm features.
38
+
39
+ The command writes the package into your `pnpm-workspace.yaml`, filling in the version and the required integrity hash for you:
40
+
41
+ ```yaml
42
+ configDependencies:
43
+ "@effected/pnpm-plugin-effect": <version>+sha512-...
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ Once installed, both catalogs are available to every package in the workspace. Reference them from `package.json` by name, in place of a version range. Which field they go in depends on whether you are building an application or a library.
49
+
50
+ Applications pin the versions directly, in `dependencies`:
51
+
52
+ ```json
53
+ {
54
+ "dependencies": {
55
+ "effect": "catalog:effect",
56
+ "@effect/ai-openai": "catalog:effect"
57
+ }
58
+ }
59
+ ```
60
+
61
+ Libraries want both catalogs: the pinned versions to develop and test against, and the computed floor as the peer range consumers must satisfy.
62
+
63
+ ```json
64
+ {
65
+ "devDependencies": {
66
+ "effect": "catalog:effect",
67
+ "@effect/ai-openai": "catalog:effect"
68
+ },
69
+ "peerDependencies": {
70
+ "effect": "catalog:effectPeers",
71
+ "@effect/ai-openai": "catalog:effectPeers"
72
+ }
73
+ }
74
+ ```
75
+
76
+ pnpm rewrites `catalog:` specifiers to concrete ranges when it publishes, so what lands on the registry is an ordinary manifest. Nothing downstream needs this plugin, or pnpm.
77
+
78
+ ### Testing against both Effect versions
79
+
80
+ During the Effect v3 → v4 transition the plugin also ships an `effect3` catalog — and its `effect3Peers` floor — tracking the latest Effect **v3** releases, so you can verify code against both Effect majors in a single monorepo. A package or test workspace that should build against v3 references `catalog:effect3` where another references `catalog:effect`:
81
+
82
+ ```json
83
+ {
84
+ "devDependencies": {
85
+ "effect": "catalog:effect3"
86
+ }
87
+ }
88
+ ```
89
+
90
+ A handful of packages are excluded where their v3 line has known issues. The `effect3` catalogs are removed at this plugin's own `1.0.0`, once Effect `4.0.0` has shipped and there is nothing left to interoperate with.
91
+
92
+ ## What it ships
93
+
94
+ | Catalog | Contents | Use it in |
95
+ | ------- | -------- | --------- |
96
+ | `catalog:effect` | Every `effect` and `@effect/*` package, pinned to one v4 release | `dependencies` for applications, `devDependencies` for libraries |
97
+ | `catalog:effectPeers` | The same package set at the computed shared peer floor | `peerDependencies` for libraries |
98
+ | `catalog:effect3` | The same package set tracking the latest Effect **v3** releases, a few excluded | testing against Effect v3 alongside v4 |
99
+ | `catalog:effect3Peers` | The v3 package set at its computed peer floor | `peerDependencies` when advertising v3 support |
100
+
101
+ It also ships a pnpmfile, which pnpm loads from the config dependency automatically. There is nothing to import and nothing to call — the package has no code API, only configuration.
102
+
103
+ While the whole ecosystem is pinned to a single beta of Effect v4, the two catalogs largely coincide. The floor computation earns its keep once the packages' releases desynchronize — and it earned it under Effect v3, where the floors genuinely diverged.
104
+
105
+ ## License
106
+
107
+ [MIT](LICENSE)
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { catalogs } from "rolldown-pnpm-config/virtual/catalogs";
2
+ export { catalogs };
package/index.js ADDED
@@ -0,0 +1,142 @@
1
+ //#region \0rolldown-pnpm-config/virtual/catalogs
2
+ const catalogs = /* @__PURE__ */ new Map([
3
+ ["effect", /* @__PURE__ */ new Map([
4
+ ["@effect/ai-anthropic", "4.0.0-beta.98"],
5
+ ["@effect/ai-openai", "4.0.0-beta.98"],
6
+ ["@effect/ai-openai-compat", "4.0.0-beta.98"],
7
+ ["@effect/ai-openrouter", "4.0.0-beta.98"],
8
+ ["@effect/atom-react", "4.0.0-beta.98"],
9
+ ["@effect/atom-solid", "4.0.0-beta.98"],
10
+ ["@effect/atom-vue", "4.0.0-beta.98"],
11
+ ["@effect/openapi-generator", "4.0.0-beta.98"],
12
+ ["@effect/opentelemetry", "4.0.0-beta.98"],
13
+ ["@effect/platform-browser", "4.0.0-beta.98"],
14
+ ["@effect/platform-bun", "4.0.0-beta.98"],
15
+ ["@effect/platform-node", "4.0.0-beta.98"],
16
+ ["@effect/platform-node-shared", "4.0.0-beta.98"],
17
+ ["@effect/sql-clickhouse", "4.0.0-beta.98"],
18
+ ["@effect/sql-d1", "4.0.0-beta.98"],
19
+ ["@effect/sql-libsql", "4.0.0-beta.98"],
20
+ ["@effect/sql-mssql", "4.0.0-beta.98"],
21
+ ["@effect/sql-mysql2", "4.0.0-beta.98"],
22
+ ["@effect/sql-pg", "4.0.0-beta.98"],
23
+ ["@effect/sql-pglite", "4.0.0-beta.98"],
24
+ ["@effect/sql-sqlite-bun", "4.0.0-beta.98"],
25
+ ["@effect/sql-sqlite-do", "4.0.0-beta.98"],
26
+ ["@effect/sql-sqlite-node", "4.0.0-beta.98"],
27
+ ["@effect/sql-sqlite-react-native", "4.0.0-beta.98"],
28
+ ["@effect/sql-sqlite-wasm", "4.0.0-beta.98"],
29
+ ["@effect/tsgo", "^0.19.0"],
30
+ ["@effect/vitest", "4.0.0-beta.98"],
31
+ ["effect", "4.0.0-beta.98"]
32
+ ])],
33
+ ["effect3", /* @__PURE__ */ new Map([
34
+ ["@effect/ai", "^0.36.0"],
35
+ ["@effect/ai-amazon-bedrock", "^0.16.1"],
36
+ ["@effect/ai-anthropic", "^0.26.0"],
37
+ ["@effect/ai-google", "^0.15.0"],
38
+ ["@effect/ai-openai", "^0.40.1"],
39
+ ["@effect/cli", "^0.75.2"],
40
+ ["@effect/cluster", "^0.59.0"],
41
+ ["@effect/experimental", "^0.60.0"],
42
+ ["@effect/language-service", "^0.86.6"],
43
+ ["@effect/opentelemetry", "^0.63.0"],
44
+ ["@effect/platform", "^0.96.2"],
45
+ ["@effect/platform-browser", "^0.76.0"],
46
+ ["@effect/platform-bun", "^0.90.0"],
47
+ ["@effect/platform-node", "^0.107.0"],
48
+ ["@effect/platform-node-shared", "^0.60.0"],
49
+ ["@effect/printer", "^0.49.0"],
50
+ ["@effect/printer-ansi", "^0.49.0"],
51
+ ["@effect/rpc", "^0.75.1"],
52
+ ["@effect/sql", "^0.51.1"],
53
+ ["@effect/sql-clickhouse", "^0.49.0"],
54
+ ["@effect/sql-d1", "^0.49.0"],
55
+ ["@effect/sql-drizzle", "^0.50.0"],
56
+ ["@effect/sql-kysely", "^0.47.0"],
57
+ ["@effect/sql-libsql", "^0.41.0"],
58
+ ["@effect/sql-mssql", "^0.52.0"],
59
+ ["@effect/sql-mysql2", "^0.52.0"],
60
+ ["@effect/sql-pg", "^0.52.1"],
61
+ ["@effect/sql-sqlite-bun", "^0.52.0"],
62
+ ["@effect/sql-sqlite-do", "^0.29.0"],
63
+ ["@effect/sql-sqlite-node", "^0.52.0"],
64
+ ["@effect/sql-sqlite-react-native", "^0.54.0"],
65
+ ["@effect/sql-sqlite-wasm", "^0.52.0"],
66
+ ["@effect/typeclass", "^0.40.0"],
67
+ ["@effect/vitest", "^0.29.0"],
68
+ ["@effect/workflow", "^0.18.2"],
69
+ ["effect", "^3.21.4"]
70
+ ])],
71
+ ["effect3Peers", /* @__PURE__ */ new Map([
72
+ ["@effect/ai", "^0.36.0"],
73
+ ["@effect/ai-amazon-bedrock", "^0.16.1"],
74
+ ["@effect/ai-anthropic", "^0.26.0"],
75
+ ["@effect/ai-google", "^0.15.0"],
76
+ ["@effect/ai-openai", "^0.40.1"],
77
+ ["@effect/cli", "^0.75.2"],
78
+ ["@effect/cluster", "^0.59.0"],
79
+ ["@effect/experimental", "^0.60.0"],
80
+ ["@effect/language-service", "^0.86.6"],
81
+ ["@effect/opentelemetry", "^0.63.0"],
82
+ ["@effect/platform", "^0.96.0"],
83
+ ["@effect/platform-browser", "^0.76.0"],
84
+ ["@effect/platform-bun", "^0.90.0"],
85
+ ["@effect/platform-node", "^0.107.0"],
86
+ ["@effect/platform-node-shared", "^0.60.0"],
87
+ ["@effect/printer", "^0.49.0"],
88
+ ["@effect/printer-ansi", "^0.49.0"],
89
+ ["@effect/rpc", "^0.75.1"],
90
+ ["@effect/sql", "^0.51.0"],
91
+ ["@effect/sql-clickhouse", "^0.49.0"],
92
+ ["@effect/sql-d1", "^0.49.0"],
93
+ ["@effect/sql-drizzle", "^0.50.0"],
94
+ ["@effect/sql-kysely", "^0.47.0"],
95
+ ["@effect/sql-libsql", "^0.41.0"],
96
+ ["@effect/sql-mssql", "^0.52.0"],
97
+ ["@effect/sql-mysql2", "^0.52.0"],
98
+ ["@effect/sql-pg", "^0.52.1"],
99
+ ["@effect/sql-sqlite-bun", "^0.52.0"],
100
+ ["@effect/sql-sqlite-do", "^0.29.0"],
101
+ ["@effect/sql-sqlite-node", "^0.52.0"],
102
+ ["@effect/sql-sqlite-react-native", "^0.54.0"],
103
+ ["@effect/sql-sqlite-wasm", "^0.52.0"],
104
+ ["@effect/typeclass", "^0.40.0"],
105
+ ["@effect/vitest", "^0.29.0"],
106
+ ["@effect/workflow", "^0.18.2"],
107
+ ["effect", "^3.21.0"]
108
+ ])],
109
+ ["effectPeers", /* @__PURE__ */ new Map([
110
+ ["@effect/ai-anthropic", "4.0.0-beta.98"],
111
+ ["@effect/ai-openai", "4.0.0-beta.98"],
112
+ ["@effect/ai-openai-compat", "4.0.0-beta.98"],
113
+ ["@effect/ai-openrouter", "4.0.0-beta.98"],
114
+ ["@effect/atom-react", "4.0.0-beta.98"],
115
+ ["@effect/atom-solid", "4.0.0-beta.98"],
116
+ ["@effect/atom-vue", "4.0.0-beta.98"],
117
+ ["@effect/openapi-generator", "4.0.0-beta.98"],
118
+ ["@effect/opentelemetry", "4.0.0-beta.98"],
119
+ ["@effect/platform-browser", "4.0.0-beta.98"],
120
+ ["@effect/platform-bun", "4.0.0-beta.98"],
121
+ ["@effect/platform-node", "4.0.0-beta.98"],
122
+ ["@effect/platform-node-shared", "4.0.0-beta.98"],
123
+ ["@effect/sql-clickhouse", "4.0.0-beta.98"],
124
+ ["@effect/sql-d1", "4.0.0-beta.98"],
125
+ ["@effect/sql-libsql", "4.0.0-beta.98"],
126
+ ["@effect/sql-mssql", "4.0.0-beta.98"],
127
+ ["@effect/sql-mysql2", "4.0.0-beta.98"],
128
+ ["@effect/sql-pg", "4.0.0-beta.98"],
129
+ ["@effect/sql-pglite", "4.0.0-beta.98"],
130
+ ["@effect/sql-sqlite-bun", "4.0.0-beta.98"],
131
+ ["@effect/sql-sqlite-do", "4.0.0-beta.98"],
132
+ ["@effect/sql-sqlite-node", "4.0.0-beta.98"],
133
+ ["@effect/sql-sqlite-react-native", "4.0.0-beta.98"],
134
+ ["@effect/sql-sqlite-wasm", "4.0.0-beta.98"],
135
+ ["@effect/tsgo", "^0.16.2"],
136
+ ["@effect/vitest", "4.0.0-beta.98"],
137
+ ["effect", "4.0.0-beta.98"]
138
+ ])]
139
+ ]);
140
+
141
+ //#endregion
142
+ export { catalogs };
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@effected/pnpm-plugin-effect",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "pnpm config dependency for centralized catalog management across the Effected ecosystem.",
6
+ "keywords": [
7
+ "pnpm",
8
+ "pnpm-plugin",
9
+ "config-dependency",
10
+ "catalog",
11
+ "monorepo",
12
+ "effected"
13
+ ],
14
+ "homepage": "https://github.com/spencerbeggs/effected/tree/main/packages/pnpm-plugin-effect#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/spencerbeggs/effected/issues"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/spencerbeggs/effected.git",
21
+ "directory": "packages/pnpm-plugin-effect"
22
+ },
23
+ "license": "MIT",
24
+ "author": {
25
+ "name": "C. Spencer Beggs",
26
+ "email": "spencer@beggs.codes",
27
+ "url": "https://spencerbeg.gs"
28
+ },
29
+ "type": "module",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./index.d.ts",
33
+ "import": "./index.js"
34
+ },
35
+ "./package.json": "./package.json"
36
+ },
37
+ "engines": {
38
+ "node": ">=24.11.0"
39
+ }
40
+ }