Giter Club home page Giter Club logo

mongosh-snippets's Introduction

mongosh-snippets

An experimental plugin feature for mongosh.

What is a snippet?

A snippet is a script that you can install using the snippet command in mongosh, to provide additional functionality that mongosh does otherwise not provide.

What does it mean that snippets are experimental?

It means that, for the time being, MongoDB does not offer any commercial support for it, and that it may be changed or removed as we see fit.

It does not mean that bugs in this feature are an expected occurrence, and you can and should file bugs in the mongosh JIRA project if you experience any.

How do I install a snippet?

You can manage snippets through the snippet command in mongosh. Running snippet help gives an overview over all commands that are available.

For installing a snippet, you can use snippet install <name>:

> snippet uninstall analyze-schema
Running uninstall...
Done!
> snippet install analyze-schema
Running install...
Installed new snippets analyze-schema. Do you want to load them now? [Y/n]: y
Finished installing snippets: analyze-schema
> db.test.insertOne({ field: 'value' })
{
  acknowledged: true,
  insertedId: ObjectId("60b60758d381fd904f5dc517")
}
> schema(db.test)
┌─────────┬─────────┬───────────┬────────────┐
│ (index) │    0    │     1     │     2      │
├─────────┼─────────┼───────────┼────────────┤
│    0    │ '_id  ' │ '100.0 %' │ 'ObjectID' │
│    1    │ 'field' │ '100.0 %' │  'String'  │
└─────────┴─────────┴───────────┴────────────┘

You can list all installed snippets with snippet ls, and you can list all available snippets with snippet search.

Can I disable this feature?

Yes.

> config.set('snippetIndexSourceURLs', '')

How do snippets work?

The snippets feature uses the npm package manager under the hood to install snippets from a pre-specified registry. The default registry currently points to this Github repository here. When you install a snippet, mongosh will look up its npm package name based on the information in the registry and install it, and load it using load() by default on each mongosh startup.

This also means that snippets can depend on npm packages, and use them in their functionality. For example, the analyze-schema example above uses the mongodb-schema package from npm to perform the analysis itself.

Can I add my own snippets?

Absolutely! You should feel encouraged to do so, if you believe that you have a script for the shell that you think others might find useful as well.

In order to add a new snippet:

  • Fork and clone this repository
  • Add a new directory under snippets/, using the name you wish to use
  • Add at least the package.json, index.js and LICENSE files, and ideally also a short README.md.

A minimal package.json could contain:

{
  "name": "@mongosh/snippet-<name>",
  "snippetName": "<name>",
  "version": "0.0.1",
  "description": "...",
  "main": "index.js",
  "license": "Apache-2.0",
  "publishConfig": {
    "access": "public"
  }
}

Once you have completed that, you can commit your changes and open a pull request against this repository.

If it is merged, we will take care of publishing and adding it to the index.

Can I run my own registry?

Yes. From the mongosh CLI perspective, a snippet registry is just a https URL pointing to a brotli-compressed BSON file; no package contents are actually provided in that file. This file has the following format ( in TypeScript syntax):

interface ErrorMatcher {
  // Add additional information to shell errors matching one of the regular.
  // expressions. The message can point to a snippet helping solve that error.
  matches: RegExp[];
  message: string;
}

interface SnippetDescription {
  // The *npm* package name. Users do not interact with this.
  name: string;
  // The snippet name. This is what users interact with.
  snippetName: string;
  // An optional install specifier that can be used to point npm towards
  // packages that are not uploaded to the registry. For example,
  // this could be an URL to a git repository or a tarball.
  installSpec?: string;
  // A version field. Users do not interact with this, as currently, `snippet`
  // always installs the latest versions of snippets.
  version: string;
  description: string;
  readme: string;
  // License should be a SPDX license identifier.
  license: string;
  errorMatchers?: ErrorMatcher[];
}

interface SnippetIndexFile {
  // This must be 1 currently.
  indexFileVersion: 1;
  index: SnippetDescription[];
  metadata: { homepage: string };
}

mongosh-snippets's People

Contributors

github-actions[bot] avatar addaleax avatar alexbevi avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.