@tsdoctor/bundle 0.1.0 → 0.2.1

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.
@@ -1,4 +1,5 @@
1
1
  import { TSDOCTOR_MANIFEST_FILENAME, readApiModelInfo, readBundle } from "./Bundle.js";
2
+ import { LenientManifest } from "@effected/package-json";
2
3
  import { Effect, FileSystem, Option, Path, Schema } from "effect";
3
4
  import { GlobPatternOptions } from "@effected/glob";
4
5
  import { compileAndExpand } from "@effected/walker";
@@ -38,11 +39,6 @@ var BundleDiscoveryError = class extends Schema.TaggedError()("BundleDiscoveryEr
38
39
  return `Bundle discovery failed (${this.reason}) at ${this.path}${detailPart}`;
39
40
  }
40
41
  };
41
- /** The lenient package.json subset discovery needs: name and version only. */
42
- const DiscoveryPackageJson = Schema.Struct({
43
- name: Schema.optionalKey(Schema.String),
44
- version: Schema.optionalKey(Schema.String)
45
- });
46
42
  /** The unscoped tail of an npm package name (`@scope/pkg` → `pkg`). */
47
43
  function unscopedName(packageName) {
48
44
  const slash = packageName.indexOf("/");
@@ -72,21 +68,35 @@ function listModelFiles(dir) {
72
68
  cause
73
69
  })));
74
70
  }
75
- /** Read the discovery-lenient name/version pair from a package.json, when present. */
71
+ /**
72
+ * Read the discovery-lenient name/version pair from a package.json, when
73
+ * present.
74
+ *
75
+ * @remarks
76
+ * Uses `@effected/package-json`'s `LenientManifest` — the shape-on-presence
77
+ * degradable tier below `PackageManifest`. Malformed JSON text (or a
78
+ * non-object document) fails typed as `invalidPackageJson`, matching the
79
+ * previous two-field sniffer; a malformed individual field now degrades to
80
+ * absence instead of failing, which is the ladder's enrich-never-gate rule
81
+ * applied at field granularity (the model's own name covers a nameless
82
+ * discovery).
83
+ */
76
84
  function readDiscoveryPackageJson(packageJsonPath) {
77
85
  return Effect.gen(function* () {
78
86
  const fs = yield* FileSystem.FileSystem;
79
87
  if (!(yield* fs.exists(packageJsonPath).pipe(Effect.orElseSucceed(() => false)))) return Option.none();
80
88
  const parsed = yield* Effect.gen(function* () {
81
89
  const text = yield* fs.readFileString(packageJsonPath);
82
- const json = yield* Effect.try(() => JSON.parse(text));
83
- return yield* Schema.decodeUnknownEffect(DiscoveryPackageJson)(json);
90
+ return yield* LenientManifest.parse(text);
84
91
  }).pipe(Effect.mapError((cause) => new BundleDiscoveryError({
85
92
  path: packageJsonPath,
86
93
  reason: "invalidPackageJson",
87
94
  cause
88
95
  })));
89
- return Option.some(parsed);
96
+ return Option.some({
97
+ ...parsed.name !== void 0 ? { name: parsed.name } : {},
98
+ ...parsed.version !== void 0 ? { version: parsed.version } : {}
99
+ });
90
100
  });
91
101
  }
