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/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..8fb24fd7 --- /dev/null +++ b/workspaces/mama/src/utils/scan-lockfiles.ts @@ -0,0 +1,26 @@ +// 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 | object { + const dir = fs.readdirSync(dirPath); + if (dir.length === 0) { + return null; + } + + const result: [string, string][] = []; + for (const [k, v] of LOCK_FILES) { + if (dir.includes(v)) { + result.push([k, v]); + } + } + + return result.length === 0 ? null : result; +} diff --git a/workspaces/mama/test/scan-lockfiles.spec.ts b/workspaces/mama/test/scan-lockfiles.spec.ts new file mode 100644 index 00000000..dd7a3055 --- /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), output); + }); + + test("should return null no lockfiles", () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "/")); + assert.deepEqual(scanLockFiles(tmpDir), null); + }); +});