remove unused packages

This commit is contained in:
Egor Aristov 2025-10-15 19:21:31 +03:00
parent 4712bb4e56
commit d14eb0a9b7
Signed by: egor3f
GPG Key ID: 40482A264AAEC85F
10 changed files with 0 additions and 816 deletions

View File

@ -1,148 +0,0 @@
package packagejson
import (
"sync"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/diagnostics"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/semver"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath"
)
var typeScriptVersion = semver.MustParse(core.Version())
type PackageJson struct {
Fields
versionPaths VersionPaths
versionTraces []string
once sync.Once
}
func (p *PackageJson) GetVersionPaths(trace func(string)) VersionPaths {
p.once.Do(func() {
if p.Fields.TypesVersions.Type == JSONValueTypeNotPresent {
p.versionTraces = append(p.versionTraces, diagnostics.X_package_json_does_not_have_a_0_field.Format("typesVersions"))
return
}
if p.Fields.TypesVersions.Type != JSONValueTypeObject {
p.versionTraces = append(p.versionTraces, diagnostics.Expected_type_of_0_field_in_package_json_to_be_1_got_2.Format("typesVersions", "object", p.Fields.TypesVersions.Type.String()))
return
}
p.versionTraces = append(p.versionTraces, diagnostics.X_package_json_has_a_typesVersions_field_with_version_specific_path_mappings.Format("typesVersions"))
for key, value := range p.Fields.TypesVersions.AsObject().Entries() {
keyRange, ok := semver.TryParseVersionRange(key)
if !ok {
p.versionTraces = append(p.versionTraces, diagnostics.X_package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range.Format(key))
continue
}
if keyRange.Test(&typeScriptVersion) {
if value.Type != JSONValueTypeObject {
p.versionTraces = append(p.versionTraces, diagnostics.Expected_type_of_0_field_in_package_json_to_be_1_got_2.Format("typesVersions['"+key+"']", "object", value.Type.String()))
return
}
p.versionPaths = VersionPaths{
Version: key,
pathsJSON: value.AsObject(),
}
return
}
}
p.versionTraces = append(p.versionTraces, diagnostics.X_package_json_does_not_have_a_typesVersions_entry_that_matches_version_0.Format(core.VersionMajorMinor()))
})
if trace != nil {
for _, msg := range p.versionTraces {
trace(msg)
}
}
return p.versionPaths
}
type VersionPaths struct {
Version string
pathsJSON *collections.OrderedMap[string, JSONValue]
paths *collections.OrderedMap[string, []string]
}
func (v *VersionPaths) Exists() bool {
return v != nil && v.Version != "" && v.pathsJSON != nil
}
func (v *VersionPaths) GetPaths() *collections.OrderedMap[string, []string] {
if !v.Exists() {
return nil
}
if v.paths != nil {
return v.paths
}
paths := collections.NewOrderedMapWithSizeHint[string, []string](v.pathsJSON.Size())
for key, value := range v.pathsJSON.Entries() {
if value.Type != JSONValueTypeArray {
continue
}
slice := make([]string, len(value.AsArray()))
for i, path := range value.AsArray() {
if path.Type != JSONValueTypeString {
continue
}
slice[i] = path.Value.(string)
}
paths.Set(key, slice)
}
v.paths = paths
return v.paths
}
type InfoCacheEntry struct {
PackageDirectory string
DirectoryExists bool
Contents *PackageJson
}
func (p *InfoCacheEntry) Exists() bool {
return p != nil && p.Contents != nil
}
func (p *InfoCacheEntry) GetContents() *PackageJson {
if p == nil || p.Contents == nil {
return nil
}
return p.Contents
}
func (p *InfoCacheEntry) GetDirectory() string {
if p == nil {
return ""
}
return p.PackageDirectory
}
type InfoCache struct {
cache collections.SyncMap[tspath.Path, *InfoCacheEntry]
currentDirectory string
useCaseSensitiveFileNames bool
}
func NewInfoCache(currentDirectory string, useCaseSensitiveFileNames bool) *InfoCache {
return &InfoCache{
currentDirectory: currentDirectory,
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
}
}
func (p *InfoCache) Get(packageJsonPath string) *InfoCacheEntry {
key := tspath.ToPath(packageJsonPath, p.currentDirectory, p.useCaseSensitiveFileNames)
if value, ok := p.cache.Load(key); ok {
return value
}
return nil
}
func (p *InfoCache) Set(packageJsonPath string, info *InfoCacheEntry) *InfoCacheEntry {
key := tspath.ToPath(packageJsonPath, p.currentDirectory, p.useCaseSensitiveFileNames)
actual, _ := p.cache.LoadOrStore(key, info)
return actual
}

