@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.
- package/BundleDiscovery.js +19 -9
- package/BundleHash.js +39 -47
- package/README.md +8 -5
- package/index.d.ts +35 -31
- package/index.js +2 -2
- package/package.json +6 -5
package/BundleDiscovery.js
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
|
|
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(
|
|
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 {
|
|
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
|
|
19
|
+
return JsoncFingerprint.normalizeEol(text).trimEnd();
|
|
38
20
|
}
|
|
39
21
|
/**
|
|
40
|
-
*
|
|
22
|
+
* Hash text content: {@link normalizeText} then SHA-256 (lowercase hex).
|
|
41
23
|
*
|
|
42
|
-
* @
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
33
|
+
return JsoncFingerprint.hashText(normalizeText(text));
|
|
54
34
|
}
|
|
55
35
|
/**
|
|
56
|
-
* Hash a JSON-shaped value:
|
|
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
|
|
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
|
|
69
|
-
* formatting churn do not read as
|
|
70
|
-
* back to {@link hashText}, so a
|
|
71
|
-
* rather than an error — hashing is
|
|
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
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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 {
|
|
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(
|
|
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`, `
|
|
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
|
|
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
|
-
*
|
|
828
|
+
* Hash text content: {@link normalizeText} then SHA-256 (lowercase hex).
|
|
839
829
|
*
|
|
840
|
-
* @
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
*
|
|
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:
|
|
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
|
|
861
|
-
* formatting churn do not read as
|
|
862
|
-
* back to {@link hashText}, so a
|
|
863
|
-
* rather than an error — hashing is
|
|
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,
|
|
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 {
|
|
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,
|
|
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
|
|
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/
|
|
45
|
-
"@effected/
|
|
46
|
-
"@effected/
|
|
47
|
-
"@effected/
|
|
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"
|