runtime-resolver 0.1.0 → 0.2.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/index.js CHANGED
@@ -1,9 +1,130 @@
1
- import { Layer, NodeResolver, GitHubAutoAuth, BunResolverLive, DenoResolverLive, GitHubClientLive, VersionCacheLive, Effect, BunResolver, DenoResolver, NodeResolverLive } from "./969.js";
1
+ import { DenoReleaseCacheLive, BunRelease, AutoDenoCacheLive, NodeReleaseCacheLive, NodeReleaseCache, AutoNodeCacheLive, denoDefaultInputs, BunReleaseCache, Layer, nodeDefaultInputs, NodeResolverLive, VersionCacheLive, BunVersionFetcherLive, Data, Effect, BunVersionFetcher, DenoResolverLive, GitHubClientLive, NodeScheduleFetcher, DenoResolver, NodeScheduleFetcherLive, DenoVersionFetcherLive, NodeVersionFetcher, DenoReleaseCache, BunReleaseCacheLive, BunResolver, DenoRelease, SemVerParserLive, bunDefaultInputs, GitHubAutoAuth, BunResolverLive, NodeVersionFetcherLive, NodeResolver, AutoBunCacheLive, DenoVersionFetcher, nodeDefaultScheduleData } from "./701.js";
2
+ const CacheErrorBase = Data.TaggedError("CacheError");
3
+ class CacheError extends CacheErrorBase {
4
+ }
5
+ const FreshnessErrorBase = Data.TaggedError("FreshnessError");
6
+ class FreshnessError extends FreshnessErrorBase {
7
+ }
8
+ const InvalidInputErrorBase = Data.TaggedError("InvalidInputError");
9
+ class InvalidInputError extends InvalidInputErrorBase {
10
+ }
11
+ const freshSetup = Effect.gen(function*() {
12
+ const cache = yield* BunReleaseCache;
13
+ const fetcher = yield* BunVersionFetcher;
14
+ const { inputs } = yield* fetcher.fetch().pipe(Effect.catchTags({
15
+ AuthenticationError: (err)=>Effect.fail(new FreshnessError({
16
+ strategy: "api",
17
+ message: `Fresh data required but authentication failed: ${err.message}`
18
+ })),
19
+ NetworkError: (err)=>Effect.fail(new FreshnessError({
20
+ strategy: "api",
21
+ message: `Fresh data required but network unavailable: ${err.message}`
22
+ })),
23
+ ParseError: (err)=>Effect.fail(new FreshnessError({
24
+ strategy: "api",
25
+ message: `Fresh data required but parse failed: ${err.message}`
26
+ })),
27
+ RateLimitError: (err)=>Effect.fail(new FreshnessError({
28
+ strategy: "api",
29
+ message: `Fresh data required but rate limit exceeded: ${err.message}`
30
+ }))
31
+ }));
32
+ const releases = yield* Effect.all(inputs.map((input)=>BunRelease.fromInput(input)), {
33
+ concurrency: "unbounded"
34
+ }).pipe(Effect.orElseSucceed(()=>[]));
35
+ yield* cache.load(releases);
36
+ });
37
+ const SemVerLayer = VersionCacheLive.pipe(Layer.provide(SemVerParserLive));
38
+ const BaseCacheLayer = BunReleaseCacheLive.pipe(Layer.provide(SemVerLayer));
39
+ const FreshBunCacheLive = BaseCacheLayer.pipe(Layer.tap((ctx)=>freshSetup.pipe(Effect.provide(ctx))));
40
+ const FreshDenoCacheLive_freshSetup = Effect.gen(function*() {
41
+ const cache = yield* DenoReleaseCache;
42
+ const fetcher = yield* DenoVersionFetcher;
43
+ const { inputs } = yield* fetcher.fetch().pipe(Effect.catchTags({
44
+ AuthenticationError: (err)=>Effect.fail(new FreshnessError({
45
+ strategy: "api",
46
+ message: `Fresh data required but authentication failed: ${err.message}`
47
+ })),
48
+ NetworkError: (err)=>Effect.fail(new FreshnessError({
49
+ strategy: "api",
50
+ message: `Fresh data required but network unavailable: ${err.message}`
51
+ })),
52
+ ParseError: (err)=>Effect.fail(new FreshnessError({
53
+ strategy: "api",
54
+ message: `Fresh data required but parse failed: ${err.message}`
55
+ })),
56
+ RateLimitError: (err)=>Effect.fail(new FreshnessError({
57
+ strategy: "api",
58
+ message: `Fresh data required but rate limit exceeded: ${err.message}`
59
+ }))
60
+ }));
61
+ const releases = yield* Effect.all(inputs.map((input)=>DenoRelease.fromInput(input)), {
62
+ concurrency: "unbounded"
63
+ }).pipe(Effect.orElseSucceed(()=>[]));
64
+ yield* cache.load(releases);
65
+ });
66
+ const FreshDenoCacheLive_SemVerLayer = VersionCacheLive.pipe(Layer.provide(SemVerParserLive));
67
+ const FreshDenoCacheLive_BaseCacheLayer = DenoReleaseCacheLive.pipe(Layer.provide(FreshDenoCacheLive_SemVerLayer));
68
+ const FreshDenoCacheLive = FreshDenoCacheLive_BaseCacheLayer.pipe(Layer.tap((ctx)=>FreshDenoCacheLive_freshSetup.pipe(Effect.provide(ctx))));
69
+ const FreshNodeCacheLive_freshSetup = Effect.gen(function*() {
70
+ const cache = yield* NodeReleaseCache;
71
+ const versionFetcher = yield* NodeVersionFetcher;
72
+ const scheduleFetcher = yield* NodeScheduleFetcher;
73
+ const [fetchResult, scheduleData] = yield* Effect.all([
74
+ versionFetcher.fetch(),
75
+ scheduleFetcher.fetch()
76
+ ]).pipe(Effect.catchTags({
77
+ NetworkError: (err)=>Effect.fail(new FreshnessError({
78
+ strategy: "api",
79
+ message: `Fresh data required but network unavailable: ${err.message}`
80
+ })),
81
+ ParseError: (err)=>Effect.fail(new FreshnessError({
82
+ strategy: "api",
83
+ message: `Fresh data required but response could not be parsed: ${err.message}`
84
+ }))
85
+ }));
86
+ yield* cache.updateSchedule(scheduleData);
87
+ yield* cache.loadFromInputs(fetchResult.inputs);
88
+ });
89
+ const FreshNodeCacheLive_SemVerLayer = VersionCacheLive.pipe(Layer.provide(SemVerParserLive));
90
+ const FreshNodeCacheLive_BaseCacheLayer = NodeReleaseCacheLive.pipe(Layer.provide(FreshNodeCacheLive_SemVerLayer));
91
+ const FreshNodeCacheLive = FreshNodeCacheLive_BaseCacheLayer.pipe(Layer.tap((ctx)=>FreshNodeCacheLive_freshSetup.pipe(Effect.provide(ctx))));
92
+ const offlineSetup = Effect.gen(function*() {
93
+ const cache = yield* BunReleaseCache;
94
+ const releases = yield* Effect.all(bunDefaultInputs.map((input)=>BunRelease.fromInput(input)), {
95
+ concurrency: "unbounded"
96
+ }).pipe(Effect.orElseSucceed(()=>[]));
97
+ yield* cache.load(releases);
98
+ });
99
+ const OfflineBunCacheLive_SemVerLayer = VersionCacheLive.pipe(Layer.provide(SemVerParserLive));
100
+ const OfflineBunCacheLive_BaseCacheLayer = BunReleaseCacheLive.pipe(Layer.provide(OfflineBunCacheLive_SemVerLayer));
101
+ const OfflineBunCacheLive = OfflineBunCacheLive_BaseCacheLayer.pipe(Layer.tap((ctx)=>offlineSetup.pipe(Effect.provide(ctx))));
102
+ const OfflineDenoCacheLive_offlineSetup = Effect.gen(function*() {
103
+ const cache = yield* DenoReleaseCache;
104
+ const releases = yield* Effect.all(denoDefaultInputs.map((input)=>DenoRelease.fromInput(input)), {
105
+ concurrency: "unbounded"
106
+ }).pipe(Effect.orElseSucceed(()=>[]));
107
+ yield* cache.load(releases);
108
+ });
109
+ const OfflineDenoCacheLive_SemVerLayer = VersionCacheLive.pipe(Layer.provide(SemVerParserLive));
110
+ const OfflineDenoCacheLive_BaseCacheLayer = DenoReleaseCacheLive.pipe(Layer.provide(OfflineDenoCacheLive_SemVerLayer));
111
+ const OfflineDenoCacheLive = OfflineDenoCacheLive_BaseCacheLayer.pipe(Layer.tap((ctx)=>OfflineDenoCacheLive_offlineSetup.pipe(Effect.provide(ctx))));
112
+ const OfflineNodeCacheLive_offlineSetup = Effect.gen(function*() {
113
+ const cache = yield* NodeReleaseCache;
114
+ yield* cache.updateSchedule(nodeDefaultScheduleData);
115
+ yield* cache.loadFromInputs(nodeDefaultInputs);
116
+ });
117
+ const OfflineNodeCacheLive_SemVerLayer = VersionCacheLive.pipe(Layer.provide(SemVerParserLive));
118
+ const OfflineNodeCacheLive_BaseCacheLayer = NodeReleaseCacheLive.pipe(Layer.provide(OfflineNodeCacheLive_SemVerLayer));
119
+ const OfflineNodeCacheLive = OfflineNodeCacheLive_BaseCacheLayer.pipe(Layer.tap((ctx)=>OfflineNodeCacheLive_offlineSetup.pipe(Effect.provide(ctx))));
2
120
  const GitHubLayer = GitHubClientLive.pipe(Layer.provide(GitHubAutoAuth));
