open-index/open-npm huggingface dataset:
npm package: @parameter1/base-cms-dependency-tool
Description: Command line tool for managing BaseCMS project dependencies.
Author: Jacob Bare
Latest version: 4.74.0


# BaseCMS Dependency Tool
Command line tool for managing BaseCMS project dependencies.

## Installation
Add `@parameter1/base-cms-dependency-tool` as a project dependency via Yarn or npm. You can also add this package globally and use it will all of your `@parameter1/base-cms` projects, via `yarn global add @parameter1/base-cms-dependency-tool`.

## Usage

### Upgrading deps
Once installed, run via the command line and target the project path you'd like to update:

```sh
basecms-dependencies upgrade ../path-to-your-project
```

If the package uses Yarn workspaces, all sub-packages will also be updated.
npm package: @parameter1/base-cms-express-apollo
Description: Apollo GraphQL SSR Client for BaseCMS+Express apps
Author: Jacob Bare
Latest version: 4.74.0

# BaseCMS Apollo GraphQL SSR Client for Express
Creates a per-request Apollo GraphQL client via Express middleware.

## Installation
This package is dependent on the `graphql` library.
```
yarn add @parameter1/base-cms-express-apollo graphql@^14.0.0
```

## Usage
To use, apply the middleware to your Express app (or router instance):
```js
const express = require('express');
const { apolloClient } = require('@parameter1/base-cms-express-apollo');

const app = express();

app.use(apolloClient('http://your-base-cms-graphql-uri'));

// Apollo is now availabe on the req object, as well as res.locals
app.get('/', (req, res) => {
  const { apollo } = req;
  const query = '{ ping }';
  apollo.query({ query }).then(result => res.json(result));
});

app.listen(1234);
```
npm package: @parameter1/base-cms-github-release-notes
Description: Generates release notes for the currently tagged version, or for a range of tags/commit hashes.
Author: Jacob Bare
Latest version: 4.74.0

# Websites Release Notes Generator
Generates release notes for the currently tagged version, or for a range of tags/commit hashes.

## Usage
Note: you must have a GitHub personal access token to execute these scripts. You can create an access token via https://github.com/settings/tokens and then set the `GITHUB_PERSONAL_ACCESS_TOKEN` variable in a `.env` file within the project root.

- Install dependencies
- Run `./node_modules/.bin/website-release-notes` from the project root to generate notes based off the current project tag

This will output the tag name and generate the release name and notes.

Example:
```
v0.11.1

Ox Georgetown Nemata

8 PRs totaling 33 commits in 50 files [+414 / -148]

- #249 BC-OGJ-eventsLink @Alixers505
- #250 Remove link to site license info @solocommand
- #253 Add GTXcel link to site license banner @solocommand
- #252 BC-magBtns-mobile: added top margin for item__button @Alixers505
- #255 BC-ILS/VSD: added /events to resources nav @Alixers505
- #256 CS2430-LFW: updated subscribe form link @Alixers505
- #254 NativeX "templateless" delivery support @zarathustra323
- #251 Wufoo survey integration @solocommand
```
npm package: @parameter1/base-cms-graphql-fragment-types
Description: Provides fragment types for the BaseCMS GraphQL API. For use with Apollo GraphQL clients.
Author: Jacob Bare
Latest version: 4.74.0

# BaseCMS GraphQL Fragment Types
Provides fragment types for the BaseCMS GraphQL API. For use with Apollo GraphQL clients.

## Usage
```js
import introspectionQueryResultData from '@parameter1/base-cms-graphql-fragment-types';
import { ApolloClient } from 'apollo-client';
import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';

const fragmentMatcher = new IntrospectionFragmentMatcher({ introspectionQueryResultData });
const cache = new InMemoryCache({ fragmentMatcher });

export default new ApolloClient({ cache });
```

## Developing / Building
To build a new version of `types.json`, run the following command inside the monorepo.
```
GRAPHQL_URL=[the graphql url to build from] node packages/graphql-fragment-types/build.js
```
npm package: @parameter1/base-cms-leaders-program
Description: Leaders Program Vue components
Author: Jacob Bare
Latest version: 4.74.0

# leaders-sandbox

## Project setup
```
yarn install
```

### Compiles and hot-reloads for development
```
yarn serve
```

### Compiles and minifies for production
```
yarn build
```

### Lints and fixes files
```
yarn lint
```

### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
npm package: @parameter1/base-cms-marko-node-require
Description: Custom Node extension resolver/compiler for Marko files.
Author: Jacob Bare
Latest version: 4.74.0

# MarkoJS Node Require
Overrides the default `marko/node-require` logic to only compile `.marko` files that are new or out-of-date (as opposed to compiling everything).

