@playfast/reform-resource 1.0.2 → 1.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/README.md CHANGED
@@ -32,10 +32,7 @@ class Config extends Resource.make('Config', {
32
32
  }) {}
33
33
 
34
34
  // Wire — `acquire` may be scoped (acquire/release tied to the scene scope).
35
- const ConfigLive = Resource.live(
36
- Config,
37
- Effect.acquireRelease(openConfig, closeConfig),
38
- )
35
+ const ConfigLive = Resource.live(Config, Effect.acquireRelease(openConfig, closeConfig))
39
36
 
40
37
  // Read inside a composition.
41
38
  const view = Effect.gen(function* () {
package/package.json CHANGED
@@ -1,36 +1,38 @@
1
1
  {
2
2
  "name": "@playfast/reform-resource",
3
- "playbook": "./playbook",
4
- "version": "1.0.2",
5
- "type": "module",
3
+ "version": "1.1.0",
6
4
  "description": "Async resources for Reform — a layer that builds synchronously, loads in the background, and flips a reactive store from pending to ready/failed. The sanctioned home for async work that would otherwise break reform's synchronous scene build.",
7
5
  "keywords": [
8
- "reform",
9
- "effect",
10
6
  "async",
11
- "resource",
7
+ "effect",
8
+ "layer",
12
9
  "reactive",
13
- "layer"
10
+ "reform",
11
+ "resource"
14
12
  ],
13
+ "bugs": {
14
+ "url": "https://github.com/playfast/reform/issues"
15
+ },
15
16
  "license": "MIT",
16
17
  "repository": {
17
18
  "type": "git",
18
19
  "url": "https://github.com/playfast/reform.git",
19
20
  "directory": "packages/reform-resource"
20
21
  },
21
- "bugs": {
22
- "url": "https://github.com/playfast/reform/issues"
23
- },
22
+ "files": [
23
+ "src",
24
+ "README.md"
25
+ ],
26
+ "type": "module",
24
27
  "sideEffects": false,
25
28
  "exports": {
26
29
  "./package.json": "./package.json",
27
30
  ".": "./src/index.ts",
28
31
  "./*": "./src/*.ts"
29
32
  },
30
- "files": [
31
- "src",
32
- "README.md"
33
- ],
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
34
36
  "scripts": {
35
37
  "clean": "rm -rf dist .tsbuildinfo",
36
38
  "check": "tsc --noEmit",
@@ -42,10 +44,8 @@
42
44
  "lint:fix": "oxlint --fix src"
43
45
  },
44
46
  "peerDependencies": {
45
- "effect": "*",
46
- "@playfast/reform": "*"
47
+ "@playfast/reform": "*",
48
+ "effect": "*"
47
49
  },
48
- "publishConfig": {
49
- "access": "public"
50
- }
50
+ "playbook": "./playbook"
51
51
  }
@@ -1,4 +1,4 @@
1
- import { type Store } from '@playfast/reform'
1
+ import { type Store } from '@playfast/reform/internal'
2
2
 
3
3
  export interface AsyncResourcePending {
4
4
  readonly _tag: 'AsyncResource'
@@ -24,10 +24,17 @@ export type AsyncResource<A, E = never> =
24
24
  | AsyncResourceReady<A>
25
25
  | ([E] extends [never] ? never : AsyncResourceFailed<E>)
26
26
 
27
- export type AnyAsyncResource<A, E> = AsyncResourcePending | AsyncResourceReady<A> | AsyncResourceFailed<E>
27
+ export type AnyAsyncResource<A, E> =
28
+ | AsyncResourcePending
29
+ | AsyncResourceReady<A>
30
+ | AsyncResourceFailed<E>
28
31
 
29
32
  const pending: AsyncResourcePending = { _tag: 'AsyncResource', isReady: false, failed: false }
30
- const ready = <A>(acquired: A): AsyncResourceReady<A> => ({ _tag: 'AsyncResource', isReady: true, value: acquired })
33
+ const ready = <A>(acquired: A): AsyncResourceReady<A> => ({
34
+ _tag: 'AsyncResource',
35
+ isReady: true,
36
+ value: acquired,
37
+ })
31
38
  const failed = <E>(error: E): AsyncResourceFailed<E> => ({
32
39
  _tag: 'AsyncResource',
33
40
  isReady: false,
@@ -43,6 +50,8 @@ export interface AsyncResourceConstructors {
43
50
 
44
51
  export const AsyncResource: AsyncResourceConstructors = { pending, ready, failed }
45
52
 
46
- export const narrowStore = <A, E>(store: Store<AnyAsyncResource<A, E>>): Store<AsyncResource<A, E>> =>
53
+ export const narrowStore = <A, E>(
54
+ store: Store<AnyAsyncResource<A, E>>,
55
+ ): Store<AsyncResource<A, E>> =>
47
56
  // oxlint-disable-next-line reform-rules/no-type-assertion -- sanctioned variance seam: the live store holds the full union; this is the one documented home for narrowing it to the definition-permitted arms (mirrors asyncData.narrowStore).
48
57
  store as unknown as Store<AsyncResource<A, E>>
@@ -21,7 +21,10 @@ it.live('builds pending then resolves to ready', () => {
21
21
  })
22
22
 
23
23
  it.live('a failing load resolves to the failed arm carrying the error', () => {
24
- class Conn extends Resource.make('Conn', { output: S.Number, error: Option.some(S.instanceOf(Boom)) }) {}
24
+ class Conn extends Resource.make('Conn', {
25
+ output: S.Number,
26
+ error: Option.some(S.instanceOf(Boom)),
27
+ }) {}
25
28
  const layer = Resource.live(Conn, Effect.fail(new Boom({ message: 'nope' })))
26
29
 
27
30
  return Effect.gen(function* () {
@@ -69,4 +72,5 @@ it.live('ties acquire/release to the scene scope', () =>
69
72
  }),
70
73
  )
71
74
  expect(yield* Ref.get(released)).toBe(true)
72
- }))
75
+ }),
76
+ )
package/src/resource.ts CHANGED
@@ -5,13 +5,9 @@ import {
5
5
  resolveScheduler,
6
6
  type Store,
7
7
  yieldableClass,
8
- } from '@playfast/reform'
8
+ } from '@playfast/reform/internal'
9
9
  import { Cause, Context, Effect, Layer, Option, type Schema, Scope } from 'effect'
10
- import {
11
- type AnyAsyncResource,
12
- AsyncResource,
13
- narrowStore,
14
- } from './asyncResource'
10
+ import { type AnyAsyncResource, AsyncResource, narrowStore } from './asyncResource'
15
11
 
16
12
  type AnySchema<A> = Schema.Schema<A, Schema.Schema.Encoded<Schema.Schema.AnyNoContext>>
17
13
 
@@ -22,8 +18,11 @@ export interface ResourceManifest<N extends string, A, E> extends Manifest {
22
18
  readonly error: Option.Option<AnySchema<E>>
23
19
  }
24
20
 
25
- export interface ResourceClass<out N extends string, in out A, in out E>
26
- extends Effect.Effect<AsyncResource<A, E>, never, Store<AsyncResource<A, E>>> {
21
+ export interface ResourceClass<out N extends string, in out A, in out E> extends Effect.Effect<
22
+ AsyncResource<A, E>,
23
+ never,
24
+ Store<AsyncResource<A, E>>
25
+ > {
27
26
  new (): {}
28
27
  readonly manifest: ResourceManifest<N, A, E>
29
28
  readonly store: Context.Tag<Store<AsyncResource<A, E>>, Store<AsyncResource<A, E>>>