@socketsecurity/lib 3.0.2 → 3.0.3
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/CHANGELOG.md +13 -0
- package/dist/abort.js +60 -1
- package/dist/abort.js.map +2 -2
- package/dist/agent.js +289 -1
- package/dist/agent.js.map +2 -2
- package/dist/ansi.js +60 -1
- package/dist/ansi.js.map +2 -2
- package/dist/argv/flags.js +282 -1
- package/dist/argv/flags.js.map +2 -2
- package/dist/argv/parse.js +171 -1
- package/dist/argv/parse.js.map +2 -2
- package/dist/arrays.js +85 -1
- package/dist/arrays.js.map +2 -2
- package/dist/bin.js +419 -5
- package/dist/bin.js.map +2 -2
- package/dist/cacache.js +139 -1
- package/dist/cacache.js.map +2 -2
- package/dist/cache-with-ttl.js +223 -1
- package/dist/cache-with-ttl.js.map +2 -2
- package/dist/constants/agents.js +126 -1
- package/dist/constants/agents.js.map +2 -2
- package/dist/constants/core.js +57 -2
- package/dist/constants/core.js.map +2 -2
- package/dist/constants/encoding.js +48 -1
- package/dist/constants/encoding.js.map +2 -2
- package/dist/constants/github.js +30 -1
- package/dist/constants/github.js.map +2 -2
- package/dist/constants/licenses.js +66 -1
- package/dist/constants/licenses.js.map +2 -2
- package/dist/constants/node.js +185 -1
- package/dist/constants/node.js.map +2 -2
- package/dist/constants/packages.js +128 -1
- package/dist/constants/packages.js.map +2 -2
- package/dist/constants/paths.js +150 -1
- package/dist/constants/paths.js.map +2 -2
- package/dist/constants/platform.js +41 -1
- package/dist/constants/platform.js.map +2 -2
- package/dist/constants/process.js +52 -1
- package/dist/constants/process.js.map +2 -2
- package/dist/constants/socket.js +102 -1
- package/dist/constants/socket.js.map +2 -2
- package/dist/constants/testing.js +36 -1
- package/dist/constants/testing.js.map +2 -2
- package/dist/constants/time.js +39 -1
- package/dist/constants/time.js.map +2 -2
- package/dist/constants/typescript.js +54 -1
- package/dist/constants/typescript.js.map +2 -2
- package/dist/cover/code.js +135 -1
- package/dist/cover/code.js.map +2 -2
- package/dist/cover/formatters.js +101 -11
- package/dist/cover/formatters.js.map +2 -2
- package/dist/cover/type.js +63 -1
- package/dist/cover/type.js.map +2 -2
- package/dist/cover/types.js +15 -1
- package/dist/cover/types.js.map +2 -2
- package/dist/debug.js +337 -2
- package/dist/debug.js.map +2 -2
- package/dist/dlx-binary.js +408 -7
- package/dist/dlx-binary.js.map +2 -2
- package/dist/dlx-package.js +278 -7
- package/dist/dlx-package.js.map +2 -2
- package/dist/dlx.js +214 -7
- package/dist/dlx.js.map +2 -2
- package/dist/effects/pulse-frames.js +64 -1
- package/dist/effects/pulse-frames.js.map +2 -2
- package/dist/effects/text-shimmer.js +174 -1
- package/dist/effects/text-shimmer.js.map +2 -2
- package/dist/effects/types.js +15 -1
- package/dist/effects/types.js.map +2 -2
- package/dist/effects/ultra.js +61 -1
- package/dist/effects/ultra.js.map +2 -2
- package/dist/env/ci.js +31 -1
- package/dist/env/ci.js.map +2 -2
- package/dist/env/debug.js +30 -1
- package/dist/env/debug.js.map +2 -2
- package/dist/env/github.js +65 -1
- package/dist/env/github.js.map +2 -2
- package/dist/env/helpers.js +47 -1
- package/dist/env/helpers.js.map +2 -2
- package/dist/env/home.js +30 -1
- package/dist/env/home.js.map +2 -2
- package/dist/env/locale.js +40 -1
- package/dist/env/locale.js.map +2 -2
- package/dist/env/node-auth-token.js +30 -1
- package/dist/env/node-auth-token.js.map +2 -2
- package/dist/env/node-env.js +30 -1
- package/dist/env/node-env.js.map +2 -2
- package/dist/env/npm.js +50 -1
- package/dist/env/npm.js.map +2 -2
- package/dist/env/package-manager.js +73 -1
- package/dist/env/package-manager.js.map +2 -2
- package/dist/env/path.js +30 -1
- package/dist/env/path.js.map +2 -2
- package/dist/env/pre-commit.js +31 -1
- package/dist/env/pre-commit.js.map +2 -2
- package/dist/env/rewire.js +72 -1
- package/dist/env/rewire.js.map +2 -2
- package/dist/env/shell.js +30 -1
- package/dist/env/shell.js.map +2 -2
- package/dist/env/socket-cli-shadow.js +51 -1
- package/dist/env/socket-cli-shadow.js.map +2 -2
- package/dist/env/socket-cli.js +86 -1
- package/dist/env/socket-cli.js.map +2 -2
- package/dist/env/socket.js +101 -1
- package/dist/env/socket.js.map +2 -2
- package/dist/env/temp-dir.js +40 -1
- package/dist/env/temp-dir.js.map +2 -2
- package/dist/env/term.js +30 -1
- package/dist/env/term.js.map +2 -2
- package/dist/env/test.js +43 -1
- package/dist/env/test.js.map +2 -2
- package/dist/env/windows.js +45 -1
- package/dist/env/windows.js.map +2 -2
- package/dist/env/xdg.js +40 -1
- package/dist/env/xdg.js.map +2 -2
- package/dist/env.js +170 -1
- package/dist/env.js.map +2 -2
- package/dist/fs.js +670 -7
- package/dist/fs.js.map +2 -2
- package/dist/functions.js +68 -1
- package/dist/functions.js.map +2 -2
- package/dist/git.js +329 -2
- package/dist/git.js.map +2 -2
- package/dist/github.js +202 -1
- package/dist/github.js.map +2 -2
- package/dist/globs.js +149 -1
- package/dist/globs.js.map +2 -2
- package/dist/http-request.js +335 -3
- package/dist/http-request.js.map +2 -2
- package/dist/index.js +69 -1
- package/dist/index.js.map +2 -2
- package/dist/ipc.js +244 -1
- package/dist/ipc.js.map +2 -2
- package/dist/json.js +73 -1
- package/dist/json.js.map +2 -2
- package/dist/links/index.js +60 -1
- package/dist/links/index.js.map +2 -2
- package/dist/logger.js +1383 -6
- package/dist/logger.js.map +2 -2
- package/dist/maintained-node-versions.js +35 -1
- package/dist/maintained-node-versions.js.map +2 -2
- package/dist/memoization.js +210 -1
- package/dist/memoization.js.map +2 -2
- package/dist/objects.js +311 -1
- package/dist/objects.js.map +2 -2
- package/dist/packages/editable.js +356 -9
- package/dist/packages/editable.js.map +2 -2
- package/dist/packages/exports.js +162 -1
- package/dist/packages/exports.js.map +2 -2
- package/dist/packages/isolation.js +187 -1
- package/dist/packages/isolation.js.map +2 -2
- package/dist/packages/licenses.js +214 -1
- package/dist/packages/licenses.js.map +2 -2
- package/dist/packages/manifest.js +190 -1
- package/dist/packages/manifest.js.map +2 -2
- package/dist/packages/normalize.js +132 -1
- package/dist/packages/normalize.js.map +2 -2
- package/dist/packages/operations.js +320 -1
- package/dist/packages/operations.js.map +2 -2
- package/dist/packages/paths.js +53 -1
- package/dist/packages/paths.js.map +2 -2
- package/dist/packages/provenance.js +178 -1
- package/dist/packages/provenance.js.map +2 -2
- package/dist/packages/specs.js +83 -1
- package/dist/packages/specs.js.map +2 -2
- package/dist/packages/validation.js +51 -1
- package/dist/packages/validation.js.map +2 -2
- package/dist/packages.js +129 -1
- package/dist/packages.js.map +2 -2
- package/dist/path.js +446 -1
- package/dist/path.js.map +2 -2
- package/dist/paths/rewire.js +79 -1
- package/dist/paths/rewire.js.map +2 -2
- package/dist/paths.js +190 -1
- package/dist/paths.js.map +2 -2
- package/dist/performance.js +216 -15
- package/dist/performance.js.map +2 -2
- package/dist/process-lock.js +287 -8
- package/dist/process-lock.js.map +2 -2
- package/dist/promise-queue.js +109 -1
- package/dist/promise-queue.js.map +2 -2
- package/dist/promises.js +267 -1
- package/dist/promises.js.map +2 -2
- package/dist/prompts/index.js +45 -1
- package/dist/prompts/index.js.map +2 -2
- package/dist/prompts.js +58 -1
- package/dist/prompts.js.map +2 -2
- package/dist/regexps.js +30 -1
- package/dist/regexps.js.map +2 -2
- package/dist/sea.js +44 -1
- package/dist/sea.js.map +2 -2
- package/dist/shadow.js +58 -1
- package/dist/shadow.js.map +2 -2
- package/dist/signal-exit.js +248 -1
- package/dist/signal-exit.js.map +2 -2
- package/dist/sorts.js +94 -1
- package/dist/sorts.js.map +2 -2
- package/dist/spawn.js +200 -1
- package/dist/spawn.js.map +2 -2
- package/dist/spinner.js +961 -1
- package/dist/spinner.js.map +2 -2
- package/dist/ssri.js +71 -1
- package/dist/ssri.js.map +2 -2
- package/dist/stdio/clear.js +82 -1
- package/dist/stdio/clear.js.map +2 -2
- package/dist/stdio/divider.js +89 -3
- package/dist/stdio/divider.js.map +2 -2
- package/dist/stdio/footer.js +94 -2
- package/dist/stdio/footer.js.map +2 -2
- package/dist/stdio/header.js +100 -2
- package/dist/stdio/header.js.map +2 -2
- package/dist/stdio/mask.js +207 -5
- package/dist/stdio/mask.js.map +2 -2
- package/dist/stdio/progress.js +209 -2
- package/dist/stdio/progress.js.map +2 -2
- package/dist/stdio/prompts.js +88 -1
- package/dist/stdio/prompts.js.map +2 -2
- package/dist/stdio/stderr.js +89 -2
- package/dist/stdio/stderr.js.map +2 -2
- package/dist/stdio/stdout.js +103 -2
- package/dist/stdio/stdout.js.map +2 -2
- package/dist/streams.js +78 -1
- package/dist/streams.js.map +2 -2
- package/dist/strings.js +251 -3
- package/dist/strings.js.map +2 -2
- package/dist/suppress-warnings.js +98 -1
- package/dist/suppress-warnings.js.map +2 -2
- package/dist/tables.js +128 -3
- package/dist/tables.js.map +2 -2
- package/dist/temporary-executor.js +53 -1
- package/dist/temporary-executor.js.map +2 -2
- package/dist/themes/context.js +71 -1
- package/dist/themes/context.js.map +2 -2
- package/dist/themes/index.js +57 -1
- package/dist/themes/index.js.map +2 -2
- package/dist/themes/themes.js +195 -1
- package/dist/themes/themes.js.map +2 -2
- package/dist/themes/types.js +15 -1
- package/dist/themes/types.js.map +2 -2
- package/dist/themes/utils.js +116 -1
- package/dist/themes/utils.js.map +2 -2
- package/dist/types.js +59 -1
- package/dist/types.js.map +2 -2
- package/dist/url.js +142 -1
- package/dist/url.js.map +2 -2
- package/dist/utils/get-ipc.js +58 -1
- package/dist/utils/get-ipc.js.map +2 -2
- package/dist/validation/json-parser.js +127 -1
- package/dist/validation/json-parser.js.map +2 -2
- package/dist/validation/types.js +15 -1
- package/dist/validation/types.js.map +2 -2
- package/dist/versions.js +154 -1
- package/dist/versions.js.map +2 -2
- package/dist/words.js +50 -1
- package/dist/words.js.map +2 -2
- package/dist/zod.js +27 -1
- package/dist/zod.js.map +2 -2
- package/package.json +1 -1
|
@@ -1,3 +1,180 @@
|
|
|
1
1
|
/* Socket Lib - Built with esbuild */
|
|
2
|
-
var
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var provenance_exports = {};
|
|
20
|
+
__export(provenance_exports, {
|
|
21
|
+
fetchPackageProvenance: () => fetchPackageProvenance,
|
|
22
|
+
getProvenanceDetails: () => getProvenanceDetails
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(provenance_exports);
|
|
25
|
+
var import_agents = require("#constants/agents");
|
|
26
|
+
var import_abort = require("../abort");
|
|
27
|
+
var import_url = require("../url");
|
|
28
|
+
const ArrayIsArray = Array.isArray;
|
|
29
|
+
const SLSA_PROVENANCE_V0_2 = "https://slsa.dev/provenance/v0.2";
|
|
30
|
+
const SLSA_PROVENANCE_V1_0 = "https://slsa.dev/provenance/v1";
|
|
31
|
+
let _fetcher;
|
|
32
|
+
// @__NO_SIDE_EFFECTS__
|
|
33
|
+
function getFetcher() {
|
|
34
|
+
if (_fetcher === void 0) {
|
|
35
|
+
const makeFetchHappen = require("../external/make-fetch-happen");
|
|
36
|
+
const { getPacoteCachePath } = require("../constants/packages");
|
|
37
|
+
_fetcher = makeFetchHappen.defaults({
|
|
38
|
+
cachePath: getPacoteCachePath(),
|
|
39
|
+
// Prefer-offline: Staleness checks for cached data will be bypassed, but
|
|
40
|
+
// missing data will be requested from the server.
|
|
41
|
+
// https://github.com/npm/make-fetch-happen?tab=readme-ov-file#--optscache
|
|
42
|
+
cache: "force-cache"
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return _fetcher;
|
|
46
|
+
}
|
|
47
|
+
function getAttestations(attestationData) {
|
|
48
|
+
const data = attestationData;
|
|
49
|
+
if (!data.attestations || !ArrayIsArray(data.attestations)) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
return data.attestations.filter((attestation) => {
|
|
53
|
+
const att = attestation;
|
|
54
|
+
return att.predicateType === SLSA_PROVENANCE_V0_2 || att.predicateType === SLSA_PROVENANCE_V1_0;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function findProvenance(attestations) {
|
|
58
|
+
for (const attestation of attestations) {
|
|
59
|
+
const att = attestation;
|
|
60
|
+
try {
|
|
61
|
+
let predicate = att.predicate;
|
|
62
|
+
if (!predicate && att.bundle?.dsseEnvelope?.payload) {
|
|
63
|
+
try {
|
|
64
|
+
const decodedPayload = Buffer.from(
|
|
65
|
+
att.bundle.dsseEnvelope.payload,
|
|
66
|
+
"base64"
|
|
67
|
+
).toString("utf8");
|
|
68
|
+
const statement = JSON.parse(decodedPayload);
|
|
69
|
+
predicate = statement.predicate;
|
|
70
|
+
} catch {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const predicateData = predicate;
|
|
75
|
+
if (predicateData?.buildDefinition?.externalParameters) {
|
|
76
|
+
return {
|
|
77
|
+
predicate,
|
|
78
|
+
externalParameters: predicateData.buildDefinition.externalParameters
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return void 0;
|
|
85
|
+
}
|
|
86
|
+
function isTrustedPublisher(value) {
|
|
87
|
+
if (typeof value !== "string" || !value) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
let url = (0, import_url.parseUrl)(value);
|
|
91
|
+
let hostname = url?.hostname;
|
|
92
|
+
if (!url && value.includes("@")) {
|
|
93
|
+
const firstPart = value.split("@")[0];
|
|
94
|
+
if (firstPart) {
|
|
95
|
+
url = (0, import_url.parseUrl)(firstPart);
|
|
96
|
+
}
|
|
97
|
+
if (url) {
|
|
98
|
+
hostname = url.hostname;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!url) {
|
|
102
|
+
const httpsUrl = (0, import_url.parseUrl)(`https://${value}`);
|
|
103
|
+
if (httpsUrl) {
|
|
104
|
+
hostname = httpsUrl.hostname;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (hostname) {
|
|
108
|
+
return hostname === "github.com" || hostname.endsWith(".github.com") || hostname === "gitlab.com" || hostname.endsWith(".gitlab.com");
|
|
109
|
+
}
|
|
110
|
+
return value.includes("github") || value.includes("gitlab");
|
|
111
|
+
}
|
|
112
|
+
function getProvenanceDetails(attestationData) {
|
|
113
|
+
const attestations = getAttestations(attestationData);
|
|
114
|
+
if (!attestations.length) {
|
|
115
|
+
return void 0;
|
|
116
|
+
}
|
|
117
|
+
const provenance = findProvenance(attestations);
|
|
118
|
+
if (!provenance) {
|
|
119
|
+
return { level: "attested" };
|
|
120
|
+
}
|
|
121
|
+
const provenanceData = provenance;
|
|
122
|
+
const { externalParameters, predicate } = provenanceData;
|
|
123
|
+
const def = predicate?.buildDefinition;
|
|
124
|
+
const workflow = externalParameters?.workflow;
|
|
125
|
+
const workflowRef = workflow?.ref || externalParameters?.workflow_ref;
|
|
126
|
+
const workflowUrl = externalParameters?.context;
|
|
127
|
+
const workflowPlatform = def?.buildType;
|
|
128
|
+
const repository = workflow?.repository || externalParameters?.repository;
|
|
129
|
+
const gitRef = externalParameters?.ref || workflow?.ref;
|
|
130
|
+
const commitSha = externalParameters?.sha;
|
|
131
|
+
const workflowRunId = externalParameters?.run_id;
|
|
132
|
+
const trusted = isTrustedPublisher(workflowRef) || isTrustedPublisher(workflowUrl) || isTrustedPublisher(workflowPlatform) || isTrustedPublisher(repository);
|
|
133
|
+
return {
|
|
134
|
+
commitSha,
|
|
135
|
+
gitRef,
|
|
136
|
+
level: trusted ? "trusted" : "attested",
|
|
137
|
+
repository,
|
|
138
|
+
workflowRef,
|
|
139
|
+
workflowUrl,
|
|
140
|
+
workflowPlatform,
|
|
141
|
+
workflowRunId
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// @__NO_SIDE_EFFECTS__
|
|
145
|
+
async function fetchPackageProvenance(pkgName, pkgVersion, options) {
|
|
146
|
+
const { signal, timeout = 1e4 } = {
|
|
147
|
+
__proto__: null,
|
|
148
|
+
...options
|
|
149
|
+
};
|
|
150
|
+
if (signal?.aborted) {
|
|
151
|
+
return void 0;
|
|
152
|
+
}
|
|
153
|
+
const timeoutSignal = (0, import_abort.createTimeoutSignal)(timeout);
|
|
154
|
+
const compositeSignal = (0, import_abort.createCompositeAbortSignal)(signal, timeoutSignal);
|
|
155
|
+
const fetcher = /* @__PURE__ */ getFetcher();
|
|
156
|
+
try {
|
|
157
|
+
const response = await fetcher(
|
|
158
|
+
// The npm registry attestations API endpoint.
|
|
159
|
+
`${import_agents.NPM_REGISTRY_URL}/-/npm/v1/attestations/${encodeURIComponent(pkgName)}@${encodeURIComponent(pkgVersion)}`,
|
|
160
|
+
{
|
|
161
|
+
method: "GET",
|
|
162
|
+
signal: compositeSignal,
|
|
163
|
+
headers: {
|
|
164
|
+
"User-Agent": "socket-registry"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
if (response.ok) {
|
|
169
|
+
return getProvenanceDetails(await response.json());
|
|
170
|
+
}
|
|
171
|
+
} catch {
|
|
172
|
+
}
|
|
173
|
+
return void 0;
|
|
174
|
+
}
|
|
175
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
176
|
+
0 && (module.exports = {
|
|
177
|
+
fetchPackageProvenance,
|
|
178
|
+
getProvenanceDetails
|
|
179
|
+
});
|
|
3
180
|
//# sourceMappingURL=provenance.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/provenance.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * @fileoverview Package provenance and attestation verification utilities.\n */\n\nimport { NPM_REGISTRY_URL } from '#constants/agents'\n\nimport { createCompositeAbortSignal, createTimeoutSignal } from '../abort'\nimport type { ProvenanceOptions } from '../packages'\nimport { parseUrl } from '../url'\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ArrayIsArray = Array.isArray\n\nconst SLSA_PROVENANCE_V0_2 = 'https://slsa.dev/provenance/v0.2'\nconst SLSA_PROVENANCE_V1_0 = 'https://slsa.dev/provenance/v1'\n\nlet _fetcher: typeof import('make-fetch-happen') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getFetcher() {\n if (_fetcher === undefined) {\n const makeFetchHappen =\n /*@__PURE__*/ require('../external/make-fetch-happen')\n // Lazy load constants to avoid circular dependencies.\n const { getPacoteCachePath } =\n /*@__PURE__*/ require('../constants/packages')\n _fetcher = makeFetchHappen.defaults({\n cachePath: getPacoteCachePath(),\n // Prefer-offline: Staleness checks for cached data will be bypassed, but\n // missing data will be requested from the server.\n // https://github.com/npm/make-fetch-happen?tab=readme-ov-file#--optscache\n cache: 'force-cache',\n })\n }\n return _fetcher as typeof import('make-fetch-happen')\n}\n\n/**\n * Extract and filter SLSA provenance attestations from attestation data.\n */\nfunction getAttestations(attestationData: unknown): unknown[] {\n const data = attestationData as { attestations?: unknown[] }\n if (!data.attestations || !ArrayIsArray(data.attestations)) {\n return []\n }\n\n return data.attestations.filter((attestation: unknown) => {\n const att = attestation as { predicateType?: string }\n return (\n att.predicateType === SLSA_PROVENANCE_V0_2 ||\n att.predicateType === SLSA_PROVENANCE_V1_0\n )\n })\n}\n\n/**\n * Find the first attestation with valid provenance data.\n */\nfunction findProvenance(attestations: unknown[]): unknown {\n for (const attestation of attestations) {\n const att = attestation as {\n bundle?: { dsseEnvelope?: { payload?: string } }\n predicate?: unknown\n }\n try {\n let predicate = att.predicate\n\n // If predicate is not directly available, try to decode from DSSE envelope\n if (!predicate && att.bundle?.dsseEnvelope?.payload) {\n try {\n const decodedPayload = Buffer.from(\n att.bundle.dsseEnvelope.payload,\n 'base64',\n ).toString('utf8')\n const statement = JSON.parse(decodedPayload)\n predicate = statement.predicate\n } catch {\n // Failed to decode, continue to next attestation\n continue\n }\n }\n\n const predicateData = predicate as {\n buildDefinition?: { externalParameters?: unknown }\n }\n if (predicateData?.buildDefinition?.externalParameters) {\n return {\n predicate,\n externalParameters: predicateData.buildDefinition.externalParameters,\n }\n }\n // c8 ignore start - Error handling for malformed attestation data should continue processing other attestations.\n } catch {\n // Continue checking other attestations if one fails to parse\n }\n // c8 ignore stop\n }\n return undefined\n}\n\n/**\n * Check if a value indicates a trusted publisher (GitHub or GitLab).\n */\nfunction isTrustedPublisher(value: unknown): boolean {\n if (typeof value !== 'string' || !value) {\n return false\n }\n\n let url = parseUrl(value)\n let hostname = url?.hostname\n\n // Handle GitHub workflow refs with @ syntax by trying the first part.\n // Example: \"https://github.com/owner/repo/.github/workflows/ci.yml@refs/heads/main\"\n if (!url && value.includes('@')) {\n const firstPart = value.split('@')[0]\n if (firstPart) {\n url = parseUrl(firstPart)\n }\n if (url) {\n hostname = url.hostname\n }\n }\n\n // Try common URL prefixes if not already a complete URL.\n if (!url) {\n const httpsUrl = parseUrl(`https://${value}`)\n if (httpsUrl) {\n hostname = httpsUrl.hostname\n }\n }\n\n if (hostname) {\n return (\n hostname === 'github.com' ||\n hostname.endsWith('.github.com') ||\n hostname === 'gitlab.com' ||\n hostname.endsWith('.gitlab.com')\n )\n }\n\n // Fallback: check for provider keywords in non-URL strings.\n return value.includes('github') || value.includes('gitlab')\n}\n\n/**\n * Convert raw attestation data to user-friendly provenance details.\n */\nexport function getProvenanceDetails(attestationData: unknown): unknown {\n const attestations = getAttestations(attestationData)\n if (!attestations.length) {\n return undefined\n }\n // Find the first attestation with valid provenance data.\n const provenance = findProvenance(attestations)\n if (!provenance) {\n return { level: 'attested' }\n }\n\n const provenanceData = provenance as {\n externalParameters?: {\n context?: string\n ref?: string\n repository?: string\n run_id?: string\n sha?: string\n workflow?: {\n ref?: string\n repository?: string\n }\n workflow_ref?: string\n }\n predicate?: {\n buildDefinition?: { buildType?: string }\n }\n }\n const { externalParameters, predicate } = provenanceData\n const def = predicate?.buildDefinition\n\n // Handle both SLSA v0.2 (direct properties) and v1 (nested workflow object)\n const workflow = externalParameters?.workflow\n const workflowRef = workflow?.ref || externalParameters?.workflow_ref\n const workflowUrl = externalParameters?.context\n const workflowPlatform = def?.buildType\n const repository = workflow?.repository || externalParameters?.repository\n const gitRef = externalParameters?.ref || workflow?.ref\n const commitSha = externalParameters?.sha\n const workflowRunId = externalParameters?.run_id\n\n // Check for trusted publishers (GitHub Actions, GitLab CI/CD).\n const trusted =\n isTrustedPublisher(workflowRef) ||\n isTrustedPublisher(workflowUrl) ||\n isTrustedPublisher(workflowPlatform) ||\n isTrustedPublisher(repository)\n\n return {\n commitSha,\n gitRef,\n level: trusted ? 'trusted' : 'attested',\n repository,\n workflowRef,\n workflowUrl,\n workflowPlatform,\n workflowRunId,\n }\n}\n\n/**\n * Fetch package provenance information from npm registry.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function fetchPackageProvenance(\n pkgName: string,\n pkgVersion: string,\n options?: ProvenanceOptions,\n): Promise<unknown> {\n const { signal, timeout = 10_000 } = {\n __proto__: null,\n ...options,\n } as ProvenanceOptions\n\n if (signal?.aborted) {\n return undefined\n }\n\n // Create composite signal combining external signal with timeout\n const timeoutSignal = createTimeoutSignal(timeout)\n const compositeSignal = createCompositeAbortSignal(signal, timeoutSignal)\n const fetcher = getFetcher()\n\n try {\n const response = await fetcher(\n // The npm registry attestations API endpoint.\n `${NPM_REGISTRY_URL}/-/npm/v1/attestations/${encodeURIComponent(pkgName)}@${encodeURIComponent(pkgVersion)}`,\n {\n method: 'GET',\n signal: compositeSignal,\n headers: {\n 'User-Agent': 'socket-registry',\n },\n } as {\n method: string\n signal: AbortSignal\n headers: Record<string, string>\n },\n )\n if (response.ok) {\n return getProvenanceDetails(await response.json())\n }\n } catch {}\n return undefined\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/dist/packages/specs.js
CHANGED
|
@@ -1,3 +1,85 @@
|
|
|
1
1
|
/* Socket Lib - Built with esbuild */
|
|
2
|
-
var
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var specs_exports = {};
|
|
20
|
+
__export(specs_exports, {
|
|
21
|
+
getRepoUrlDetails: () => getRepoUrlDetails,
|
|
22
|
+
gitHubTagRefUrl: () => gitHubTagRefUrl,
|
|
23
|
+
gitHubTgzUrl: () => gitHubTgzUrl,
|
|
24
|
+
isGitHubTgzSpec: () => isGitHubTgzSpec,
|
|
25
|
+
isGitHubUrlSpec: () => isGitHubUrlSpec
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(specs_exports);
|
|
28
|
+
var import_objects = require("../objects");
|
|
29
|
+
var import_strings = require("../strings");
|
|
30
|
+
let _npmPackageArg;
|
|
31
|
+
// @__NO_SIDE_EFFECTS__
|
|
32
|
+
function getNpmPackageArg() {
|
|
33
|
+
if (_npmPackageArg === void 0) {
|
|
34
|
+
_npmPackageArg = require("../external/npm-package-arg");
|
|
35
|
+
}
|
|
36
|
+
return _npmPackageArg;
|
|
37
|
+
}
|
|
38
|
+
// @__NO_SIDE_EFFECTS__
|
|
39
|
+
function getRepoUrlDetails(repoUrl = "") {
|
|
40
|
+
const userAndRepo = repoUrl.replace(/^.+github.com\//, "").split("/");
|
|
41
|
+
const user = userAndRepo[0] || "";
|
|
42
|
+
const project = userAndRepo.length > 1 ? userAndRepo[1]?.slice(0, -".git".length) || "" : "";
|
|
43
|
+
return { user, project };
|
|
44
|
+
}
|
|
45
|
+
// @__NO_SIDE_EFFECTS__
|
|
46
|
+
function gitHubTagRefUrl(user, project, tag) {
|
|
47
|
+
return `https://api.github.com/repos/${user}/${project}/git/ref/tags/${tag}`;
|
|
48
|
+
}
|
|
49
|
+
// @__NO_SIDE_EFFECTS__
|
|
50
|
+
function gitHubTgzUrl(user, project, sha) {
|
|
51
|
+
return `https://github.com/${user}/${project}/archive/${sha}.tar.gz`;
|
|
52
|
+
}
|
|
53
|
+
// @__NO_SIDE_EFFECTS__
|
|
54
|
+
function isGitHubTgzSpec(spec, where) {
|
|
55
|
+
let parsedSpec;
|
|
56
|
+
if ((0, import_objects.isObjectObject)(spec)) {
|
|
57
|
+
parsedSpec = spec;
|
|
58
|
+
} else {
|
|
59
|
+
const npmPackageArg = /* @__PURE__ */ getNpmPackageArg();
|
|
60
|
+
parsedSpec = npmPackageArg(spec, where);
|
|
61
|
+
}
|
|
62
|
+
const typedSpec = parsedSpec;
|
|
63
|
+
return typedSpec.type === "remote" && !!typedSpec.saveSpec?.endsWith(".tar.gz");
|
|
64
|
+
}
|
|
65
|
+
// @__NO_SIDE_EFFECTS__
|
|
66
|
+
function isGitHubUrlSpec(spec, where) {
|
|
67
|
+
let parsedSpec;
|
|
68
|
+
if ((0, import_objects.isObjectObject)(spec)) {
|
|
69
|
+
parsedSpec = spec;
|
|
70
|
+
} else {
|
|
71
|
+
const npmPackageArg = /* @__PURE__ */ getNpmPackageArg();
|
|
72
|
+
parsedSpec = npmPackageArg(spec, where);
|
|
73
|
+
}
|
|
74
|
+
const typedSpec = parsedSpec;
|
|
75
|
+
return typedSpec.type === "git" && typedSpec.hosted?.domain === "github.com" && (0, import_strings.isNonEmptyString)(typedSpec.gitCommittish);
|
|
76
|
+
}
|
|
77
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
78
|
+
0 && (module.exports = {
|
|
79
|
+
getRepoUrlDetails,
|
|
80
|
+
gitHubTagRefUrl,
|
|
81
|
+
gitHubTgzUrl,
|
|
82
|
+
isGitHubTgzSpec,
|
|
83
|
+
isGitHubUrlSpec
|
|
84
|
+
});
|
|
3
85
|
//# sourceMappingURL=specs.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/specs.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * @fileoverview Package spec parsing and GitHub URL utilities.\n */\n\nimport { isObjectObject } from '../objects'\nimport { isNonEmptyString } from '../strings'\n\nlet _npmPackageArg: typeof import('npm-package-arg') | undefined\n/**\n * Get the npm-package-arg module.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getNpmPackageArg() {\n if (_npmPackageArg === undefined) {\n _npmPackageArg = /*@__PURE__*/ require('../external/npm-package-arg')\n }\n return _npmPackageArg as typeof import('npm-package-arg')\n}\n\n/**\n * Extract user and project from GitHub repository URL.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getRepoUrlDetails(repoUrl: string = ''): {\n user: string\n project: string\n} {\n const userAndRepo = repoUrl.replace(/^.+github.com\\//, '').split('/')\n const user = userAndRepo[0] || ''\n const project =\n userAndRepo.length > 1 ? userAndRepo[1]?.slice(0, -'.git'.length) || '' : ''\n return { user, project }\n}\n\n/**\n * Generate GitHub API URL for a tag reference.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function gitHubTagRefUrl(\n user: string,\n project: string,\n tag: string,\n): string {\n return `https://api.github.com/repos/${user}/${project}/git/ref/tags/${tag}`\n}\n\n/**\n * Generate GitHub tarball download URL for a commit SHA.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function gitHubTgzUrl(\n user: string,\n project: string,\n sha: string,\n): string {\n return `https://github.com/${user}/${project}/archive/${sha}.tar.gz`\n}\n\n/**\n * Check if a package specifier is a GitHub tarball URL.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isGitHubTgzSpec(spec: unknown, where?: string): boolean {\n let parsedSpec: unknown\n if (isObjectObject(spec)) {\n parsedSpec = spec\n } else {\n const npmPackageArg = getNpmPackageArg()\n parsedSpec = npmPackageArg(spec as string, where)\n }\n const typedSpec = parsedSpec as { type?: string; saveSpec?: string }\n return (\n typedSpec.type === 'remote' && !!typedSpec.saveSpec?.endsWith('.tar.gz')\n )\n}\n\n/**\n * Check if a package specifier is a GitHub URL with committish.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isGitHubUrlSpec(spec: unknown, where?: string): boolean {\n let parsedSpec: unknown\n if (isObjectObject(spec)) {\n parsedSpec = spec\n } else {\n const npmPackageArg = getNpmPackageArg()\n parsedSpec = npmPackageArg(spec as string, where)\n }\n const typedSpec = parsedSpec as {\n gitCommittish?: string\n hosted?: { domain?: string }\n type?: string\n }\n return (\n typedSpec.type === 'git' &&\n typedSpec.hosted?.domain === 'github.com' &&\n isNonEmptyString(typedSpec.gitCommittish)\n )\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,qBAA+B;AAC/B,qBAAiC;AAEjC,IAAI;AAAA;AAKJ,SAAS,mBAAmB;AAC1B,MAAI,mBAAmB,QAAW;AAChC,qBAA+B,QAAQ,6BAA6B;AAAA,EACtE;AACA,SAAO;AACT;AAAA;AAMO,SAAS,kBAAkB,UAAkB,IAGlD;AACA,QAAM,cAAc,QAAQ,QAAQ,mBAAmB,EAAE,EAAE,MAAM,GAAG;AACpE,QAAM,OAAO,YAAY,CAAC,KAAK;AAC/B,QAAM,UACJ,YAAY,SAAS,IAAI,YAAY,CAAC,GAAG,MAAM,GAAG,CAAC,OAAO,MAAM,KAAK,KAAK;AAC5E,SAAO,EAAE,MAAM,QAAQ;AACzB;AAAA;AAMO,SAAS,gBACd,MACA,SACA,KACQ;AACR,SAAO,gCAAgC,IAAI,IAAI,OAAO,iBAAiB,GAAG;AAC5E;AAAA;AAMO,SAAS,aACd,MACA,SACA,KACQ;AACR,SAAO,sBAAsB,IAAI,IAAI,OAAO,YAAY,GAAG;AAC7D;AAAA;AAMO,SAAS,gBAAgB,MAAe,OAAyB;AACtE,MAAI;AACJ,UAAI,+BAAe,IAAI,GAAG;AACxB,iBAAa;AAAA,EACf,OAAO;AACL,UAAM,gBAAgB,iCAAiB;AACvC,iBAAa,cAAc,MAAgB,KAAK;AAAA,EAClD;AACA,QAAM,YAAY;AAClB,SACE,UAAU,SAAS,YAAY,CAAC,CAAC,UAAU,UAAU,SAAS,SAAS;AAE3E;AAAA;AAMO,SAAS,gBAAgB,MAAe,OAAyB;AACtE,MAAI;AACJ,UAAI,+BAAe,IAAI,GAAG;AACxB,iBAAa;AAAA,EACf,OAAO;AACL,UAAM,gBAAgB,iCAAiB;AACvC,iBAAa,cAAc,MAAgB,KAAK;AAAA,EAClD;AACA,QAAM,YAAY;AAKlB,SACE,UAAU,SAAS,SACnB,UAAU,QAAQ,WAAW,oBAC7B,iCAAiB,UAAU,aAAa;AAE5C;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,53 @@
|
|
|
1
1
|
/* Socket Lib - Built with esbuild */
|
|
2
|
-
var
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var validation_exports = {};
|
|
20
|
+
__export(validation_exports, {
|
|
21
|
+
isBlessedPackageName: () => isBlessedPackageName,
|
|
22
|
+
isRegistryFetcherType: () => isRegistryFetcherType,
|
|
23
|
+
isValidPackageName: () => isValidPackageName
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(validation_exports);
|
|
26
|
+
let _validateNpmPackageName;
|
|
27
|
+
// @__NO_SIDE_EFFECTS__
|
|
28
|
+
function getValidateNpmPackageName() {
|
|
29
|
+
if (_validateNpmPackageName === void 0) {
|
|
30
|
+
_validateNpmPackageName = require("../external/validate-npm-package-name");
|
|
31
|
+
}
|
|
32
|
+
return _validateNpmPackageName;
|
|
33
|
+
}
|
|
34
|
+
// @__NO_SIDE_EFFECTS__
|
|
35
|
+
function isBlessedPackageName(name) {
|
|
36
|
+
return typeof name === "string" && (name === "sfw" || name === "socket" || name.startsWith("@socketoverride/") || name.startsWith("@socketregistry/") || name.startsWith("@socketsecurity/"));
|
|
37
|
+
}
|
|
38
|
+
// @__NO_SIDE_EFFECTS__
|
|
39
|
+
function isRegistryFetcherType(type) {
|
|
40
|
+
return type === "alias" || type === "range" || type === "tag" || type === "version";
|
|
41
|
+
}
|
|
42
|
+
// @__NO_SIDE_EFFECTS__
|
|
43
|
+
function isValidPackageName(name) {
|
|
44
|
+
const validateNpmPackageName = /* @__PURE__ */ getValidateNpmPackageName();
|
|
45
|
+
return validateNpmPackageName(name).validForOldPackages;
|
|
46
|
+
}
|
|
47
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
48
|
+
0 && (module.exports = {
|
|
49
|
+
isBlessedPackageName,
|
|
50
|
+
isRegistryFetcherType,
|
|
51
|
+
isValidPackageName
|
|
52
|
+
});
|
|
3
53
|
//# sourceMappingURL=validation.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/validation.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * @fileoverview Package name validation utilities.\n */\n\nlet _validateNpmPackageName:\n | typeof import('validate-npm-package-name')\n | undefined\n/**\n * Get the validate-npm-package-name module.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getValidateNpmPackageName() {\n if (_validateNpmPackageName === undefined) {\n _validateNpmPackageName =\n /*@__PURE__*/ require('../external/validate-npm-package-name')\n }\n return _validateNpmPackageName as typeof import('validate-npm-package-name')\n}\n\n/**\n * Check if package name is a blessed Socket.dev package.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isBlessedPackageName(name: unknown): boolean {\n return (\n typeof name === 'string' &&\n (name === 'sfw' ||\n name === 'socket' ||\n name.startsWith('@socketoverride/') ||\n name.startsWith('@socketregistry/') ||\n name.startsWith('@socketsecurity/'))\n )\n}\n\n/**\n * Check if a type string represents a registry fetcher type.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isRegistryFetcherType(type: string): boolean {\n // RegistryFetcher spec.type check based on:\n // https://github.com/npm/pacote/blob/v19.0.0/lib/fetcher.js#L467-L488\n return (\n type === 'alias' || type === 'range' || type === 'tag' || type === 'version'\n )\n}\n\n/**\n * Check if a package name is valid according to npm naming rules.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isValidPackageName(name: string): boolean {\n const validateNpmPackageName = getValidateNpmPackageName()\n return validateNpmPackageName(name).validForOldPackages\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,IAAI;AAAA;AAOJ,SAAS,4BAA4B;AACnC,MAAI,4BAA4B,QAAW;AACzC,8BACgB,QAAQ,uCAAuC;AAAA,EACjE;AACA,SAAO;AACT;AAAA;AAMO,SAAS,qBAAqB,MAAwB;AAC3D,SACE,OAAO,SAAS,aACf,SAAS,SACR,SAAS,YACT,KAAK,WAAW,kBAAkB,KAClC,KAAK,WAAW,kBAAkB,KAClC,KAAK,WAAW,kBAAkB;AAExC;AAAA;AAMO,SAAS,sBAAsB,MAAuB;AAG3D,SACE,SAAS,WAAW,SAAS,WAAW,SAAS,SAAS,SAAS;AAEvE;AAAA;AAMO,SAAS,mBAAmB,MAAuB;AACxD,QAAM,yBAAyB,0CAA0B;AACzD,SAAO,uBAAuB,IAAI,EAAE;AACtC;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/dist/packages.js
CHANGED
|
@@ -1,3 +1,131 @@
|
|
|
1
1
|
/* Socket Lib - Built with esbuild */
|
|
2
|
-
var
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var packages_exports = {};
|
|
20
|
+
__export(packages_exports, {
|
|
21
|
+
collectIncompatibleLicenses: () => import_licenses.collectIncompatibleLicenses,
|
|
22
|
+
collectLicenseWarnings: () => import_licenses.collectLicenseWarnings,
|
|
23
|
+
createAstNode: () => import_licenses.createAstNode,
|
|
24
|
+
createBinaryOperationNode: () => import_licenses.createBinaryOperationNode,
|
|
25
|
+
createLicenseNode: () => import_licenses.createLicenseNode,
|
|
26
|
+
createPackageJson: () => import_manifest.createPackageJson,
|
|
27
|
+
extractPackage: () => import_operations.extractPackage,
|
|
28
|
+
fetchPackageManifest: () => import_manifest.fetchPackageManifest,
|
|
29
|
+
fetchPackagePackument: () => import_manifest.fetchPackagePackument,
|
|
30
|
+
fetchPackageProvenance: () => import_provenance.fetchPackageProvenance,
|
|
31
|
+
findPackageExtensions: () => import_operations.findPackageExtensions,
|
|
32
|
+
findTypesForSubpath: () => import_exports.findTypesForSubpath,
|
|
33
|
+
getEditablePackageJsonClass: () => import_editable.getEditablePackageJsonClass,
|
|
34
|
+
getExportFilePaths: () => import_exports.getExportFilePaths,
|
|
35
|
+
getProvenanceDetails: () => import_provenance.getProvenanceDetails,
|
|
36
|
+
getReleaseTag: () => import_operations.getReleaseTag,
|
|
37
|
+
getRepoUrlDetails: () => import_specs.getRepoUrlDetails,
|
|
38
|
+
getSubpaths: () => import_exports.getSubpaths,
|
|
39
|
+
gitHubTagRefUrl: () => import_specs.gitHubTagRefUrl,
|
|
40
|
+
gitHubTgzUrl: () => import_specs.gitHubTgzUrl,
|
|
41
|
+
isBlessedPackageName: () => import_validation.isBlessedPackageName,
|
|
42
|
+
isConditionalExports: () => import_exports.isConditionalExports,
|
|
43
|
+
isGitHubTgzSpec: () => import_specs.isGitHubTgzSpec,
|
|
44
|
+
isGitHubUrlSpec: () => import_specs.isGitHubUrlSpec,
|
|
45
|
+
isRegistryFetcherType: () => import_validation.isRegistryFetcherType,
|
|
46
|
+
isSubpathExports: () => import_exports.isSubpathExports,
|
|
47
|
+
isValidPackageName: () => import_validation.isValidPackageName,
|
|
48
|
+
isolatePackage: () => import_isolation.isolatePackage,
|
|
49
|
+
normalizePackageJson: () => import_normalize.normalizePackageJson,
|
|
50
|
+
packPackage: () => import_operations.packPackage,
|
|
51
|
+
parseSpdxExp: () => import_licenses.parseSpdxExp,
|
|
52
|
+
pkgJsonToEditable: () => import_editable.pkgJsonToEditable,
|
|
53
|
+
readPackageJson: () => import_operations.readPackageJson,
|
|
54
|
+
readPackageJsonSync: () => import_operations.readPackageJsonSync,
|
|
55
|
+
resolveEscapedScope: () => import_normalize.resolveEscapedScope,
|
|
56
|
+
resolveGitHubTgzUrl: () => import_operations.resolveGitHubTgzUrl,
|
|
57
|
+
resolveOriginalPackageName: () => import_normalize.resolveOriginalPackageName,
|
|
58
|
+
resolvePackageJsonDirname: () => import_paths.resolvePackageJsonDirname,
|
|
59
|
+
resolvePackageJsonEntryExports: () => import_exports.resolvePackageJsonEntryExports,
|
|
60
|
+
resolvePackageJsonPath: () => import_paths.resolvePackageJsonPath,
|
|
61
|
+
resolvePackageLicenses: () => import_licenses.resolvePackageLicenses,
|
|
62
|
+
resolvePackageName: () => import_operations.resolvePackageName,
|
|
63
|
+
resolveRegistryPackageName: () => import_operations.resolveRegistryPackageName,
|
|
64
|
+
toEditablePackageJson: () => import_editable.toEditablePackageJson,
|
|
65
|
+
toEditablePackageJsonSync: () => import_editable.toEditablePackageJsonSync,
|
|
66
|
+
unescapeScope: () => import_normalize.unescapeScope,
|
|
67
|
+
visitLicenses: () => import_licenses.visitLicenses
|
|
68
|
+
});
|
|
69
|
+
module.exports = __toCommonJS(packages_exports);
|
|
70
|
+
var import_editable = require("./packages/editable");
|
|
71
|
+
var import_exports = require("./packages/exports");
|
|
72
|
+
var import_isolation = require("./packages/isolation");
|
|
73
|
+
var import_licenses = require("./packages/licenses");
|
|
74
|
+
var import_manifest = require("./packages/manifest");
|
|
75
|
+
var import_normalize = require("./packages/normalize");
|
|
76
|
+
var import_operations = require("./packages/operations");
|
|
77
|
+
var import_paths = require("./packages/paths");
|
|
78
|
+
var import_provenance = require("./packages/provenance");
|
|
79
|
+
var import_specs = require("./packages/specs");
|
|
80
|
+
var import_validation = require("./packages/validation");
|
|
81
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
82
|
+
0 && (module.exports = {
|
|
83
|
+
collectIncompatibleLicenses,
|
|
84
|
+
collectLicenseWarnings,
|
|
85
|
+
createAstNode,
|
|
86
|
+
createBinaryOperationNode,
|
|
87
|
+
createLicenseNode,
|
|
88
|
+
createPackageJson,
|
|
89
|
+
extractPackage,
|
|
90
|
+
fetchPackageManifest,
|
|
91
|
+
fetchPackagePackument,
|
|
92
|
+
fetchPackageProvenance,
|
|
93
|
+
findPackageExtensions,
|
|
94
|
+
findTypesForSubpath,
|
|
95
|
+
getEditablePackageJsonClass,
|
|
96
|
+
getExportFilePaths,
|
|
97
|
+
getProvenanceDetails,
|
|
98
|
+
getReleaseTag,
|
|
99
|
+
getRepoUrlDetails,
|
|
100
|
+
getSubpaths,
|
|
101
|
+
gitHubTagRefUrl,
|
|
102
|
+
gitHubTgzUrl,
|
|
103
|
+
isBlessedPackageName,
|
|
104
|
+
isConditionalExports,
|
|
105
|
+
isGitHubTgzSpec,
|
|
106
|
+
isGitHubUrlSpec,
|
|
107
|
+
isRegistryFetcherType,
|
|
108
|
+
isSubpathExports,
|
|
109
|
+
isValidPackageName,
|
|
110
|
+
isolatePackage,
|
|
111
|
+
normalizePackageJson,
|
|
112
|
+
packPackage,
|
|
113
|
+
parseSpdxExp,
|
|
114
|
+
pkgJsonToEditable,
|
|
115
|
+
readPackageJson,
|
|
116
|
+
readPackageJsonSync,
|
|
117
|
+
resolveEscapedScope,
|
|
118
|
+
resolveGitHubTgzUrl,
|
|
119
|
+
resolveOriginalPackageName,
|
|
120
|
+
resolvePackageJsonDirname,
|
|
121
|
+
resolvePackageJsonEntryExports,
|
|
122
|
+
resolvePackageJsonPath,
|
|
123
|
+
resolvePackageLicenses,
|
|
124
|
+
resolvePackageName,
|
|
125
|
+
resolveRegistryPackageName,
|
|
126
|
+
toEditablePackageJson,
|
|
127
|
+
toEditablePackageJsonSync,
|
|
128
|
+
unescapeScope,
|
|
129
|
+
visitLicenses
|
|
130
|
+
});
|
|
3
131
|
//# sourceMappingURL=packages.js.map
|
package/dist/packages.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/packages.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * @fileoverview Package registry management with Socket.dev specific utilities.\n * Provides npm package analysis, dependency resolution, and registry operations.\n */\n\nimport type { CategoryString } from '#types'\n\nimport {\n getEditablePackageJsonClass,\n pkgJsonToEditable,\n toEditablePackageJson,\n toEditablePackageJsonSync,\n} from './packages/editable'\nimport {\n findTypesForSubpath,\n getExportFilePaths,\n getSubpaths,\n isConditionalExports,\n isSubpathExports,\n resolvePackageJsonEntryExports,\n} from './packages/exports'\nimport { isolatePackage } from './packages/isolation'\nimport {\n collectIncompatibleLicenses,\n collectLicenseWarnings,\n createAstNode,\n createBinaryOperationNode,\n createLicenseNode,\n parseSpdxExp,\n resolvePackageLicenses,\n visitLicenses,\n} from './packages/licenses'\nimport {\n createPackageJson,\n fetchPackageManifest,\n fetchPackagePackument,\n} from './packages/manifest'\nimport {\n normalizePackageJson,\n resolveEscapedScope,\n resolveOriginalPackageName,\n unescapeScope,\n} from './packages/normalize'\nimport {\n extractPackage,\n findPackageExtensions,\n getReleaseTag,\n packPackage,\n readPackageJson,\n readPackageJsonSync,\n resolveGitHubTgzUrl,\n resolvePackageName,\n resolveRegistryPackageName,\n} from './packages/operations'\nimport {\n resolvePackageJsonDirname,\n resolvePackageJsonPath,\n} from './packages/paths'\nimport {\n fetchPackageProvenance,\n getProvenanceDetails,\n} from './packages/provenance'\nimport {\n getRepoUrlDetails,\n gitHubTagRefUrl,\n gitHubTgzUrl,\n isGitHubTgzSpec,\n isGitHubUrlSpec,\n} from './packages/specs'\nimport {\n isBlessedPackageName,\n isRegistryFetcherType,\n isValidPackageName,\n} from './packages/validation'\n\n// Type for package.json exports field.\ntype PackageExports = {\n [path: string]: unknown\n}\n\n// Re-export the EditablePackageJson instance type for convenient access\nexport type EditablePackageJson =\n import('./packages/editable').EditablePackageJsonInstance\n\n/**\n * Extended PackageJson type based on NPMCliPackageJson.Content with Socket-specific additions.\n * @extends NPMCliPackageJson.Content (from @npmcli/package-json)\n * @property socket - Optional Socket.dev specific configuration\n */\nexport type PackageJson = {\n // Core npm fields\n [key: string]: unknown\n name?: string | undefined\n version?: string | undefined\n description?: string | undefined\n main?: string | undefined\n module?: string | undefined\n types?: string | undefined\n typings?: string | undefined\n bin?: string | Record<string, string> | undefined\n\n // Author and contributors\n author?: string | { name?: string; email?: string; url?: string } | undefined\n contributors?:\n | Array<string | { name?: string; email?: string; url?: string }>\n | undefined\n maintainers?:\n | Array<string | { name?: string; email?: string; url?: string }>\n | undefined\n\n // Repository and URLs\n repository?:\n | string\n | { type?: string; url?: string; directory?: string }\n | undefined\n homepage?: string | undefined\n bugs?: string | { url?: string; email?: string } | undefined\n\n // License\n license?: string | undefined\n licenses?: Array<{ type?: string; url?: string }> | undefined\n\n // Scripts\n scripts?: Record<string, string> | undefined\n\n // Dependencies\n dependencies?: Record<string, string> | undefined\n devDependencies?: Record<string, string> | undefined\n peerDependencies?: Record<string, string> | undefined\n optionalDependencies?: Record<string, string> | undefined\n bundledDependencies?: string[] | undefined\n bundleDependencies?: string[] | undefined\n\n // Package managers specific\n overrides?: Record<string, string> | undefined\n resolutions?: Record<string, string> | undefined\n pnpm?: Record<string, unknown> | undefined\n\n // Module system\n exports?: PackageExports | string | string[] | undefined\n imports?: Record<string, unknown> | undefined\n type?: 'module' | 'commonjs' | undefined\n\n // Publishing\n private?: boolean | undefined\n publishConfig?: Record<string, unknown> | undefined\n files?: string[] | undefined\n\n // Engines and OS\n engines?: Record<string, string> | undefined\n os?: string[] | undefined\n cpu?: string[] | undefined\n\n // Package manager\n packageManager?: string | undefined\n\n // Workspaces\n workspaces?: string[] | { packages?: string[] } | undefined\n\n // Socket.dev specific\n socket?:\n | {\n categories?: CategoryString | CategoryString[]\n interop?: string | string[]\n [key: string]: unknown\n }\n | undefined\n}\n\nexport type SaveOptions = {\n ignoreWhitespace?: boolean | undefined\n sort?: boolean | undefined\n}\n\nexport type EditablePackageJsonOptions = {\n normalize?: boolean | undefined\n path?: string | undefined\n preserve?: string[] | readonly string[] | undefined\n create?: boolean | undefined\n data?: PackageJson | undefined\n}\n\nexport type ExtractOptions = {\n dest?: string | undefined\n tmpPrefix?: string | undefined\n signal?: AbortSignal | undefined\n packumentCache?: Map<string, unknown> | undefined\n preferOffline?: boolean | undefined\n}\n\nexport type NormalizeOptions = {\n preserve?: string[] | readonly string[] | undefined\n}\n\nexport type ReadPackageJsonOptions = NormalizeOptions & {\n editable?: boolean | undefined\n normalize?: boolean | undefined\n throws?: boolean | undefined\n}\n\nexport type ProvenanceOptions = {\n signal?: AbortSignal | undefined\n timeout?: number | undefined\n}\n\nexport type LicenseNode = {\n license: string\n exception?: string | undefined\n inFile?: string | undefined\n plus?: boolean | undefined\n}\n\nexport type PacoteOptions = {\n signal?: AbortSignal | undefined\n packumentCache?: Map<string, unknown> | undefined\n preferOffline?: boolean | undefined\n fullMetadata?: boolean | undefined\n}\n\nexport type {\n IsolatePackageOptions,\n IsolatePackageResult,\n} from './packages/isolation'\n\nexport type {\n InternalAstNode,\n InternalBinaryOperationNode,\n InternalLicenseNode,\n LicenseVisitor,\n SpdxAstNode,\n SpdxBinaryOperationNode,\n SpdxLicenseNode,\n} from './packages/licenses'\n\nexport {\n collectIncompatibleLicenses,\n collectLicenseWarnings,\n createAstNode,\n createBinaryOperationNode,\n createLicenseNode,\n createPackageJson,\n extractPackage,\n fetchPackageManifest,\n fetchPackagePackument,\n fetchPackageProvenance,\n findPackageExtensions,\n findTypesForSubpath,\n getEditablePackageJsonClass,\n getExportFilePaths,\n getProvenanceDetails,\n getReleaseTag,\n getRepoUrlDetails,\n getSubpaths,\n gitHubTagRefUrl,\n gitHubTgzUrl,\n isBlessedPackageName,\n isConditionalExports,\n isGitHubTgzSpec,\n isGitHubUrlSpec,\n isolatePackage,\n isRegistryFetcherType,\n isSubpathExports,\n isValidPackageName,\n normalizePackageJson,\n packPackage,\n parseSpdxExp,\n pkgJsonToEditable,\n readPackageJson,\n readPackageJsonSync,\n resolveEscapedScope,\n resolveGitHubTgzUrl,\n resolveOriginalPackageName,\n resolvePackageName,\n resolvePackageJsonDirname,\n resolvePackageJsonPath,\n resolvePackageJsonEntryExports,\n resolvePackageLicenses,\n resolveRegistryPackageName,\n toEditablePackageJson,\n toEditablePackageJsonSync,\n unescapeScope,\n visitLicenses,\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,sBAKO;AACP,qBAOO;AACP,uBAA+B;AAC/B,sBASO;AACP,sBAIO;AACP,uBAKO;AACP,wBAUO;AACP,mBAGO;AACP,wBAGO;AACP,mBAMO;AACP,wBAIO;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|