diff --git a/.changeset/shy-dingos-grin.md b/.changeset/shy-dingos-grin.md new file mode 100644 index 00000000..6fa94583 --- /dev/null +++ b/.changeset/shy-dingos-grin.md @@ -0,0 +1,5 @@ +--- +"@nodesecure/mama": minor +--- + +Added lockfile scanning utils diff --git a/workspaces/mama/README.md b/workspaces/mama/README.md index 1e24389a..1b48f9f9 100644 --- a/workspaces/mama/README.md +++ b/workspaces/mama/README.md @@ -38,6 +38,7 @@ This package exports a set of standalone utilities that are internally used by t - [packageJSONIntegrityHash](./docs/packageJSONIntegrityHash.md) - [parseNpmSpec](./docs/parseNpmSpec.md) - [inspectModuleType](./docs/inspectModuleType.md) +- [scanLockFiles](./docs/scan-lockfiles.md) ## ManifestManager API diff --git a/workspaces/mama/docs/scan-lockfiles.md b/workspaces/mama/docs/scan-lockfiles.md new file mode 100644 index 00000000..f03b56d0 --- /dev/null +++ b/workspaces/mama/docs/scan-lockfiles.md @@ -0,0 +1,13 @@ +# scanLockFiles + +Scans for lock files in the given path. + +This function searches for common package manager lock files +such as package-lock.json, yarn.lock, pnpm-lock.yaml, etc. +returns an Object of found lock file with their paths + +## Function Signature + +```ts +export function scanLockFiles(dirPath: string): null | Record; +``` diff --git a/workspaces/mama/src/index.ts b/workspaces/mama/src/index.ts index 1dabb0ab..750ff967 100644 --- a/workspaces/mama/src/index.ts +++ b/workspaces/mama/src/index.ts @@ -3,5 +3,7 @@ export { packageJSONIntegrityHash, parseNpmSpec, inspectModuleType, + scanLockFiles, + LOCK_FILES, type PackageModuleType } from "./utils/index.ts"; diff --git a/workspaces/mama/src/utils/index.ts b/workspaces/mama/src/utils/index.ts index d081be93..3f2648ff 100644 --- a/workspaces/mama/src/utils/index.ts +++ b/workspaces/mama/src/utils/index.ts @@ -1,3 +1,4 @@ export * from "./integrity-hash.ts"; export * from "./inspectModuleType.ts"; export * from "./parseNpmSpec.ts"; +export * from "./scan-lockfiles.ts"; diff --git a/workspaces/mama/src/utils/scan-lockfiles.ts b/workspaces/mama/src/utils/scan-lockfiles.ts new file mode 100644 index 00000000..974cbcb2 --- /dev/null +++ b/workspaces/mama/src/utils/scan-lockfiles.ts @@ -0,0 +1,24 @@ +// Import Node.js Dependencies +import fs from "node:fs"; + +export const LOCK_FILES = [ + ["npm", "package-lock.json"], + ["bun", "bun.lockb"], + ["pnpm", "pnpm-lock.yaml"], + ["yarn", "yarn.lock"], + ["deno", "deno.lock"] +]; + +export function scanLockFiles(dirPath: string): null | Record { + const dir = fs.readdirSync(dirPath); + if (dir.length === 0) { + return null; + } + + const filteredEntries = Array.from(LOCK_FILES).flatMap(([k, v]) => (dir.includes(v) ? [[k, v]] : []) + ); + + return filteredEntries.length === 0 + ? null + : Object.fromEntries(filteredEntries); +} diff --git a/workspaces/mama/test/scan-lockfiles.spec.ts b/workspaces/mama/test/scan-lockfiles.spec.ts new file mode 100644 index 00000000..4b96513b --- /dev/null +++ b/workspaces/mama/test/scan-lockfiles.spec.ts @@ -0,0 +1,30 @@ +// Import Node.js Dependencies +import { describe, test } from "node:test"; +import assert from "node:assert"; +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; + +// Import Internal Dependencies +import { scanLockFiles, LOCK_FILES } from "../src/index.ts"; + +describe("scanLockFiles", () => { + test("should scan lock files", () => { + const output: [string, string][] = []; + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "/")); + + for (const [k, v] of LOCK_FILES) { + const filepath = path.join(tmpDir, v); + + fs.writeFileSync(filepath, ""); + output.push([k, v]); + } + + assert.deepEqual(scanLockFiles(tmpDir), Object.fromEntries(output)); + }); + + test("should return null no lockfiles", () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "/")); + assert.deepEqual(scanLockFiles(tmpDir), null); + }); +});