123 lines
3.2 KiB
Go
123 lines
3.2 KiB
Go
package packagejson
|
|
|
|
import (
|
|
"github.com/microsoft/typescript-go/internal/collections"
|
|
json "github.com/microsoft/typescript-go/internal/json"
|
|
)
|
|
|
|
type HeaderFields struct {
|
|
Name Expected[string] `json:"name"`
|
|
Version Expected[string] `json:"version"`
|
|
Type Expected[string] `json:"type"`
|
|
}
|
|
|
|
type PathFields struct {
|
|
TSConfig Expected[string] `json:"tsconfig"`
|
|
Main Expected[string] `json:"main"`
|
|
Types Expected[string] `json:"types"`
|
|
Typings Expected[string] `json:"typings"`
|
|
TypesVersions JSONValue `json:"typesVersions"`
|
|
Imports ExportsOrImports `json:"imports"`
|
|
Exports ExportsOrImports `json:"exports"`
|
|
}
|
|
|
|
type DependencyFields struct {
|
|
Dependencies Expected[map[string]string] `json:"dependencies"`
|
|
DevDependencies Expected[map[string]string] `json:"devDependencies"`
|
|
PeerDependencies Expected[map[string]string] `json:"peerDependencies"`
|
|
OptionalDependencies Expected[map[string]string] `json:"optionalDependencies"`
|
|
}
|
|
|
|
// HasDependency returns true if the package.json has a dependency with the given name
|
|
// under any of the dependency fields (dependencies, devDependencies, peerDependencies,
|
|
// optionalDependencies).
|
|
func (df *DependencyFields) HasDependency(name string) bool {
|
|
if deps, ok := df.Dependencies.GetValue(); ok {
|
|
if _, ok := deps[name]; ok {
|
|
return true
|
|
}
|
|
}
|
|
if devDeps, ok := df.DevDependencies.GetValue(); ok {
|
|
if _, ok := devDeps[name]; ok {
|
|
return true
|
|
}
|
|
}
|
|
if peerDeps, ok := df.PeerDependencies.GetValue(); ok {
|
|
if _, ok := peerDeps[name]; ok {
|
|
return true
|
|
}
|
|
}
|
|
if optDeps, ok := df.OptionalDependencies.GetValue(); ok {
|
|
if _, ok := optDeps[name]; ok {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (df *DependencyFields) RangeDependencies(f func(name, version, dependencyField string) bool) {
|
|
if deps, ok := df.Dependencies.GetValue(); ok {
|
|
for name, version := range deps {
|
|
if !f(name, version, "dependencies") {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
if devDeps, ok := df.DevDependencies.GetValue(); ok {
|
|
for name, version := range devDeps {
|
|
if !f(name, version, "devDependencies") {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
if peerDeps, ok := df.PeerDependencies.GetValue(); ok {
|
|
for name, version := range peerDeps {
|
|
if !f(name, version, "peerDependencies") {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
if optDeps, ok := df.OptionalDependencies.GetValue(); ok {
|
|
for name, version := range optDeps {
|
|
if !f(name, version, "optionalDependencies") {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (df *DependencyFields) GetRuntimeDependencyNames() *collections.Set[string] {
|
|
var count int
|
|
deps, _ := df.Dependencies.GetValue()
|
|
count += len(deps)
|
|
peerDeps, _ := df.PeerDependencies.GetValue()
|
|
count += len(peerDeps)
|
|
optDeps, _ := df.OptionalDependencies.GetValue()
|
|
count += len(optDeps)
|
|
names := collections.NewSetWithSizeHint[string](count)
|
|
for name := range deps {
|
|
names.Add(name)
|
|
}
|
|
for name := range peerDeps {
|
|
names.Add(name)
|
|
}
|
|
for name := range optDeps {
|
|
names.Add(name)
|
|
}
|
|
return names
|
|
}
|
|
|
|
type Fields struct {
|
|
HeaderFields
|
|
PathFields
|
|
DependencyFields
|
|
}
|
|
|
|
func Parse(data []byte) (Fields, error) {
|
|
var f Fields
|
|
if err := json.Unmarshal(data, &f, json.AllowDuplicateNames(true)); err != nil {
|
|
return Fields{}, err
|
|
}
|
|
return f, nil
|
|
}
|