92
102
  /**
package/BundleHash.js CHANGED
@@ -1,83 +1,75 @@
1
- import { createHash } from "node:crypto";
1
+ import { Effect } from "effect";
2
+ import { JsoncFingerprint } from "@effected/jsonc";
2
3
 
3
4
  //#region src/BundleHash.ts
4
5
  /**
5
- * Serialize a JSON-shaped value canonically: object keys sorted recursively,
6
- * `undefined`-valued keys dropped, arrays in declared order, no whitespace.
7
- *
8
- * @remarks
9
- * The normalization half of the change-detection discipline: two values that
10
- * differ only in key order or optional-key presence-as-`undefined` serialize
11
- * identically, so their hashes match. Non-JSON leaves (functions, symbols)
12
- * serialize as `null`, matching `JSON.stringify` semantics inside arrays.
13
- *
14
- * @public
15
- */
16
- function canonicalJson(value) {
17
- if (value === null || typeof value === "boolean" || typeof value === "number" || typeof value === "string") return JSON.stringify(value);
18
- if (Array.isArray(value)) return `[${value.map((item) => canonicalJson(item === void 0 ? null : item)).join(",")}]`;
19
- if (typeof value === "object") {
20
- const record = value;
21
- return `{${Object.keys(record).filter((key) => record[key] !== void 0).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
22
- }
23
- return "null";
24
- }
25
- /**
26
6
  * Normalize text for hashing: CRLF/CR line endings become LF and trailing
27
7
  * whitespace at the end of the content is trimmed.
28
8
  *
29
9
  * @remarks
30
10
  * The same file checked out with different line-ending settings must hash
31
11
  * identically — coarse layer-hash comparison otherwise reports every file
32
- * changed on the first cross-platform build.
12
+ * changed on the first cross-platform build. Line-ending normalization is
13
+ * `@effected/jsonc`'s `JsoncFingerprint.normalizeEol`; the trailing trim is
14
+ * this package's own policy on top.
33
15
  *
34
16
  * @public
35
17
  */
36
18
  function normalizeText(text) {
37
- return text.replace(/\r\n?/g, "\n").trimEnd();
19
+ return JsoncFingerprint.normalizeEol(text).trimEnd();
38
20
  }
39
21
  /**
40
- * The lowercase hex SHA-256 of a string, UTF-8 encoded.
22
+ * Hash text content: {@link normalizeText} then SHA-256 (lowercase hex).
41
23
  *
42
- * @public
43
- */
44
- function sha256Hex(text) {
45
- return createHash("sha256").update(text, "utf8").digest("hex");
46
- }
47
- /**
48
- * Hash text content: {@link normalizeText} then {@link sha256Hex}.
24
+ * @remarks
25
+ * Digesting runs through core's `Crypto` service (`JsoncFingerprint`), so
26
+ * consumers provide a backend — `@effect/platform-node`'s
27
+ * `NodeCrypto.layer` — at the edge, the same posture as this package's
28
+ * `FileSystem | Path` requirements.
49
29
  *
50
30
  * @public
51
31
  */
52
32
  function hashText(text) {
53
- return sha256Hex(normalizeText(text));
33
+ return JsoncFingerprint.hashText(normalizeText(text));
54
34
  }
55
35
  /**
56
- * Hash a JSON-shaped value: {@link canonicalJson} then {@link sha256Hex}.
36
+ * Hash a JSON-shaped value: RFC 8785 (JCS) canonicalization then SHA-256.
37
+ *
38
+ * @remarks
39
+ * Delegates to `@effected/jsonc`'s `JsoncFingerprint.hash`. Canonicalization
40
+ * is strict by design: an `undefined`-valued member, a `Date`, or any other
41
+ * non-plain object fails typed (`JsoncCanonicalizeError`) rather than being
42
+ * silently dropped or coerced — a fingerprint of a silently altered document
43
+ * lies. Schema-encode class instances to plain JSON before hashing.
57
44
  *
58
45
  * @public
59
46
  */
60
47
  function hashJsonValue(value) {
61
- return sha256Hex(canonicalJson(value));
48
+ return JsoncFingerprint.hash(value);
62
49
  }
63
50
  /**
64
51
  * Hash one bundle layer file's raw text — the COARSE half of change
65
52
  * detection (all layer hashes match → skip resolution entirely).
66
53
  *
67
54
  * @remarks
68
- * Total: text that parses as JSON hashes canonically (key order and
69
- * formatting churn do not read as change); text that does not parse falls
70
- * back to {@link hashText}, so a broken file still gets a stable hash
71
- * rather than an error — hashing is bookkeeping, not validation.
55
+ * Total in the error sense that matters here: text that parses as JSON
56
+ * hashes canonically (key order and formatting churn do not read as
57
+ * change); text that does not parse falls back to {@link hashText}, so a
58
+ * broken file still gets a stable hash rather than an error — hashing is
59
+ * bookkeeping, not validation. `JSON.parse` output is always plain
60
+ * JSON-shaped, so a canonicalization failure on the parsed branch is a
61
+ * defect, not a recoverable error.
72
62
  *
73
63
  * @public
74
64
  */
75
65
  function hashLayerText(text) {
66
+ let parsed;
76
67
  try {
77
- return hashJsonValue(JSON.parse(text));
68
+ parsed = JSON.parse(text);
78
69
  } catch {
79
70
  return hashText(text);
80
71
  }
72
+ return JsoncFingerprint.hash(parsed).pipe(Effect.catchTag("JsoncCanonicalizeError", (error) => Effect.die(error)));
81
73
  }
82
74
  /**
83
75
  * Fingerprint every present field of a {@link ResolvedBundle} — the FINE
@@ -91,17 +83,17 @@ function hashLayerText(text) {
91
83
  * The consuming store maps each key to its invalidation scope (version →
92
84
  * version-embedding surfaces, tsconfig → all code blocks, …).
93
85
  *
86
+ * Resolver output is plain JSON-shaped by construction (every value comes
87
+ * from a `Schema.Struct` decode or a primitive derivation), so a
88
+ * canonicalization failure here is a defect, not a recoverable error.
89
+ *
94
90
  * @public
95
91
  */
96
92
  function fingerprintResolvedBundle(resolved) {
97
- const fingerprints = {};
98
93
  const fields = { ...resolved };
99
- for (const key of Object.keys(fields).sort()) {
100
- const field = fields[key];
101
- if (field !== void 0) fingerprints[key] = hashJsonValue(field);
102
- }
103
- return fingerprints;
94
+ const present = Object.keys(fields).sort().filter((key) => fields[key] !== void 0);
95
+ return Effect.forEach(present, (key) => JsoncFingerprint.hash(fields[key]).pipe(Effect.catchTag("JsoncCanonicalizeError", (error) => Effect.die(error)), Effect.map((hash) => [key, hash])), { concurrency: 1 }).pipe(Effect.map((entries) => Object.fromEntries(entries)));
104
96
  }
105
97
 
106
98
  //#endregion
107
- export { canonicalJson, fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, normalizeText, sha256Hex };
99
+ export { fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, normalizeText };
package/README.md CHANGED
@@ -29,7 +29,7 @@ This is an ESM-only package. `effect` and the `@effected/*` packages are peer de
29
29
  ## Quick start
30
30
 
31
31
  ```ts
32
- import { NodeFileSystem } from "@effect/platform-node";
32
+ import { NodeCrypto, NodeFileSystem } from "@effect/platform-node";
33
33
  import { Effect, Layer, Path } from "effect";
34
34
  import { fingerprintResolvedBundle, loadBundle, resolveBundleFrom } from "@tsdoctor/bundle";
35
35
 
@@ -40,10 +40,13 @@ const program = Effect.gen(function* () {
40
40
  tagline: "Every API Extractor feature in one module",
41
41
  });
42
42
  console.log(resolved.name); // { value: "...", source: "manifest.leaf" | "packageJson" | ... }
43
- console.log(fingerprintResolvedBundle(resolved)); // per-field SHA-256 fingerprints
43
+ console.log(yield* fingerprintResolvedBundle(resolved)); // per-field SHA-256 fingerprints
44
44
  });
45
45
 
46
- program.pipe(Effect.provide(Layer.mergeAll(NodeFileSystem.layer, Path.layer)), Effect.runPromise);
46
+ program.pipe(
47
+ Effect.provide(Layer.mergeAll(NodeFileSystem.layer, Path.layer, NodeCrypto.layer)),
48
+ Effect.runPromise,
49
+ );
47
50
  ```
48
51
 
49
52
  Every resolved field carries `{ value, source }`, so "did the user override this or did we derive it?" is a rank comparison, not a heuristic. The fingerprints feed a snapshot store: unchanged inputs mean generation can be skipped at the granularity of exactly the surfaces a changed field invalidates.
@@ -56,9 +59,9 @@ Every resolved field carries `{ value, source }`, so "did the user override this
56
59
  - `BundleManifest`, `decodeBundleManifest` — the `tsdoctor.json` spec-1 schema; unknown fields and unknown registry types degrade gracefully instead of rejecting.
57
60
  - `PlatformOverrides`, `decodePlatformOverrides` — the top-ranked data-override tier a consumer passes through platform options.
58
61
  - `resolveBundle` / `resolveBundleFrom` — the pure six-tier resolver producing a `ResolvedBundle` of `Provenanced` fields, with the documented inference rules (Open Graph alt-text chain, MIME from extension).
59
- - `hashLayerText`, `hashJsonValue`, `canonicalJson`, `fingerprintResolvedBundle` — canonical-normalization hashing for coarse (per-layer) and fine (per-field) change detection.
62
+ - `hashLayerText`, `hashJsonValue`, `fingerprintResolvedBundle` — RFC 8785 (JCS) canonicalization plus SHA-256 (via `@effected/jsonc`'s `JsoncFingerprint`) for coarse (per-layer) and fine (per-field) change detection. Canonicalization is strict: an `undefined`-valued member or non-plain object fails typed rather than being silently dropped.
60
63
 
61
- All filesystem-touching functions keep `FileSystem` and `Path` in the Effect `R` channel; provide a platform layer (for example `@effect/platform-node`) once at the application boundary.
64
+ All filesystem-touching functions keep `FileSystem` and `Path` in the Effect `R` channel, and the hashing functions keep `Crypto` there too; provide platform layers (for example `@effect/platform-node`'s `NodeFileSystem.layer`, `Path.layer` and `NodeCrypto.layer`) once at the application boundary.
62
65
 
63
66
  ## License
64
67
 
package/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import { PackageManifest } from "@effected/package-json";
2
2
  import { CompilerOptions, ResolvedTsconfig } from "@effected/tsconfig-json";
3
- import { Effect, FileSystem, Option, Path, Schema } from "effect";
3
+ import { Crypto, Effect, FileSystem, Option, Path, PlatformError, Schema } from "effect";
4
4
  import { GitHubRelease } from "@effected/github";
5
5
  import { NpmRegistry, PackageTarball, RegistryTarget } from "@effected/npm";
6
6
  import { Cache } from "@effected/store";
7
7
  import { AppDirs } from "@effected/xdg";
8
+ import { JsoncCanonicalizeError } from "@effected/jsonc";
8
9
  //#region src/BundleManifest.d.ts
9
10
  /**
10
11
  * The registry protocol families this reader knows how to do more than link
@@ -809,19 +810,6 @@ declare function resolveBundle(input: ResolveBundleInput): ResolvedBundle;
809
810
  declare function resolveBundleFrom(bundle: Bundle, platform?: PlatformOverrides): ResolvedBundle;
810
811
  //#endregion
811
812
  //#region src/BundleHash.d.ts
812
- /**
813
- * Serialize a JSON-shaped value canonically: object keys sorted recursively,
814
- * `undefined`-valued keys dropped, arrays in declared order, no whitespace.
815
- *
816
- * @remarks
817
- * The normalization half of the change-detection discipline: two values that
818
- * differ only in key order or optional-key presence-as-`undefined` serialize
819
- * identically, so their hashes match. Non-JSON leaves (functions, symbols)
820
- * serialize as `null`, matching `JSON.stringify` semantics inside arrays.
821
- *
822
- * @public
823
- */
824
- declare function canonicalJson(value: unknown): string;
825
813
  /**
826
814
  * Normalize text for hashing: CRLF/CR line endings become LF and trailing
827
815
  * whitespace at the end of the content is trimmed.
@@ -829,42 +817,54 @@ declare function canonicalJson(value: unknown): string;
829
817
  * @remarks
830
818
  * The same file checked out with different line-ending settings must hash
831
819
  * identically — coarse layer-hash comparison otherwise reports every file
832
- * changed on the first cross-platform build.
820
+ * changed on the first cross-platform build. Line-ending normalization is
821
+ * `@effected/jsonc`'s `JsoncFingerprint.normalizeEol`; the trailing trim is
822
+ * this package's own policy on top.
833
823
  *
834
824
  * @public
835
825
  */
836
826
  declare function normalizeText(text: string): string;
837
827
  /**
838
- * The lowercase hex SHA-256 of a string, UTF-8 encoded.
828
+ * Hash text content: {@link normalizeText} then SHA-256 (lowercase hex).
839
829
  *
840
- * @public
841
- */
842
- declare function sha256Hex(text: string): string;
843
- /**
844
- * Hash text content: {@link normalizeText} then {@link sha256Hex}.
830
+ * @remarks
831
+ * Digesting runs through core's `Crypto` service (`JsoncFingerprint`), so
832
+ * consumers provide a backend — `@effect/platform-node`'s
833
+ * `NodeCrypto.layer` — at the edge, the same posture as this package's
834
+ * `FileSystem | Path` requirements.
845
835
  *
846
836
  * @public
847
837
  */
848
- declare function hashText(text: string): string;
838
+ declare function hashText(text: string): Effect.Effect<string, PlatformError.PlatformError, Crypto.Crypto>;
849
839
  /**
850
- * Hash a JSON-shaped value: {@link canonicalJson} then {@link sha256Hex}.
840
+ * Hash a JSON-shaped value: RFC 8785 (JCS) canonicalization then SHA-256.
841
+ *
842
+ * @remarks
843
+ * Delegates to `@effected/jsonc`'s `JsoncFingerprint.hash`. Canonicalization
844
+ * is strict by design: an `undefined`-valued member, a `Date`, or any other
845
+ * non-plain object fails typed (`JsoncCanonicalizeError`) rather than being
846
+ * silently dropped or coerced — a fingerprint of a silently altered document
847
+ * lies. Schema-encode class instances to plain JSON before hashing.
851
848
  *
852
849
  * @public
853
850
  */
854
- declare function hashJsonValue(value: unknown): string;
851
+ declare function hashJsonValue(value: unknown): Effect.Effect<string, JsoncCanonicalizeError | PlatformError.PlatformError, Crypto.Crypto>;
855
852
  /**
856
853
  * Hash one bundle layer file's raw text — the COARSE half of change
857
854
  * detection (all layer hashes match → skip resolution entirely).
858
855
  *
859
856
  * @remarks
860
- * Total: text that parses as JSON hashes canonically (key order and
861
- * formatting churn do not read as change); text that does not parse falls
862
- * back to {@link hashText}, so a broken file still gets a stable hash
863
- * rather than an error — hashing is bookkeeping, not validation.
857
+ * Total in the error sense that matters here: text that parses as JSON
858
+ * hashes canonically (key order and formatting churn do not read as
859
+ * change); text that does not parse falls back to {@link hashText}, so a
860
+ * broken file still gets a stable hash rather than an error — hashing is
861
+ * bookkeeping, not validation. `JSON.parse` output is always plain
862
+ * JSON-shaped, so a canonicalization failure on the parsed branch is a
863
+ * defect, not a recoverable error.
864
864
  *
865
865
  * @public
866
866
  */
867
- declare function hashLayerText(text: string): string;
867
+ declare function hashLayerText(text: string): Effect.Effect<string, PlatformError.PlatformError, Crypto.Crypto>;
868
868
  /**
869
869
  * Fingerprint every present field of a {@link ResolvedBundle} — the FINE
870
870
  * half of change detection, hashing each field's `{ value, source }` pair.
@@ -877,9 +877,13 @@ declare function hashLayerText(text: string): string;
877
877
  * The consuming store maps each key to its invalidation scope (version →
878
878
  * version-embedding surfaces, tsconfig → all code blocks, …).
879
879
  *
880
+ * Resolver output is plain JSON-shaped by construction (every value comes
881
+ * from a `Schema.Struct` decode or a primitive derivation), so a
882
+ * canonicalization failure here is a defect, not a recoverable error.
883
+ *
880
884
  * @public
881
885
  */
882
- declare function fingerprintResolvedBundle(resolved: ResolvedBundle): Readonly<Record<string, string>>;
886
+ declare function fingerprintResolvedBundle(resolved: ResolvedBundle): Effect.Effect<Readonly<Record<string, string>>, PlatformError.PlatformError, Crypto.Crypto>;
883
887
  //#endregion
884
- export { type ApiModelInfo, type Bundle, type BundleDescriptor, BundleDiscoveryError, BundleFetchError, BundleLayerError, BundleManifest, BundleManifestError, type BundleOverrides, type DiscoverBundleOptions, type DiscoverBundlesOptions, type FetchGitHubReleaseBundleOptions, type FetchNpmBundleOptions, KNOWN_REGISTRY_TYPES, type KnownRegistryType, OpenGraphConfig, OpenGraphImage, PlatformOverrides, ProjectIdentity, type ProvenanceSource, type Provenanced, RegistryRef, type ResolveBundleInput, type ResolvedBundle, type ResolvedOpenGraph, type ResolvedOpenGraphImage, SbomRef, TSDOCTOR_MANIFEST_FILENAME, canonicalJson, decodeBundleManifest, decodePlatformOverrides, discoverBundle, discoverBundles, fetchGitHubReleaseBundle, fetchNpmBundle, fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, isKnownRegistryType, loadBundle, loadBundles, normalizeText, readApiModelInfo, readBundle, resolveBundle, resolveBundleFrom, sha256Hex };
888
+ export { type ApiModelInfo, type Bundle, type BundleDescriptor, BundleDiscoveryError, BundleFetchError, BundleLayerError, BundleManifest, BundleManifestError, type BundleOverrides, type DiscoverBundleOptions, type DiscoverBundlesOptions, type FetchGitHubReleaseBundleOptions, type FetchNpmBundleOptions, KNOWN_REGISTRY_TYPES, type KnownRegistryType, OpenGraphConfig, OpenGraphImage, PlatformOverrides, ProjectIdentity, type ProvenanceSource, type Provenanced, RegistryRef, type ResolveBundleInput, type ResolvedBundle, type ResolvedOpenGraph, type ResolvedOpenGraphImage, SbomRef, TSDOCTOR_MANIFEST_FILENAME, decodeBundleManifest, decodePlatformOverrides, discoverBundle, discoverBundles, fetchGitHubReleaseBundle, fetchNpmBundle, fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, isKnownRegistryType, loadBundle, loadBundles, normalizeText, readApiModelInfo, readBundle, resolveBundle, resolveBundleFrom };
885
889
  //# sourceMappingURL=index.d.ts.map
package/index.js CHANGED
@@ -2,8 +2,8 @@ import { BundleManifest, BundleManifestError, KNOWN_REGISTRY_TYPES, OpenGraphCon
2
2
  import { BundleLayerError, TSDOCTOR_MANIFEST_FILENAME, readApiModelInfo, readBundle } from "./Bundle.js";
3
3
  import { BundleDiscoveryError, discoverBundle, discoverBundles, loadBundle, loadBundles } from "./BundleDiscovery.js";
4
4
  import { BundleFetchError, fetchGitHubReleaseBundle, fetchNpmBundle } from "./BundleFetch.js";
5
- import { canonicalJson, fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, normalizeText, sha256Hex } from "./BundleHash.js";
5
+ import { fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, normalizeText } from "./BundleHash.js";
6
6
  import { resolveBundle, resolveBundleFrom } from "./BundleResolver.js";
7
7
  import { PlatformOverrides, decodePlatformOverrides } from "./PlatformOverrides.js";
8
8
 
9
- export { BundleDiscoveryError, BundleFetchError, BundleLayerError, BundleManifest, BundleManifestError, KNOWN_REGISTRY_TYPES, OpenGraphConfig, OpenGraphImage, PlatformOverrides, ProjectIdentity, RegistryRef, SbomRef, TSDOCTOR_MANIFEST_FILENAME, canonicalJson, decodeBundleManifest, decodePlatformOverrides, discoverBundle, discoverBundles, fetchGitHubReleaseBundle, fetchNpmBundle, fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, isKnownRegistryType, loadBundle, loadBundles, normalizeText, readApiModelInfo, readBundle, resolveBundle, resolveBundleFrom, sha256Hex };
9
+ export { BundleDiscoveryError, BundleFetchError, BundleLayerError, BundleManifest, BundleManifestError, KNOWN_REGISTRY_TYPES, OpenGraphConfig, OpenGraphImage, PlatformOverrides, ProjectIdentity, RegistryRef, SbomRef, TSDOCTOR_MANIFEST_FILENAME, decodeBundleManifest, decodePlatformOverrides, discoverBundle, discoverBundles, fetchGitHubReleaseBundle, fetchNpmBundle, fingerprintResolvedBundle, hashJsonValue, hashLayerText, hashText, isKnownRegistryType, loadBundle, loadBundles, normalizeText, readApiModelInfo, readBundle, resolveBundle, resolveBundleFrom };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsdoctor/bundle",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "private": false,
5
5
  "description": "The tsdoctor bundle spec: layered bundle discovery, the versioned tsdoctor.json sidecar manifest, provenance-carrying resolution and canonical input hashing for API documentation bundles.",
6
6
  "keywords": [
@@ -41,10 +41,11 @@
41
41
  "peerDependencies": {
42
42
  "@effected/github": "^0.8.0",
43
43
  "@effected/glob": "^0.4.0",
44
- "@effected/npm": "^0.12.0",
45
- "@effected/package-json": "^0.11.0",
46
- "@effected/store": "^0.4.0",
47
- "@effected/tsconfig-json": "^0.6.0",
44
+ "@effected/jsonc": "^0.8.0",
45
+ "@effected/npm": "^0.12.1",
46
+ "@effected/package-json": "^0.13.0",
47
+ "@effected/store": "^0.5.0",
48
+ "@effected/tsconfig-json": "^0.6.1",
48
49
  "@effected/walker": "^0.5.0",
49
50
  "@effected/xdg": "^0.3.0",
50
51
  "effect": "4.0.0-rc.109"