@systemfsoftware/effect-cell-types 4.0.0 → 5.0.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/CHANGELOG.md +58 -0
- package/dist/index.d.ts +31 -39
- package/dist/index.mjs +21 -56
- package/package.json +6 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,63 @@
|
|
|
1
1
|
# @systemfsoftware/effect-cell-types
|
|
2
2
|
|
|
3
|
+
## 5.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- A phase can no longer require a service. `Phases` drops `readContext` and
|
|
8
|
+
`writeContext`, and a read or write phase must return an effect whose context is
|
|
9
|
+
`never`.
|
|
10
|
+
|
|
11
|
+
Those two members were a claim about what a phase needed that nothing
|
|
12
|
+
recomputed. Whenever the surrounding stage was generic over `Phases`, the
|
|
13
|
+
compiler could not see through the type parameter to what the phase body
|
|
14
|
+
actually reached for, so declaring `never` for a body requiring four services
|
|
15
|
+
was accepted. The description then compiled clean and the missing service
|
|
16
|
+
surfaced only wherever it was finally applied, or nowhere at all.
|
|
17
|
+
|
|
18
|
+
Services now arrive the same way a phase's other inputs already do: as
|
|
19
|
+
parameters. Resolve them where you build the description, take them as an
|
|
20
|
+
argument, and provide them to the phase's own effect with
|
|
21
|
+
`Effect.provideContext`. Both mistakes that used to pass now fail — claiming
|
|
22
|
+
less than the body needs leaves the phase's context wider than `never`, which
|
|
23
|
+
the phase type rejects, and claiming more than it needs widens the requirement
|
|
24
|
+
of whoever builds the description, which surfaces where that builder is run.
|
|
25
|
+
|
|
26
|
+
`apply` therefore derives a context of `never` for every description, and a
|
|
27
|
+
caller can no longer be handed a requirement it never agreed to.
|
|
28
|
+
|
|
29
|
+
- The wire surface is now the seven symbols it always claimed to be: the mark,
|
|
30
|
+
the minted types, `mint`, `Fields` and `wire`. Fifteen convenience wrappers
|
|
31
|
+
around the schema library are gone. A member you built with a wrapper decodes
|
|
32
|
+
to exactly what it decoded to before; only the spelling changed.
|
|
33
|
+
|
|
34
|
+
To migrate, wrap the schema library member in `mint` where you used a wrapper:
|
|
35
|
+
|
|
36
|
+
- `string`, `number`, `boolean`, `integer` → `mint(S.String)`,
|
|
37
|
+
`mint(S.Finite)`, `mint(S.Boolean)`, `mint(S.Int)`
|
|
38
|
+
- `literal(...v)` → `mint(S.Literals([...v]))`; `union(...m)` →
|
|
39
|
+
`mint(S.Union([...m]))`; `tuple(...t)` → `mint(S.Tuple([...t]))`
|
|
40
|
+
- `nullOr(m)` / `undefinedOr(m)` / `nullishOr(m)` / `array(m)` /
|
|
41
|
+
`optional(m)` / `record(k, v)` / `suspend(t)` → the same letter under
|
|
42
|
+
`mint`, e.g. `mint(S.NullOr(m))`, `mint(S.Array(m))`, `mint(S.Record(k, v))`
|
|
43
|
+
- `refine(m, predicate)` → `mint(S.refine(predicate)(m))`
|
|
44
|
+
|
|
45
|
+
### Minor Changes
|
|
46
|
+
|
|
47
|
+
- A write phase now receives what its own layer's read gathered, as a second
|
|
48
|
+
argument after the encoded output.
|
|
49
|
+
|
|
50
|
+
This is for the common shape where a write persists or reports on what the read
|
|
51
|
+
found while the decision in between narrowed to what it needed. Until now such a
|
|
52
|
+
write had no channel for that value, so the layer had to keep it in a mutable
|
|
53
|
+
binding beside the description — assigned during the read, read back during the
|
|
54
|
+
write — and then guard at runtime against a value that was in fact always there.
|
|
55
|
+
The argument replaces that binding and the guard with it.
|
|
56
|
+
|
|
57
|
+
Writes that do not want the value are unchanged: a write declaring a single
|
|
58
|
+
parameter still satisfies the phase type, so nothing you have already written
|
|
59
|
+
needs to move.
|
|
60
|
+
|
|
3
61
|
## 4.0.0
|
|
4
62
|
|
|
5
63
|
### Major Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Effect } from "effect/Effect";
|
|
|
3
3
|
import * as Result$1 from "effect/Result";
|
|
4
4
|
import { Result } from "effect/Result";
|
|
5
5
|
import * as Schema$1 from "effect/Schema";
|
|
6
|
-
import { Schema
|
|
6
|
+
import { Schema } from "effect";
|
|
7
7
|
declare namespace Workflow_d_exports {
|
|
8
8
|
export { Inhabited, UninhabitedDecision, UninhabitedError, UntaggedError, Workflow, WorkflowBrand, make };
|
|
9
9
|
}
|
|
@@ -152,16 +152,23 @@ interface Phases {
|
|
|
152
152
|
readonly decodeError: unknown;
|
|
153
153
|
readonly readError: unknown;
|
|
154
154
|
readonly writeError: unknown;
|
|
155
|
-
readonly readContext: unknown;
|
|
156
|
-
readonly writeContext: unknown;
|
|
157
155
|
}
|
|
158
156
|
/**
|
|
159
157
|
* A read gathers what the decision needs, and may gather a product across its interior;
|
|
160
158
|
* that interior is not type-visible, so no I/O count is claimed or enforced here. A step that
|
|
161
159
|
* mutates in order to report — bumping a counter and returning the resulting rate — is one
|
|
162
160
|
* such product, and belongs here rather than in a layer of its own.
|
|
161
|
+
*
|
|
162
|
+
* The context channel is pinned `never`: a phase requires nothing. Services are resolved by
|
|
163
|
+
* whoever builds the description and handed to the phase as ordinary parameters, which is
|
|
164
|
+
* the same edge that already gathers the read's inputs. The alternative — a `readContext`
|
|
165
|
+
* member on the bag — let an author write `never` for a body that reaches for a service, and
|
|
166
|
+
* nothing checked the claim: under a stage generic over `Phases` the compiler cannot see the
|
|
167
|
+
* lambda's requirement at all, so the description compiled and the missing service surfaced
|
|
168
|
+
* only where it was finally applied, or nowhere. Pinning it makes the lie unrepresentable
|
|
169
|
+
* instead of merely discouraged, and leaves `apply`'s derived `R` honestly `never`.
|
|
163
170
|
*/
|
|
164
|
-
type ReadPhase<P extends Phases> = (command: P['command']) => Effect$1.Effect<P['raw'], P['readError'],
|
|
171
|
+
type ReadPhase<P extends Phases> = (command: P['command']) => Effect$1.Effect<P['raw'], P['readError'], never>;
|
|
165
172
|
/** Validation. Its `Left` is fatal: it reaches the derived error channel and no write runs. */
|
|
166
173
|
type DecodePhase<P extends Phases> = (raw: P['raw']) => Result$1.Result<P['decoded'], P['decodeError']>;
|
|
167
174
|
/**
|
|
@@ -176,7 +183,19 @@ type DecodePhase<P extends Phases> = (raw: P['raw']) => Result$1.Result<P['decod
|
|
|
176
183
|
type DecidePhase<P extends Phases> = ((decoded: P['decoded']) => Result$1.Result<P['decision'], P['decisionError']>) & WorkflowBrand;
|
|
177
184
|
/** Shapes what the write consumes. Total, so it receives both branches of the decision. */
|
|
178
185
|
type EncodePhase<P extends Phases> = (outcome: Result$1.Result<P['decision'], P['decisionError']>) => P['output'];
|
|
179
|
-
|
|
186
|
+
/**
|
|
187
|
+
* The write. It receives the encoded `output` and, as a second argument, the `raw` its own
|
|
188
|
+
* layer's read gathered.
|
|
189
|
+
*
|
|
190
|
+
* `raw` is there because a write is frequently the point that persists or reports what the
|
|
191
|
+
* read found, while the decision in between deliberately narrows to what it needed. Without
|
|
192
|
+
* this argument such a write has no channel for it and the layer smuggles the value through
|
|
193
|
+
* a closure — a `let` beside the description, assigned in the read and consulted in the
|
|
194
|
+
* write, which then needs a runtime guard for a value the fold has already produced. The
|
|
195
|
+
* argument is second, and a write that does not want it declares one parameter: a unary
|
|
196
|
+
* function satisfies this type, so every write written before it existed is unchanged.
|
|
197
|
+
*/
|
|
198
|
+
type WritePhase<P extends Phases> = (output: P['output'], raw: P['raw']) => Effect$1.Effect<P['response'], P['writeError'], never>;
|
|
180
199
|
/**
|
|
181
200
|
* The invocation shape a folding consumer must use to call a phase's `run`:
|
|
182
201
|
* - `'effect'` — `run` returns an `Effect`; yield it. (read, write)
|
|
@@ -350,7 +369,7 @@ declare const write: {
|
|
|
350
369
|
* description's response is the last layer's. No scope is opened and interruptibility is
|
|
351
370
|
* untouched, so a `Scope.Scope` a phase requires reaches the caller as part of the derived `R`.
|
|
352
371
|
*/
|
|
353
|
-
declare const apply: <P extends Phases>(description: WriteDone<P>, command: P['command']) => Effect$1.Effect<P["response"], P["decodeError"] | P["readError"] | P["writeError"],
|
|
372
|
+
declare const apply: <P extends Phases>(description: WriteDone<P>, command: P['command']) => Effect$1.Effect<P["response"], P["decodeError"] | P["readError"] | P["writeError"], never>;
|
|
354
373
|
/** One phase's vocabulary entry: what it is called, its purity, its invocation shape. */
|
|
355
374
|
interface PhaseFact {
|
|
356
375
|
readonly name: Phase<Phases>['name'];
|
|
@@ -407,13 +426,13 @@ declare namespace Policy_d_exports {
|
|
|
407
426
|
}
|
|
408
427
|
type Policy<A, E, R> = (self: Effect<A, E, R>) => Effect<A, E, R>;
|
|
409
428
|
declare namespace Wire_d_exports {
|
|
410
|
-
export { AnyMinted, Fields, Mark, Minted, MintedField,
|
|
429
|
+
export { AnyMinted, Fields, Mark, Minted, MintedField, mint, wire };
|
|
411
430
|
}
|
|
412
431
|
/**
|
|
413
432
|
* Marker a wire member carries once this workspace declares its type. The property type is the
|
|
414
433
|
* fix, so the compiler diagnostic names it.
|
|
415
434
|
*
|
|
416
|
-
* It sits on the schema, never on the decoded value: `Schema.Type<typeof Wire.
|
|
435
|
+
* It sits on the schema, never on the decoded value: `Schema.Type<typeof Wire.mint(S.String)>` is `string`.
|
|
417
436
|
*/
|
|
418
437
|
interface Mark {
|
|
419
438
|
readonly __WIRE_MEMBER_IS_NOT_BUILT_FROM_THE_ALPHABET__: 'this member names a type this workspace does not declare; build it from Wire, or admit a foreign schema deliberately with Wire.mint';
|
|
@@ -427,8 +446,7 @@ type Minted<A, I = A> = Schema.Codec<A, I> & Mark;
|
|
|
427
446
|
/** Any marked schema, for constraint positions. */
|
|
428
447
|
type AnyMinted = Schema.Top & Mark;
|
|
429
448
|
/**
|
|
430
|
-
* Any marked struct member — a schema, or a property signature from
|
|
431
|
-
*
|
|
449
|
+
* Any marked struct member — a schema, or a property signature from `S.optional`.
|
|
432
450
|
* The permissive `Constraint` arm rather than a narrower schema type, whose `never` variants
|
|
433
451
|
* would fail the assignability check before the marker is reached, leaving the diagnostic to
|
|
434
452
|
* report an unrelated type error.
|
|
@@ -437,37 +455,11 @@ type MintedField = Schema.Constraint & Mark;
|
|
|
437
455
|
/**
|
|
438
456
|
* Mark a member whose type this workspace declares.
|
|
439
457
|
*
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
*
|
|
458
|
+
* The value returned is the one passed in, and its concrete type is preserved, so a marked
|
|
459
|
+
* struct stays a struct and Effect's inference keeps working. Reach for it to admit anything
|
|
460
|
+
* the schema library can express, including a vendor's own schema — deliberately.
|
|
443
461
|
*/
|
|
444
462
|
declare const mint: <Field extends Schema.Constraint>(field: Field) => Field & Mark;
|
|
445
|
-
declare const string: Schema.String & Mark;
|
|
446
|
-
declare const number: Schema.Finite & Mark;
|
|
447
|
-
declare const boolean: Schema.Boolean & Mark;
|
|
448
|
-
declare const integer: Schema.Int & Mark;
|
|
449
|
-
declare const literal: <const Literals extends ReadonlyArray<SchemaAST.LiteralValue>>(...literals: Literals) => Schema.Literals<Literals> & Mark;
|
|
450
|
-
declare const nullOr: <A, I>(member: Minted<A, I>) => Minted<A | null, I | null>;
|
|
451
|
-
declare const undefinedOr: <A, I>(member: Minted<A, I>) => Minted<A | undefined, I | undefined>;
|
|
452
|
-
declare const nullishOr: <A, I>(member: Minted<A, I>) => Minted<A | null | undefined, I | null | undefined>;
|
|
453
|
-
declare const array: <A, I>(member: Minted<A, I>) => Minted<ReadonlyArray<A>, ReadonlyArray<I>>;
|
|
454
|
-
/** A field that may be absent from the payload entirely, as distinct from present and `undefined`. */
|
|
455
|
-
declare const optional: <Member extends AnyMinted>(member: Member) => Schema.optional<Member> & Mark;
|
|
456
|
-
declare const record: <K extends Schema.Record.Key & Mark, V extends AnyMinted>(key: K, value: V) => Schema.$Record<K, V> & Mark;
|
|
457
|
-
declare const union: <Members extends readonly [AnyMinted, AnyMinted, ...Array<AnyMinted>]>(...members: Members) => Schema.Union<Members> & Mark;
|
|
458
|
-
declare const tuple: <Elements extends ReadonlyArray<AnyMinted>>(...elements: Elements) => Schema.Tuple<Elements> & Mark;
|
|
459
|
-
declare const suspend: <A, I>(thunk: () => Minted<A, I>) => Minted<A, I>;
|
|
460
|
-
/**
|
|
461
|
-
* Constrain a member's values. Effect's own `member.pipe(Schema.check(Schema.isMinLength(1)))`
|
|
462
|
-
* preserves the mark, but returns the schema with the concrete decode/encode pair fused; this
|
|
463
|
-
* combinator is the alphabet's own shape for the same operation, so a refined member keeps the
|
|
464
|
-
* declaration this workspace makes of its type.
|
|
465
|
-
*
|
|
466
|
-
* `S.refine` needs a type-guard as its predicate argument; the workspace's predicate is a plain
|
|
467
|
-
* `(a: A) => boolean` that narrows nothing, so a truth-preserving `value is A` guard is written
|
|
468
|
-
* at this one call site rather than widening the public signature.
|
|
469
|
-
*/
|
|
470
|
-
declare const refine: <A, I>(member: Minted<A, I>, predicate: (a: A) => boolean, annotations?: Schema.Annotations.Filter) => Minted<A, I>;
|
|
471
463
|
type Fields = Record<string, MintedField>;
|
|
472
464
|
declare const wire: <F extends Fields>(fields: F) => Schema.Struct<F> & Mark;
|
|
473
465
|
//#endregion
|
package/dist/index.mjs
CHANGED
|
@@ -218,9 +218,15 @@ const runLayer = (layer, command) => Effect$1.gen(function* () {
|
|
|
218
218
|
const last = phases[phases.length - 1];
|
|
219
219
|
if (!last || last.name !== "write") return yield* Effect$1.die(/* @__PURE__ */ new Error("effect-cell-types: a layer reached the interpreter without a write phase closing it"));
|
|
220
220
|
let value = command;
|
|
221
|
+
let raw = command;
|
|
221
222
|
for (const phase of phases.slice(0, -1)) switch (phase.convention) {
|
|
222
223
|
case "effect":
|
|
223
|
-
|
|
224
|
+
if (phase.name === "read") {
|
|
225
|
+
value = yield* phase.run(value);
|
|
226
|
+
raw = value;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
value = yield* phase.run(value, raw);
|
|
224
230
|
break;
|
|
225
231
|
case "either-fail":
|
|
226
232
|
value = yield* Result$1.match(phase.run(value), {
|
|
@@ -240,7 +246,7 @@ const runLayer = (layer, command) => Effect$1.gen(function* () {
|
|
|
240
246
|
return yield* Effect$1.die(/* @__PURE__ */ new Error(`effect-cell-types: unknown phase convention ${String(unreachable)}`));
|
|
241
247
|
}
|
|
242
248
|
}
|
|
243
|
-
return yield* last.run(value);
|
|
249
|
+
return yield* last.run(value, raw);
|
|
244
250
|
});
|
|
245
251
|
/**
|
|
246
252
|
* Applies a description. The return type is deliberately not annotated: `gen` accumulates
|
|
@@ -312,79 +318,38 @@ var Policy_exports = /* @__PURE__ */ __exportAll({});
|
|
|
312
318
|
*
|
|
313
319
|
* ```ts
|
|
314
320
|
* import { Wire } from '@systemfsoftware/effect-cell-types'
|
|
315
|
-
* import { Schema } from 'effect'
|
|
321
|
+
* import { Effect, Schema as S } from 'effect'
|
|
316
322
|
*
|
|
317
323
|
* const Invoice = Wire.wire({
|
|
318
|
-
* id: Wire.
|
|
319
|
-
* amountDue: Wire.
|
|
320
|
-
* status: Wire.
|
|
321
|
-
* lineItems: Wire.
|
|
322
|
-
* metadata: Wire.
|
|
323
|
-
* deleted: Wire.optional(Wire.
|
|
324
|
+
* id: Wire.mint(S.String),
|
|
325
|
+
* amountDue: Wire.mint(S.NullOr(Wire.mint(S.Finite))),
|
|
326
|
+
* status: Wire.mint(S.Literals(['draft', 'open', 'paid'])),
|
|
327
|
+
* lineItems: Wire.mint(S.Array(Wire.mint(S.String))),
|
|
328
|
+
* metadata: Wire.mint(S.Record(Wire.mint(S.String), Wire.mint(S.String))),
|
|
329
|
+
* deleted: Wire.mint(S.optional(Wire.mint(S.Boolean))),
|
|
324
330
|
* })
|
|
325
331
|
*
|
|
326
332
|
* // Decodes to your own type — `{ id: string; amountDue: number | null; ... }`.
|
|
327
|
-
* const invoice = Schema.
|
|
333
|
+
* const invoice = yield* Schema.decode(Invoice)(payload)
|
|
328
334
|
* ```
|
|
329
335
|
*
|
|
330
|
-
* Only declarations that
|
|
331
|
-
* schema deliberately. It is a guardrail, not a security boundary.
|
|
336
|
+
* Only declarations that name members through {@link mint} are constrained, and mint admits a
|
|
337
|
+
* foreign schema deliberately. It is a guardrail, not a security boundary.
|
|
332
338
|
*/
|
|
333
339
|
var Wire_exports = /* @__PURE__ */ __exportAll({
|
|
334
|
-
array: () => array,
|
|
335
|
-
boolean: () => boolean,
|
|
336
|
-
integer: () => integer,
|
|
337
|
-
literal: () => literal,
|
|
338
340
|
mint: () => mint,
|
|
339
|
-
nullOr: () => nullOr,
|
|
340
|
-
nullishOr: () => nullishOr,
|
|
341
|
-
number: () => number,
|
|
342
|
-
optional: () => optional,
|
|
343
|
-
record: () => record,
|
|
344
|
-
refine: () => refine,
|
|
345
|
-
string: () => string,
|
|
346
|
-
suspend: () => suspend,
|
|
347
|
-
tuple: () => tuple,
|
|
348
|
-
undefinedOr: () => undefinedOr,
|
|
349
|
-
union: () => union,
|
|
350
341
|
wire: () => wire
|
|
351
342
|
});
|
|
352
343
|
/**
|
|
353
344
|
* Mark a member whose type this workspace declares.
|
|
354
345
|
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
*
|
|
346
|
+
* The value returned is the one passed in, and its concrete type is preserved, so a marked
|
|
347
|
+
* struct stays a struct and Effect's inference keeps working. Reach for it to admit anything
|
|
348
|
+
* the schema library can express, including a vendor's own schema — deliberately.
|
|
358
349
|
*/
|
|
359
350
|
const mint = (field) => {
|
|
360
351
|
return field;
|
|
361
352
|
};
|
|
362
|
-
const string = mint(Schema.String);
|
|
363
|
-
const number = mint(Schema.Finite);
|
|
364
|
-
const boolean = mint(Schema.Boolean);
|
|
365
|
-
const integer = mint(Schema.Int);
|
|
366
|
-
const literal = (...literals) => mint(Schema.Literals(literals));
|
|
367
|
-
const nullOr = (member) => mint(Schema.NullOr(member));
|
|
368
|
-
const undefinedOr = (member) => mint(Schema.UndefinedOr(member));
|
|
369
|
-
const nullishOr = (member) => mint(Schema.NullishOr(member));
|
|
370
|
-
const array = (member) => mint(Schema.Array(member));
|
|
371
|
-
/** A field that may be absent from the payload entirely, as distinct from present and `undefined`. */
|
|
372
|
-
const optional = (member) => mint(Schema.optional(member));
|
|
373
|
-
const record = (key, value) => mint(Schema.Record(key, value));
|
|
374
|
-
const union = (...members) => mint(Schema.Union(members));
|
|
375
|
-
const tuple = (...elements) => mint(Schema.Tuple(elements));
|
|
376
|
-
const suspend = (thunk) => mint(Schema.suspend(thunk));
|
|
377
|
-
/**
|
|
378
|
-
* Constrain a member's values. Effect's own `member.pipe(Schema.check(Schema.isMinLength(1)))`
|
|
379
|
-
* preserves the mark, but returns the schema with the concrete decode/encode pair fused; this
|
|
380
|
-
* combinator is the alphabet's own shape for the same operation, so a refined member keeps the
|
|
381
|
-
* declaration this workspace makes of its type.
|
|
382
|
-
*
|
|
383
|
-
* `S.refine` needs a type-guard as its predicate argument; the workspace's predicate is a plain
|
|
384
|
-
* `(a: A) => boolean` that narrows nothing, so a truth-preserving `value is A` guard is written
|
|
385
|
-
* at this one call site rather than widening the public signature.
|
|
386
|
-
*/
|
|
387
|
-
const refine = (member, predicate, annotations) => mint(Schema.refine((value) => predicate(value), annotations)(member));
|
|
388
353
|
const wire = (fields) => mint(Schema.Struct(fields));
|
|
389
354
|
//#endregion
|
|
390
355
|
export { Cell_exports as Cell, Policy_exports as Policy, Wire_exports as Wire, Workflow_exports as Workflow };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@systemfsoftware/effect-cell-types",
|
|
3
3
|
"license": "Apache-2.0",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.0.0",
|
|
5
5
|
"author": "Ryan Lee <drdgvhbh@gmail.com>",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -32,23 +32,23 @@
|
|
|
32
32
|
"dist"
|
|
33
33
|
],
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@effect/vitest": "4.0.0-rc.
|
|
35
|
+
"@effect/vitest": "4.0.0-rc.112",
|
|
36
36
|
"@microsoft/api-extractor": "^7.58.7",
|
|
37
37
|
"@systemfsoftware/arethetypeswrong-cli": "^1.1.1",
|
|
38
38
|
"@types/node": "^24",
|
|
39
|
-
"effect": "4.0.0-rc.
|
|
39
|
+
"effect": "^4.0.0-rc.112",
|
|
40
40
|
"oxlint": "^1.77.0",
|
|
41
41
|
"rimraf": "^6.1.3",
|
|
42
42
|
"tsdown": "^0.22.14",
|
|
43
43
|
"tstyche": "^7.1.0",
|
|
44
44
|
"vitest": "^4.1.10",
|
|
45
45
|
"@systemfsoftware/effect-gherkin-spec": "2.0.1",
|
|
46
|
+
"@systemfsoftware/tsconfig": "^1.3.3",
|
|
46
47
|
"@systemfsoftware/oxlint-config": "^0.1.0",
|
|
47
|
-
"@systemfsoftware/vitest-config": "^0.1.0"
|
|
48
|
-
"@systemfsoftware/tsconfig": "^1.3.3"
|
|
48
|
+
"@systemfsoftware/vitest-config": "^0.1.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"effect": "^4.0.0-rc.
|
|
51
|
+
"effect": "^4.0.0-rc.112"
|
|
52
52
|
},
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"provenance": true
|
|
@@ -58,7 +58,6 @@
|
|
|
58
58
|
"build": "tsdown && pnpm api:check",
|
|
59
59
|
"typecheck": "tsc --noEmit --incremental",
|
|
60
60
|
"test": "vitest run --passWithNoTests",
|
|
61
|
-
"test:run": "vitest run --passWithNoTests",
|
|
62
61
|
"test:types": "TSTYCHE_TYPESCRIPT_MODULE=tstyche-typescript tstyche",
|
|
63
62
|
"api:check": "api-extractor run",
|
|
64
63
|
"api:update": "api-extractor run --local",
|