# `NPM.Package.License`
[🔗](https://github.com/elixir-volt/npm_ex/blob/v0.7.4/lib/npm/package/license.ex#L1)

Scans and reports licenses across the dependency tree.

Reads `license` fields from package manifests to produce
compliance reports and detect potential issues.

# `license_entry`

```elixir
@type license_entry() :: %{
  package: String.t(),
  version: String.t(),
  license: String.t() | nil
}
```

# `check_policy`

```elixir
@spec check_policy([license_entry()], [String.t()]) :: [license_entry()]
```

Checks entries against a list of allowed licenses.
Returns packages that violate the policy.

# `extract`

```elixir
@spec extract(map()) :: String.t() | nil
```

Extracts the license from a package.json data map.

Handles both string `license` and legacy `licenses` array.

# `group_by_license`

```elixir
@spec group_by_license([license_entry()]) :: %{
  required(String.t()) =&gt; [license_entry()]
}
```

Groups license entries by license type.

# `non_permissive`

```elixir
@spec non_permissive([license_entry()]) :: [license_entry()]
```

Finds packages with non-permissive or unknown licenses.

# `permissive?`

```elixir
@spec permissive?(String.t() | nil) :: boolean()
```

Checks if a license is considered permissive.

# `scan`

```elixir
@spec scan(String.t()) :: [license_entry()]
```

Scans a node_modules directory for license information.

# `summary`

```elixir
@spec summary([license_entry()]) :: %{
  total: non_neg_integer(),
  permissive: non_neg_integer(),
  non_permissive: non_neg_integer(),
  unknown: non_neg_integer(),
  unique_licenses: [String.t()]
}
```

Returns a compliance summary.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
