mirror of
https://github.com/sourcegraph/sourcegraph.git
synced 2026-02-06 18:31:54 +00:00
Spell npm consistently. (#32575)
- Spelled as Npm or NPM depending on local case convention. For local variables and in types, Npm should be preferred. For fully uppercase spellings, NPM should be used. - Default to spelling it as npm otherwise. This matches the convention in the npm/cli code and the recommendation in the npm/cli README.
This commit is contained in:
parent
2d7b8b1549
commit
73e054d477
@ -1735,7 +1735,7 @@ This is `3.12.8` release with internal infrastructure fixes to publish the docke
|
||||
- Global settings can be configured from a local file using the environment variable `GLOBAL_SETTINGS_FILE`.
|
||||
- High-level health metrics and dashboards have been added to Sourcegraph's monitoring (found under the **Site admin** -> **Monitoring** area). [#7216](https://github.com/sourcegraph/sourcegraph/pull/7216)
|
||||
- Logging for GraphQL API requests not issued by Sourcegraph is now much more verbose, allowing for easier debugging of problematic queries and where they originate from. [#5706](https://github.com/sourcegraph/sourcegraph/issues/5706)
|
||||
- A new campaign type finds and removes leaked NPM credentials. [#6893](https://github.com/sourcegraph/sourcegraph/pull/6893)
|
||||
- A new campaign type finds and removes leaked npm credentials. [#6893](https://github.com/sourcegraph/sourcegraph/pull/6893)
|
||||
- Campaigns can now be retried to create failed changesets due to ephemeral errors (e.g. network problems when creating a pull request on GitHub). [#6718](https://github.com/sourcegraph/sourcegraph/issues/6718)
|
||||
- The initial release of [structural code search](https://docs.sourcegraph.com/code_search/reference/structural).
|
||||
|
||||
|
||||
@ -171,12 +171,12 @@ export const predicateCompletion = (field: string): Completion[] => {
|
||||
asSnippet: true,
|
||||
},
|
||||
{
|
||||
label: 'deps(...) Includes NPM dependencies only (beta)',
|
||||
label: 'deps(...) Includes npm dependencies only (beta)',
|
||||
insertText: 'deps(${1})',
|
||||
asSnippet: true,
|
||||
},
|
||||
{
|
||||
label: 'dependencies(...) Includes NPM dependencies only (beta)',
|
||||
label: 'dependencies(...) Includes npm dependencies only (beta)',
|
||||
insertText: 'dependencies(${1})',
|
||||
asSnippet: true,
|
||||
},
|
||||
|
||||
@ -1240,10 +1240,10 @@ const PAGURE: AddExternalServiceOptions = {
|
||||
|
||||
const NPM_PACKAGES: AddExternalServiceOptions = {
|
||||
kind: ExternalServiceKind.NPMPACKAGES,
|
||||
title: 'NPM Dependencies',
|
||||
title: 'npm Dependencies',
|
||||
icon: NpmIcon,
|
||||
jsonSchema: npmPackagesSchemaJSON,
|
||||
defaultDisplayName: 'NPM Dependencies',
|
||||
defaultDisplayName: 'npm Dependencies',
|
||||
defaultConfig: `{
|
||||
"registry": "https://registry.npmjs.org",
|
||||
"dependencies": []
|
||||
@ -1252,7 +1252,7 @@ const NPM_PACKAGES: AddExternalServiceOptions = {
|
||||
<div>
|
||||
<ol>
|
||||
<li>
|
||||
In the configuration below, set <Field>registry</Field> to the applicable NPM registry. For example,
|
||||
In the configuration below, set <Field>registry</Field> to the applicable npm registry. For example,
|
||||
<code>"https://registry.npmjs.mycompany.com"</code> or <code>"https://registry.npmjs.org"</code>.
|
||||
Note that this URL may not be the same as where packages can be searched (such as{' '}
|
||||
<code>https://www.npmjs.org</code>). If you're unsure about the exact URL URL for a custom registry,
|
||||
|
||||
@ -394,12 +394,12 @@ func getVCSSyncer(ctx context.Context, externalServiceStore database.ExternalSer
|
||||
return nil, err
|
||||
}
|
||||
return &server.JVMPackagesSyncer{Config: &c, DepsStore: codeintelDB}, nil
|
||||
case extsvc.TypeNPMPackages:
|
||||
var c schema.NPMPackagesConnection
|
||||
case extsvc.TypeNpmPackages:
|
||||
var c schema.NpmPackagesConnection
|
||||
if err := extractOptions(&c); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return server.NewNPMPackagesSyncer(c, codeintelDB, nil), nil
|
||||
return server.NewNpmPackagesSyncer(c, codeintelDB, nil), nil
|
||||
}
|
||||
return &server.GitRepoSyncer{}, nil
|
||||
}
|
||||
|
||||
@ -23,9 +23,9 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
placeholderNPMDependency = &reposource.NPMDependency{
|
||||
NPMPackage: func() *reposource.NPMPackage {
|
||||
pkg, err := reposource.NewNPMPackage("sourcegraph", "placeholder")
|
||||
placeholderNpmDependency = &reposource.NpmDependency{
|
||||
NpmPackage: func() *reposource.NpmPackage {
|
||||
pkg, err := reposource.NewNpmPackage("sourcegraph", "placeholder")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("expected placeholder package to parse but got %v", err))
|
||||
}
|
||||
@ -35,51 +35,51 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
type NPMPackagesSyncer struct {
|
||||
// Configuration object describing the connection to the NPM registry.
|
||||
connection schema.NPMPackagesConnection
|
||||
type NpmPackagesSyncer struct {
|
||||
// Configuration object describing the connection to the npm registry.
|
||||
connection schema.NpmPackagesConnection
|
||||
depsStore repos.DependenciesStore
|
||||
// The client to use for making queries against NPM.
|
||||
// The client to use for making queries against npm.
|
||||
client npm.Client
|
||||
}
|
||||
|
||||
// Create a new NPMPackagesSyncer. If customClient is nil, the client
|
||||
// Create a new NpmPackagesSyncer. If customClient is nil, the client
|
||||
// for the syncer is configured based on the connection parameter.
|
||||
func NewNPMPackagesSyncer(
|
||||
connection schema.NPMPackagesConnection,
|
||||
func NewNpmPackagesSyncer(
|
||||
connection schema.NpmPackagesConnection,
|
||||
dbStore repos.DependenciesStore,
|
||||
customClient npm.Client,
|
||||
) *NPMPackagesSyncer {
|
||||
) *NpmPackagesSyncer {
|
||||
var client = customClient
|
||||
if client == nil {
|
||||
client = npm.NewHTTPClient(connection.Registry, connection.RateLimit, connection.Credentials)
|
||||
}
|
||||
return &NPMPackagesSyncer{connection, dbStore, client}
|
||||
return &NpmPackagesSyncer{connection, dbStore, client}
|
||||
}
|
||||
|
||||
var _ VCSSyncer = &NPMPackagesSyncer{}
|
||||
var _ VCSSyncer = &NpmPackagesSyncer{}
|
||||
|
||||
func (s *NPMPackagesSyncer) Type() string {
|
||||
func (s *NpmPackagesSyncer) Type() string {
|
||||
return "npm_packages"
|
||||
}
|
||||
|
||||
// IsCloneable always returns nil for NPM package repos. We check which versions of a
|
||||
// IsCloneable always returns nil for Npm package repos. We check which versions of a
|
||||
// package are cloneable in Fetch, and clone those, ignoring versions that are not
|
||||
// cloneable.
|
||||
func (s *NPMPackagesSyncer) IsCloneable(ctx context.Context, remoteURL *vcs.URL) error {
|
||||
func (s *NpmPackagesSyncer) IsCloneable(ctx context.Context, remoteURL *vcs.URL) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Similar to CloneCommand for JVMPackagesSyncer; it handles cloning itself
|
||||
// instead of returning a command that does the cloning.
|
||||
func (s *NPMPackagesSyncer) CloneCommand(ctx context.Context, remoteURL *vcs.URL, bareGitDirectory string) (*exec.Cmd, error) {
|
||||
func (s *NpmPackagesSyncer) CloneCommand(ctx context.Context, remoteURL *vcs.URL, bareGitDirectory string) (*exec.Cmd, error) {
|
||||
err := os.MkdirAll(bareGitDirectory, 0755)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cmd := exec.CommandContext(ctx, "git", "--bare", "init")
|
||||
if _, err := runCommandInDirectory(ctx, cmd, bareGitDirectory, placeholderNPMDependency); err != nil {
|
||||
if _, err := runCommandInDirectory(ctx, cmd, bareGitDirectory, placeholderNpmDependency); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ func (s *NPMPackagesSyncer) CloneCommand(ctx context.Context, remoteURL *vcs.URL
|
||||
|
||||
// Fetch adds git tags for newly added dependency versions and removes git tags
|
||||
// for deleted versions.
|
||||
func (s *NPMPackagesSyncer) Fetch(ctx context.Context, remoteURL *vcs.URL, dir GitDir) error {
|
||||
func (s *NpmPackagesSyncer) Fetch(ctx context.Context, remoteURL *vcs.URL, dir GitDir) error {
|
||||
dependencies, err := s.packageDependencies(ctx, remoteURL.Path)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -116,7 +116,7 @@ func (s *NPMPackagesSyncer) Fetch(ctx context.Context, remoteURL *vcs.URL, dir G
|
||||
|
||||
dependencies = cloneable
|
||||
|
||||
out, err := runCommandInDirectory(ctx, exec.CommandContext(ctx, "git", "tag"), string(dir), placeholderNPMDependency)
|
||||
out, err := runCommandInDirectory(ctx, exec.CommandContext(ctx, "git", "tag"), string(dir), placeholderNpmDependency)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -147,7 +147,7 @@ func (s *NPMPackagesSyncer) Fetch(ctx context.Context, remoteURL *vcs.URL, dir G
|
||||
for tag := range tags {
|
||||
if _, isDependencyTag := dependencyTags[tag]; !isDependencyTag {
|
||||
cmd := exec.CommandContext(ctx, "git", "tag", "-d", tag)
|
||||
if _, err := runCommandInDirectory(ctx, cmd, string(dir), placeholderNPMDependency); err != nil {
|
||||
if _, err := runCommandInDirectory(ctx, cmd, string(dir), placeholderNpmDependency); err != nil {
|
||||
log15.Error("Failed to delete git tag", "error", err, "tag", tag)
|
||||
continue
|
||||
}
|
||||
@ -158,25 +158,25 @@ func (s *NPMPackagesSyncer) Fetch(ctx context.Context, remoteURL *vcs.URL, dir G
|
||||
}
|
||||
|
||||
// RemoteShowCommand returns the command to be executed for showing remote.
|
||||
func (s *NPMPackagesSyncer) RemoteShowCommand(ctx context.Context, remoteURL *vcs.URL) (cmd *exec.Cmd, err error) {
|
||||
func (s *NpmPackagesSyncer) RemoteShowCommand(ctx context.Context, remoteURL *vcs.URL) (cmd *exec.Cmd, err error) {
|
||||
return exec.CommandContext(ctx, "git", "remote", "show", "./"), nil
|
||||
}
|
||||
|
||||
// packageDependencies returns the list of NPM dependencies that belong to the
|
||||
// packageDependencies returns the list of npm dependencies that belong to the
|
||||
// given URL path. The returned package dependencies are sorted in descending
|
||||
// semver order (newest first).
|
||||
//
|
||||
// For example, if the URL path represents pkg@1, and our configuration has
|
||||
// [otherPkg@1, pkg@2, pkg@3], we will return [pkg@3, pkg@2].
|
||||
func (s *NPMPackagesSyncer) packageDependencies(ctx context.Context, repoUrlPath string) (matchingDependencies []*reposource.NPMDependency, err error) {
|
||||
repoPackage, err := reposource.ParseNPMPackageFromRepoURL(repoUrlPath)
|
||||
func (s *NpmPackagesSyncer) packageDependencies(ctx context.Context, repoUrlPath string) (matchingDependencies []*reposource.NpmDependency, err error) {
|
||||
repoPackage, err := reposource.ParseNpmPackageFromRepoURL(repoUrlPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, configDependencyString := range s.npmDependencies() {
|
||||
if repoPackage.MatchesDependencyString(configDependencyString) {
|
||||
dep, err := reposource.ParseNPMDependency(configDependencyString)
|
||||
dep, err := reposource.ParseNpmDependency(configDependencyString)
|
||||
if err != nil {
|
||||
log15.Warn("skipping malformed npm dependency", "package", configDependencyString, "error", err)
|
||||
continue
|
||||
@ -186,7 +186,7 @@ func (s *NPMPackagesSyncer) packageDependencies(ctx context.Context, repoUrlPath
|
||||
}
|
||||
|
||||
dbDeps, err := s.depsStore.ListDependencyRepos(ctx, dependenciesStore.ListDependencyReposOpts{
|
||||
Scheme: dependenciesStore.NPMPackagesScheme,
|
||||
Scheme: dependenciesStore.NpmPackagesScheme,
|
||||
Name: repoPackage.PackageSyntax(),
|
||||
NewestFirst: true,
|
||||
})
|
||||
@ -195,28 +195,28 @@ func (s *NPMPackagesSyncer) packageDependencies(ctx context.Context, repoUrlPath
|
||||
}
|
||||
|
||||
for _, dbDep := range dbDeps {
|
||||
parsedDbPackage, err := reposource.ParseNPMPackageFromPackageSyntax(dbDep.Name)
|
||||
parsedDbPackage, err := reposource.ParseNpmPackageFromPackageSyntax(dbDep.Name)
|
||||
if err != nil {
|
||||
log15.Warn("skipping malformed npm dependency", "package", dbDep.Name, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
matchingDependencies = append(matchingDependencies, &reposource.NPMDependency{
|
||||
NPMPackage: parsedDbPackage,
|
||||
matchingDependencies = append(matchingDependencies, &reposource.NpmDependency{
|
||||
NpmPackage: parsedDbPackage,
|
||||
Version: dbDep.Version,
|
||||
})
|
||||
}
|
||||
|
||||
if len(matchingDependencies) == 0 {
|
||||
return nil, errors.Errorf("no NPM dependencies for URL path %s", repoUrlPath)
|
||||
return nil, errors.Errorf("no npm dependencies for URL path %s", repoUrlPath)
|
||||
}
|
||||
|
||||
reposource.SortNPMDependencies(matchingDependencies)
|
||||
reposource.SortNpmDependencies(matchingDependencies)
|
||||
|
||||
return matchingDependencies, nil
|
||||
}
|
||||
|
||||
func (s *NPMPackagesSyncer) npmDependencies() []string {
|
||||
func (s *NpmPackagesSyncer) npmDependencies() []string {
|
||||
if s.connection.Dependencies == nil {
|
||||
return nil
|
||||
}
|
||||
@ -227,7 +227,7 @@ func (s *NPMPackagesSyncer) npmDependencies() []string {
|
||||
// tag points to a commit that adds all sources of given dependency. When
|
||||
// isLatestVersion is true, the HEAD of the bare git directory will also be
|
||||
// updated to point to the same commit as the git tag.
|
||||
func (s *NPMPackagesSyncer) gitPushDependencyTag(ctx context.Context, bareGitDirectory string, dependency *reposource.NPMDependency, isLatestVersion bool) error {
|
||||
func (s *NpmPackagesSyncer) gitPushDependencyTag(ctx context.Context, bareGitDirectory string, dependency *reposource.NpmDependency, isLatestVersion bool) error {
|
||||
tmpDirectory, err := os.MkdirTemp("", "npm-")
|
||||
if err != nil {
|
||||
return err
|
||||
@ -273,7 +273,7 @@ func (s *NPMPackagesSyncer) gitPushDependencyTag(ctx context.Context, bareGitDir
|
||||
|
||||
// commitTgz initializes a git repository in the given working directory and creates
|
||||
// a git commit in that contains all the file contents of the given tgz.
|
||||
func (s *NPMPackagesSyncer) commitTgz(ctx context.Context, dependency *reposource.NPMDependency,
|
||||
func (s *NpmPackagesSyncer) commitTgz(ctx context.Context, dependency *reposource.NpmDependency,
|
||||
workingDirectory string, tgz io.Reader) error {
|
||||
if err := decompressTgz(tgz, workingDirectory); err != nil {
|
||||
return errors.Wrapf(err, "failed to decompress gzipped tarball for %s", dependency.PackageManagerSyntax())
|
||||
@ -343,7 +343,7 @@ func decompressTgz(tgz io.Reader, destination string) error {
|
||||
// stripSingleOutermostDirectory strips a single outermost directory in dir
|
||||
// if it has no sibling files or directories.
|
||||
//
|
||||
// In practice, NPM tarballs seem to contain a superfluous directory which
|
||||
// In practice, npm tarballs seem to contain a superfluous directory which
|
||||
// contains the files. For example, if you extract react's tarball,
|
||||
// all files will be under a package/ directory, and if you extract
|
||||
// @types/lodash's files, all files are under lodash/.
|
||||
|
||||
@ -33,16 +33,16 @@ const (
|
||||
exampleJSFilepath = "Example.js"
|
||||
exampleTSFileContents = "export X; interface X { x: number }"
|
||||
exampleJSFileContents = "var x = 1; var y = 'hello'; x = y;"
|
||||
exampleNPMVersion = "1.0.0"
|
||||
exampleNPMVersion2 = "2.0.0-abc"
|
||||
exampleNPMVersionedPackage = "example@1.0.0"
|
||||
exampleNPMVersionedPackage2 = "example@2.0.0-abc"
|
||||
exampleNpmVersion = "1.0.0"
|
||||
exampleNpmVersion2 = "2.0.0-abc"
|
||||
exampleNpmVersionedPackage = "example@1.0.0"
|
||||
exampleNpmVersionedPackage2 = "example@2.0.0-abc"
|
||||
exampleTgz = "example-1.0.0.tgz"
|
||||
exampleTgz2 = "example-2.0.0-abc.tgz"
|
||||
exampleNPMPackageURL = "npm/example"
|
||||
exampleNpmPackageURL = "npm/example"
|
||||
)
|
||||
|
||||
func TestNoMaliciousFilesNPM(t *testing.T) {
|
||||
func TestNoMaliciousFilesNpm(t *testing.T) {
|
||||
dir, err := os.MkdirTemp("", "")
|
||||
assert.Nil(t, err)
|
||||
defer os.RemoveAll(dir)
|
||||
@ -52,15 +52,15 @@ func TestNoMaliciousFilesNPM(t *testing.T) {
|
||||
|
||||
tgz := bytes.NewReader(createMaliciousTgz(t))
|
||||
|
||||
s := NewNPMPackagesSyncer(
|
||||
schema.NPMPackagesConnection{Dependencies: []string{}},
|
||||
s := NewNpmPackagesSyncer(
|
||||
schema.NpmPackagesConnection{Dependencies: []string{}},
|
||||
NewMockDependenciesStore(),
|
||||
nil,
|
||||
)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
cancel() // cancel now to prevent any network IO
|
||||
|
||||
dep := &reposource.NPMDependency{NPMPackage: &reposource.NPMPackage{}}
|
||||
dep := &reposource.NpmDependency{NpmPackage: &reposource.NpmPackage{}}
|
||||
err = s.commitTgz(ctx, dep, extractPath, tgz)
|
||||
require.NotNil(t, err, "malicious tarball should not be committed successfully")
|
||||
|
||||
@ -86,7 +86,7 @@ func createMaliciousTgz(t *testing.T) []byte {
|
||||
return createTgz(t, fileInfos)
|
||||
}
|
||||
|
||||
func TestNPMCloneCommand(t *testing.T) {
|
||||
func TestNpmCloneCommand(t *testing.T) {
|
||||
dir, err := os.MkdirTemp("", "")
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -101,71 +101,71 @@ func TestNPMCloneCommand(t *testing.T) {
|
||||
Packages: map[string]*npm.PackageInfo{
|
||||
"example": {
|
||||
Versions: map[string]*npm.DependencyInfo{
|
||||
exampleNPMVersion: {
|
||||
Dist: npm.DependencyInfoDist{TarballURL: exampleNPMVersion},
|
||||
exampleNpmVersion: {
|
||||
Dist: npm.DependencyInfoDist{TarballURL: exampleNpmVersion},
|
||||
},
|
||||
exampleNPMVersion2: {
|
||||
Dist: npm.DependencyInfoDist{TarballURL: exampleNPMVersion2},
|
||||
exampleNpmVersion2: {
|
||||
Dist: npm.DependencyInfoDist{TarballURL: exampleNpmVersion2},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Tarballs: map[string][]byte{
|
||||
exampleNPMVersion: tgz1,
|
||||
exampleNPMVersion2: tgz2,
|
||||
exampleNpmVersion: tgz1,
|
||||
exampleNpmVersion2: tgz2,
|
||||
},
|
||||
}
|
||||
s := NewNPMPackagesSyncer(
|
||||
schema.NPMPackagesConnection{Dependencies: []string{}},
|
||||
s := NewNpmPackagesSyncer(
|
||||
schema.NpmPackagesConnection{Dependencies: []string{}},
|
||||
NewMockDependenciesStore(),
|
||||
&client,
|
||||
)
|
||||
bareGitDirectory := path.Join(dir, "git")
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{exampleNPMVersionedPackage})
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{exampleNpmVersionedPackage})
|
||||
checkSingleTag := func() {
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "tag", "--list"),
|
||||
bareGitDirectory,
|
||||
fmt.Sprintf("v%s\n", exampleNPMVersion))
|
||||
fmt.Sprintf("v%s\n", exampleNpmVersion))
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNPMVersion, exampleJSFilepath)),
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNpmVersion, exampleJSFilepath)),
|
||||
bareGitDirectory,
|
||||
exampleJSFileContents,
|
||||
)
|
||||
}
|
||||
checkSingleTag()
|
||||
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{exampleNPMVersionedPackage, exampleNPMVersionedPackage2})
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{exampleNpmVersionedPackage, exampleNpmVersionedPackage2})
|
||||
checkTagAdded := func() {
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "tag", "--list"),
|
||||
bareGitDirectory,
|
||||
fmt.Sprintf("v%s\nv%s\n", exampleNPMVersion, exampleNPMVersion2), // verify that a new tag was added
|
||||
fmt.Sprintf("v%s\nv%s\n", exampleNpmVersion, exampleNpmVersion2), // verify that a new tag was added
|
||||
)
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNPMVersion, exampleJSFilepath)),
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNpmVersion, exampleJSFilepath)),
|
||||
bareGitDirectory,
|
||||
exampleJSFileContents,
|
||||
)
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNPMVersion2, exampleTSFilepath)),
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNpmVersion2, exampleTSFilepath)),
|
||||
bareGitDirectory,
|
||||
exampleTSFileContents,
|
||||
)
|
||||
}
|
||||
checkTagAdded()
|
||||
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{exampleNPMVersionedPackage})
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{exampleNpmVersionedPackage})
|
||||
checkTagRemoved := func() {
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNPMVersion, exampleJSFilepath)),
|
||||
exec.Command("git", "show", fmt.Sprintf("v%s:%s", exampleNpmVersion, exampleJSFilepath)),
|
||||
bareGitDirectory,
|
||||
exampleJSFileContents,
|
||||
)
|
||||
assertCommandOutput(t,
|
||||
exec.Command("git", "tag", "--list"),
|
||||
bareGitDirectory,
|
||||
fmt.Sprintf("v%s\n", exampleNPMVersion), // verify that second tag has been removed.
|
||||
fmt.Sprintf("v%s\n", exampleNpmVersion), // verify that second tag has been removed.
|
||||
)
|
||||
}
|
||||
checkTagRemoved()
|
||||
@ -175,14 +175,14 @@ func TestNPMCloneCommand(t *testing.T) {
|
||||
s.depsStore = mockStore
|
||||
|
||||
mockStore.ListDependencyReposFunc.PushReturn([]dependenciesStore.DependencyRepo{
|
||||
{ID: 0, Name: "example", Version: exampleNPMVersion},
|
||||
{ID: 0, Name: "example", Version: exampleNpmVersion},
|
||||
}, nil)
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{})
|
||||
checkSingleTag()
|
||||
|
||||
mockStore.ListDependencyReposFunc.PushReturn([]dependenciesStore.DependencyRepo{
|
||||
{ID: 0, Name: "example", Version: exampleNPMVersion},
|
||||
{ID: 1, Name: "example", Version: exampleNPMVersion2},
|
||||
{ID: 0, Name: "example", Version: exampleNpmVersion},
|
||||
{ID: 1, Name: "example", Version: exampleNpmVersion2},
|
||||
}, nil)
|
||||
s.runCloneCommand(t, bareGitDirectory, []string{})
|
||||
checkTagAdded()
|
||||
@ -194,9 +194,9 @@ func TestNPMCloneCommand(t *testing.T) {
|
||||
checkTagRemoved()
|
||||
}
|
||||
|
||||
func (s NPMPackagesSyncer) runCloneCommand(t *testing.T, bareGitDirectory string, dependencies []string) {
|
||||
func (s NpmPackagesSyncer) runCloneCommand(t *testing.T, bareGitDirectory string, dependencies []string) {
|
||||
t.Helper()
|
||||
packageURL := vcs.URL{URL: url.URL{Path: exampleNPMPackageURL}}
|
||||
packageURL := vcs.URL{URL: url.URL{Path: exampleNpmPackageURL}}
|
||||
s.connection.Dependencies = dependencies
|
||||
cmd, err := s.CloneCommand(context.Background(), &packageURL, bareGitDirectory)
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -79,7 +79,7 @@ func isPotentiallyMaliciousFilepathInArchive(filepath, destinationDir string) (o
|
||||
// the JDK or whether it's a regular Maven artifact. For the JDK, lsif-java
|
||||
// has a special case to emit "export" monikers instead of "import".
|
||||
//
|
||||
// This doesn't apply to JS/S because there is no special NPM module
|
||||
// This doesn't apply to JS/S because there is no special npm module
|
||||
// analogous to the JDK.
|
||||
//
|
||||
// 3. The lsif-java.json file is used as a marker file to enable inference
|
||||
|
||||
@ -256,7 +256,7 @@ func TestServer_RepoLookup(t *testing.T) {
|
||||
}
|
||||
|
||||
npmSource := types.ExternalService{
|
||||
Kind: extsvc.KindNPMPackages,
|
||||
Kind: extsvc.KindNpmPackages,
|
||||
Config: `{}`,
|
||||
}
|
||||
|
||||
@ -355,8 +355,8 @@ func TestServer_RepoLookup(t *testing.T) {
|
||||
URI: "npm/package",
|
||||
ExternalRepo: api.ExternalRepoSpec{
|
||||
ID: "npm/package",
|
||||
ServiceType: extsvc.TypeNPMPackages,
|
||||
ServiceID: extsvc.TypeNPMPackages,
|
||||
ServiceType: extsvc.TypeNpmPackages,
|
||||
ServiceID: extsvc.TypeNpmPackages,
|
||||
},
|
||||
Sources: map[string]*types.SourceInfo{
|
||||
npmSource.URN(): {
|
||||
@ -364,8 +364,8 @@ func TestServer_RepoLookup(t *testing.T) {
|
||||
CloneURL: "npm/package",
|
||||
},
|
||||
},
|
||||
Metadata: &npmpackages.Metadata{Package: func() *reposource.NPMPackage {
|
||||
p, _ := reposource.NewNPMPackage("", "package")
|
||||
Metadata: &npmpackages.Metadata{Package: func() *reposource.NpmPackage {
|
||||
p, _ := reposource.NewNpmPackage("", "package")
|
||||
return p
|
||||
}()},
|
||||
}
|
||||
|
||||
@ -88,11 +88,11 @@ func TestSearch(t *testing.T) {
|
||||
|
||||
testSearchOther(t)
|
||||
|
||||
// This test runs after all others because its adds a NPM external service
|
||||
// This test runs after all others because its adds a npm external service
|
||||
// which expands the set of repositories in the instance. All previous tests
|
||||
// assume only the repos from gqltest-github-search exist.
|
||||
//
|
||||
// Adding and deleting the NPM external service in between all other tests is
|
||||
// Adding and deleting the npm external service in between all other tests is
|
||||
// flaky since deleting an external service doesn't cancel a running external
|
||||
// service sync job for it.
|
||||
t.Run("repo:deps", testDependenciesSearch(client, streamClient))
|
||||
@ -1384,9 +1384,9 @@ func testDependenciesSearch(client, streamClient searchClient) func(*testing.T)
|
||||
}
|
||||
|
||||
_, err = client.AddExternalService(gqltestutil.AddExternalServiceInput{
|
||||
Kind: extsvc.KindNPMPackages,
|
||||
Kind: extsvc.KindNpmPackages,
|
||||
DisplayName: "gqltest-npm-search",
|
||||
Config: mustMarshalJSONString(&schema.NPMPackagesConnection{
|
||||
Config: mustMarshalJSONString(&schema.NpmPackagesConnection{
|
||||
Registry: "https://registry.npmjs.org",
|
||||
Dependencies: []string{
|
||||
"urql@2.2.0", // We're searching the dependencies of this repo.
|
||||
@ -1397,7 +1397,7 @@ func testDependenciesSearch(client, streamClient searchClient) func(*testing.T)
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Set up a NPM external service to test dependencies search
|
||||
// Set up a npm external service to test dependencies search
|
||||
t.Cleanup(func() {
|
||||
if err := client.UpdateSiteConfiguration(&oldConfig); err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
4
doc/admin/observability/dashboards.md
generated
4
doc/admin/observability/dashboards.md
generated
@ -4661,7 +4661,7 @@ Query: `sum by (op)(increase(src_codeintel_coursier_errors_total{op!="RunCommand
|
||||
|
||||
<br />
|
||||
|
||||
### Git Server: Codeintel: NPM invocation stats
|
||||
### Git Server: Codeintel: npm invocation stats
|
||||
|
||||
#### gitserver: codeintel_npm_total
|
||||
|
||||
@ -11444,7 +11444,7 @@ Query: `sum by (op)(increase(src_codeintel_coursier_errors_total{op!="RunCommand
|
||||
|
||||
<br />
|
||||
|
||||
### Repo Updater: Codeintel: NPM invocation stats
|
||||
### Repo Updater: Codeintel: npm invocation stats
|
||||
|
||||
#### repo-updater: codeintel_npm_total
|
||||
|
||||
|
||||
@ -52,7 +52,7 @@ Examples:
|
||||
|
||||
Searching for "Router" and getting result count:
|
||||
|
||||
$ echo 'query($query: String!) { search(query: $query) { results { matchCount } } }' | src api 'query=Router'
|
||||
$ echo 'query($query: String!) { search(query: $query) { results { resultCount } } }' | src api 'query=Router'
|
||||
|
||||
Get the curl command for a query (just add '-get-curl' in the flags section):
|
||||
|
||||
|
||||
@ -61,7 +61,7 @@ indexing_jobs:
|
||||
- root: <ancestor(dir)>
|
||||
image: sourcegraph/lsif-node:autoindex
|
||||
commands:
|
||||
# NPM is used to resolve dependencies otherwise.
|
||||
# npm is used to resolve dependencies otherwise.
|
||||
- npm install
|
||||
- ...
|
||||
local_steps:
|
||||
|
||||
@ -57,7 +57,7 @@ Note that the extension host execution context varies depending on the client ap
|
||||
### Publishing
|
||||
|
||||
- Once you've opened a PR and received feedback and approval, bump the sourcegraph extension API version. Be sure to follow [semantic versioning](https://semver.org/).
|
||||
- Once your PR is merged into `main`, publish the new extension API to NPM.
|
||||
- Once your PR is merged into `main`, publish the new extension API to npm.
|
||||
- If necessary, update [extension-api-stubs](https://github.com/sourcegraph/extension-api-stubs) to reflect the latest version of the extension API.
|
||||
- Upgrade any extensions you've written to the latest version. Be sure to CHECK that the Sourcegraph extension host that loads your extension supports this feature ([example](https://sourcegraph.com/github.com/codecov/sourcegraph-codecov@19a302e7dccb48b4fe910f1862309e434cf76bb8/-/blob/src/extension.ts#L225-227)).
|
||||
- Sourcegraph.com will support this new feature (almost) immediately
|
||||
|
||||
@ -139,7 +139,7 @@ Default pipeline:
|
||||
- E2E for chrome extension
|
||||
- Extension release
|
||||
- Extension release
|
||||
- NPM Release
|
||||
- npm Release
|
||||
- Upload build trace
|
||||
|
||||
### Main branch
|
||||
|
||||
@ -90,4 +90,4 @@ You can view our components:
|
||||
|
||||
### *Can I use these components in a different codebase?*
|
||||
|
||||
Currently our Wildcard components are not published on NPM, if this is a requirement please create a new issue and add the label: `team/frontend-platform`.
|
||||
Currently our Wildcard components are not published on npm, if this is a requirement please create a new issue and add the label: `team/frontend-platform`.
|
||||
|
||||
@ -407,6 +407,6 @@ We measure our generated production build through [Bundlesize](https://github.co
|
||||
If `Bundlesize` fails, it is likely because one of the generated bundles has gone over the maximum size we have set. This can be due to numerous reasons, to fix this you should check:
|
||||
|
||||
1. That you are lazy-loading code where possible.
|
||||
2. That you are not using dependencies that are potentially too large to be suitable for our application. Tip: Use [Bundlephobia](https://bundlephobia.com) to help find the size of an NPM dependency.
|
||||
2. That you are not using dependencies that are potentially too large to be suitable for our application. Tip: Use [Bundlephobia](https://bundlephobia.com) to help find the size of an npm dependency.
|
||||
|
||||
If none of the above is applicable, we might need to consider adjusting our limits. Please start a discussion with @sourcegraph/frontend-devs before doing this!
|
||||
|
||||
@ -22,7 +22,7 @@ import (
|
||||
|
||||
var schemeToExternalService = map[string]string{
|
||||
dependenciesStore.JVMPackagesScheme: extsvc.KindJVMPackages,
|
||||
dependenciesStore.NPMPackagesScheme: extsvc.KindNPMPackages,
|
||||
dependenciesStore.NpmPackagesScheme: extsvc.KindNpmPackages,
|
||||
}
|
||||
|
||||
// NewDependencySyncScheduler returns a new worker instance that processes
|
||||
|
||||
@ -461,7 +461,7 @@ func addBrowserExtensionReleaseSteps(pipeline *bk.Pipeline) {
|
||||
bk.Cmd("yarn --cwd client/browser release:firefox"))
|
||||
|
||||
// Release to npm
|
||||
pipeline.AddStep(":rocket::npm: NPM Release",
|
||||
pipeline.AddStep(":rocket::npm: npm Release",
|
||||
withYarnCache(),
|
||||
bk.Cmd("yarn --frozen-lockfile --network-timeout 60000"),
|
||||
bk.Cmd("yarn --cwd client/browser -s run build"),
|
||||
|
||||
@ -16,7 +16,7 @@ func InferRepositoryAndRevision(pkg precise.Package) (repoName api.RepoName, git
|
||||
for _, fn := range []func(pkg precise.Package) (api.RepoName, string, bool){
|
||||
inferGoRepositoryAndRevision,
|
||||
inferJVMRepositoryAndRevision,
|
||||
inferNPMRepositoryAndRevision,
|
||||
inferNpmRepositoryAndRevision,
|
||||
} {
|
||||
if repoName, gitTagOrCommit, ok := fn(pkg); ok {
|
||||
return repoName, gitTagOrCommit, true
|
||||
@ -55,13 +55,13 @@ func inferJVMRepositoryAndRevision(pkg precise.Package) (api.RepoName, string, b
|
||||
return api.RepoName(pkg.Name), "v" + pkg.Version, true
|
||||
}
|
||||
|
||||
func inferNPMRepositoryAndRevision(pkg precise.Package) (api.RepoName, string, bool) {
|
||||
if pkg.Scheme != dependenciesStore.NPMPackagesScheme {
|
||||
func inferNpmRepositoryAndRevision(pkg precise.Package) (api.RepoName, string, bool) {
|
||||
if pkg.Scheme != dependenciesStore.NpmPackagesScheme {
|
||||
return "", "", false
|
||||
}
|
||||
npmPkg, err := reposource.ParseNPMPackageFromPackageSyntax(pkg.Name)
|
||||
npmPkg, err := reposource.ParseNpmPackageFromPackageSyntax(pkg.Name)
|
||||
if err != nil {
|
||||
log15.Error("invalid NPM package name in database", "error", err)
|
||||
log15.Error("invalid npm package name in database", "error", err)
|
||||
return "", "", false
|
||||
}
|
||||
return npmPkg.RepoName(), "v" + pkg.Version, true
|
||||
|
||||
@ -2,5 +2,5 @@ package store
|
||||
|
||||
const (
|
||||
JVMPackagesScheme = "semanticdb"
|
||||
NPMPackagesScheme = "npm"
|
||||
NpmPackagesScheme = "npm"
|
||||
)
|
||||
|
||||
@ -59,7 +59,7 @@ func TestUpsertDependencyRepo(t *testing.T) {
|
||||
}
|
||||
|
||||
have, err := store.ListDependencyRepos(ctx, ListDependencyReposOpts{
|
||||
Scheme: NPMPackagesScheme,
|
||||
Scheme: NpmPackagesScheme,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -41,7 +41,7 @@ func parsePackageLockDependencies(in map[string]*packageLockDependency) ([]repos
|
||||
)
|
||||
|
||||
for name, d := range in {
|
||||
dep, err := reposource.ParseNPMDependency(name + "@" + d.Version)
|
||||
dep, err := reposource.ParseNpmDependency(name + "@" + d.Version)
|
||||
if err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
} else {
|
||||
@ -101,7 +101,7 @@ func parseYarnLockFile(r io.Reader) (deps []reposource.PackageDependency, err er
|
||||
return nil, errors.New("invalid yarn.lock format")
|
||||
}
|
||||
|
||||
dep, err := reposource.ParseNPMDependency(name + "@" + version)
|
||||
dep, err := reposource.ParseNpmDependency(name + "@" + version)
|
||||
if err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
} else {
|
||||
|
||||
@ -14,28 +14,28 @@ import (
|
||||
const (
|
||||
// Exported for [NOTE: npm-tarball-filename-workaround].
|
||||
// . is allowed in scope names: for example https://www.npmjs.com/package/@dinero.js/core
|
||||
NPMScopeRegexString = `(?P<scope>[\w\-\.]+)`
|
||||
NpmScopeRegexString = `(?P<scope>[\w\-\.]+)`
|
||||
// . is allowed in package names: for example https://www.npmjs.com/package/highlight.js
|
||||
npmPackageNameRegexString = `(?P<name>[\w\-]+(\.[\w\-]+)*)`
|
||||
)
|
||||
|
||||
var (
|
||||
npmScopeRegex = lazyregexp.New(`^` + NPMScopeRegexString + `$`)
|
||||
npmScopeRegex = lazyregexp.New(`^` + NpmScopeRegexString + `$`)
|
||||
npmPackageNameRegex = lazyregexp.New(`^` + npmPackageNameRegexString + `$`)
|
||||
scopedPackageNameRegex = lazyregexp.New(
|
||||
`^(@` + NPMScopeRegexString + `/)?` +
|
||||
`^(@` + NpmScopeRegexString + `/)?` +
|
||||
npmPackageNameRegexString +
|
||||
`@(?P<version>[\w\-]+(\.[\w\-]+)*)$`)
|
||||
npmURLRegex = lazyregexp.New(
|
||||
`^npm/(` + NPMScopeRegexString + `/)?` +
|
||||
`^npm/(` + NpmScopeRegexString + `/)?` +
|
||||
npmPackageNameRegexString + `$`)
|
||||
)
|
||||
|
||||
// An NPM package of the form (@scope/)?name.
|
||||
// An npm package of the form (@scope/)?name.
|
||||
//
|
||||
// The fields are kept private to reduce risk of not handling the empty scope
|
||||
// case correctly.
|
||||
type NPMPackage struct {
|
||||
type NpmPackage struct {
|
||||
// Optional scope () for a package, can potentially be "".
|
||||
// For more details, see https://docs.npmjs.com/cli/v8/using-npm/scope
|
||||
scope string
|
||||
@ -43,23 +43,23 @@ type NPMPackage struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func NewNPMPackage(scope string, name string) (*NPMPackage, error) {
|
||||
func NewNpmPackage(scope string, name string) (*NpmPackage, error) {
|
||||
if scope != "" && !npmScopeRegex.MatchString(scope) {
|
||||
return nil, errors.Errorf("illegal scope %s (allowed characters: 0-9, a-z, A-Z, _, -)", scope)
|
||||
}
|
||||
if !npmPackageNameRegex.MatchString(name) {
|
||||
return nil, errors.Errorf("illegal package name %s (allowed characters: 0-9, a-z, A-Z, _, -)", name)
|
||||
}
|
||||
return &NPMPackage{scope, name}, nil
|
||||
return &NpmPackage{scope, name}, nil
|
||||
}
|
||||
|
||||
func (pkg *NPMPackage) Equal(other *NPMPackage) bool {
|
||||
func (pkg *NpmPackage) Equal(other *NpmPackage) bool {
|
||||
return pkg == other || (pkg != nil && other != nil && *pkg == *other)
|
||||
}
|
||||
|
||||
// ParseNPMPackageFromRepoURL is a convenience function to parse a string in a
|
||||
// 'npm/(scope/)?name' format into an NPMPackage.
|
||||
func ParseNPMPackageFromRepoURL(urlPath string) (*NPMPackage, error) {
|
||||
// ParseNpmPackageFromRepoURL is a convenience function to parse a string in a
|
||||
// 'npm/(scope/)?name' format into an NpmPackage.
|
||||
func ParseNpmPackageFromRepoURL(urlPath string) (*NpmPackage, error) {
|
||||
match := npmURLRegex.FindStringSubmatch(urlPath)
|
||||
if match == nil {
|
||||
return nil, errors.Errorf("expected path in npm/(scope/)?name format but found %s", urlPath)
|
||||
@ -71,38 +71,38 @@ func ParseNPMPackageFromRepoURL(urlPath string) (*NPMPackage, error) {
|
||||
}
|
||||
}
|
||||
scope, name := result["scope"], result["name"]
|
||||
return &NPMPackage{scope, name}, nil
|
||||
return &NpmPackage{scope, name}, nil
|
||||
}
|
||||
|
||||
// ParseNPMPackageFromPackageSyntax is a convenience function to parse a
|
||||
// string in a '(@scope/)?name' format into an NPMPackage.
|
||||
func ParseNPMPackageFromPackageSyntax(pkg string) (*NPMPackage, error) {
|
||||
dep, err := ParseNPMDependency(fmt.Sprintf("%s@0", pkg))
|
||||
// ParseNpmPackageFromPackageSyntax is a convenience function to parse a
|
||||
// string in a '(@scope/)?name' format into an NpmPackage.
|
||||
func ParseNpmPackageFromPackageSyntax(pkg string) (*NpmPackage, error) {
|
||||
dep, err := ParseNpmDependency(fmt.Sprintf("%s@0", pkg))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return dep.NPMPackage, nil
|
||||
return dep.NpmPackage, nil
|
||||
}
|
||||
|
||||
type NPMPackageSerializationHelper struct {
|
||||
type NpmPackageSerializationHelper struct {
|
||||
Scope string
|
||||
Name string
|
||||
}
|
||||
|
||||
var _ json.Marshaler = &NPMPackage{}
|
||||
var _ json.Unmarshaler = &NPMPackage{}
|
||||
var _ json.Marshaler = &NpmPackage{}
|
||||
var _ json.Unmarshaler = &NpmPackage{}
|
||||
|
||||
func (pkg *NPMPackage) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(NPMPackageSerializationHelper{pkg.scope, pkg.name})
|
||||
func (pkg *NpmPackage) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(NpmPackageSerializationHelper{pkg.scope, pkg.name})
|
||||
}
|
||||
|
||||
func (pkg *NPMPackage) UnmarshalJSON(data []byte) error {
|
||||
var wrapper NPMPackageSerializationHelper
|
||||
func (pkg *NpmPackage) UnmarshalJSON(data []byte) error {
|
||||
var wrapper NpmPackageSerializationHelper
|
||||
err := json.Unmarshal(data, &wrapper)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newPkg, err := NewNPMPackage(wrapper.Scope, wrapper.Name)
|
||||
newPkg, err := NewNpmPackage(wrapper.Scope, wrapper.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -113,7 +113,7 @@ func (pkg *NPMPackage) UnmarshalJSON(data []byte) error {
|
||||
// RepoName provides a name that is "globally unique" for a Sourcegraph instance.
|
||||
//
|
||||
// The returned value is used for repo:... in queries.
|
||||
func (pkg *NPMPackage) RepoName() api.RepoName {
|
||||
func (pkg *NpmPackage) RepoName() api.RepoName {
|
||||
if pkg.scope != "" {
|
||||
return api.RepoName(fmt.Sprintf("npm/%s/%s", pkg.scope, pkg.name))
|
||||
}
|
||||
@ -121,36 +121,36 @@ func (pkg *NPMPackage) RepoName() api.RepoName {
|
||||
}
|
||||
|
||||
// CloneURL returns a "URL" that can later be used to download a repo.
|
||||
func (pkg *NPMPackage) CloneURL() string {
|
||||
func (pkg *NpmPackage) CloneURL() string {
|
||||
return string(pkg.RepoName())
|
||||
}
|
||||
|
||||
// MatchesDependencyString checks if a dependency (= package + version pair)
|
||||
// refers to the same package as pkg.
|
||||
func (pkg *NPMPackage) MatchesDependencyString(depPackageSyntax string) bool {
|
||||
func (pkg *NpmPackage) MatchesDependencyString(depPackageSyntax string) bool {
|
||||
return strings.HasPrefix(depPackageSyntax, pkg.PackageSyntax()+"@")
|
||||
}
|
||||
|
||||
// Format a package using (@scope/)?name syntax.
|
||||
//
|
||||
// This is largely for "lower-level" code interacting with the NPM API.
|
||||
// This is largely for "lower-level" code interacting with the npm API.
|
||||
//
|
||||
// In most cases, you want to use NPMDependency's PackageManagerSyntax() instead.
|
||||
func (pkg *NPMPackage) PackageSyntax() string {
|
||||
// In most cases, you want to use NpmDependency's PackageManagerSyntax() instead.
|
||||
func (pkg *NpmPackage) PackageSyntax() string {
|
||||
if pkg.scope != "" {
|
||||
return fmt.Sprintf("@%s/%s", pkg.scope, pkg.name)
|
||||
}
|
||||
return pkg.name
|
||||
}
|
||||
|
||||
// NPMDependency is a "versioned package" for use by npm commands, such as
|
||||
// NpmDependency is a "versioned package" for use by npm commands, such as
|
||||
// `npm install`.
|
||||
//
|
||||
// See also: [NOTE: Dependency-terminology]
|
||||
//
|
||||
// Reference: https://docs.npmjs.com/cli/v8/commands/npm-install
|
||||
type NPMDependency struct {
|
||||
*NPMPackage
|
||||
type NpmDependency struct {
|
||||
*NpmPackage
|
||||
|
||||
// The version or tag (such as "latest") for a dependency.
|
||||
//
|
||||
@ -159,15 +159,15 @@ type NPMDependency struct {
|
||||
Version string
|
||||
}
|
||||
|
||||
// ParseNPMDependency parses a string in a '(@scope/)?module@version' format into an NPMDependency.
|
||||
// ParseNpmDependency parses a string in a '(@scope/)?module@version' format into an NpmDependency.
|
||||
//
|
||||
// NPM supports many ways of specifying dependencies (https://docs.npmjs.com/cli/v8/commands/npm-install)
|
||||
// npm supports many ways of specifying dependencies (https://docs.npmjs.com/cli/v8/commands/npm-install)
|
||||
// but we only support exact versions for now.
|
||||
func ParseNPMDependency(dependency string) (*NPMDependency, error) {
|
||||
func ParseNpmDependency(dependency string) (*NpmDependency, error) {
|
||||
// We use slightly more restrictive validation compared to the official
|
||||
// rules (https://github.com/npm/validate-npm-package-name#naming-rules).
|
||||
//
|
||||
// For example, NPM does not explicitly forbid package names with @ in them.
|
||||
// For example, npm does not explicitly forbid package names with @ in them.
|
||||
// However, there don't seem to be any such packages in practice (I searched
|
||||
// 100k+ packages and got 0 hits). The web frontend relies on using '@' to
|
||||
// split between the package and rev-like part of the URL, such as
|
||||
@ -187,39 +187,39 @@ func ParseNPMDependency(dependency string) (*NPMDependency, error) {
|
||||
}
|
||||
}
|
||||
scope, name, version := result["scope"], result["name"], result["version"]
|
||||
return &NPMDependency{&NPMPackage{scope, name}, version}, nil
|
||||
return &NpmDependency{&NpmPackage{scope, name}, version}, nil
|
||||
}
|
||||
|
||||
// PackageManagerSyntax returns the dependency in NPM/Yarn syntax. The returned
|
||||
// PackageManagerSyntax returns the dependency in npm/Yarn syntax. The returned
|
||||
// string can (for example) be passed to `npm install`.
|
||||
func (d *NPMDependency) PackageManagerSyntax() string {
|
||||
func (d *NpmDependency) PackageManagerSyntax() string {
|
||||
return fmt.Sprintf("%s@%s", d.PackageSyntax(), d.Version)
|
||||
}
|
||||
|
||||
func (d *NPMDependency) Scheme() string {
|
||||
func (d *NpmDependency) Scheme() string {
|
||||
return "npm"
|
||||
}
|
||||
|
||||
func (d *NPMDependency) PackageVersion() string {
|
||||
func (d *NpmDependency) PackageVersion() string {
|
||||
return d.Version
|
||||
}
|
||||
|
||||
func (d *NPMDependency) GitTagFromVersion() string {
|
||||
func (d *NpmDependency) GitTagFromVersion() string {
|
||||
return "v" + d.Version
|
||||
}
|
||||
|
||||
func (d *NPMDependency) Equal(other *NPMDependency) bool {
|
||||
func (d *NpmDependency) Equal(other *NpmDependency) bool {
|
||||
return d == other || (d != nil && other != nil &&
|
||||
d.NPMPackage.Equal(other.NPMPackage) &&
|
||||
d.NpmPackage.Equal(other.NpmPackage) &&
|
||||
d.Version == other.Version)
|
||||
}
|
||||
|
||||
// SortDependencies sorts the dependencies by the semantic version in descending
|
||||
// order. The latest version of a dependency becomes the first element of the
|
||||
// slice.
|
||||
func SortNPMDependencies(dependencies []*NPMDependency) {
|
||||
func SortNpmDependencies(dependencies []*NpmDependency) {
|
||||
sort.Slice(dependencies, func(i, j int) bool {
|
||||
iPkg, jPkg := dependencies[i].NPMPackage, dependencies[j].NPMPackage
|
||||
iPkg, jPkg := dependencies[i].NpmPackage, dependencies[j].NpmPackage
|
||||
if iPkg.Equal(jPkg) {
|
||||
return versionGreaterThan(dependencies[i].Version, dependencies[j].Version)
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestParseNPMDependency(t *testing.T) {
|
||||
func TestParseNpmDependency(t *testing.T) {
|
||||
table := []struct {
|
||||
testName string
|
||||
expect bool
|
||||
@ -29,7 +29,7 @@ func TestParseNPMDependency(t *testing.T) {
|
||||
{"@A.B-C.D-E/F.G--H.IJK-L@0.1-ABC", true},
|
||||
}
|
||||
for _, entry := range table {
|
||||
dep, err := ParseNPMDependency(entry.testName)
|
||||
dep, err := ParseNpmDependency(entry.testName)
|
||||
if entry.expect && (err != nil) {
|
||||
t.Errorf("expected success but got error '%s' when parsing %s",
|
||||
err.Error(), entry.testName)
|
||||
@ -39,37 +39,37 @@ func TestParseNPMDependency(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSortNPMDependencies(t *testing.T) {
|
||||
dependencies := []*NPMDependency{
|
||||
parseNPMDependencyOrPanic(t, "ac@1.2.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0.Final"),
|
||||
parseNPMDependencyOrPanic(t, "aa@1.2.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.11.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-M11"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-M1"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-RC11"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-RC1"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.1.0"),
|
||||
func TestSortNpmDependencies(t *testing.T) {
|
||||
dependencies := []*NpmDependency{
|
||||
parseNpmDependencyOrPanic(t, "ac@1.2.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0.Final"),
|
||||
parseNpmDependencyOrPanic(t, "aa@1.2.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.11.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-M11"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-M1"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-RC11"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-RC1"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.1.0"),
|
||||
}
|
||||
expected := []*NPMDependency{
|
||||
parseNPMDependencyOrPanic(t, "ac@1.2.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.11.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0.Final"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-RC11"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-RC1"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-M11"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.2.0-M1"),
|
||||
parseNPMDependencyOrPanic(t, "ab@1.1.0"),
|
||||
parseNPMDependencyOrPanic(t, "aa@1.2.0"),
|
||||
expected := []*NpmDependency{
|
||||
parseNpmDependencyOrPanic(t, "ac@1.2.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.11.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0.Final"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-RC11"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-RC1"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-M11"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.2.0-M1"),
|
||||
parseNpmDependencyOrPanic(t, "ab@1.1.0"),
|
||||
parseNpmDependencyOrPanic(t, "aa@1.2.0"),
|
||||
}
|
||||
SortNPMDependencies(dependencies)
|
||||
SortNpmDependencies(dependencies)
|
||||
assert.Equal(t, expected, dependencies)
|
||||
}
|
||||
|
||||
func parseNPMDependencyOrPanic(t *testing.T, value string) *NPMDependency {
|
||||
dependency, err := ParseNPMDependency(value)
|
||||
func parseNpmDependencyOrPanic(t *testing.T, value string) *NpmDependency {
|
||||
dependency, err := ParseNpmDependency(value)
|
||||
if err != nil {
|
||||
t.Fatalf("error=%s", err)
|
||||
}
|
||||
|
||||
@ -42,4 +42,4 @@ type PackageDependency interface {
|
||||
}
|
||||
|
||||
var _ PackageDependency = &MavenDependency{}
|
||||
var _ PackageDependency = &NPMDependency{}
|
||||
var _ PackageDependency = &NpmDependency{}
|
||||
|
||||
@ -199,7 +199,7 @@ var ExternalServiceKinds = map[string]ExternalServiceKind{
|
||||
extsvc.KindJVMPackages: {CodeHost: true, JSONSchema: schema.JVMPackagesSchemaJSON},
|
||||
extsvc.KindOther: {CodeHost: true, JSONSchema: schema.OtherExternalServiceSchemaJSON},
|
||||
extsvc.KindPagure: {CodeHost: true, JSONSchema: schema.PagureSchemaJSON},
|
||||
extsvc.KindNPMPackages: {CodeHost: true, JSONSchema: schema.NPMPackagesSchemaJSON},
|
||||
extsvc.KindNpmPackages: {CodeHost: true, JSONSchema: schema.NpmPackagesSchemaJSON},
|
||||
extsvc.KindPerforce: {CodeHost: true, JSONSchema: schema.PerforceSchemaJSON},
|
||||
extsvc.KindPhabricator: {CodeHost: true, JSONSchema: schema.PhabricatorSchemaJSON},
|
||||
}
|
||||
|
||||
@ -493,7 +493,7 @@ func scanRepo(rows *sql.Rows, r *types.Repo) (err error) {
|
||||
r.Metadata = new(extsvc.OtherRepoMetadata)
|
||||
case extsvc.TypeJVMPackages:
|
||||
r.Metadata = new(jvmpackages.Metadata)
|
||||
case extsvc.TypeNPMPackages:
|
||||
case extsvc.TypeNpmPackages:
|
||||
r.Metadata = new(npmpackages.Metadata)
|
||||
default:
|
||||
log15.Warn("scanRepo - unknown service type", "typ", typ)
|
||||
|
||||
@ -15,7 +15,7 @@ type CodeHost struct {
|
||||
|
||||
func (c *CodeHost) IsPackageHost() bool {
|
||||
switch c.ServiceType {
|
||||
case TypeNPMPackages, TypeJVMPackages:
|
||||
case TypeNpmPackages, TypeJVMPackages:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@ -32,14 +32,14 @@ var (
|
||||
MavenURL = &url.URL{Host: "maven"}
|
||||
JVMPackages = NewCodeHost(MavenURL, TypeJVMPackages)
|
||||
|
||||
NPMURL = &url.URL{Host: "npm"}
|
||||
NPMPackages = NewCodeHost(NPMURL, TypeNPMPackages)
|
||||
NpmURL = &url.URL{Host: "npm"}
|
||||
NpmPackages = NewCodeHost(NpmURL, TypeNpmPackages)
|
||||
|
||||
PublicCodeHosts = []*CodeHost{
|
||||
GitHubDotCom,
|
||||
GitLabDotCom,
|
||||
JVMPackages,
|
||||
NPMPackages,
|
||||
NpmPackages,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// Code for interfacing with Javascript and Typescript package registries such
|
||||
// as NPMJS.com.
|
||||
// as npmjs.com.
|
||||
package npm
|
||||
|
||||
import (
|
||||
@ -34,15 +34,15 @@ type Client interface {
|
||||
//
|
||||
// It is preferable to use this method instead of calling GetDependencyInfo for
|
||||
// multiple versions of a package in a loop.
|
||||
GetPackageInfo(ctx context.Context, pkg *reposource.NPMPackage) (*PackageInfo, error)
|
||||
GetPackageInfo(ctx context.Context, pkg *reposource.NpmPackage) (*PackageInfo, error)
|
||||
|
||||
// GetDependencyInfo gets a dependency's data from the registry.
|
||||
GetDependencyInfo(ctx context.Context, dep *reposource.NPMDependency) (*DependencyInfo, error)
|
||||
GetDependencyInfo(ctx context.Context, dep *reposource.NpmDependency) (*DependencyInfo, error)
|
||||
|
||||
// FetchTarball fetches the sources in .tar.gz format for a dependency.
|
||||
//
|
||||
// The caller should close the returned reader after reading.
|
||||
FetchTarball(ctx context.Context, dep *reposource.NPMDependency) (io.ReadCloser, error)
|
||||
FetchTarball(ctx context.Context, dep *reposource.NpmDependency) (io.ReadCloser, error)
|
||||
}
|
||||
|
||||
var (
|
||||
@ -62,7 +62,7 @@ func init() {
|
||||
// so we don't need to set up any on-disk caching here.
|
||||
}
|
||||
|
||||
func FetchSources(ctx context.Context, client Client, dependency *reposource.NPMDependency) (tarball io.ReadCloser, err error) {
|
||||
func FetchSources(ctx context.Context, client Client, dependency *reposource.NpmDependency) (tarball io.ReadCloser, err error) {
|
||||
ctx, endObservation := operations.fetchSources.With(ctx, &err, observation.Args{LogFields: []otlog.Field{
|
||||
otlog.String("dependency", dependency.PackageManagerSyntax()),
|
||||
}})
|
||||
@ -71,7 +71,7 @@ func FetchSources(ctx context.Context, client Client, dependency *reposource.NPM
|
||||
return client.FetchTarball(ctx, dependency)
|
||||
}
|
||||
|
||||
func Exists(ctx context.Context, client Client, dependency *reposource.NPMDependency) (exists bool, err error) {
|
||||
func Exists(ctx context.Context, client Client, dependency *reposource.NpmDependency) (exists bool, err error) {
|
||||
ctx, endObservation := operations.exists.With(ctx, &err, observation.Args{LogFields: []otlog.Field{
|
||||
otlog.Bool("exists", exists),
|
||||
otlog.String("dependency", dependency.PackageManagerSyntax()),
|
||||
@ -94,7 +94,7 @@ type HTTPClient struct {
|
||||
credentials string
|
||||
}
|
||||
|
||||
func NewHTTPClient(registryURL string, rateLimit *schema.NPMRateLimit, credentials string) *HTTPClient {
|
||||
func NewHTTPClient(registryURL string, rateLimit *schema.NpmRateLimit, credentials string) *HTTPClient {
|
||||
var requestsPerHour float64
|
||||
if rateLimit == nil || !rateLimit.Enabled {
|
||||
requestsPerHour = math.Inf(1)
|
||||
@ -116,7 +116,7 @@ type PackageInfo struct {
|
||||
Versions map[string]*DependencyInfo `json:"versions"`
|
||||
}
|
||||
|
||||
func (client *HTTPClient) GetPackageInfo(ctx context.Context, pkg *reposource.NPMPackage) (info *PackageInfo, err error) {
|
||||
func (client *HTTPClient) GetPackageInfo(ctx context.Context, pkg *reposource.NpmPackage) (info *PackageInfo, err error) {
|
||||
url := fmt.Sprintf("%s/%s", client.registryURL, pkg.PackageSyntax())
|
||||
body, err := client.makeGetRequest(ctx, url)
|
||||
if err != nil {
|
||||
@ -127,7 +127,7 @@ func (client *HTTPClient) GetPackageInfo(ctx context.Context, pkg *reposource.NP
|
||||
return nil, err
|
||||
}
|
||||
if len(pkgInfo.Versions) == 0 {
|
||||
return nil, errors.Newf("NPM returned empty list of versions")
|
||||
return nil, errors.Newf("npm returned empty list of versions")
|
||||
}
|
||||
return &pkgInfo, nil
|
||||
}
|
||||
@ -145,13 +145,13 @@ type illFormedJSONError struct {
|
||||
}
|
||||
|
||||
func (i illFormedJSONError) Error() string {
|
||||
return fmt.Sprintf("unexpected JSON output from NPM request: url=%s", i.url)
|
||||
return fmt.Sprintf("unexpected JSON output from npm request: url=%s", i.url)
|
||||
}
|
||||
|
||||
func (client *HTTPClient) do(ctx context.Context, req *http.Request) (*http.Response, error) {
|
||||
req, ht := nethttp.TraceRequest(ot.GetTracer(ctx),
|
||||
req.WithContext(ctx),
|
||||
nethttp.OperationName("NPM"),
|
||||
nethttp.OperationName("npm"),
|
||||
nethttp.ClientTrace(false))
|
||||
defer ht.Finish()
|
||||
startWait := time.Now()
|
||||
@ -159,7 +159,7 @@ func (client *HTTPClient) do(ctx context.Context, req *http.Request) (*http.Resp
|
||||
return nil, err
|
||||
}
|
||||
if d := time.Since(startWait); d > 200*time.Millisecond {
|
||||
log15.Warn("NPM self-enforced API rate limit: request delayed longer than expected due to rate limit", "delay", d)
|
||||
log15.Warn("npm self-enforced API rate limit: request delayed longer than expected due to rate limit", "delay", d)
|
||||
}
|
||||
return client.doer.Do(req)
|
||||
}
|
||||
@ -171,7 +171,7 @@ type npmError struct {
|
||||
|
||||
func (n npmError) Error() string {
|
||||
if 100 <= n.statusCode && n.statusCode <= 599 {
|
||||
return fmt.Sprintf("NPM HTTP response %d: %s", n.statusCode, n.err.Error())
|
||||
return fmt.Sprintf("npm HTTP response %d: %s", n.statusCode, n.err.Error())
|
||||
}
|
||||
return n.err.Error()
|
||||
}
|
||||
@ -203,7 +203,7 @@ func (client *HTTPClient) makeGetRequest(ctx context.Context, url string) (io.Re
|
||||
return io.NopCloser(&bodyBuffer), nil
|
||||
}
|
||||
|
||||
func (client *HTTPClient) GetDependencyInfo(ctx context.Context, dep *reposource.NPMDependency) (*DependencyInfo, error) {
|
||||
func (client *HTTPClient) GetDependencyInfo(ctx context.Context, dep *reposource.NpmDependency) (*DependencyInfo, error) {
|
||||
// https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#getpackageversion
|
||||
url := fmt.Sprintf("%s/%s/%s", client.registryURL, dep.PackageSyntax(), dep.Version)
|
||||
body, err := client.makeGetRequest(ctx, url)
|
||||
@ -217,7 +217,7 @@ func (client *HTTPClient) GetDependencyInfo(ctx context.Context, dep *reposource
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
func (client *HTTPClient) FetchTarball(ctx context.Context, dep *reposource.NPMDependency) (io.ReadCloser, error) {
|
||||
func (client *HTTPClient) FetchTarball(ctx context.Context, dep *reposource.NpmDependency) (io.ReadCloser, error) {
|
||||
info, err := client.GetDependencyInfo(ctx, dep)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@ -30,12 +30,12 @@ func TestMain(m *testing.M) {
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
var updateRecordings = flag.Bool("update", false, "make NPM API calls, record and save data")
|
||||
var updateRecordings = flag.Bool("update", false, "make npm API calls, record and save data")
|
||||
|
||||
func newTestHTTPClient(t *testing.T) (client *HTTPClient, stop func()) {
|
||||
t.Helper()
|
||||
recorderFactory, stop := httptestutil.NewRecorderFactory(t, *updateRecordings, t.Name())
|
||||
rateLimit := schema.NPMRateLimit{true, 1000}
|
||||
rateLimit := schema.NpmRateLimit{true, 1000}
|
||||
client = NewHTTPClient("https://registry.npmjs.org", &rateLimit, "")
|
||||
doer, err := recorderFactory.Doer()
|
||||
require.Nil(t, err)
|
||||
@ -43,7 +43,7 @@ func newTestHTTPClient(t *testing.T) (client *HTTPClient, stop func()) {
|
||||
return client, stop
|
||||
}
|
||||
|
||||
func mockNPMServer(credentials string) *httptest.Server {
|
||||
func mockNpmServer(credentials string) *httptest.Server {
|
||||
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
if key, ok := req.Header["Authorization"]; ok && key[0] != fmt.Sprintf("Bearer %s", credentials) {
|
||||
w.WriteHeader(http.StatusUnauthorized)
|
||||
@ -74,16 +74,16 @@ func mockNPMServer(credentials string) *httptest.Server {
|
||||
|
||||
func TestCredentials(t *testing.T) {
|
||||
credentials := "top secret access token"
|
||||
server := mockNPMServer(credentials)
|
||||
server := mockNpmServer(credentials)
|
||||
defer server.Close()
|
||||
|
||||
ctx := context.Background()
|
||||
rateLimit := schema.NPMRateLimit{true, 1000}
|
||||
rateLimit := schema.NpmRateLimit{true, 1000}
|
||||
client := NewHTTPClient(server.URL, &rateLimit, credentials)
|
||||
|
||||
presentDep, err := reposource.ParseNPMDependency("left-pad@1.3.0")
|
||||
presentDep, err := reposource.ParseNpmDependency("left-pad@1.3.0")
|
||||
require.NoError(t, err)
|
||||
absentDep, err := reposource.ParseNPMDependency("left-pad@1.3.1")
|
||||
absentDep, err := reposource.ParseNpmDependency("left-pad@1.3.1")
|
||||
require.NoError(t, err)
|
||||
|
||||
info, err := client.GetDependencyInfo(ctx, presentDep)
|
||||
@ -112,7 +112,7 @@ func TestGetPackage(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
client, stop := newTestHTTPClient(t)
|
||||
defer stop()
|
||||
pkg, err := reposource.ParseNPMPackageFromPackageSyntax("is-sorted")
|
||||
pkg, err := reposource.ParseNpmPackageFromPackageSyntax("is-sorted")
|
||||
require.Nil(t, err)
|
||||
info, err := client.GetPackageInfo(ctx, pkg)
|
||||
require.Nil(t, err)
|
||||
@ -129,12 +129,12 @@ func TestGetDependencyInfo(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
client, stop := newTestHTTPClient(t)
|
||||
defer stop()
|
||||
dep, err := reposource.ParseNPMDependency("left-pad@1.3.0")
|
||||
dep, err := reposource.ParseNpmDependency("left-pad@1.3.0")
|
||||
require.NoError(t, err)
|
||||
info, err := client.GetDependencyInfo(ctx, dep)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, info)
|
||||
dep, err = reposource.ParseNPMDependency("left-pad@1.3.1")
|
||||
dep, err = reposource.ParseNpmDependency("left-pad@1.3.1")
|
||||
require.NoError(t, err)
|
||||
info, err = client.GetDependencyInfo(ctx, dep)
|
||||
require.Nil(t, info)
|
||||
@ -145,7 +145,7 @@ func TestFetchSources(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
client, stop := newTestHTTPClient(t)
|
||||
defer stop()
|
||||
dep, err := reposource.ParseNPMDependency("is-sorted@1.0.0")
|
||||
dep, err := reposource.ParseNpmDependency("is-sorted@1.0.0")
|
||||
require.Nil(t, err)
|
||||
readSeekCloser, err := client.FetchTarball(ctx, dep)
|
||||
require.Nil(t, err)
|
||||
@ -180,7 +180,7 @@ func TestNoPanicOnNonexistentRegistry(t *testing.T) {
|
||||
client, stop := newTestHTTPClient(t)
|
||||
defer stop()
|
||||
client.registryURL = "http://not-an-npm-registry.sourcegraph.com"
|
||||
dep, err := reposource.ParseNPMDependency("left-pad@1.3.0")
|
||||
dep, err := reposource.ParseNpmDependency("left-pad@1.3.0")
|
||||
require.Nil(t, err)
|
||||
info, err := client.GetDependencyInfo(ctx, dep)
|
||||
require.Error(t, err)
|
||||
|
||||
@ -3,5 +3,5 @@ package npmpackages
|
||||
import "github.com/sourcegraph/sourcegraph/internal/conf/reposource"
|
||||
|
||||
type Metadata struct {
|
||||
Package *reposource.NPMPackage
|
||||
Package *reposource.NpmPackage
|
||||
}
|
||||
|
||||
@ -21,7 +21,7 @@ func NewMockClient(t testing.TB, deps ...string) *MockClient {
|
||||
|
||||
packages := map[string]*npm.PackageInfo{}
|
||||
for _, dep := range deps {
|
||||
d, err := reposource.ParseNPMDependency(dep)
|
||||
d, err := reposource.ParseNpmDependency(dep)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -47,7 +47,7 @@ func NewMockClient(t testing.TB, deps ...string) *MockClient {
|
||||
|
||||
var _ npm.Client = &MockClient{}
|
||||
|
||||
func (m *MockClient) GetPackageInfo(ctx context.Context, pkg *reposource.NPMPackage) (info *npm.PackageInfo, err error) {
|
||||
func (m *MockClient) GetPackageInfo(ctx context.Context, pkg *reposource.NpmPackage) (info *npm.PackageInfo, err error) {
|
||||
info = m.Packages[pkg.PackageSyntax()]
|
||||
if info == nil {
|
||||
return nil, errors.Newf("package not found: %s", pkg.PackageSyntax())
|
||||
@ -55,8 +55,8 @@ func (m *MockClient) GetPackageInfo(ctx context.Context, pkg *reposource.NPMPack
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func (m *MockClient) GetDependencyInfo(ctx context.Context, dep *reposource.NPMDependency) (info *npm.DependencyInfo, err error) {
|
||||
pkg, err := m.GetPackageInfo(ctx, dep.NPMPackage)
|
||||
func (m *MockClient) GetDependencyInfo(ctx context.Context, dep *reposource.NpmDependency) (info *npm.DependencyInfo, err error) {
|
||||
pkg, err := m.GetPackageInfo(ctx, dep.NpmPackage)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -69,7 +69,7 @@ func (m *MockClient) GetDependencyInfo(ctx context.Context, dep *reposource.NPMD
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func (m *MockClient) FetchTarball(_ context.Context, dep *reposource.NPMDependency) (io.ReadCloser, error) {
|
||||
func (m *MockClient) FetchTarball(_ context.Context, dep *reposource.NpmDependency) (io.ReadCloser, error) {
|
||||
info, ok := m.Packages[dep.PackageSyntax()]
|
||||
if !ok {
|
||||
return nil, errors.Newf("Unknown dependency: %s", dep.PackageManagerSyntax())
|
||||
|
||||
@ -84,7 +84,7 @@ const (
|
||||
KindPhabricator = "PHABRICATOR"
|
||||
KindJVMPackages = "JVMPACKAGES"
|
||||
KindPagure = "PAGURE"
|
||||
KindNPMPackages = "NPMPACKAGES"
|
||||
KindNpmPackages = "NPMPACKAGES"
|
||||
KindOther = "OTHER"
|
||||
)
|
||||
|
||||
@ -127,8 +127,8 @@ const (
|
||||
// TypePagure is the (api.ExternalRepoSpec).ServiceType value for Pagure projects.
|
||||
TypePagure = "pagure"
|
||||
|
||||
// TypeNPMPackages is the (api.ExternalRepoSpec).ServiceType value for NPM packages (JavaScript/TypeScript ecosystem libraries).
|
||||
TypeNPMPackages = "npmPackages"
|
||||
// TypeNpmPackages is the (api.ExternalRepoSpec).ServiceType value for Npm packages (JavaScript/TypeScript ecosystem libraries).
|
||||
TypeNpmPackages = "npmPackages"
|
||||
|
||||
// TypeOther is the (api.ExternalRepoSpec).ServiceType value for other projects.
|
||||
TypeOther = "other"
|
||||
@ -187,8 +187,8 @@ func TypeToKind(t string) string {
|
||||
return KindPerforce
|
||||
case TypePhabricator:
|
||||
return KindPhabricator
|
||||
case TypeNPMPackages:
|
||||
return KindNPMPackages
|
||||
case TypeNpmPackages:
|
||||
return KindNpmPackages
|
||||
case TypeJVMPackages:
|
||||
return KindJVMPackages
|
||||
case TypePagure:
|
||||
@ -205,7 +205,7 @@ var (
|
||||
bbsLower = strings.ToLower(TypeBitbucketServer)
|
||||
bbcLower = strings.ToLower(TypeBitbucketCloud)
|
||||
jvmLower = strings.ToLower(TypeJVMPackages)
|
||||
npmLower = strings.ToLower(TypeNPMPackages)
|
||||
npmLower = strings.ToLower(TypeNpmPackages)
|
||||
)
|
||||
|
||||
// ParseServiceType will return a ServiceType constant after doing a case insensitive match on s.
|
||||
@ -231,7 +231,7 @@ func ParseServiceType(s string) (string, bool) {
|
||||
case jvmLower:
|
||||
return TypeJVMPackages, true
|
||||
case npmLower:
|
||||
return TypeNPMPackages, true
|
||||
return TypeNpmPackages, true
|
||||
case TypePagure:
|
||||
return TypePagure, true
|
||||
case TypeOther:
|
||||
@ -308,8 +308,8 @@ func ParseConfig(kind, config string) (cfg interface{}, _ error) {
|
||||
cfg = &schema.JVMPackagesConnection{}
|
||||
case KindPagure:
|
||||
cfg = &schema.PagureConnection{}
|
||||
case KindNPMPackages:
|
||||
cfg = &schema.NPMPackagesConnection{}
|
||||
case KindNpmPackages:
|
||||
cfg = &schema.NpmPackagesConnection{}
|
||||
case KindOther:
|
||||
cfg = &schema.OtherExternalServiceConnection{}
|
||||
default:
|
||||
@ -542,8 +542,8 @@ func UniqueCodeHostIdentifier(kind, config string) (string, error) {
|
||||
return c.P4Port, nil
|
||||
case *schema.JVMPackagesConnection:
|
||||
return KindJVMPackages, nil
|
||||
case *schema.NPMPackagesConnection:
|
||||
return KindNPMPackages, nil
|
||||
case *schema.NpmPackagesConnection:
|
||||
return KindNpmPackages, nil
|
||||
case *schema.PagureConnection:
|
||||
rawURL = c.Url
|
||||
default:
|
||||
|
||||
@ -77,7 +77,7 @@ func CloneURL(kind, config string, repo *types.Repo) (string, error) {
|
||||
if r, ok := repo.Metadata.(*jvmpackages.Metadata); ok {
|
||||
return r.Module.CloneURL(), nil
|
||||
}
|
||||
case *schema.NPMPackagesConnection:
|
||||
case *schema.NpmPackagesConnection:
|
||||
if r, ok := repo.Metadata.(*npmpackages.Metadata); ok {
|
||||
return r.Package.CloneURL(), nil
|
||||
}
|
||||
|
||||
@ -19,23 +19,23 @@ import (
|
||||
"github.com/sourcegraph/sourcegraph/schema"
|
||||
)
|
||||
|
||||
// A NPMPackagesSource creates git repositories from `*-sources.tar.gz` files of
|
||||
// published NPM dependencies from the JS ecosystem.
|
||||
type NPMPackagesSource struct {
|
||||
// A NpmPackagesSource creates git repositories from `*-sources.tar.gz` files of
|
||||
// published npm dependencies from the JS ecosystem.
|
||||
type NpmPackagesSource struct {
|
||||
svc *types.ExternalService
|
||||
connection schema.NPMPackagesConnection
|
||||
connection schema.NpmPackagesConnection
|
||||
depsStore DependenciesStore
|
||||
client npm.Client
|
||||
}
|
||||
|
||||
// NewNPMPackagesSource returns a new NPMSource from the given external
|
||||
// NewNpmPackagesSource returns a new NpmSource from the given external
|
||||
// service.
|
||||
func NewNPMPackagesSource(svc *types.ExternalService) (*NPMPackagesSource, error) {
|
||||
var c schema.NPMPackagesConnection
|
||||
func NewNpmPackagesSource(svc *types.ExternalService) (*NpmPackagesSource, error) {
|
||||
var c schema.NpmPackagesConnection
|
||||
if err := jsonc.Unmarshal(svc.Config, &c); err != nil {
|
||||
return nil, errors.Errorf("external service id=%d config error: %s", svc.ID, err)
|
||||
}
|
||||
return &NPMPackagesSource{
|
||||
return &NpmPackagesSource{
|
||||
svc: svc,
|
||||
connection: c,
|
||||
/*dbStore initialized in SetDB */
|
||||
@ -43,14 +43,14 @@ func NewNPMPackagesSource(svc *types.ExternalService) (*NPMPackagesSource, error
|
||||
}, nil
|
||||
}
|
||||
|
||||
var _ Source = &NPMPackagesSource{}
|
||||
var _ Source = &NpmPackagesSource{}
|
||||
|
||||
// ListRepos returns all NPM artifacts accessible to all connections
|
||||
// ListRepos returns all npm artifacts accessible to all connections
|
||||
// configured in Sourcegraph via the external services configuration.
|
||||
//
|
||||
// [FIXME: deduplicate-listed-repos] The current implementation will return
|
||||
// multiple repos with the same URL if there are different versions of it.
|
||||
func (s *NPMPackagesSource) ListRepos(ctx context.Context, results chan SourceResult) {
|
||||
func (s *NpmPackagesSource) ListRepos(ctx context.Context, results chan SourceResult) {
|
||||
npmPackages, err := npmPackages(s.connection)
|
||||
if err != nil {
|
||||
results <- SourceResult{Err: err}
|
||||
@ -75,7 +75,7 @@ func (s *NPMPackagesSource) ListRepos(ctx context.Context, results chan SourceRe
|
||||
pkgVersions := map[string]*npm.PackageInfo{}
|
||||
for {
|
||||
dbDeps, err := s.depsStore.ListDependencyRepos(ctx, dependenciesStore.ListDependencyReposOpts{
|
||||
Scheme: dependenciesStore.NPMPackagesScheme,
|
||||
Scheme: dependenciesStore.NpmPackagesScheme,
|
||||
After: lastID,
|
||||
Limit: 100,
|
||||
NewestFirst: true,
|
||||
@ -90,18 +90,18 @@ func (s *NPMPackagesSource) ListRepos(ctx context.Context, results chan SourceRe
|
||||
totalDBFetched += len(dbDeps)
|
||||
lastID = dbDeps[len(dbDeps)-1].ID
|
||||
for _, dbDep := range dbDeps {
|
||||
parsedDbPackage, err := reposource.ParseNPMPackageFromPackageSyntax(dbDep.Name)
|
||||
parsedDbPackage, err := reposource.ParseNpmPackageFromPackageSyntax(dbDep.Name)
|
||||
if err != nil {
|
||||
log15.Error("failed to parse npm package name retrieved from database", "package", dbDep.Name, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
npmDependency := reposource.NPMDependency{NPMPackage: parsedDbPackage, Version: dbDep.Version}
|
||||
npmDependency := reposource.NpmDependency{NpmPackage: parsedDbPackage, Version: dbDep.Version}
|
||||
pkgKey := npmDependency.PackageSyntax()
|
||||
info := pkgVersions[pkgKey]
|
||||
|
||||
if info == nil {
|
||||
info, err = s.client.GetPackageInfo(ctx, npmDependency.NPMPackage)
|
||||
info, err = s.client.GetPackageInfo(ctx, npmDependency.NpmPackage)
|
||||
if err != nil {
|
||||
pkgVersions[pkgKey] = &npm.PackageInfo{Versions: map[string]*npm.DependencyInfo{}}
|
||||
continue
|
||||
@ -114,7 +114,7 @@ func (s *NPMPackagesSource) ListRepos(ctx context.Context, results chan SourceRe
|
||||
continue
|
||||
}
|
||||
|
||||
repo := s.makeRepo(npmDependency.NPMPackage, info.Description)
|
||||
repo := s.makeRepo(npmDependency.NpmPackage, info.Description)
|
||||
totalDBResolved++
|
||||
results <- SourceResult{Source: s, Repo: repo}
|
||||
}
|
||||
@ -122,8 +122,8 @@ func (s *NPMPackagesSource) ListRepos(ctx context.Context, results chan SourceRe
|
||||
log15.Info("finish resolving npm artifacts", "totalDB", totalDBFetched, "totalDBResolved", totalDBResolved, "totalConfig", len(npmPackages))
|
||||
}
|
||||
|
||||
func (s *NPMPackagesSource) GetRepo(ctx context.Context, name string) (*types.Repo, error) {
|
||||
pkg, err := reposource.ParseNPMPackageFromRepoURL(name)
|
||||
func (s *NpmPackagesSource) GetRepo(ctx context.Context, name string) (*types.Repo, error) {
|
||||
pkg, err := reposource.ParseNpmPackageFromRepoURL(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -136,7 +136,7 @@ func (s *NPMPackagesSource) GetRepo(ctx context.Context, name string) (*types.Re
|
||||
return s.makeRepo(pkg, info.Description), nil
|
||||
}
|
||||
|
||||
func (s *NPMPackagesSource) makeRepo(npmPackage *reposource.NPMPackage, description string) *types.Repo {
|
||||
func (s *NpmPackagesSource) makeRepo(npmPackage *reposource.NpmPackage, description string) *types.Repo {
|
||||
urn := s.svc.URN()
|
||||
cloneURL := npmPackage.CloneURL()
|
||||
repoName := npmPackage.RepoName()
|
||||
@ -146,8 +146,8 @@ func (s *NPMPackagesSource) makeRepo(npmPackage *reposource.NPMPackage, descript
|
||||
URI: string(repoName),
|
||||
ExternalRepo: api.ExternalRepoSpec{
|
||||
ID: string(repoName),
|
||||
ServiceID: extsvc.TypeNPMPackages,
|
||||
ServiceType: extsvc.TypeNPMPackages,
|
||||
ServiceID: extsvc.TypeNpmPackages,
|
||||
ServiceType: extsvc.TypeNpmPackages,
|
||||
},
|
||||
Private: false,
|
||||
Sources: map[string]*types.SourceInfo{
|
||||
@ -163,35 +163,35 @@ func (s *NPMPackagesSource) makeRepo(npmPackage *reposource.NPMPackage, descript
|
||||
}
|
||||
|
||||
// ExternalServices returns a singleton slice containing the external service.
|
||||
func (s *NPMPackagesSource) ExternalServices() types.ExternalServices {
|
||||
func (s *NpmPackagesSource) ExternalServices() types.ExternalServices {
|
||||
return types.ExternalServices{s.svc}
|
||||
}
|
||||
|
||||
func (s *NPMPackagesSource) SetDB(db dbutil.DB) {
|
||||
func (s *NpmPackagesSource) SetDB(db dbutil.DB) {
|
||||
s.depsStore = dependenciesStore.GetStore(database.NewDB(db))
|
||||
}
|
||||
|
||||
// npmPackages gets the list of applicable packages by de-duplicating dependencies
|
||||
// present in the configuration.
|
||||
func npmPackages(connection schema.NPMPackagesConnection) ([]*reposource.NPMPackage, error) {
|
||||
func npmPackages(connection schema.NpmPackagesConnection) ([]*reposource.NpmPackage, error) {
|
||||
dependencies, err := npmDependencies(connection)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
npmPackages := []*reposource.NPMPackage{}
|
||||
npmPackages := []*reposource.NpmPackage{}
|
||||
isAdded := make(map[string]bool)
|
||||
for _, dep := range dependencies {
|
||||
if key := dep.PackageSyntax(); !isAdded[key] {
|
||||
npmPackages = append(npmPackages, dep.NPMPackage)
|
||||
npmPackages = append(npmPackages, dep.NpmPackage)
|
||||
isAdded[key] = true
|
||||
}
|
||||
}
|
||||
return npmPackages, nil
|
||||
}
|
||||
|
||||
func npmDependencies(connection schema.NPMPackagesConnection) (dependencies []*reposource.NPMDependency, err error) {
|
||||
func npmDependencies(connection schema.NpmPackagesConnection) (dependencies []*reposource.NpmDependency, err error) {
|
||||
for _, dep := range connection.Dependencies {
|
||||
dependency, err := reposource.ParseNPMDependency(dep)
|
||||
dependency, err := reposource.ParseNpmDependency(dep)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ import (
|
||||
"github.com/sourcegraph/sourcegraph/internal/types"
|
||||
)
|
||||
|
||||
func TestGetNPMDependencyRepos(t *testing.T) {
|
||||
func TestGetNpmDependencyRepos(t *testing.T) {
|
||||
_, store, ctx, _ := setupDependenciesInDB(t)
|
||||
|
||||
type testCase struct {
|
||||
@ -39,16 +39,16 @@ func TestGetNPMDependencyRepos(t *testing.T) {
|
||||
|
||||
for _, testCase := range testCases {
|
||||
deps, err := store.ListDependencyRepos(ctx, dependenciesStore.ListDependencyReposOpts{
|
||||
Scheme: dependenciesStore.NPMPackagesScheme,
|
||||
Scheme: dependenciesStore.NpmPackagesScheme,
|
||||
Name: testCase.pkgName,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
depStrs := []string{}
|
||||
for _, dep := range deps {
|
||||
pkg, err := reposource.ParseNPMPackageFromPackageSyntax(dep.Name)
|
||||
pkg, err := reposource.ParseNpmPackageFromPackageSyntax(dep.Name)
|
||||
require.Nil(t, err)
|
||||
depStrs = append(depStrs,
|
||||
(&reposource.NPMDependency{pkg, dep.Version}).PackageManagerSyntax(),
|
||||
(&reposource.NpmDependency{pkg, dep.Version}).PackageManagerSyntax(),
|
||||
)
|
||||
}
|
||||
sort.Strings(depStrs)
|
||||
@ -61,16 +61,16 @@ func TestGetNPMDependencyRepos(t *testing.T) {
|
||||
lastID := 0
|
||||
for i := 0; i < len(testCase.matches); i++ {
|
||||
deps, err := store.ListDependencyRepos(ctx, dependenciesStore.ListDependencyReposOpts{
|
||||
Scheme: dependenciesStore.NPMPackagesScheme,
|
||||
Scheme: dependenciesStore.NpmPackagesScheme,
|
||||
Name: testCase.pkgName,
|
||||
After: lastID,
|
||||
Limit: 1,
|
||||
})
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, len(deps), 1)
|
||||
pkg, err := reposource.ParseNPMPackageFromPackageSyntax(deps[0].Name)
|
||||
pkg, err := reposource.ParseNpmPackageFromPackageSyntax(deps[0].Name)
|
||||
require.Nil(t, err)
|
||||
depStrs = append(depStrs, (&reposource.NPMDependency{pkg, deps[0].Version}).PackageManagerSyntax())
|
||||
depStrs = append(depStrs, (&reposource.NpmDependency{pkg, deps[0].Version}).PackageManagerSyntax())
|
||||
lastID = deps[0].ID
|
||||
}
|
||||
sort.Strings(depStrs)
|
||||
@ -106,10 +106,10 @@ func TestListRepos(t *testing.T) {
|
||||
defer os.RemoveAll(dir)
|
||||
|
||||
svc := types.ExternalService{
|
||||
Kind: extsvc.KindNPMPackages,
|
||||
Kind: extsvc.KindNpmPackages,
|
||||
Config: `{"registry": "https://placeholder.lol", "rateLimit": {"enabled": false}}`,
|
||||
}
|
||||
packageSource, err := NewNPMPackagesSource(&svc)
|
||||
packageSource, err := NewNpmPackagesSource(&svc)
|
||||
require.Nil(t, err)
|
||||
packageSource.SetDB(db)
|
||||
packageSource.client = npmtest.NewMockClient(t, dependencies...)
|
||||
@ -131,7 +131,7 @@ func TestListRepos(t *testing.T) {
|
||||
|
||||
var want []*types.Repo
|
||||
for _, dep := range dependencies {
|
||||
dep, err := reposource.ParseNPMDependency(dep)
|
||||
dep, err := reposource.ParseNpmDependency(dep)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -141,8 +141,8 @@ func TestListRepos(t *testing.T) {
|
||||
URI: string(dep.RepoName()),
|
||||
ExternalRepo: api.ExternalRepoSpec{
|
||||
ID: string(dep.RepoName()),
|
||||
ServiceID: extsvc.TypeNPMPackages,
|
||||
ServiceType: extsvc.TypeNPMPackages,
|
||||
ServiceID: extsvc.TypeNpmPackages,
|
||||
ServiceType: extsvc.TypeNpmPackages,
|
||||
},
|
||||
Sources: map[string]*types.SourceInfo{
|
||||
packageSource.svc.URN(): {
|
||||
@ -151,7 +151,7 @@ func TestListRepos(t *testing.T) {
|
||||
},
|
||||
},
|
||||
Metadata: &npmpackages.Metadata{
|
||||
Package: dep.NPMPackage,
|
||||
Package: dep.NpmPackage,
|
||||
},
|
||||
})
|
||||
}
|
||||
@ -164,13 +164,13 @@ func TestListRepos(t *testing.T) {
|
||||
|
||||
func insertDependencies(t *testing.T, ctx context.Context, s *dependenciesStore.Store, dependencies []string) {
|
||||
for _, depStr := range dependencies {
|
||||
dep, err := reposource.ParseNPMDependency(depStr)
|
||||
dep, err := reposource.ParseNpmDependency(depStr)
|
||||
require.Nil(t, err)
|
||||
// See also: enterprise/internal/codeintel/stores/dbstore/dependency_index.go:InsertCloneableDependencyRepo
|
||||
rows, err :=
|
||||
s.Store.Query(ctx, sqlf.Sprintf(
|
||||
`INSERT INTO lsif_dependency_repos (scheme, name, version) VALUES (%s, %s, %s)`,
|
||||
dependenciesStore.NPMPackagesScheme, dep.PackageSyntax(), dep.Version))
|
||||
dependenciesStore.NpmPackagesScheme, dep.PackageSyntax(), dep.Version))
|
||||
require.Nil(t, err)
|
||||
for rows.Next() {
|
||||
}
|
||||
|
||||
@ -61,8 +61,8 @@ func NewSource(externalServicesStore database.ExternalServiceStore, svc *types.E
|
||||
return NewJVMPackagesSource(svc)
|
||||
case extsvc.KindPagure:
|
||||
return NewPagureSource(svc, cf)
|
||||
case extsvc.KindNPMPackages:
|
||||
return NewNPMPackagesSource(svc)
|
||||
case extsvc.KindNpmPackages:
|
||||
return NewNpmPackagesSource(svc)
|
||||
case extsvc.KindOther:
|
||||
return NewOtherSource(svc, cf)
|
||||
default:
|
||||
|
||||
@ -252,7 +252,7 @@ func (d Diff) Len() int {
|
||||
// It works for repos from:
|
||||
// 1. Public "cloud_default" code hosts since we don't sync them in the background
|
||||
// (which would delete lazy synced repos).
|
||||
// 2. Any package hosts (i.e. NPM, Maven, etc) since callers are expected to store
|
||||
// 2. Any package hosts (i.e. npm, Maven, etc) since callers are expected to store
|
||||
// repos in the `lsif_dependency_repos` table which is used as the source of truth
|
||||
// for the next full sync, so lazy added repos don't get wiped.
|
||||
//
|
||||
|
||||
@ -90,8 +90,8 @@ func (o *Observer) alertForNoResolvedRepos(ctx context.Context, q query.Q) *sear
|
||||
isSiteAdmin := backend.CheckCurrentUserIsSiteAdmin(ctx, o.Db) == nil
|
||||
if !envvar.SourcegraphDotComMode() {
|
||||
if len(dependencies) > 0 {
|
||||
needsNPMConfig, err := needsNPMPackageHostConfiguration(ctx, o.Db)
|
||||
if err == nil && needsNPMConfig {
|
||||
needsNpmConfig, err := needsNpmPackageHostConfiguration(ctx, o.Db)
|
||||
if err == nil && needsNpmConfig {
|
||||
if isSiteAdmin {
|
||||
return &search.Alert{
|
||||
Title: "No package hosts configured",
|
||||
@ -124,7 +124,7 @@ func (o *Observer) alertForNoResolvedRepos(ctx context.Context, q query.Q) *sear
|
||||
if len(dependencies) > 0 {
|
||||
return &search.Alert{
|
||||
Title: "No dependency repositories found",
|
||||
Description: "Dependency repos are cloned on-demand when first searched. Try again in a few seconds if you know the given repositories have dependencies.\n\nOnly NPM dependencies from `package-lock.json` and `yarn.lock` files are currently supported.",
|
||||
Description: "Dependency repos are cloned on-demand when first searched. Try again in a few seconds if you know the given repositories have dependencies.\n\nOnly npm dependencies from `package-lock.json` and `yarn.lock` files are currently supported.",
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,9 +362,9 @@ func needsRepositoryConfiguration(ctx context.Context, db database.DB) (bool, er
|
||||
return count == 0, nil
|
||||
}
|
||||
|
||||
func needsNPMPackageHostConfiguration(ctx context.Context, db database.DB) (bool, error) {
|
||||
func needsNpmPackageHostConfiguration(ctx context.Context, db database.DB) (bool, error) {
|
||||
count, err := database.ExternalServices(db).Count(ctx, database.ExternalServicesListOptions{
|
||||
Kinds: []string{extsvc.KindNPMPackages},
|
||||
Kinds: []string{extsvc.KindNpmPackages},
|
||||
})
|
||||
if err != nil {
|
||||
return false, err
|
||||
|
||||
@ -108,7 +108,7 @@ func redactionInfo(cfg interface{}) ([]jsonStringField, error) {
|
||||
return []jsonStringField{{[]string{"token"}, &cfg.Token}}, nil
|
||||
}
|
||||
return []jsonStringField{}, nil
|
||||
case *schema.NPMPackagesConnection:
|
||||
case *schema.NpmPackagesConnection:
|
||||
return []jsonStringField{{[]string{"credentials"}, &cfg.Credentials}}, nil
|
||||
case *schema.OtherExternalServiceConnection:
|
||||
return []jsonStringField{{[]string{"url"}, &cfg.Url}}, nil
|
||||
|
||||
@ -70,7 +70,7 @@ func TestRoundTripRedactExternalServiceConfig(t *testing.T) {
|
||||
pagureConfig := schema.PagureConnection{
|
||||
Url: "https://src.fedoraproject.org",
|
||||
}
|
||||
npmPackagesConfig := schema.NPMPackagesConnection{
|
||||
npmPackagesConfig := schema.NpmPackagesConnection{
|
||||
Credentials: "npm credentials!",
|
||||
Dependencies: []string{"placeholder"},
|
||||
}
|
||||
@ -141,9 +141,9 @@ func TestRoundTripRedactExternalServiceConfig(t *testing.T) {
|
||||
editField: func(cfg interface{}) *string { return &cfg.(*schema.PagureConnection).Pattern },
|
||||
},
|
||||
{
|
||||
kind: extsvc.KindNPMPackages,
|
||||
kind: extsvc.KindNpmPackages,
|
||||
config: &npmPackagesConfig,
|
||||
editField: func(cfg interface{}) *string { return &cfg.(*schema.NPMPackagesConnection).Dependencies[0] },
|
||||
editField: func(cfg interface{}) *string { return &cfg.(*schema.NpmPackagesConnection).Dependencies[0] },
|
||||
},
|
||||
{
|
||||
kind: extsvc.KindOther,
|
||||
|
||||
@ -112,14 +112,14 @@ func InferTypeScriptIndexJobs(gitclient GitClient, paths []string) (indexes []co
|
||||
|
||||
func checkLernaFile(gitclient GitClient, path string, pathMap pathMap) (isYarn bool) {
|
||||
lernaConfig := struct {
|
||||
NPMClient string `json:"npmClient"`
|
||||
NpmClient string `json:"npmClient"`
|
||||
}{}
|
||||
|
||||
for _, dir := range ancestorDirs(path) {
|
||||
if pathMap.contains(dir, "lerna.json") {
|
||||
lernaPath := filepath.Join(dir, "lerna.json")
|
||||
if b, err := gitclient.RawContents(context.TODO(), lernaPath); err == nil {
|
||||
if err := json.Unmarshal(b, &lernaConfig); err == nil && lernaConfig.NPMClient == "yarn" {
|
||||
if err := json.Unmarshal(b, &lernaConfig); err == nil && lernaConfig.NpmClient == "yarn" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@ -451,7 +451,7 @@ func GitServer() *monitoring.Container {
|
||||
},
|
||||
|
||||
shared.CodeIntelligence.NewCoursierGroup(containerName),
|
||||
shared.CodeIntelligence.NewNPMGroup(containerName),
|
||||
shared.CodeIntelligence.NewNpmGroup(containerName),
|
||||
|
||||
shared.NewDatabaseConnectionsMonitoringGroup(containerName),
|
||||
shared.NewContainerMonitoringGroup(containerName, monitoring.ObservableOwnerCoreApplication, nil),
|
||||
|
||||
@ -462,7 +462,7 @@ func RepoUpdater() *monitoring.Container {
|
||||
shared.Batches.NewServiceGroup(containerName),
|
||||
|
||||
shared.CodeIntelligence.NewCoursierGroup(containerName),
|
||||
shared.CodeIntelligence.NewNPMGroup(containerName),
|
||||
shared.CodeIntelligence.NewNpmGroup(containerName),
|
||||
|
||||
shared.NewFrontendInternalAPIErrorResponseMonitoringGroup(containerName, monitoring.ObservableOwnerCoreApplication, nil),
|
||||
shared.NewDatabaseConnectionsMonitoringGroup(containerName),
|
||||
|
||||
@ -890,8 +890,8 @@ func (codeIntelligence) NewCoursierGroup(containerName string) monitoring.Group
|
||||
return newPackageManagerGroup("Coursier", containerName)
|
||||
}
|
||||
|
||||
func (codeIntelligence) NewNPMGroup(containerName string) monitoring.Group {
|
||||
return newPackageManagerGroup("NPM", containerName)
|
||||
func (codeIntelligence) NewNpmGroup(containerName string) monitoring.Group {
|
||||
return newPackageManagerGroup("npm", containerName)
|
||||
}
|
||||
|
||||
func (codeIntelligence) NewDependencyReposStoreGroup(containerName string) monitoring.Group {
|
||||
|
||||
@ -1,28 +1,28 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "npm-packages.schema.json#",
|
||||
"title": "NPMPackagesConnection",
|
||||
"description": "Configuration for a connection to an NPM packages repository.",
|
||||
"title": "NpmPackagesConnection",
|
||||
"description": "Configuration for a connection to an npm packages repository.",
|
||||
"allowComments": true,
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["registry"],
|
||||
"properties": {
|
||||
"credentials": {
|
||||
"description": "Access token for logging into the NPM registry.",
|
||||
"description": "Access token for logging into the npm registry.",
|
||||
"type": "string",
|
||||
"default": "",
|
||||
"examples": ["CRs5VaTVbR7pBPcVpaxwQeafrYOId7IdVUiZCkFCqnw="]
|
||||
},
|
||||
"registry": {
|
||||
"description": "The URL at which the NPM registry can be found.",
|
||||
"description": "The URL at which the npm registry can be found.",
|
||||
"type": "string",
|
||||
"default": "https://registry.npmjs.org",
|
||||
"examples": ["https://npm-registry.mycompany.com"]
|
||||
},
|
||||
"rateLimit": {
|
||||
"description": "Rate limit applied when making background API requests to the NPM registry.",
|
||||
"title": "NPMRateLimit",
|
||||
"description": "Rate limit applied when making background API requests to the npm registry.",
|
||||
"title": "NpmRateLimit",
|
||||
"type": "object",
|
||||
"required": ["enabled", "requestsPerHour"],
|
||||
"properties": {
|
||||
@ -44,7 +44,7 @@
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"description": "An array of \"(@scope/)?packageName@version\" strings specifying which NPM packages to mirror on Sourcegraph.",
|
||||
"description": "An array of \"(@scope/)?packageName@version\" strings specifying which npm packages to mirror on Sourcegraph.",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
|
||||
@ -583,7 +583,7 @@ type ExperimentalFeatures struct {
|
||||
EventLogging string `json:"eventLogging,omitempty"`
|
||||
// JvmPackages description: Allow adding JVM packages code host connections
|
||||
JvmPackages string `json:"jvmPackages,omitempty"`
|
||||
// NpmPackages description: Allow adding NPM packages code host connections
|
||||
// NpmPackages description: Allow adding npm packages code host connections
|
||||
NpmPackages string `json:"npmPackages,omitempty"`
|
||||
// Pagure description: Allow adding Pagure code host connections
|
||||
Pagure string `json:"pagure,omitempty"`
|
||||
@ -1026,26 +1026,6 @@ type MountedEncryptionKey struct {
|
||||
Version string `json:"version,omitempty"`
|
||||
}
|
||||
|
||||
// NPMPackagesConnection description: Configuration for a connection to an NPM packages repository.
|
||||
type NPMPackagesConnection struct {
|
||||
// Credentials description: Access token for logging into the NPM registry.
|
||||
Credentials string `json:"credentials,omitempty"`
|
||||
// Dependencies description: An array of "(@scope/)?packageName@version" strings specifying which NPM packages to mirror on Sourcegraph.
|
||||
Dependencies []string `json:"dependencies,omitempty"`
|
||||
// RateLimit description: Rate limit applied when making background API requests to the NPM registry.
|
||||
RateLimit *NPMRateLimit `json:"rateLimit,omitempty"`
|
||||
// Registry description: The URL at which the NPM registry can be found.
|
||||
Registry string `json:"registry"`
|
||||
}
|
||||
|
||||
// NPMRateLimit description: Rate limit applied when making background API requests to the NPM registry.
|
||||
type NPMRateLimit struct {
|
||||
// Enabled description: true if rate limiting is enabled.
|
||||
Enabled bool `json:"enabled"`
|
||||
// RequestsPerHour description: Requests per hour permitted. This is an average, calculated per second. Internally, the burst limit is set to 100, which implies that for a requests per hour limit as low as 1, users will continue to be able to send a maximum of 100 requests immediately, provided that the complexity cost of each request is 1.
|
||||
RequestsPerHour float64 `json:"requestsPerHour"`
|
||||
}
|
||||
|
||||
// NoOpEncryptionKey description: This encryption key is a no op, leaving your data in plaintext (not recommended).
|
||||
type NoOpEncryptionKey struct {
|
||||
Type string `json:"type"`
|
||||
@ -1159,6 +1139,26 @@ type NotifierWebhook struct {
|
||||
Url string `json:"url"`
|
||||
Username string `json:"username,omitempty"`
|
||||
}
|
||||
|
||||
// NpmPackagesConnection description: Configuration for a connection to an npm packages repository.
|
||||
type NpmPackagesConnection struct {
|
||||
// Credentials description: Access token for logging into the npm registry.
|
||||
Credentials string `json:"credentials,omitempty"`
|
||||
// Dependencies description: An array of "(@scope/)?packageName@version" strings specifying which npm packages to mirror on Sourcegraph.
|
||||
Dependencies []string `json:"dependencies,omitempty"`
|
||||
// RateLimit description: Rate limit applied when making background API requests to the npm registry.
|
||||
RateLimit *NpmRateLimit `json:"rateLimit,omitempty"`
|
||||
// Registry description: The URL at which the npm registry can be found.
|
||||
Registry string `json:"registry"`
|
||||
}
|
||||
|
||||
// NpmRateLimit description: Rate limit applied when making background API requests to the npm registry.
|
||||
type NpmRateLimit struct {
|
||||
// Enabled description: true if rate limiting is enabled.
|
||||
Enabled bool `json:"enabled"`
|
||||
// RequestsPerHour description: Requests per hour permitted. This is an average, calculated per second. Internally, the burst limit is set to 100, which implies that for a requests per hour limit as low as 1, users will continue to be able to send a maximum of 100 requests immediately, provided that the complexity cost of each request is 1.
|
||||
RequestsPerHour float64 `json:"requestsPerHour"`
|
||||
}
|
||||
type OAuthIdentity struct {
|
||||
Type string `json:"type"`
|
||||
}
|
||||
|
||||
@ -160,7 +160,7 @@
|
||||
}
|
||||
},
|
||||
"npmPackages": {
|
||||
"description": "Allow adding NPM packages code host connections",
|
||||
"description": "Allow adding npm packages code host connections",
|
||||
"type": "string",
|
||||
"enum": ["enabled", "disabled"],
|
||||
"default": "enabled"
|
||||
|
||||
@ -38,9 +38,9 @@ var GitoliteSchemaJSON string
|
||||
//go:embed jvm-packages.schema.json
|
||||
var JVMPackagesSchemaJSON string
|
||||
|
||||
// NPMPackagesSchemaJSON is the content of the file "npm-packages.schema.json".
|
||||
// NpmPackagesSchemaJSON is the content of the file "npm-packages.schema.json".
|
||||
//go:embed npm-packages.schema.json
|
||||
var NPMPackagesSchemaJSON string
|
||||
var NpmPackagesSchemaJSON string
|
||||
|
||||
// OtherExternalServiceSchemaJSON is the content of the file "other_external_service.schema.json".
|
||||
//go:embed other_external_service.schema.json
|
||||
|
||||
Loading…
Reference in New Issue
Block a user