View File

@ -1,75 +0,0 @@
package packagejson
import (
"reflect"
"github.com/go-json-experiment/json"
)
type Expected[T any] struct {
actualJSONType string
Null bool
Valid bool
Value T
}
func (e *Expected[T]) UnmarshalJSON(data []byte) error {
if string(data) == "null" {
*e = Expected[T]{Null: true, actualJSONType: "null"}
return nil
}
if json.Unmarshal(data, &e.Value) == nil {
e.Valid = true
}
switch data[0] {
case '"':
e.actualJSONType = "string"
case 't', 'f':
e.actualJSONType = "boolean"
case '[':
e.actualJSONType = "array"
case '{':
e.actualJSONType = "object"
default:
e.actualJSONType = "number"
}
return nil
}
func (e *Expected[T]) IsPresent() bool {
return e.actualJSONType != ""
}
func (e *Expected[T]) GetValue() (value T, ok bool) {
return e.Value, e.Valid
}
func (e *Expected[T]) IsValid() bool {
return e.Valid
}
func (e *Expected[T]) ExpectedJSONType() string {
switch reflect.TypeFor[T]().Kind() {
case reflect.String:
return "string"
case reflect.Bool:
return "boolean"
case reflect.Slice, reflect.Array:
return "array"
case reflect.Map:
return "object"
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return "number"
default:
return "unknown"
}
}
func (e *Expected[T]) ActualJSONType() string {
return e.actualJSONType
}
func ExpectedOf[T any](value T) Expected[T] {
return Expected[T]{Value: value, Valid: true, actualJSONType: (*Expected[T])(nil).ExpectedJSONType()}
}

View File

@ -1,44 +0,0 @@
package packagejson_test
import (
"testing"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/packagejson"
"github.com/go-json-experiment/json"
"gotest.tools/v3/assert"
)
func TestExpected(t *testing.T) {
t.Parallel()
type packageJson struct {
Name packagejson.Expected[string] `json:"name"`
Version packagejson.Expected[string] `json:"version"`
Exports packagejson.Expected[any] `json:"exports"`
Main packagejson.Expected[string] `json:"main"`
}
var p packageJson
jsonString := `{
"name": "test",
"version": 2,
"exports": null
}`
err := json.Unmarshal([]byte(jsonString), &p)
assert.NilError(t, err)
assert.Equal(t, p.Name.Valid, true)
assert.Equal(t, p.Name.Value, "test")
assert.Equal(t, p.Version.Valid, false)
assert.Equal(t, p.Version.Value, "")
assert.Assert(t, p.Exports.Null)
assert.Equal(t, p.Exports.Valid, false)
assert.Equal(t, p.Main.Valid, false)
assert.Equal(t, p.Main.Null, false)
assert.Equal(t, p.Main.Value, "")
}

View File

@ -1,85 +0,0 @@
package packagejson
import (
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"github.com/go-json-experiment/json"
"github.com/go-json-experiment/json/jsontext"
)
type objectKind int8
const (
objectKindUnknown objectKind = iota
objectKindSubpaths
objectKindConditions
objectKindImports
objectKindInvalid
)
type ExportsOrImports struct {
JSONValue
objectKind objectKind
}
var _ json.UnmarshalerFrom = (*ExportsOrImports)(nil)
func (e *ExportsOrImports) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
return unmarshalJSONValueV2[ExportsOrImports](&e.JSONValue, dec)
}
func (e ExportsOrImports) AsObject() *collections.OrderedMap[string, ExportsOrImports] {
if e.Type != JSONValueTypeObject {
panic("expected object")
}
return e.Value.(*collections.OrderedMap[string, ExportsOrImports])
}
func (e ExportsOrImports) AsArray() []ExportsOrImports {
if e.Type != JSONValueTypeArray {
panic("expected array")
}
return e.Value.([]ExportsOrImports)
}
func (e ExportsOrImports) IsSubpaths() bool {
e.initObjectKind()
return e.objectKind == objectKindSubpaths
}
func (e ExportsOrImports) IsImports() bool {
e.initObjectKind()
return e.objectKind == objectKindImports
}
func (e ExportsOrImports) IsConditions() bool {
e.initObjectKind()
return e.objectKind == objectKindConditions
}
func (e *ExportsOrImports) initObjectKind() {
if e.objectKind == objectKindUnknown && e.Type == JSONValueTypeObject {
if obj := e.AsObject(); obj.Size() > 0 {
seenDot, seenHash, seenOther := false, false, false
for k := range obj.Keys() {
if len(k) > 0 {
seenDot = seenDot || k[0] == '.'
seenHash = seenHash || k[0] == '#'
seenOther = seenOther || (k[0] != '.' && k[0] != '#')
if seenOther && (seenDot || seenHash) {
e.objectKind = objectKindInvalid
return
}
}
}
if seenDot {
e.objectKind = objectKindSubpaths
return
}
if seenHash {
e.objectKind = objectKindImports
return
}
}
e.objectKind = objectKindConditions
}
}