3
- const SharedLayer = Layer.merge(GitHubLayer, VersionCacheLive);
4
- const NodeLayer = NodeResolverLive.pipe(Layer.provide(SharedLayer));
5
- const BunLayer = BunResolverLive.pipe(Layer.provide(SharedLayer));
6
- const DenoLayer = DenoResolverLive.pipe(Layer.provide(SharedLayer));
121
+ const NodeFetchersLayer = Layer.merge(NodeVersionFetcherLive.pipe(Layer.provide(GitHubLayer)), NodeScheduleFetcherLive.pipe(Layer.provide(GitHubLayer)));
122
+ const NodeCacheLayer = AutoNodeCacheLive.pipe(Layer.provide(NodeFetchersLayer));
123
+ const NodeLayer = NodeResolverLive.pipe(Layer.provide(NodeCacheLayer));
124
+ const BunCacheLayer = AutoBunCacheLive.pipe(Layer.provide(BunVersionFetcherLive.pipe(Layer.provide(GitHubLayer))));
125
+ const BunLayer = BunResolverLive.pipe(Layer.provide(BunCacheLayer));
126
+ const DenoCacheLayer = AutoDenoCacheLive.pipe(Layer.provide(DenoVersionFetcherLive.pipe(Layer.provide(GitHubLayer))));
127
+ const DenoLayer = DenoResolverLive.pipe(Layer.provide(DenoCacheLayer));
7
128
  const resolveNode = (options)=>Effect.runPromise(Effect.gen(function*() {
8
129
  const resolver = yield* NodeResolver;
9
130
  return yield* resolver.resolve(options);
@@ -16,5 +137,5 @@ const resolveDeno = (options)=>Effect.runPromise(Effect.gen(function*() {
16
137
  const resolver = yield* DenoResolver;
17
138
  return yield* resolver.resolve(options);
18
139
  }).pipe(Effect.provide(DenoLayer)));
19
- export { AuthenticationError, AuthenticationErrorBase, BunResolver, BunResolverLive, CacheError, CacheErrorBase, DenoResolver, DenoResolverLive, FreshnessError, FreshnessErrorBase, GitHubAppAuth, GitHubAutoAuth, GitHubClient, GitHubClientLive, GitHubTokenAuth, GitHubTokenAuthFromToken, InvalidInputError, InvalidInputErrorBase, NetworkError, NetworkErrorBase, NodeResolver, NodeResolverLive, OctokitInstance, ParseError, ParseErrorBase, RateLimitError, RateLimitErrorBase, VersionCache, VersionCacheLive, VersionNotFoundError, VersionNotFoundErrorBase } from "./969.js";
20
- export { resolveBun, resolveDeno, resolveNode };
140
+ export { AuthenticationError, AuthenticationErrorBase, AutoBunCacheLive, AutoDenoCacheLive, AutoNodeCacheLive, BunRelease, BunReleaseBase, BunReleaseCache, BunReleaseCacheLive, BunResolver, BunResolverLive, BunVersionFetcher, BunVersionFetcherLive, DenoRelease, DenoReleaseBase, DenoReleaseCache, DenoReleaseCacheLive, DenoResolver, DenoResolverLive, DenoVersionFetcher, DenoVersionFetcherLive, GitHubAppAuth, GitHubAutoAuth, GitHubClient, GitHubClientLive, GitHubTokenAuth, GitHubTokenAuthFromToken, NetworkError, NetworkErrorBase, NodeRelease, NodeReleaseCache, NodeReleaseCacheLive, NodeResolver, NodeResolverLive, NodeSchedule, NodeScheduleBase, NodeScheduleFetcher, NodeScheduleFetcherLive, NodeVersionFetcher, NodeVersionFetcherLive, OctokitInstance, ParseError, ParseErrorBase, RateLimitError, RateLimitErrorBase, VersionNotFoundError, VersionNotFoundErrorBase, createRuntimeCache } from "./701.js";
141
+ export { CacheError, CacheErrorBase, FreshBunCacheLive, FreshDenoCacheLive, FreshNodeCacheLive, FreshnessError, FreshnessErrorBase, InvalidInputError, InvalidInputErrorBase, OfflineBunCacheLive, OfflineDenoCacheLive, OfflineNodeCacheLive, resolveBun, resolveDeno, resolveNode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runtime-resolver",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "description": "Resolve semver-compatible versions of Node.js, Bun, and Deno runtimes with Effect-based architecture and offline fallback.",
6
6
  "keywords": [
@@ -47,14 +47,14 @@
47
47
  "@octokit/auth-app": "^8.2.0",
48
48
  "effect": "^3.19.19",
49
49
  "octokit": "^5.0.5",
50
- "semver": "^7.7.4"
50
+ "semver-effect": "^0.1.0"
51
51
  },
52
52
  "files": [
53
53
  "!runtime-resolver.api.json",
54
54
  "!tsconfig.json",
55
55
  "!tsdoc.json",
56
56
  "235.js",
57
- "969.js",
57
+ "701.js",
58
58
  "LICENSE",
59
59
  "README.md",
60
60
  "bin/runtime-resolver.js",