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:
Varun Gandhi 2022-03-14 12:38:09 -07:00 committed by GitHub
parent 2d7b8b1549
commit 73e054d477
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 329 additions and 329 deletions

View File

@ -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).

View File

@ -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,
},

View File

@ -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,

View File

@ -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
}

View File

@ -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/.

View File

@ -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)

View File

@ -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

View File

@ -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
}()},
}

View File

@ -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)

View File

@ -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

View File

@ -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):

View File

@ -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:

View File

@ -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

View File

@ -139,7 +139,7 @@ Default pipeline:
- E2E for chrome extension
- Extension release
- Extension release
- NPM Release
- npm Release
- Upload build trace
### Main branch

View File

@ -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`.

View File

@ -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!

View File

@ -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

View File

@ -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"),

View File

@ -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

View File

@ -2,5 +2,5 @@ package store
const (
JVMPackagesScheme = "semanticdb"
NPMPackagesScheme = "npm"
NpmPackagesScheme = "npm"
)

View File

@ -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)

View File

@ -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 {

View File

@ -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)
}

View File

@ -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)
}

View File

@ -42,4 +42,4 @@ type PackageDependency interface {
}
var _ PackageDependency = &MavenDependency{}
var _ PackageDependency = &NPMDependency{}
var _ PackageDependency = &NpmDependency{}

View File

@ -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},
}

View File

@ -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)

View File

@ -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,
}
)

View File

@ -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

View File

@ -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)

View File

@ -3,5 +3,5 @@ package npmpackages
import "github.com/sourcegraph/sourcegraph/internal/conf/reposource"
type Metadata struct {
Package *reposource.NPMPackage
Package *reposource.NpmPackage
}

View File

@ -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())

View File

@ -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:

View File

@ -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
}

View File

@ -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
}

View File

@ -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() {
}

View File

@ -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:

View File

@ -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.
//

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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
}
}

View File

@ -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),

View File

@ -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),

View File

@ -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 {

View File

@ -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",

View File

@ -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"`
}

View File

@ -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"

View File

@ -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