View File

@ -1,62 +0,0 @@
package packagejson_test
import (
"testing"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/packagejson"
"github.com/go-json-experiment/json"
"gotest.tools/v3/assert"
)
func TestExports(t *testing.T) {
t.Parallel()
t.Run("UnmarshalJSONV2", func(t *testing.T) {
t.Parallel()
testExports(t, func(in []byte, out any) error { return json.Unmarshal(in, out) })
})
}
func testExports(t *testing.T, unmarshal func([]byte, any) error) {
type Exports struct {
Imports packagejson.ExportsOrImports `json:"imports"`
Exports packagejson.ExportsOrImports `json:"exports"`
}
var e Exports
jsonString := `{
"imports": {
"#foo": {
"import": "./foo.ts"
}
},
"exports": {
".": {
"import": "./test.ts",
"default": "./test.ts"
},
"./test": [
"./test1.ts",
"./test2.ts",
null
],
"./null": null
}
}`
err := unmarshal([]byte(jsonString), &e)
assert.NilError(t, err)
assert.Assert(t, e.Exports.IsSubpaths())
assert.Equal(t, e.Exports.AsObject().Size(), 3)
assert.Assert(t, e.Exports.AsObject().GetOrZero(".").IsConditions())
assert.Assert(t, e.Exports.AsObject().GetOrZero(".").AsObject().GetOrZero("import").Type == packagejson.JSONValueTypeString)
assert.Equal(t, e.Exports.AsObject().GetOrZero("./test").AsArray()[2].Type, packagejson.JSONValueTypeNull)
assert.Assert(t, e.Exports.AsObject().GetOrZero("./null").Type == packagejson.JSONValueTypeNull)
assert.Assert(t, e.Imports.IsImports())
assert.Equal(t, e.Imports.AsObject().Size(), 1)
assert.Assert(t, e.Imports.AsObject().GetOrZero("#foo").IsConditions())
assert.Assert(t, e.Imports.AsObject().GetOrZero("#foo").AsObject().GetOrZero("import").Type == packagejson.JSONValueTypeString)
}

View File

