nodejs_package_json 0.4.10

Shapes for Node.js package.json.
Documentation
use indexmap::IndexMap;
use nodejs_package_json::{
    DependencyMetaField, ImportExportField, ImportExportMap, PackageJson, VersionProtocol,
    WorkspaceProtocol,
};
use semver::{Version, VersionReq};
use starbase_sandbox::locate_fixture;
use std::collections::BTreeMap;
use std::fs;

#[test]
fn serializes_packages_json() {
    let pkg = PackageJson {
        name: Some("vite".into()),
        version: Some(Version::new(1, 2, 3)),
        scripts: Some(IndexMap::from_iter([("build".into(), "vite build".into())])),
        exports: Some(ImportExportField::Map(ImportExportMap::from_iter([
            (
                ".".into(),
                ImportExportField::String("./mjs/index.mjs".into()),
            ),
            (
                "./bin".into(),
                ImportExportField::Map(ImportExportMap::from_iter([
                    (
                        "import".into(),
                        ImportExportField::String("./mjs/bin.mjs".into()),
                    ),
                    (
                        "require".into(),
                        ImportExportField::String("./cjs/bin.cjs".into()),
                    ),
                ])),
            ),
        ]))),
        dependencies: Some(BTreeMap::from_iter([
            (
                "@moonrepo/cli".into(),
                VersionProtocol::Requirement(VersionReq::parse("^1.20").unwrap()),
            ),
            (
                "vite".into(),
                VersionProtocol::Workspace(WorkspaceProtocol::Any { alias: None }),
            ),
        ])),
        dependencies_meta: Some(BTreeMap::from_iter([(
            "vite".into(),
            DependencyMetaField {
                injected: Some(true),
                ..Default::default()
            },
        )])),
        package_manager: Some("npm@1.0.0".into()),
        ..Default::default()
    };

    assert_eq!(
        serde_json::to_string_pretty(&pkg).unwrap(),
        r#"{
  "name": "vite",
  "version": "1.2.3",
  "scripts": {
    "build": "vite build"
  },
  "exports": {
    ".": "./mjs/index.mjs",
    "./bin": {
      "import": "./mjs/bin.mjs",
      "require": "./cjs/bin.cjs"
    }
  },
  "dependencies": {
    "@moonrepo/cli": "^1.20",
    "vite": "workspace:*"
  },
  "dependenciesMeta": {
    "vite": {
      "injected": true
    }
  },
  "packageManager": "npm@1.0.0"
}"#
    );
}

#[test]
fn parses_babel() {
    let pkg: PackageJson = serde_json::from_str(
        &fs::read_to_string(locate_fixture("packages").join("babel.json")).unwrap(),
    )
    .unwrap();

    dbg!(pkg);
}

#[test]
fn parses_eslint() {
    let pkg: PackageJson = serde_json::from_str(
        &fs::read_to_string(locate_fixture("packages").join("eslint.json")).unwrap(),
    )
    .unwrap();

    dbg!(pkg);
}

#[test]
fn parses_typescript() {
    let pkg: PackageJson = serde_json::from_str(
        &fs::read_to_string(locate_fixture("packages").join("typescript.json")).unwrap(),
    )
    .unwrap();

    dbg!(pkg);
}

#[test]
fn parses_typescript_eslint() {
    let pkg: PackageJson = serde_json::from_str(
        &fs::read_to_string(locate_fixture("packages").join("typescript-eslint.json")).unwrap(),
    )
    .unwrap();

    dbg!(pkg);
}

#[test]
fn parses_webpack() {
    let pkg: PackageJson = serde_json::from_str(
        &fs::read_to_string(locate_fixture("packages").join("webpack.json")).unwrap(),
    )
    .unwrap();

    dbg!(pkg);
}

#[test]
fn parses_yarn() {
    let pkg: PackageJson = serde_json::from_str(
        &fs::read_to_string(locate_fixture("packages").join("yarn.json")).unwrap(),
    )
    .unwrap();

    dbg!(pkg);
}