Load as the first module in your app's entrypoint via
```js
require('@parameter1/base-cms-marko-node-require');
```
npm package: @parameter1/base-cms-marko-web-gtm
Description: Google Tag Manager (GAM) Marko components for BaseCMS websites
Author: Jacob Bare
Latest version: 4.74.0

# BaseCMS Marko Web GTM Components
Google Tag Manager components for BaseCMS/Marko websites.

## Installation
Once you have a GTM container ID, you can enable GTM in your base-cms-marko-web application. To do so, include this package and add the following two tags to your app:

## Usage: Marko

### `marko-web-gtm-init`
This component initializes the GTM container(s) specified, and allows a standard set of inputs to be used for projects utilizing this package solo and for projects using the `marko-web-deferred-script-loader` package.

To load GTM normally, include the following calls, specifying only your container id(s) and any of the optional arguments: `start`, `push`:
```marko
<marko-web-document ...input>
  <@head>
    <marko-web-gtm-init container-id="GTM-XXXXXX" start=true />
    <${input.head} />
  </@head>
  <@above-wrapper>
    <marko-web-gtm-noscript container-id="GTM-XXXXXX" />
  </@above-wrapper>
</marko-web-document>
```

To defer GTM, ensure the `marko-web-deferred-script-loader` package is installed and enabled, and then specify the relevant `on`, `request-frame`, and `target-tag` parameters along with your component call.
```marko
<marko-web-document ...input>
  <@head>
    <marko-web-gtm-init
      container-id="GTM-XXXXXX"
      start=true
      on="load"
      request-frame=true
      target-tag="body"
    />
    <${input.head} />
  </@head>
  <@above-wrapper>
    <marko-web-gtm-noscript container-id="GTM-XXXXXX" />
  </@above-wrapper>
</marko-web-document>
```

To specify an alternative datalayer name, use the `name="fooLayer"` parameter1.

To pre-push data to the datalayer, you can use the `push={ foo: 'bar' }` parameter. See the `marko-web-gtm-push` component for more details.

To automatically start your containers, send the `start=true` parameter with your `init` component. Otherwise, you must manually start the GTM container with the `marko-web-gtm-start` component.

### `marko-web-gtm-noscript`

### `marko-web-gtm-start`
### `marko-web-gtm-push`
### `marko-web-gtm-slot`
### `marko-web-gtm-track-bus-event`
### `marko-web-gtm-track-inview-event`
### `marko-web-gtm-track-load-more`

## Usage: Vue/Browser

### `track-bus-event`

### `track-in-view-event`

### `track-load-more`
npm package: @parameter1/base-cms-marko-web-leaders
Description: Marko Wrapper for the Leaders Program
Author: Jacob Bare
Latest version: 4.80.4

# BaseCMS Marko Wrapper for the Leaders Program

## Installation

1. Include `@parameter1/base-cms-marko-web-leaders` as a project/website dependency.

2. Include the Browser plugin.
```js
// your-site/browser/index.js
import Leaders from '@parameter1/base-cms-marko-web-leaders/browser';

Leaders(Browser);

export default Browser;
```

3. Include the styles.
```scss
// your-site/server/styles/index.scss
@import url("https://fonts.googleapis.com/css?family=IBM+Plex+Sans:300,400,500,600,700&display=swap");
@import "@parameter1/base-cms-marko-web-leaders/scss/leaders";
```

4. Include the dropdown portal component in your template or document root. _Include immediately after the opening `<body>` tag!_ **<< Don't forget this step >>**
```marko
<!-- your-site/server/components/document.marko -->
<marko-web-document ...input>
  <@head>
    <!-- ... head components here -->
  </@head>
  <@above-container>
    <marko-web-leaders-dropdown-portal />
    <!-- ... other components here -->
    <${input.aboveContainer} />
  </@above-container>
</marko-web-document>
```

5. Include the `<marko-web-leaders>` component where you'd like it displayed.
```marko
<!-- your-site/server/templates/index.marko -->
<marko-web-leaders props={
  sectionAlias: "leaders",
  open: null,
  expanded: false,
  headerImgSrc: "https://img.packworld.com/files/base/pmmi/all/leaders/pw.png",
  headerImgAlt: "Leaders in Packaging 2019",
  columns: 1,
  offsetTop: 105,
  mediaQueries: [
    { prop: "open", value: "right", query: "(min-width: 1490px)" },
    { prop: "columns", value: 2, query: "(min-width: 700px)" },
    { prop: "displayCallout", value: false, query: "(max-width: 660px)" },
  ],
}/>
```
npm package: @parameter1/base-cms-marko-web-photoswipe
Description: ## Installation
Author: Jacob Bare
Latest version: 4.74.0