@ -1,165 +0,0 @@
package packagejson
import (
"fmt"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"github.com/go-json-experiment/json"
"github.com/go-json-experiment/json/jsontext"
)
type JSONValueType int8
const (
JSONValueTypeNotPresent JSONValueType = iota
JSONValueTypeNull
JSONValueTypeString
JSONValueTypeNumber
JSONValueTypeBoolean
JSONValueTypeArray
JSONValueTypeObject
)
func (t JSONValueType) String() string {
switch t {
case JSONValueTypeNull:
return "null"
case JSONValueTypeString:
return "string"
case JSONValueTypeNumber:
return "number"
case JSONValueTypeBoolean:
return "boolean"
case JSONValueTypeArray:
return "array"
case JSONValueTypeObject:
return "object"
default:
return fmt.Sprintf("unknown(%d)", t)
}
}
type JSONValue struct {
Type JSONValueType
Value any
}
func (v *JSONValue) IsFalsy() bool {
switch v.Type {
case JSONValueTypeNotPresent, JSONValueTypeNull:
return true
case JSONValueTypeString:
return v.Value == ""
case JSONValueTypeNumber:
return v.Value == 0
case JSONValueTypeBoolean:
return !v.Value.(bool)
default:
return false
}
}
func (v JSONValue) AsObject() *collections.OrderedMap[string, JSONValue] {
if v.Type != JSONValueTypeObject {
panic(fmt.Sprintf("expected object, got %v", v.Type))
}
return v.Value.(*collections.OrderedMap[string, JSONValue])
}
func (v JSONValue) AsArray() []JSONValue {
if v.Type != JSONValueTypeArray {
panic(fmt.Sprintf("expected array, got %v", v.Type))
}
return v.Value.([]JSONValue)
}
var _ json.UnmarshalerFrom = (*JSONValue)(nil)
func (v *JSONValue) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
return unmarshalJSONValueV2[JSONValue](v, dec)
}
func unmarshalJSONValue[T any](v *JSONValue, data []byte) error {
if string(data) == "null" {
*v = JSONValue{Type: JSONValueTypeNull}
} else if data[0] == '"' {
v.Type = JSONValueTypeString
return json.Unmarshal(data, &v.Value)
} else if data[0] == '[' {
var elements []T
if err := json.Unmarshal(data, &elements); err != nil {
return err
}
v.Type = JSONValueTypeArray
v.Value = elements
} else if data[0] == '{' {
var object collections.OrderedMap[string, T]
if err := json.Unmarshal(data, &object); err != nil {
return err
}
v.Type = JSONValueTypeObject
v.Value = &object
} else if string(data) == "true" {
v.Type = JSONValueTypeBoolean
v.Value = true
} else if string(data) == "false" {
v.Type = JSONValueTypeBoolean
v.Value = false
} else {
v.Type = JSONValueTypeNumber
return json.Unmarshal(data, &v.Value)
}
return nil
}
func unmarshalJSONValueV2[T any](v *JSONValue, dec *jsontext.Decoder) error {
switch dec.PeekKind() {
case 'n': // jsontext.Null.Kind()
if _, err := dec.ReadToken(); err != nil {
return err
}
v.Value = nil
v.Type = JSONValueTypeNull
return nil
case '"':
v.Type = JSONValueTypeString
if err := json.UnmarshalDecode(dec, &v.Value); err != nil {
return err
}
case '[':
if _, err := dec.ReadToken(); err != nil {
return err
}
var elements []T
for dec.PeekKind() != jsontext.EndArray.Kind() {
var element T
if err := json.UnmarshalDecode(dec, &element); err != nil {
return err
}
elements = append(elements, element)
}
if _, err := dec.ReadToken(); err != nil {
return err
}
v.Type = JSONValueTypeArray
v.Value = elements
case '{':
var object collections.OrderedMap[string, T]
if err := json.UnmarshalDecode(dec, &object); err != nil {
return err
}
v.Type = JSONValueTypeObject
v.Value = &object
case 't', 'f': // jsontext.True.Kind(), jsontext.False.Kind()
v.Type = JSONValueTypeBoolean
if err := json.UnmarshalDecode(dec, &v.Value); err != nil {
return err
}
default:
v.Type = JSONValueTypeNumber
if err := json.UnmarshalDecode(dec, &v.Value); err != nil {
return err
}
}
return nil
}

View File

@ -1,83 +0,0 @@
package packagejson_test
import (
"testing"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/packagejson"
"github.com/go-json-experiment/json"
"gotest.tools/v3/assert"
)
func TestJSONValue(t *testing.T) {
t.Parallel()
t.Run("UnmarshalJSONV2", func(t *testing.T) {
t.Parallel()
testJSONValue(t, func(in []byte, out any) error { return json.Unmarshal(in, out) })
})
}
func testJSONValue(t *testing.T, unmarshal func([]byte, any) error) {
type packageJson struct {
Private packagejson.JSONValue `json:"private"`
False packagejson.JSONValue `json:"false"`
Name packagejson.JSONValue `json:"name"`
Version packagejson.JSONValue `json:"version"`
Exports packagejson.JSONValue `json:"exports"`
Imports packagejson.JSONValue `json:"imports"`
NotPresent packagejson.JSONValue `json:"notPresent"`
}
var p packageJson
jsonString := `{
"private": true,
"false": false,
"name": "test",
"version": 2,
"exports": {
".": {
"import": "./test.ts",
"default": "./test.ts"
},
"./test": [
"./test1.ts",
"./test2.ts",
null
],
"./null": null
},
"imports": null
}`
err := unmarshal([]byte(jsonString), &p)
assert.NilError(t, err)
assert.Equal(t, p.Private.Type, packagejson.JSONValueTypeBoolean)
assert.Equal(t, p.Private.Value, true)
assert.Equal(t, p.Name.Type, packagejson.JSONValueTypeString)
assert.Equal(t, p.Name.Value, "test")
assert.Equal(t, p.Version.Type, packagejson.JSONValueTypeNumber)
assert.Equal(t, p.Version.Value, float64(2))
assert.Equal(t, p.Exports.Type, packagejson.JSONValueTypeObject)
assert.Equal(t, p.Exports.AsObject().Size(), 3)
assert.Equal(t, p.Exports.AsObject().GetOrZero(".").Type, packagejson.JSONValueTypeObject)
assert.Equal(t, p.Exports.AsObject().GetOrZero(".").AsObject().GetOrZero("import").Value, "./test.ts")
assert.Equal(t, p.Exports.AsObject().GetOrZero("./test").Type, packagejson.JSONValueTypeArray)
assert.Equal(t, len(p.Exports.AsObject().GetOrZero("./test").AsArray()), 3)
assert.Equal(t, p.Exports.AsObject().GetOrZero("./test").AsArray()[0].Value, "./test1.ts")
assert.Equal(t, p.Exports.AsObject().GetOrZero("./test").AsArray()[1].Value, "./test2.ts")
assert.Equal(t, p.Exports.AsObject().GetOrZero("./test").AsArray()[2].Type, packagejson.JSONValueTypeNull)
assert.Equal(t, p.Exports.AsObject().GetOrZero("./null").Type, packagejson.JSONValueTypeNull)
assert.Equal(t, p.Imports.Type, packagejson.JSONValueTypeNull)
assert.Equal(t, p.Imports.Value, nil)
assert.Equal(t, p.NotPresent.Type, packagejson.JSONValueTypeNotPresent)
assert.Equal(t, p.NotPresent.Value, nil)
}

