@effected/sbom 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/README.md +189 -0
- package/SbomMetadataSource.js +4 -0
- package/index.d.ts +9 -5
- package/index.js +2 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# @effected/sbom
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@effected/sbom)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org/)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
|
|
8
|
+
Supply-chain artifacts for [Effect](https://effect.website) v4: a CycloneDX 1.6 SBOM, an NTIA minimum-elements report, in-toto statements, SLSA provenance, and Sigstore DSSE signing. `Sbom.generate` and `Sbom.toJson` are total, plain functions — assembling and serializing a document cannot fail, so the package's only error channel belongs to `Sbom.write`, the one member that touches a filesystem. Signing is a separate, deliberately walled-off capability: a consumer that only ever emits an SBOM never reaches `@sigstore/*` or its Fulcio/Rekor network calls.
|
|
9
|
+
|
|
10
|
+
> **Pre-release.** This package is part of the `@effected/*` kit, in pre-`1.0.0`
|
|
11
|
+
> development against a single pinned Effect v4 beta. Packages graduate to
|
|
12
|
+
> `1.0.0` once Effect `4.0.0` ships. To hold your own `effect` versions at
|
|
13
|
+
> exactly the ones the kit is built and tested against, install
|
|
14
|
+
> [`@effected/pnpm-plugin-effect`](https://www.npmjs.com/package/@effected/pnpm-plugin-effect).
|
|
15
|
+
>
|
|
16
|
+
> **Stability: unstable.** This package's API surface is not yet considered
|
|
17
|
+
> complete and may change across `0.x` releases. Pin an exact version — even a
|
|
18
|
+
> package marked *stable* before `1.0.0` can introduce a breaking change by
|
|
19
|
+
> accident, and an exact pin turns that into a type-check error rather than a
|
|
20
|
+
> runtime surprise. Full policy: [release strategy](https://github.com/spencerbeggs/effected#release-strategy).
|
|
21
|
+
|
|
22
|
+
## Why @effected/sbom
|
|
23
|
+
|
|
24
|
+
`@cyclonedx/cyclonedx-library` is 6.6 MB with seven optional peer dependencies for around ten symbols this package actually needs — an object model and a JSON normalizer. The parts that would justify the weight (XML output, ajv validation, SPDX expression parsing) are exactly the parts an emitter never calls, and its `spdx-expression-parse` peer would install a second SPDX engine beside `@effected/spdx`. This package owns its CycloneDX 1.6 model directly instead, conformance-tested against the published schema rather than promised by a dependency.
|
|
25
|
+
|
|
26
|
+
Emitting an SBOM and signing one are different kinds of work — pure computation over a manifest versus network-bound cryptography against Fulcio and Rekor — and the module boundary follows that split exactly. `SbomDocument`, `Sbom`, `SbomMetadataSource`, `NtiaReport`, `InTotoStatement` and `SlsaProvenance` reach nothing but `effect`, `@effected/spdx` and (as a type-only import) `@effected/package-json`. Only `SigstoreSigner.ts` imports `@sigstore/*`, and it is walked by a reachability test rather than left to convention: a namespace object gathering `generate` and `sign` together would make every SBOM consumer reachable to Fulcio's HTTP stack, silently, which is why none exists here.
|
|
27
|
+
|
|
28
|
+
A license is a CycloneDX **expression** field with three legal shapes — `{license:{id}}` for a catalog identifier, a one-element `[{expression}]` tuple for an expression like `MIT OR Apache-2.0`, and `{license:{name}}` for anything else — and choosing between them is `@effected/spdx`'s job (`License.isKnownId`, `isValidExpression`), never a local regex. Emitting every value as an `id` produces a document that looks right and fails validation.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install @effected/sbom effect
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm add @effected/sbom effect
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Requires Node.js >=24.11.0. `effect` v4 is a peer dependency.
|
|
41
|
+
|
|
42
|
+
All `@effected/*` packages are ESM-only: the exports maps publish only `import` conditions, so `require()` — including tools that resolve in CJS mode — fails with Node's `ERR_PACKAGE_PATH_NOT_EXPORTED` rather than loading a CJS build that does not exist. Import from an ES module.
|
|
43
|
+
|
|
44
|
+
## Quick start
|
|
45
|
+
|
|
46
|
+
Generating an SBOM needs no layer, no service and no network call:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { Package, Sbom, SbomMetadataSource } from "@effected/sbom";
|
|
50
|
+
|
|
51
|
+
declare const pkg: Package;
|
|
52
|
+
|
|
53
|
+
const root = SbomMetadataSource.rootComponent(pkg);
|
|
54
|
+
const metadata = SbomMetadataSource.fromPackage(pkg, { timestamp: new Date().toISOString() });
|
|
55
|
+
const components = [
|
|
56
|
+
SbomMetadataSource.componentFor({ name: "effect", version: "4.0.0-beta.101", license: "MIT" }),
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
const document = Sbom.generate({ root, components, metadata });
|
|
60
|
+
console.log(Sbom.toJson(document));
|
|
61
|
+
// canonical CycloneDX 1.6 JSON — component names sorted, so two runs over
|
|
62
|
+
// the same inputs produce identical bytes
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Components are sorted by name so the document's digest — which becomes an attestation subject — does not change between runs over the same inputs for no reason.
|
|
66
|
+
|
|
67
|
+
`Package`, `Person` and `Repository` come from `@effected/package-json` and are re-exported here, so naming the type `fromPackage` takes does not mean declaring a dependency you would not otherwise have. Inside `src/` the manifest types stay a type-only import; the entry point is the one place they cross as values.
|
|
68
|
+
|
|
69
|
+
## NTIA compliance
|
|
70
|
+
|
|
71
|
+
`NtiaReport.of` is total: it answers for every document, including one that satisfies nothing.
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import { NtiaReport, SbomDocument } from "@effected/sbom";
|
|
75
|
+
import { Effect } from "effect";
|
|
76
|
+
|
|
77
|
+
declare const document: SbomDocument;
|
|
78
|
+
|
|
79
|
+
const program = Effect.gen(function* () {
|
|
80
|
+
const report = NtiaReport.of(document);
|
|
81
|
+
if (!report.compliant) {
|
|
82
|
+
yield* Effect.logWarning(`SBOM missing: ${report.missing.join(", ")}`);
|
|
83
|
+
}
|
|
84
|
+
return report;
|
|
85
|
+
});
|
|
86
|
+
// report.missing: readonly NtiaElementId[] — e.g. ["sbomAuthor", "timestamp"]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Provenance and attestation
|
|
90
|
+
|
|
91
|
+
`InTotoStatement` and `SlsaProvenance` build the predicate an attestation wraps around an SBOM or a build. Both are pure projections of their input — nothing is read from the environment, and nothing can fail:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import { InTotoStatement, Sha256Digest, SbomMetadataSource, SlsaProvenance } from "@effected/sbom";
|
|
95
|
+
import { Effect } from "effect";
|
|
96
|
+
|
|
97
|
+
const program = Effect.gen(function* () {
|
|
98
|
+
const digest = yield* Sha256Digest.parse("a".repeat(64));
|
|
99
|
+
const provenance = SlsaProvenance.forGitHubWorkflow({
|
|
100
|
+
serverUrl: "https://github.com",
|
|
101
|
+
repository: "acme/widget",
|
|
102
|
+
ref: "refs/heads/main",
|
|
103
|
+
sha: "abc123",
|
|
104
|
+
eventName: "push",
|
|
105
|
+
workflowRef: "acme/widget/.github/workflows/release.yml@refs/heads/main",
|
|
106
|
+
jobWorkflowRef: "acme/widget/.github/workflows/release.yml@refs/heads/main",
|
|
107
|
+
repositoryId: "1",
|
|
108
|
+
repositoryOwnerId: "1",
|
|
109
|
+
runnerEnvironment: "github-hosted",
|
|
110
|
+
runId: "1",
|
|
111
|
+
runAttempt: "1",
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
return InTotoStatement.forSubject({
|
|
115
|
+
name: SbomMetadataSource.npmPurl("@acme/widget", "1.0.0"),
|
|
116
|
+
digest,
|
|
117
|
+
predicateType: SlsaProvenance.predicateType,
|
|
118
|
+
predicate: provenance,
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Signing
|
|
124
|
+
|
|
125
|
+
`SigstoreSigner` fetches an identity token, exchanges it with Fulcio for a certificate, signs the statement, and (unless `witnesses: []`) logs it to Rekor — all behind one method, `sign`, over `IdentityToken`:
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
import { IdentityToken, InTotoStatement, SigstoreSigner } from "@effected/sbom";
|
|
129
|
+
import { Effect, Layer } from "effect";
|
|
130
|
+
|
|
131
|
+
declare const oidcToken: string;
|
|
132
|
+
declare const statement: InTotoStatement;
|
|
133
|
+
|
|
134
|
+
const program = Effect.gen(function* () {
|
|
135
|
+
const signer = yield* SigstoreSigner;
|
|
136
|
+
return yield* signer.sign(statement);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const SignerLayer = SigstoreSigner.layer.pipe(Layer.provide(IdentityToken.layerStatic(oidcToken)));
|
|
140
|
+
|
|
141
|
+
Effect.runPromise(program.pipe(Effect.provide(SignerLayer))).then(console.log);
|
|
142
|
+
// SigstoreBundle: { mediaType, verificationMaterial, dsseEnvelope }
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`IdentityToken` is a narrow, one-method contract deliberately smaller than any real issuer's surface, so several things can satisfy it. On a GitHub runner that is `ActionsIdentityToken.layer`, which `@effected/github-actions` ships over its own `OidcTokenIssuer` — the dependency points that way so signing never drags the Actions runtime into a consumer that only emits an SBOM. A CI system that mints its own token works the same way through `IdentityToken.layerStatic`.
|
|
146
|
+
|
|
147
|
+
## Errors
|
|
148
|
+
|
|
149
|
+
`SigningError.kind` names which step failed — `identity` (a workflow permissions problem), `certificate` (Fulcio), `transparencyLog` (Rekor), or `bundle` (assembly) — with the original failure preserved structurally on `cause` rather than flattened into a message:
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import { SigningError } from "@effected/sbom";
|
|
153
|
+
import { Effect } from "effect";
|
|
154
|
+
|
|
155
|
+
declare const sign: Effect.Effect<unknown, SigningError>;
|
|
156
|
+
|
|
157
|
+
const program = sign.pipe(Effect.catchTag("SigningError", (error) => Effect.logError(`${error.kind}: ${error.message}`)));
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`Sbom.write` is the package's only other error channel (`SbomWriteError`), because assembling and serializing a document cannot fail — there is nothing in `generate` or `toJson` that reaches an error path.
|
|
161
|
+
|
|
162
|
+
## Testing
|
|
163
|
+
|
|
164
|
+
`SigstoreSigner.makeTest().sign` **dies** rather than fabricating a bundle: a signature-shaped lie is exactly the failure an attestation exists to prevent. A test that needs a real bundle without a network drives the real `DSSEBundleBuilder` through `SigstoreSigner.layerWith({ signer, witnesses })`. `IdentityToken.makeTest`, by contrast, **answers** — a fabricated OIDC token is a real answer to "give me a token":
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import { IdentityToken } from "@effected/sbom";
|
|
168
|
+
import { Effect } from "effect";
|
|
169
|
+
|
|
170
|
+
const TestToken = IdentityToken.layerTest({
|
|
171
|
+
token: () => Effect.succeed("test-token"),
|
|
172
|
+
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Features
|
|
176
|
+
|
|
177
|
+
- `Sbom` — `generate` (total), `toJson` (total, canonical CycloneDX 1.6), and `write` (the package's one fallible member, over core `FileSystem`).
|
|
178
|
+
- `SbomDocument` — the owned CycloneDX 1.6 model: `Component`, `ComponentType`, `ExternalReference`, `Contact`, `Supplier`, `SbomMetadata`.
|
|
179
|
+
- `SbomMetadataSource` — manifest-derived metadata: `npmPurl`, `componentFor`, `rootComponent`, `externalReferences`, `fromPackage`, `formatCopyright`, `merge`.
|
|
180
|
+
- `NtiaReport` — the seven NTIA minimum elements as a total report (`compliant`, `missing`).
|
|
181
|
+
- `InTotoStatement` — `of` / `forSubject`, over `InTotoSubject` and a validated `Sha256Digest`.
|
|
182
|
+
- `SlsaProvenance` — `forGitHubWorkflow`, a total projection to a SLSA Provenance v1 predicate.
|
|
183
|
+
- `SigstoreSigner` — DSSE signing against Fulcio and Rekor, `layerWith` for a supplied signer/witnesses/endpoints, and a die-on-unstubbed test double.
|
|
184
|
+
- `IdentityToken` — the narrow, one-method OIDC contract `SigstoreSigner` runs on; `layerStatic` for a token you already hold.
|
|
185
|
+
- `SigstoreBundle` — the bundle value and media-type constants, importing nothing from `@sigstore/*`.
|
|
186
|
+
|
|
187
|
+
## License
|
|
188
|
+
|
|
189
|
+
[MIT](LICENSE)
|
package/SbomMetadataSource.js
CHANGED
|
@@ -174,6 +174,10 @@ var SbomMetadataSource = class {
|
|
|
174
174
|
* maintainers fill them — the one derivation that crosses from manifest
|
|
175
175
|
* vocabulary into supplier vocabulary, and only where the caller left a
|
|
176
176
|
* hole.
|
|
177
|
+
*
|
|
178
|
+
* `pkg` is a `@effected/package-json` `Package`, re-exported from
|
|
179
|
+
* this package's entry point so a caller can name the parameter type
|
|
180
|
+
* without adding `@effected/package-json` as an undeclared dependency.
|
|
177
181
|
*/
|
|
178
182
|
static fromPackage = fromPackage;
|
|
179
183
|
/**
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Package, Package as Package$1, Person, Repository } from "@effected/package-json";
|
|
1
2
|
import { Brand, Context, Effect, FileSystem, Layer, Redacted, Result, Schema } from "effect";
|
|
2
|
-
import { Package } from "@effected/package-json";
|
|
3
3
|
import { Signer, Witness } from "@sigstore/sign";
|
|
4
4
|
//#region src/IdentityToken.d.ts
|
|
5
5
|
declare const IdentityTokenError_base: Schema.Class<IdentityTokenError, Schema.TaggedStruct<"IdentityTokenError", {
|
|
@@ -656,7 +656,7 @@ declare class SbomMetadataSource {
|
|
|
656
656
|
* `publisher` resolves explicit → supplier name → the manifest's author,
|
|
657
657
|
* which is what lets NTIA element 6 be satisfied from a manifest alone.
|
|
658
658
|
*/
|
|
659
|
-
static readonly rootComponent: (pkg: Package, options?: SbomMetadataOptions) => Component;
|
|
659
|
+
static readonly rootComponent: (pkg: Package$1, options?: SbomMetadataOptions) => Component;
|
|
660
660
|
/**
|
|
661
661
|
* The manifest's outward links, as CycloneDX external references.
|
|
662
662
|
*
|
|
@@ -670,7 +670,7 @@ declare class SbomMetadataSource {
|
|
|
670
670
|
* `externalReference.url` is a URL, and emitting `owner/name` there is a
|
|
671
671
|
* document that validates and misleads.
|
|
672
672
|
*/
|
|
673
|
-
static readonly externalReferences: (pkg: Package, options?: SbomMetadataOptions) => ReadonlyArray<ExternalReference>;
|
|
673
|
+
static readonly externalReferences: (pkg: Package$1, options?: SbomMetadataOptions) => ReadonlyArray<ExternalReference>;
|
|
674
674
|
/**
|
|
675
675
|
* Document-level metadata for a manifest.
|
|
676
676
|
*
|
|
@@ -684,8 +684,12 @@ declare class SbomMetadataSource {
|
|
|
684
684
|
* maintainers fill them — the one derivation that crosses from manifest
|
|
685
685
|
* vocabulary into supplier vocabulary, and only where the caller left a
|
|
686
686
|
* hole.
|
|
687
|
+
*
|
|
688
|
+
* `pkg` is a `@effected/package-json` `Package`, re-exported from
|
|
689
|
+
* this package's entry point so a caller can name the parameter type
|
|
690
|
+
* without adding `@effected/package-json` as an undeclared dependency.
|
|
687
691
|
*/
|
|
688
|
-
static readonly fromPackage: (pkg: Package, options?: SbomMetadataOptions) => SbomMetadata;
|
|
692
|
+
static readonly fromPackage: (pkg: Package$1, options?: SbomMetadataOptions) => SbomMetadata;
|
|
689
693
|
/**
|
|
690
694
|
* A copyright statement for a holder and a year, or a span of years.
|
|
691
695
|
*
|
|
@@ -1030,5 +1034,5 @@ declare class SlsaProvenance extends SlsaProvenance_base {
|
|
|
1030
1034
|
static forGitHubWorkflow(input: GitHubWorkflowProvenance): SlsaProvenance;
|
|
1031
1035
|
}
|
|
1032
1036
|
//#endregion
|
|
1033
|
-
export { CYCLONEDX_BOM_PREDICATE, Component, type ComponentInput, ComponentType, Contact, type CopyrightYears, ExternalReference, ExternalReferenceType, GITHUB_BUILD_TYPE, type GitHubWorkflowProvenance, IN_TOTO_PAYLOAD_TYPE, IN_TOTO_STATEMENT_V1, IdentityToken, IdentityTokenError, type IdentityTokenShape, InTotoStatement, type InTotoStatementInput, InTotoSubject, type InTotoSubjectInput, InvalidSha256DigestError, NtiaElement, NtiaElementId, NtiaReport, type PredicateType, SIGSTORE_BUNDLE_V0_3_MEDIA_TYPE, SIGSTORE_OIDC_AUDIENCE, SLSA_PROVENANCE_V1, Sbom, SbomDocument, type SbomInput, type SbomJsonOptions, SbomMetadata, type SbomMetadataOptions, SbomMetadataSource, SbomWriteError, Sha256Digest, SigningError, SigningErrorKind, SigstoreBundle, SigstoreSigner, type SigstoreSignerOptions, type SigstoreSignerShape, SlsaBuildDefinition, SlsaProvenance, SlsaRunDetails, Supplier };
|
|
1037
|
+
export { CYCLONEDX_BOM_PREDICATE, Component, type ComponentInput, ComponentType, Contact, type CopyrightYears, ExternalReference, ExternalReferenceType, GITHUB_BUILD_TYPE, type GitHubWorkflowProvenance, IN_TOTO_PAYLOAD_TYPE, IN_TOTO_STATEMENT_V1, IdentityToken, IdentityTokenError, type IdentityTokenShape, InTotoStatement, type InTotoStatementInput, InTotoSubject, type InTotoSubjectInput, InvalidSha256DigestError, NtiaElement, NtiaElementId, NtiaReport, Package, Person, type PredicateType, Repository, SIGSTORE_BUNDLE_V0_3_MEDIA_TYPE, SIGSTORE_OIDC_AUDIENCE, SLSA_PROVENANCE_V1, Sbom, SbomDocument, type SbomInput, type SbomJsonOptions, SbomMetadata, type SbomMetadataOptions, SbomMetadataSource, SbomWriteError, Sha256Digest, SigningError, SigningErrorKind, SigstoreBundle, SigstoreSigner, type SigstoreSignerOptions, type SigstoreSignerShape, SlsaBuildDefinition, SlsaProvenance, SlsaRunDetails, Supplier };
|
|
1034
1038
|
//# sourceMappingURL=index.d.ts.map
|
package/index.js
CHANGED
|
@@ -7,5 +7,6 @@ import { SbomMetadataSource } from "./SbomMetadataSource.js";
|
|
|
7
7
|
import { IN_TOTO_PAYLOAD_TYPE, SIGSTORE_BUNDLE_V0_3_MEDIA_TYPE, SigstoreBundle } from "./SigstoreBundle.js";
|
|
8
8
|
import { SIGSTORE_OIDC_AUDIENCE, SigningError, SigningErrorKind, SigstoreSigner } from "./SigstoreSigner.js";
|
|
9
9
|
import { GITHUB_BUILD_TYPE, SLSA_PROVENANCE_V1, SlsaBuildDefinition, SlsaProvenance, SlsaRunDetails } from "./SlsaProvenance.js";
|
|
10
|
+
import { Package, Person, Repository } from "@effected/package-json";
|
|
10
11
|
|
|
11
|
-
export { CYCLONEDX_BOM_PREDICATE, Component, ComponentType, Contact, ExternalReference, ExternalReferenceType, GITHUB_BUILD_TYPE, IN_TOTO_PAYLOAD_TYPE, IN_TOTO_STATEMENT_V1, IdentityToken, IdentityTokenError, InTotoStatement, InTotoSubject, InvalidSha256DigestError, NtiaElement, NtiaElementId, NtiaReport, SIGSTORE_BUNDLE_V0_3_MEDIA_TYPE, SIGSTORE_OIDC_AUDIENCE, SLSA_PROVENANCE_V1, Sbom, SbomDocument, SbomMetadata, SbomMetadataSource, SbomWriteError, Sha256Digest, SigningError, SigningErrorKind, SigstoreBundle, SigstoreSigner, SlsaBuildDefinition, SlsaProvenance, SlsaRunDetails, Supplier };
|
|
12
|
+
export { CYCLONEDX_BOM_PREDICATE, Component, ComponentType, Contact, ExternalReference, ExternalReferenceType, GITHUB_BUILD_TYPE, IN_TOTO_PAYLOAD_TYPE, IN_TOTO_STATEMENT_V1, IdentityToken, IdentityTokenError, InTotoStatement, InTotoSubject, InvalidSha256DigestError, NtiaElement, NtiaElementId, NtiaReport, Package, Person, Repository, SIGSTORE_BUNDLE_V0_3_MEDIA_TYPE, SIGSTORE_OIDC_AUDIENCE, SLSA_PROVENANCE_V1, Sbom, SbomDocument, SbomMetadata, SbomMetadataSource, SbomWriteError, Sha256Digest, SigningError, SigningErrorKind, SigstoreBundle, SigstoreSigner, SlsaBuildDefinition, SlsaProvenance, SlsaRunDetails, Supplier };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effected/sbom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "CycloneDX 1.6 SBOM construction, SLSA provenance, NTIA validation and Sigstore signing as typed services.",
|
|
6
6
|
"keywords": [
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"./package.json": "./package.json"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@effected/package-json": "~0.6.
|
|
42
|
+
"@effected/package-json": "~0.6.1",
|
|
43
43
|
"@effected/spdx": "~0.1.1",
|
|
44
44
|
"@sigstore/bundle": "^5.0.0",
|
|
45
45
|
"@sigstore/sign": "^5.0.0"
|