NodeSecure 숨겨진 기능: mama

발행: (2026년 1월 10일 오후 04:12 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

Hello 👋

저는 NodeSecure 프로젝트의 잘 알려지지 않은 부분들을 조명하는 짧은 기사 시리즈를 시작합니다. 목표는 새로운 기여자들이 프로젝트를 구동하는 백엔드 구성 요소들을 보다 명확히 이해하도록 돕는 것입니다.

Chapter 1: mama

MamaManifestManager의 약자입니다. 이 패키지는 npm 매니페스트(package.json 파일)를 관리하고 로드하도록 설계되었습니다(간단히 말해).

내부적으로는 @nodesecure/npm-types를 사용해 정확하고 최신의 타입(런타임 관련 필드 포함)을 제공합니다. 해당 패키지는 다른 기사에서 자세히 다룰 예정입니다.

import { ManifestManager } from "@nodesecure/mama";

// asynchronous version
const mama = await ManifestManager.fromPackageJSON(process.cwd());
console.log(mama.document);

이 패키지는 Scanner 모노레포의 백엔드 구성 요소 전반에서 사용되는 다양한 유틸리티를 제공합니다.

Integrity

읽기 전용 getter integrity를 사용하면 해시를 손쉽게 추출할 수 있습니다.

console.log(mama.integrity);

Scanner는 이를 이용해 tarball 안의 package.json이 레지스트리에 업로드된 파일과 일치하는지 확인합니다(일명 manifest confusion).

해시 대상이 되는 속성은 다음과 같습니다:

{
  "name",
  "version",
  "dependencies",
  "license": "license ?? \"NONE\"",
  "scripts"
}

불일치가 감지되면 도구는 CLI UI에 전역 경고로 표시합니다:

NodeSecure 전역 경고

Module type

Antfu가 만든 최신 node-modules-inspector 도구에서 영감을 받아 동일한 모듈 타입 감지를 재구현했습니다:

// "dts" | "faux" | "dual" | "esm" | "cjs"
console.log(mama.moduleType);

Entry files

mama는 Node.js exports 필드(또는 레거시 main 같은 필드)를 사용해 진입 파일을 재귀적으로 추출할 수 있습니다. API는 지연 로딩이며 IterableIterator를 반환합니다:

console.log([...mama.getEntryFiles()]);

이 API는 tarball 패키지에서 JS‑X‑Ray의 EntryFilesAnalyser와 함께 사용됩니다.

async scanFiles(): Promise {
  const location = this.manifest.location;
  const [composition, spdx] = await Promise.all([
    getTarballComposition(location),
    conformance.extractLicenses(location)
  ]);

  const code = await new SourceCodeScanner(this.manifest).iterate({
    manifest: [...this.manifest.getEntryFiles()]
      .flatMap(filterJavaScriptFiles()),
    javascript: composition.files
      .flatMap(filterJavaScriptFiles())
  });

  return {
    conformance: spdx,
    composition,
    code
  };
}

Author

NPM author 필드(존재하는 경우)를 파싱해 Contact 인터페이스를 반환합니다:

interface Contact {
  email?: string;
  url?: string;
  name: string;
}

예를 들어 John Doe는 다음과 같이 반환됩니다:

{
  "name": "John Doe",
  "email": "john.doe@gmail.com"
}

Others

이 모듈은 매니페스트를 읽고 관리하는 데 도움이 되는 추가 유틸리티도 제공합니다. 예를 들면:

  • 패키지 스펙 파싱(스코프/조직, 패키지 이름, semver 범위 포함)
  • 로컬 lockfile 감지

The end

전체 모듈 문서는 여기에서 확인할 수 있습니다.

읽어 주셔서 감사합니다.

Back to Blog

관련 글

더 보기 »