View File

@ -1,43 +0,0 @@
package packagejson
import (
json "github.com/go-json-experiment/json"
"github.com/go-json-experiment/json/jsontext"
)
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"`
}
type Fields struct {
HeaderFields
PathFields
DependencyFields
}
func Parse(data []byte) (Fields, error) {
var f Fields
if err := json.Unmarshal(data, &f, jsontext.AllowDuplicateNames(true)); err != nil {
return Fields{}, err
}
return f, nil
}

View File

@ -1,103 +0,0 @@
package packagejson_test
import (
"path/filepath"
"testing"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/packagejson"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/parser"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/repo"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/testutil/filefixture"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath"
"github.com/go-json-experiment/json"
"github.com/google/go-cmp/cmp/cmpopts"
"gotest.tools/v3/assert"
)
var packageJsonFixtures = []filefixture.Fixture{
filefixture.FromFile("package.json", filepath.Join(repo.RootPath, "package.json")),
filefixture.FromFile("date-fns.json", filepath.Join(repo.TestDataPath, "fixtures", "packagejson", "date-fns.json")),
}
func BenchmarkPackageJSON(b *testing.B) {
for _, f := range packageJsonFixtures {
f.SkipIfNotExist(b)
content := []byte(f.ReadFile(b))
b.Run("UnmarshalJSON", func(b *testing.B) {
b.Run(f.Name(), func(b *testing.B) {
for b.Loop() {
var p packagejson.Fields
if err := json.Unmarshal(content, &p); err != nil {
b.Fatal(err)
}
}
})
})
b.Run("UnmarshalJSONV2", func(b *testing.B) {
b.Run(f.Name(), func(b *testing.B) {
for b.Loop() {
var p packagejson.Fields
if err := json.Unmarshal(content, &p); err != nil {
b.Fatal(err)
}
}
})
})
b.Run("ParseJSONText", func(b *testing.B) {
b.Run(f.Name(), func(b *testing.B) {
fileName := "/" + f.Name()
for b.Loop() {
parser.ParseSourceFile(ast.SourceFileParseOptions{
FileName: fileName,
Path: tspath.Path(fileName),
}, string(content), core.ScriptKindJSON)
}
})
})
}
}
func TestParse(t *testing.T) {
t.Parallel()
tests := []struct {
name string
content string
want packagejson.Fields
}{
{
name: "duplicate names",
content: `{
"name": "test-package",
"name": "test-package",
"version": "1.0.0"
}`,
want: packagejson.Fields{
HeaderFields: packagejson.HeaderFields{
Name: packagejson.ExpectedOf("test-package"),
Version: packagejson.ExpectedOf("1.0.0"),
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
got, err := packagejson.Parse([]byte(tt.content))
assert.NilError(t, err)
assert.DeepEqual(t, got, tt.want, cmpopts.IgnoreUnexported(
packagejson.Fields{},
packagejson.HeaderFields{},
packagejson.Expected[string]{},
packagejson.Expected[map[string]string]{},
packagejson.ExportsOrImports{},
))
})
}
}

View File

@ -1,8 +0,0 @@
package packagejson
type TypeValidatedField interface {
IsPresent() bool
IsValid() bool
ExpectedJSONType() string
ActualJSONType() string
}