# BaseCMS Marko Wrapper for Photoswipe

## Installation

1. Include `@parameter1/base-cms-marko-web-photoswipe` as a project/website dependency.

2. Include the Browser plugin.
```js
// your-site/browser/index.js
import PhotoSwipe from '@parameter1/base-cms-marko-web-photoswipe/browser';

PhotoSwipe(Browser);

export default Browser;
```

3. Include the styles.
```scss
// your-site/server/styles/index.scss
@import "@parameter1/base-cms-marko-web-photoswipe/scss/main";
```

4. If you're using the default theme (or something similar) you'll need to adjust the photoswipe z-index:
```scss
$pswp__root-z-index: $theme-site-header-z-index + 1 !default;
@import "@parameter1/base-cms-marko-web-photoswipe/scss/main";
```

## Usage

### Create a Content Image Gallery
You must specify a body gallery ID as well as an image selector.

1. On the page contents, append a unique gallery ID and display some images, e.g.:
```marko
<default-theme-page-contents attrs={ "data-gallery-id": content.id }>
  <marko-web-page-image width=720 obj=content.primaryImage />
  <marko-web-content-body obj=content />
</default-theme-page-contents>
```

2. Immediately after this block, load the gallery component:
```marko
import { getAsArray } from "@parameter1/base-cms-object-path";

$ const images = resolved.getEdgeNodesFor("images");

<marko-web-photoswipe-images images=images>
  <@props thumbnail-click-selectors=`[data-gallery-id="${id}"] [data-image-id]` />
</marko-web-photoswipe-images>
```

3. Make sure you're returning the images from GraphQL
```js
const gql = require('graphql-tag');

module.exports = gql`
fragment ContentPageFragment on Content {
  id
  name
  images(input:{ pagination: { limit: 100 }, sort: { order: values } }) {
    edges {
      node {
        id
        src
        alt
        displayName
        caption
        credit
      }
    }
  }
}
`;

```
npm package: @parameter1/base-cms-marko-web-reveal-ad
Description: Custom Reveal Ad Marko/Vue components for BaseCMS websites
Author: Jacob Bare
Latest version: 4.74.0

# BaseCMS Marko Web Reveal Ad Components

## Installation
1. Add `@parameter1/base-cms-marko-web-revel-ad` to your project/site.

2. Include the Browser plugin.
  ```js
  // your-site/browser/index.js
  import RevealAd from '@parameter1/base-cms-marko-web-reveal-ad/browser';

  RevealAd(Browser);

  export default Browser;
  ```

3. Include the styles
  ```scss
  // your-site/server/styles/index.scss
  @import "@parameter1/base-cms-marko-web-reveal-ad/scss/reveal-ad";
  ```

4. Load the listener component on all pages, as close to the opening `<body>` tag as possible. This is usually handled in a common site `document.marko` component
  ```marko
  <marko-web-document ...input>
    <@head>
      <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
      <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
      <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
      <link rel="manifest" href="/site.webmanifest">
      <marko-web-gam-init />
      <${input.head} />
      <marko-web-gam-enable />
      <marko-web-gam-targeting key-values={ uri: req.path } />
    </@head>
    <@above-container>
      <marko-web-reveal-ad-listener />
      <default-theme-site-header />
      <default-theme-site-menu />
      <${input.aboveContainer} />
    </@above-container>
  </marko-web-document>
  ```
npm package: @parameter1/base-cms-marko-web-social-sharing
Description: Social Sharing Marko/Vue components for BaseCMS websites
Author: Jacob Bare
Latest version: 4.74.0

# BaseCMS Marko Web Social Sharing Components

## Installation

1. Include `@parameter1/base-cms-marko-web-social-sharing` as a project/website dependency.

2. Include the Browser plugin.
```js
// your-site/browser/index.js
import SocialSharing from '@parameter1/base-cms-marko-web-social-sharing/browser';

SocialSharing(Browser);
// ...

export default Browser;
```

3. Include the default styles:
```scss
@import "@parameter1/base-cms-marko-web-social-sharing/scss/buttons";
```

## Usage

Include the sharing component where you'd like the icons to appear:

```marko
<marko-web-social-sharing
  path=content.siteContext.path
  providers=["email", "facebook", "linkedin", "twitter", "pinterest", "print"]
/>
```
npm package: @parameter1/base-cms-newsletter-deployment-tool
Description: The deployment tool for use with @parameter1/base-cms-marko-newsletters
Author: Josh Worden
Latest version: 4.74.0

# Newsletter Deployment Tool

To use the deployment tool with your `@parameter1/base-cms-marko-newsletters` project, include and modify (as appropriate) the files in the `templates` directory at the root of your project.

## Dockerfile

The `Dockerfile` defines the production build process for your project. No modifications to this file should be necessary.

## .travis.yml

The `.travis.tml` defines how your project should be deployed. Copy this file to your project, and update the deployment commands to deploy each tenant. You **must** include both the `production` and `staging` definition for each tenant, if you would like it to deploy to both stacks.

Ensure that you replace all references to `TENANT_*` with the appropriate values for your tenant.
npm package: @parameter1/base-cms-section-query-generator
Description: Utility function for generating section query data for base-cms content
Author: Josh Worden
Latest version: 4.74.0

BaseCMS section query generator
===

This utility can be used to regenerate the BaseCMS content `sectionQuery` field.

## Usage
To use, import the package and await the exported function, supplying the relevant tenant key and an active (connected) MongoDB client.

*Note*: You **must** use the [`@parameter1/base-cms-db`](https://github.com/parameter1/base-cms/tree/master/packages/db) MongoDB client/factory.

```js
const buildFn = require('@parameter1/base-cms-section-query-generator');
const { createMongoClient } = require('@parameter1/base-cms-db');

const { NODE_ENV, MONGO_DSN } = process.env;
const appname = `myapp v1.0 (env: ${NODE_ENV})`;

const client = createMongoClient(MONGO_DSN, { appname });
await client.connect();

await buildFn({ tenant: 'my_tenant_key', client });

await client.close();
```

## Arguments

| Option | Description | Default value
| - | - | - |
| `tenant` | (Required) A BaseCMS tenant key
| `client` | (Required) A connected MongoDB client
| `context` | (Optional) Additional context for the BaseDB instance | `{}`
| `logger` | (Optional) A function to log debug information to | `console.log`
| `maxDate` | (Option) A Date indicating how far in the future to check for schedules | `2038-01-01`
| `createIndexes` | (Optional) A Boolean indicating if indexes should be built | `false`
npm package: @parameter1/base-cms-website-deployment-tool
Description: The deployment tool for use with @parameter1/base-cms-marko-web
Author: Josh Worden
Latest version: 4.74.0

# Website Deployment Tool

To use the deployment tool with your `@parameter1/base-cms-marko-web` project, include and modify (as appropriate) the following files in the `templates` directory at the root of your project.

## Dockerfile

The `Dockerfile` defines the production build process for your project. No modifications to this file should be necessary.

## .travis.yml

The `.travis.tml` defines how your project should be deployed. Copy this file to your project, and update the deployment commands to deploy each site. You **must** include both the `production` and `staging` definition for each site, if you would like it to deploy to both stacks.

Ensure that you replace all references to `SITE_*` with the appropriate values for your site.

## Custom services

If building a custom website service, copy the `Dockerfile.service` to your service folder, and include/modify (as appropriate) the lines relating to custom service deployment from the `.travis.service.yml`.

Ensure that you replace all references to `SERVICE_*` with the appropriate values for your site.
npm package: @parameter1/build-match-regex
Description: Builds regular expressions for matching parts of phrases to values.
Author: Jacob Bare
Latest version: 2.0.0

# Build Match Regex
Builds regular expressions for matching parts of a phrase to a value. Useful for autocompleters, typeaheads, or quasi-search functions.

## Installation
```
yarn add @parameter1/build-match-regex
```

## Usage
```js
import buildMatchRegex from '@parameter1/build-match-regex';

const phrase = 'quick brown fox';
const regex = buildMatchRegex({
  phrase,
  // can be one of 'starts', 'ends', 'exact', or 'contains'
  position: 'contains', // default
  // can be either 'all' or 'any'
  words: 'all', // default
  insensitive: true, // default, set to false to force case-sensitivity
});

regex.test('brown fox'); // false
regex.test('brown fox quick'); // true
regex.test('Quickest Brownest Fox!'); // true
```

### Options

Assuming a phrase of `quick brown fox`...

Position `starts`:
 - Words: `any`
   - Where a value starts with `quick`, `brown`, or `fox`
   - `/^quick|^brown|^fox/i`
 - Words: `all`
   - Where a value literally starts with `quick brown fox`
   - `/^quick brown fox/i`

Position `ends`:
 - Words: `any`
   - Where a value ends with `quick`, `brown`, or `fox`
   - `/quick$|brown$|fox$/i`
 - Words: `all`
   - Where a value literally ends with `quick brown fox`
   - `/quick brown fox$/i`

Position: `exact`:
 - Words: `any`
   - Where a value exactly matches `quick`, `brown`, or `fox`
   - `/^quick$|^brown$|^fox$/i`
 - Words: `all`
   - Where a value exactly matches `quick brown fox`
   - `/^quick brown fox$/i`

Position `contains`:
 - Words: `any`
   - Where a value contains any partial matches of `quick`, `brown`, or `fox`
   - `/quick|brown|fox/i`
 - Words: `all`
   - Where a value contains all partial matches of `quick`, `brown`, and `fox`
   - `/(?=.*quick)(?=.*brown)(?=.*fox)/i`
npm package: @parameter1/dataloader-mongodb
Description: Provides a GraphQL dataloader for MongoDB with field projection support.
Author: Jacob Bare
Latest version: 1.0.22

# MongoDB Dataloader
Provides a GraphQL dataloader for MongoDB with field projection support.

## Installation
```
yarn add @parameter1/dataloader-mongodb
```

## Usage
Dataloaders should only live per request. For example, using Express...

```js
const express = require('express');
const MongoDBLoader = require('@parameter1/dataloader-mongodb');
const db = require('./your-mongo-client');

const app = express();

app.get('/', (req, res, next) => {
  // get the user collection from mongo.
  const collection = db.collection('users');
  // create the loader during the request
  const userLoader = new MongoDBLoader({ collection });
  // return the user with an id of `1` and only project the `name` field.
  userLoader.load({ id: 1, projection: { name: 1 } }).then((user) => {
    res.send(user);
  }).catch(next);
});

app.listen(2112);
```

When using with GraphQL, context is usually the best bet...

```js
const { ApolloServer } = require('apollo-server-express');
const express = require('express');
const schema = require('./your-schema');
const db = require('./your-mongo-client');

const app = express();

const server = new ApolloServer({
  context: () => {
    const loaders = {
      user: new MongoDBLoader({ collection: db.collection('users') });
    }
    // now `loaders.user` will be available in the resolver context
    return { loaders };
  },
  schema,
});
server.applyMiddleware({ app, path });

app.listen(2112);
```
npm package: @parameter1/dependency-tool
Description: A CLI tool for upgrading package dependencies.
Author: Jacob Bare
Latest version: 1.1.17

# Dependency Tool
Command line tool for managing project dependencies.

## Installation
Add `@parameter1/dependency-tool` as a project dependency via Yarn or npm. You can also add this package globally.

## Usage

### Upgrading
Once installed, run via the command line and target the project path you'd like to update:

```sh
p1-dependency-tool upgrade ../path-to-your-project
```

If the package uses Yarn workspaces, all sub-packages will also be updated.
npm package: @parameter1/google-ad-manager-graphql-generator
Description: Generates GraphQL type definitions using the Google Ad Manager API WSDLs.
Author: Jacob Bare
Latest version: 1.0.0

# Google Ad Manager GraphQL Schema Generator
Reads the GAM API WSDL files and generates a corresponding GraphQL schema for a provided API version.

## General
- WSDL types that lack child fields will be generated as a definition with a `_: Boolean` placeholder field. This is due to the GraphQL spec requring all definitions to have at least one field. This applies to all generated `Type`, `Interface`, `Input`, and `Enum` definitions.
- When building fields for `Type` and `Interface` definitions, the reference field value is handled as follows:
  - if explicitly mapped to a scalar value use the mapped value (e.g. `xsd:string` becomes `String`)
  - otherwise, load the `WSDLType` object.
  - if `WSDLType.isEnumerated`, reference the `Enum` name
  - if `WSDLType.abstract`, reference the `Interface` name
  - if the type has child types (via extension), reference the `Interface` name
  - otherwise, use the `Type` name

## Enums
- A definition will be an `Enum` when the `WSDLType.enumeration` array field has values.

## Interfaces
- A definition will _only_ be an `Interface` when the `WSDLType.abstract` field is set to `true`.
- A definition will be an `Interface` _with_ a corresponding `Type` when the WSDL type is extended by another WSDL type.

## Types
- A type will _implement_ an `Interface` when the `WSDLType.extension` field has a value set.
- Types with the `WSDLType.abstract` field set to `true` will _never_ be a concrete `Type` and will be generated as an `Interface`

## Inputs

## Queries

## Mutations
npm package: @parameter1/graphql-type-date
Description: A custom Date GraphQL scalar type.
Author: Jacob Bare
Latest version: 1.0.23

# GraphQL Date Type
A custom Date GraphQL scalar type.

## Installation
```
yarn add @parameter1/graphql-type-date
```

## Usage
Add the custom scalar to your resolvers.

```js
// resolvers.js
const GraphQLDate = require('@parameter1/graphql-type-date');

module.exports = {
  Date: GraphQLDate,

  // your resovlers here...
};
```

And to your GraphQL type definitions.
```graphql
scalar Date
```
npm package: @parameter1/graphql-type-month
Description: A custom Month GraphQL scalar type.
Author: Jacob Bare
Latest version: 1.0.10

# GraphQL Month Type
A custom MongoDB Month GraphQL scalar type, which parses values in `YYYY-MM` format (e.g. `2021-03`)

## Installation
```
yarn add @parameter1/graphql-type-month
```

## Usage
Add the custom scalar to your resolvers and pass any desired options.

```js
// resolvers.js
const GraphQLMonth = require('@parameter1/graphql-type-month');

module.exports = {
  ObjectID: GraphQLMonth(),

  // your resovlers here...
};
```

And to your GraphQL type definitions.
```graphql
scalar Month
```

## Configuration
The default timezone is `UTC`. To change this, pass a `timezone` value as a resolver option. The value can be any timezone supported by the `dayjs` package.

```js
// resolvers.js
const GraphQLMonth = require('@parameter1/graphql-type-month');

module.exports = {
  ObjectID: GraphQLMonth({ timezone: 'America/Chicago' }),

  // your resovlers here...
};
```
npm package: @parameter1/graphql-type-objectid
Description: A custom MongoDB ObjectID GraphQL scalar type.
Author: Jacob Bare
Latest version: 1.0.21

# GraphQL ObjectID Type
A custom MongoDB ObjectID GraphQL scalar type.

## Installation
```
yarn add @parameter1/graphql-type-objectid
```

## Usage
Add the custom scalar to your resolvers and inject the `ObjectId` class from `mongodb` (or elsewhere, e.g. Mongoose).

```js
// resolvers.js
const GraphQLObjectID = require('@parameter1/graphql-type-objectid');
const { ObjectId } = require('mongodb');

module.exports = {
  ObjectID: GraphQLObjectID(ObjectId),

  // your resovlers here...
};
```

And to your GraphQL type definitions.
```graphql
scalar ObjectID
```
npm package: @parameter1/gulp
Description: A simple Gulp wrapper for watching and serving of Node apps.
Author: Jacob Bare
Latest version: 2.1.0

# Gulp
A simple Gulp wrapper for watching and serving of Node apps.

## Installation
```
yarn add @parameter1/gulp
```

## Usage
To use the Gulpfile factory...

```js
// gulpfile.js
import { gulpfile } from '@parameter/gulp/factory';

gulpfile({
  entry: 'src/index.js',
  watchPaths: ['src/**/*.js'],
});

```
npm package: @parameter1/omeda-graphql-client-express
Description: Express middleware for creating and using the Omeda GraphQL client
Author: Jacob Bare
Latest version: 1.0.0

# Omeda GraphQL Express Middleware
Express middleware for creating and using the Omeda GraphQL client

## Installation
```
yarn add @parameter1/omeda-graphql-client-express
```

## Usage
The middleware can be applied globally to Express, or on a per-route (or per-router) basis.

```js
const express = require('express');
const omedaGraphQL = require('@parameter1/omeda-graphql-client-express');

const app = express();

// the client will be globally available on `req.$omeda` and `res.locals.$omeda`
app.use(omedaGraphQL({
  uri: 'https://graphql.omeda.parameter1.com',
  brandKey: 'yourbrandkey',
  appId: 'your app id',
  inputId: 'your input id',
}));
```
npm package: @parameter1/package-theme-monorail-magazine
Description: Magazine components, routes, and styling for the Monorail theme
Author: Brandon Krigbaum
Latest version: 2.101.0
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

marko-web-theme-monorail-magazine
===

Provides support for displaying publications and issues within the monorail theme.
npm package: @parameter1/package-utils
Description: Package JSON loading utilities.
Author: Jacob Bare
Latest version: 1.0.0

# Package JSON Loading Utilities for ESM

## Usage
```js
// package.js
import { loadPackageFile } from '@parameter1/package-utils';

export default loadPackageFile(import.meta.url, './package.json');

// some-other-file.js
import pkg from './package.js';

console.log(pkg.name);
```
npm package: @parameter1/terminus
Description: A terminus bootstrapper for running servers/microservices
Author: Jacob Bare
Latest version: 3.0.1

# Terminus Bootstrapper
A terminus bootstrapper for running servers/microservices.

## Installation
```
yarn add @parameter1/terminus
```

## Usage
To boot a service, import the `@parameter1/terminus/boot-service` file and execute it in the entrypoint of your project. You must provide an `http.Server`-like object that contains the server you wish to run. For example (using Express):

```js
import http from 'http';
import express from 'express';
import { bootService } from '@parameter1/terminus';

const app = express();
app.get('/', (req, res) => {
  res.json({ ping: 'pong' });
});

const server = http.createServer(app);

bootService({
  name: 'foo',
  version: '1.0.0',
  server,
  port: 1000,

  // advanced hooks (see the `packages/terminus/boot-service.js` file for more)
  // in these cases, `someService` is pseudo-code :)
  onStart: async () => {
    // ensure services are awaited before booting the server
    await someService.start();
  },
  onSignal: async () => {
    // stop services when a signal is received.
    await someService.stop();
  },
  onHealthCheck: async () => {
    // ensure services are still healthy.
    // by default, health can be checked on `/_health`
    await someService.ping();
  },

  // log a different exposed port when the server boots. useful with docker
  exposedPort: 1200,
}).catch((e) => setImmediate(() => {
  throw e;
}));
```
This will boot an Express server (wrapped with `http`) on port 1000.

## Configuration
The following environment variables can be used to adjust the timeout and shutdown delay of terminus (with defaults shown):

```
TERMINUS_TIMEOUT=1000
TERMINUS_SHUTDOWN_DELAY=0
```
npm package: @parametersjs/grpc_proto
Description: GRPC Protocol Buffer definition.
Author: David Worms
Latest version: 0.8.1


# `@parametersjs/grpc_proto`

Store the Protocol Buffer definition file used by the GRPC server and client packages.

Additionnal, the package provide some functions to facilitate its usage:

* `resolve`   
  Return the `shell.proto` location.
* `load`   
  Load .proto files for use with gRPC.
* `loadSync`   
  Synchronous version of `load`.

## Note

The Protocol Buffer definition is stored in a file. We could probably make it dynamic with [grpc-tools](https://www.npmjs.com/package/grpc-tools).
npm package: @parametric-svg/ast
Description: The internal format of parametric.svg
Author: Tomek Wiszniewski
Latest version: 1.0.1

[![Code style: airbnb
](https://img.shields.io/badge/code%20style-airbnb-777777.svg?style=flat-square)
](https://github.com/airbnb/javascript)




parametric.svg AST
==================

**The internal format of parametric.svg**




<div                                                 id="/whats-up">&nbsp;</div>

What’s up?
----------

This repo describes the structure of objects that different parts of parametric.svg use to communicate with each other. [Here](https://github.com/parametric-svg/js/issues/2)’s some reasoning behind the idea.




<div                                                  id="/install">&nbsp;</div>

Install
-------

```sh
npm install parametric-svg-ast
```




<div                                                      id="/use">&nbsp;</div>

Use
---

```js
const ast = require('parametric-svg-ast');

const myAst = ast({
  attributes: [
    {
      address: [2, 5, 4],
      name: 'width',
      dependencies: ['a', 'b'],
      relation: (a, b) => a + b,
    },
    {
      address: [4, 8],
      name: 'height',
      dependencies: [],
      relation: () => 59,
    },
  ],

  defaults: [
    {
      identifier: 'a',
      dependencies: [],
      relation: () => 10,
    },
    {
      identifier: 'b',
      dependencies: [],
      relation: () => 20,
    },
  ]
});
//» { type: 'ParametricSvgAst',
//    version: 1,
//    attributes: [object Set],
//    defaults: [object Set] }
```




<div                                                      id="/api">&nbsp;</div>

API
---

See the API docs [in the source](./module/index.js). If you can help us render them in the readme, that would be [awesome](https://github.com/parametric-svg/ast/issues/1)!




<div                                                  id="/license">&nbsp;</div>

License
-------

[MIT][] © [Tomek Wiszniewski][]

[MIT]: ./License.md
[Tomek Wiszniewski]: https://github.com/tomekwi
npm package: @parametric-svg/expression-to-mathjs
Description: Convert a parametric.svg expression to a mathjs expression
Author: Tomek Wiszniewski
Latest version: 2.0.1

[![Stability: experimental
](https://img.shields.io/badge/stability-experimental-yellow.svg?style=flat-square)
](https://nodejs.org/api/documentation.html#documentation_stability_index)
 [![Code style: airbnb
](https://img.shields.io/badge/code%20style-airbnb-777777.svg?style=flat-square)
](https://github.com/airbnb/javascript)




@parametric-svg/expression-to-mathjs
===================================

**Convert a parametric.svg expression to a mathjs expression**




<div                                                  id="/install">&nbsp;</div>

Install
-------

```sh
$ npm install @parametric-svg/expression-to-mathjs
```




<div                                                      id="/use">&nbsp;</div>

Use
---

```js
const convert = require('@parametric-svg/expression-to-mathjs');

convert('`1 + 2 = ${1 + 2}`');
//» 'concat("1 + 2 = ", string(1 + 2))'
```




<div                                                  id="/license">&nbsp;</div>

License
-------

[MIT][] © [Tomek Wiszniewski][]

[MIT]: ./License.md
[Tomek Wiszniewski]: https://github.com/tomekwi
npm package: @parametric-svg/parse
Description: A JS-based parser for parametric.svg graphics
Author: Tomek Wiszniewski
Latest version: 1.2.5

[![Stability: experimental
](https://img.shields.io/badge/stability-experimental-yellow.svg?style=flat-square)
](https://nodejs.org/api/documentation.html#documentation_stability_index)
 [![Code style: airbnb
](https://img.shields.io/badge/code%20style-airbnb-777777.svg?style=flat-square)
](https://github.com/airbnb/javascript)




parametric-svg-parse
====================

**A JS-based parser for parametric.svg graphics**

Works in node and in browsers.




<div                                                  id="/install">&nbsp;</div>

Install
-------

```sh
$ npm install parametric-svg-parse
```




<div                                                      id="/use">&nbsp;</div>

Use
---

```js
const parse = require('parametric-svg-parse');

// In the browser:
  const domify = require('domify');
  const svg = domify('<svg><rect parametric:width="a + 5" /></svg>');

// …or in node:
  const svg = document.querySelect('#my-svg');

const ast = parse(svg);
ast;
//» { type: 'ParametricSvgAst',
//    version: 1,
//    parameters: [object Set],
//    defaults: [object Set] }
```

You can now pass the `ast` to **[parametric-svg-patch](https://www.npmjs.com/package/parametric-svg-patch)**.




<div                                                  id="/license">&nbsp;</div>

License
-------

[MIT][] © [Tomek Wiszniewski][]

[MIT]: ./License.md
[Tomek Wiszniewski]: https://github.com/tomekwi
npm package: @parametric-svg/patch
Description: Update a parametric SVG element with new data. A low-level library.
Author: Tomek Wiszniewski
Latest version: 1.2.3

[![Stability: experimental
](https://img.shields.io/badge/stability-experimental-yellow.svg?style=flat-square)
](https://nodejs.org/api/documentation.html#documentation_stability_index)
 [![Code style: airbnb
](https://img.shields.io/badge/code%20style-airbnb-777777.svg?style=flat-square)
](https://github.com/airbnb/javascript)




parametric-svg-patch
====================

**Update a parametric SVG element with new data. A low-level library.**


<a                                                 id="/example"></a>&nbsp;

```xml
<rect
  id="cool-rectangle"
  parametric:x="2 * a"
  parametric:y="b + 5"
/>
```

<p align="center"><b>➕</b></p>

```js
const parse = require('parametric-svg-parse');
const patch = require('parametric-svg-patch');
const rectangle = document.querySelector('#cool-rectangle');
const ast = parse(rectangle);

patch(rectangle, ast, {
  a: 10,
  b: 20,
});
```

<p align="center"><b>➔</b></p>

```xml
<rect
  id="cool-rectangle"
  x="20"  parametric:x="2 * a"
  y="25"  parametric:y="b + 5"
/>
```




<a                                                 id="/installation"></a>&nbsp;

Installation
------------

```sh
$ npm install parametric-svg-patch
```




<a                                                        id="/usage"></a>&nbsp;

Usage
-----

<!-- @doxie.inject start -->
<!-- Don’t remove or change the comment above – that can break automatic updates. -->
<p align="right"><sub><a href="http://jsig.biz/">JSIG SIGNATURE:</a></sub></p>

<h3><pre>
patch(
  element: DOMElement,
  ast: ParametricSvgAst,
  variables: Object
) => void
</pre></h3>

The `element` will be updated in place with bindings from the `ast` using
the `variables` you give us. The `ast` should generally come from the module
[parametric-svg-parse][]. You can also generate it yourself using
[parametric-svg-ast][].

If a parametric attribute depends on a variable you don’t give us, we won’t
update the attribute. For example, if you have
a `<rect parametric:x="a + 1" y="5" parametric:y="b + 1" />` and only
give us `{a: 10}` as `variables`, the result will be
`<rect x="11" parametric:x="a + 1" y="5" parametric:y="b + 1" />`.

[parametric-svg-parse]:  https://npmjs.com/package/parametric-svg-parse
[parametric-svg-ast]:    https://npmjs.com/package/parametric-svg-ast
<!-- Don’t remove or change the comment below – that can break automatic updates. More info at <http://npm.im/doxie.inject>. -->
<!-- @doxie.inject end -->




<a                                                      id="/license"></a>&nbsp;

License
-------

[MIT][] © [Tomek Wiszniewski][]

[MIT]: ./License.md
[Tomek Wiszniewski]: https://github.com/tomekwi